tiptap-markdown-react 1.3.1 → 1.3.3

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.
@@ -1560,6 +1560,11 @@ function findScrollParent(start) {
1560
1560
  function isViewportScroller(node) {
1561
1561
  return node === document.documentElement || node === document.body || node === document.scrollingElement;
1562
1562
  }
1563
+ function headingHasArrived(heading, rootTop) {
1564
+ const margin = Number.parseFloat(getComputedStyle(heading).scrollMarginTop);
1565
+ const line = rootTop + (Number.isFinite(margin) && margin > 0 ? margin : 8);
1566
+ return heading.getBoundingClientRect().top <= line;
1567
+ }
1563
1568
  function EditorToc({ items, editorDom, locale = "en" }) {
1564
1569
  var _a;
1565
1570
  const t = getLocaleBundle(locale).toc;
@@ -1572,6 +1577,9 @@ function EditorToc({ items, editorDom, locale = "en" }) {
1572
1577
  const pinnedId = useRef(null);
1573
1578
  const pinScroll = useRef(null);
1574
1579
  const pinTimer = useRef(null);
1580
+ const cancelPinWatch = useRef(null);
1581
+ const cancelPointerWait = useRef(null);
1582
+ const cardRef = useRef(null);
1575
1583
  const clearHide = () => {
1576
1584
  if (hideTimer.current !== null) {
1577
1585
  window.clearTimeout(hideTimer.current);
@@ -1593,8 +1601,10 @@ function EditorToc({ items, editorDom, locale = "en" }) {
1593
1601
  };
1594
1602
  useEffect(
1595
1603
  () => () => {
1604
+ var _a2, _b;
1596
1605
  clearHide();
1597
- if (pinTimer.current !== null) window.clearTimeout(pinTimer.current);
1606
+ (_a2 = cancelPointerWait.current) == null ? void 0 : _a2.call(cancelPointerWait);
1607
+ (_b = cancelPinWatch.current) == null ? void 0 : _b.call(cancelPinWatch);
1598
1608
  },
1599
1609
  []
1600
1610
  );
@@ -1607,7 +1617,6 @@ function EditorToc({ items, editorDom, locale = "en" }) {
1607
1617
  if (!headings.length) return;
1608
1618
  const scrollParent = findScrollParent(editorDom);
1609
1619
  const viewport = isViewportScroller(scrollParent);
1610
- const visible = /* @__PURE__ */ new Set();
1611
1620
  const scrollPos = () => viewport ? window.scrollY : scrollParent.scrollTop;
1612
1621
  const apply = () => {
1613
1622
  var _a2;
@@ -1640,46 +1649,19 @@ function EditorToc({ items, editorDom, locale = "en" }) {
1640
1649
  return;
1641
1650
  }
1642
1651
  const rootTop = viewport ? 0 : scrollParent.getBoundingClientRect().top;
1643
- let best = null;
1644
- let bestTop = Infinity;
1645
- for (const el of visible) {
1646
- const top = el.getBoundingClientRect().top;
1647
- if (top < bestTop) {
1648
- bestTop = top;
1649
- best = el;
1650
- }
1651
- }
1652
- if (!best) {
1653
- let last = null;
1654
- for (const heading of headings) {
1655
- if (heading.getBoundingClientRect().top <= rootTop + 12) last = heading;
1656
- }
1657
- best = last ?? headings[0];
1652
+ let current = headings[0];
1653
+ for (const heading of headings) {
1654
+ if (!headingHasArrived(heading, rootTop)) break;
1655
+ current = heading;
1658
1656
  }
1659
- const id = best.getAttribute("data-toc-id");
1657
+ const id = current.getAttribute("data-toc-id");
1660
1658
  if (id) setActiveId(id);
1661
1659
  };
1662
- const observer = new IntersectionObserver(
1663
- (entries) => {
1664
- for (const entry of entries) {
1665
- if (entry.isIntersecting) visible.add(entry.target);
1666
- else visible.delete(entry.target);
1667
- }
1668
- apply();
1669
- },
1670
- {
1671
- root: viewport ? null : scrollParent,
1672
- rootMargin: "0px 0px -60% 0px",
1673
- threshold: [0, 1]
1674
- }
1675
- );
1676
- for (const heading of headings) observer.observe(heading);
1677
1660
  const onScroll = () => apply();
1678
1661
  const scrollTarget = viewport ? window : scrollParent;
1679
1662
  scrollTarget.addEventListener("scroll", onScroll, { passive: true });
1680
1663
  apply();
1681
1664
  return () => {
1682
- observer.disconnect();
1683
1665
  scrollTarget.removeEventListener("scroll", onScroll);
1684
1666
  };
1685
1667
  }, [items, editorDom]);
@@ -1690,10 +1672,19 @@ function EditorToc({ items, editorDom, locale = "en" }) {
1690
1672
  if (index >= 0) setRoving(index);
1691
1673
  }, [activeId, items]);
1692
1674
  useEffect(() => {
1693
- var _a2, _b;
1694
1675
  if (!open || !activeId) return;
1695
- const reduce = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
1696
- (_b = (_a2 = navRef.current) == null ? void 0 : _a2.querySelector(`[data-toc-item="${CSS.escape(activeId)}"]`)) == null ? void 0 : _b.scrollIntoView({ block: "nearest", behavior: reduce ? "auto" : "smooth" });
1676
+ const card2 = cardRef.current;
1677
+ const button = card2 == null ? void 0 : card2.querySelector(
1678
+ `[data-toc-item="${CSS.escape(activeId)}"]`
1679
+ );
1680
+ if (!card2 || !button) return;
1681
+ const cardRect = card2.getBoundingClientRect();
1682
+ const buttonRect = button.getBoundingClientRect();
1683
+ if (buttonRect.top < cardRect.top) {
1684
+ card2.scrollTop -= cardRect.top - buttonRect.top;
1685
+ } else if (buttonRect.bottom > cardRect.bottom) {
1686
+ card2.scrollTop += buttonRect.bottom - cardRect.bottom;
1687
+ }
1697
1688
  }, [activeId, open]);
1698
1689
  useEffect(() => {
1699
1690
  var _a2;
@@ -1706,18 +1697,73 @@ function EditorToc({ items, editorDom, locale = "en" }) {
1706
1697
  );
1707
1698
  (_a2 = itemRefs.current[index]) == null ? void 0 : _a2.focus();
1708
1699
  }, [open, activeId, items]);
1709
- const jump = (item2) => {
1700
+ const watchPinRelease = (itemId, scroller) => {
1701
+ var _a2;
1702
+ (_a2 = cancelPinWatch.current) == null ? void 0 : _a2.call(cancelPinWatch);
1703
+ const scrollTarget = isViewportScroller(scroller) ? window : scroller;
1704
+ let settled = false;
1705
+ const lock = () => {
1706
+ if (settled) return;
1707
+ settled = true;
1708
+ scrollTarget.removeEventListener("scroll", arm);
1709
+ scrollTarget.removeEventListener("scrollend", lock);
1710
+ if (pinTimer.current !== null) {
1711
+ window.clearTimeout(pinTimer.current);
1712
+ pinTimer.current = null;
1713
+ }
1714
+ if (cancelPinWatch.current === cancel) cancelPinWatch.current = null;
1715
+ if (pinnedId.current !== itemId) return;
1716
+ pinScroll.current = isViewportScroller(scroller) ? window.scrollY : scroller.scrollTop;
1717
+ };
1718
+ const arm = () => {
1719
+ if (settled) return;
1720
+ if (pinTimer.current !== null) window.clearTimeout(pinTimer.current);
1721
+ pinTimer.current = window.setTimeout(lock, 100);
1722
+ };
1723
+ const cancel = () => {
1724
+ if (settled) return;
1725
+ settled = true;
1726
+ scrollTarget.removeEventListener("scroll", arm);
1727
+ scrollTarget.removeEventListener("scrollend", lock);
1728
+ if (pinTimer.current !== null) {
1729
+ window.clearTimeout(pinTimer.current);
1730
+ pinTimer.current = null;
1731
+ }
1732
+ if (cancelPinWatch.current === cancel) cancelPinWatch.current = null;
1733
+ };
1734
+ cancelPinWatch.current = cancel;
1735
+ scrollTarget.addEventListener("scroll", arm, { passive: true });
1736
+ scrollTarget.addEventListener("scrollend", lock);
1737
+ arm();
1738
+ };
1739
+ const pinHighlight = (item2) => {
1740
+ var _a2;
1741
+ (_a2 = cancelPinWatch.current) == null ? void 0 : _a2.call(cancelPinWatch);
1710
1742
  const scroller = findScrollParent(editorDom);
1711
1743
  pinnedId.current = item2.id;
1712
1744
  pinScroll.current = null;
1713
1745
  setActiveId(item2.id);
1746
+ return scroller;
1747
+ };
1748
+ const jump = (item2) => {
1749
+ const scroller = pinHighlight(item2);
1750
+ watchPinRelease(item2.id, scroller);
1714
1751
  scrollToTocHeading(item2.id, scroller);
1715
- if (pinTimer.current !== null) window.clearTimeout(pinTimer.current);
1716
- pinTimer.current = window.setTimeout(() => {
1717
- pinTimer.current = null;
1718
- if (pinnedId.current !== item2.id) return;
1719
- pinScroll.current = isViewportScroller(scroller) ? window.scrollY : scroller.scrollTop;
1720
- }, 480);
1752
+ };
1753
+ const pressItem = (item2, event) => {
1754
+ var _a2;
1755
+ if (event.button !== 0) return;
1756
+ (_a2 = cancelPointerWait.current) == null ? void 0 : _a2.call(cancelPointerWait);
1757
+ const scroller = pinHighlight(item2);
1758
+ const stop = () => {
1759
+ window.removeEventListener("pointerup", stop);
1760
+ window.removeEventListener("pointercancel", stop);
1761
+ if (cancelPointerWait.current === stop) cancelPointerWait.current = null;
1762
+ watchPinRelease(item2.id, scroller);
1763
+ };
1764
+ cancelPointerWait.current = stop;
1765
+ window.addEventListener("pointerup", stop);
1766
+ window.addEventListener("pointercancel", stop);
1721
1767
  };
1722
1768
  const move = (delta) => {
1723
1769
  var _a2;
@@ -1762,33 +1808,43 @@ function EditorToc({ items, editorDom, locale = "en" }) {
1762
1808
  style: { "--bar-width": `${barWidth(item2.level)}px` },
1763
1809
  "aria-current": active ? "true" : void 0,
1764
1810
  "aria-label": item2.text,
1811
+ onPointerDown: (event) => pressItem(item2, event),
1765
1812
  onClick: () => jump(item2),
1766
1813
  children: /* @__PURE__ */ jsx("span", { className: active ? styles.barActive : styles.bar })
1767
1814
  }
1768
1815
  ) }, item2.id);
1769
1816
  }) }),
1770
- /* @__PURE__ */ jsx("div", { className: open ? styles.cardOpen : styles.card, inert: !open, children: /* @__PURE__ */ jsx("div", { className: styles.cardInner, children: /* @__PURE__ */ jsx("ul", { className: styles.list, children: items.map((item2, index) => {
1771
- const active = item2.id === activeId;
1772
- return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
1773
- "button",
1774
- {
1775
- type: "button",
1776
- ref: (node) => {
1777
- itemRefs.current[index] = node;
1778
- },
1779
- "data-toc-item": item2.id,
1780
- tabIndex: open && index === roving ? 0 : -1,
1781
- className: active ? `${styles.item} ${styles.itemActive}` : styles.item,
1782
- style: {
1783
- "--toc-indent": `${(item2.level - 1) * 12 + 10}px`
1784
- },
1785
- "aria-current": active ? "true" : void 0,
1786
- "aria-label": item2.text,
1787
- onClick: () => jump(item2),
1788
- children: /* @__PURE__ */ jsx("span", { className: styles.itemText, children: item2.text })
1789
- }
1790
- ) }, item2.id);
1791
- }) }) }) })
1817
+ /* @__PURE__ */ jsx(
1818
+ "div",
1819
+ {
1820
+ ref: cardRef,
1821
+ className: open ? styles.cardOpen : styles.card,
1822
+ inert: !open,
1823
+ children: /* @__PURE__ */ jsx("div", { className: styles.cardInner, children: /* @__PURE__ */ jsx("ul", { className: styles.list, children: items.map((item2, index) => {
1824
+ const active = item2.id === activeId;
1825
+ return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
1826
+ "button",
1827
+ {
1828
+ type: "button",
1829
+ ref: (node) => {
1830
+ itemRefs.current[index] = node;
1831
+ },
1832
+ "data-toc-item": item2.id,
1833
+ tabIndex: open && index === roving ? 0 : -1,
1834
+ className: active ? `${styles.item} ${styles.itemActive}` : styles.item,
1835
+ style: {
1836
+ "--toc-indent": `${(item2.level - 1) * 12 + 10}px`
1837
+ },
1838
+ "aria-current": active ? "true" : void 0,
1839
+ "aria-label": item2.text,
1840
+ onPointerDown: (event) => pressItem(item2, event),
1841
+ onClick: () => jump(item2),
1842
+ children: /* @__PURE__ */ jsx("span", { className: styles.itemText, children: item2.text })
1843
+ }
1844
+ ) }, item2.id);
1845
+ }) }) })
1846
+ }
1847
+ )
1792
1848
  ]
1793
1849
  }
1794
1850
  ) });
@@ -2161,4 +2217,4 @@ export {
2161
2217
  ExpandIcon as y,
2162
2218
  requestImagePreview as z
2163
2219
  };
2164
- //# sourceMappingURL=ReportContentWithCharts-cjidlvfi.js.map
2220
+ //# sourceMappingURL=ReportContentWithCharts-BOskBjBI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReportContentWithCharts-BOskBjBI.js","sources":["../src/icons/index.tsx","../src/labels.ts","../src/i18n/zh.ts","../src/i18n/index.ts","../src/imagePreview.ts","../src/components/ImageLightbox.tsx","../src/chart/mapData.ts","../src/chart/theme.ts","../src/chart/renderChart.ts","../src/toc/scrollToTocHeading.ts","../src/components/EditorToc.tsx","../src/hooks/useIsMobile.ts","../src/toc/readTocItems.ts","../src/citationDom.ts","../src/components/CitationInteractive.tsx","../src/components/ContentOutline.tsx","../src/components/ReaderReportContent.tsx","../src/components/ReportContentInteractive.tsx","../src/components/ChartMount.tsx","../src/components/ReportContentWithCharts.tsx"],"sourcesContent":["import type { SVGProps } from 'react';\n\n/**\n * 内联 SVG 图标集(0 运行时依赖)。stroke 走 currentColor,尺寸默认 1em 跟随字号,\n * 故颜色/大小随文本与主题自动变化。\n *\n * 通用图标(粗体/斜体/下划线/列表/撤销/查找等,本文件表格图标之前的部分)的 path 取自\n * Lucide,其许可证为 ISC,其中部分图形源自 Feather 的 MIT——完整版权声明见\n * 仓库根目录 THIRD_PARTY_LICENSES.md。表格行列操作图标(Column / Row / TableDelete 系列)为自绘。\n */\nexport interface IconProps extends SVGProps<SVGSVGElement> {\n size?: number | string;\n}\n\nfunction Svg({ size = '1em', children, ...rest }: IconProps & { children: React.ReactNode }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n {...rest}\n >\n {children}\n </svg>\n );\n}\n\nexport const BoldIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\" />\n <path d=\"M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\" />\n </Svg>\n);\n\nexport const ItalicIcon = (p: IconProps) => (\n <Svg {...p}>\n <line x1=\"19\" x2=\"10\" y1=\"4\" y2=\"4\" />\n <line x1=\"14\" x2=\"5\" y1=\"20\" y2=\"20\" />\n <line x1=\"15\" x2=\"9\" y1=\"4\" y2=\"20\" />\n </Svg>\n);\n\nexport const UnderlineIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M6 4v6a6 6 0 0 0 12 0V4\" />\n <line x1=\"4\" x2=\"20\" y1=\"20\" y2=\"20\" />\n </Svg>\n);\n\nexport const StrikethroughIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M16 4H9a3 3 0 0 0-2.83 4\" />\n <path d=\"M14 12a4 4 0 0 1 0 8H6\" />\n <line x1=\"4\" x2=\"20\" y1=\"12\" y2=\"12\" />\n </Svg>\n);\n\nexport const CodeIcon = (p: IconProps) => (\n <Svg {...p}>\n <polyline points=\"16 18 22 12 16 6\" />\n <polyline points=\"8 6 2 12 8 18\" />\n </Svg>\n);\n\nexport const LinkIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" />\n <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" />\n </Svg>\n);\n\n/** 橡皮擦:表格菜单的「清空内容」。 */\nexport const EraserIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"m7 21-4.3-4.3c-1-1-1-2.5 0-3.4l9.6-9.6c1-1 2.5-1 3.4 0l5.6 5.6c1 1 1 2.5 0 3.4L13 21\" />\n <path d=\"M22 21H7\" />\n <path d=\"m5 11 9 9\" />\n </Svg>\n);\n\n/** 逆时针回转:表格菜单的「重置单元格样式」。 */\nexport const RotateCcwIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n </Svg>\n);\n\n/** 在新窗口打开(链接浮层的「打开」按钮)。 */\nexport const ExternalLinkIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M15 3h6v6\" />\n <path d=\"M10 14 21 3\" />\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n </Svg>\n);\n\nexport const ImageIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\" />\n <circle cx=\"9\" cy=\"9\" r=\"2\" />\n <path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\" />\n </Svg>\n);\n\n/**\n * 段落排版图标(对齐四件 / 缩进两件 / 行高):块状 fill 风格,自绘。\n * 细线条(stroke 2)在 14px 下会发虚——这组统一用带圆角的实心块。\n */\nconst BlockSvg = ({ size = '1em', children, ...rest }: IconProps & { children: React.ReactNode }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n stroke=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n {...rest}\n >\n {children}\n </svg>\n);\n\nexport const AlignLeftIcon = (p: IconProps) => (\n <BlockSvg {...p}>\n <rect x=\"3\" y=\"3.4\" width=\"18\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"3\" y=\"8.6\" width=\"12\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"3\" y=\"13.8\" width=\"18\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"3\" y=\"19\" width=\"12\" height=\"2.4\" rx=\"1.2\" />\n </BlockSvg>\n);\n\nexport const AlignCenterIcon = (p: IconProps) => (\n <BlockSvg {...p}>\n <rect x=\"3\" y=\"3.4\" width=\"18\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"6\" y=\"8.6\" width=\"12\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"3\" y=\"13.8\" width=\"18\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"6\" y=\"19\" width=\"12\" height=\"2.4\" rx=\"1.2\" />\n </BlockSvg>\n);\n\nexport const AlignRightIcon = (p: IconProps) => (\n <BlockSvg {...p}>\n <rect x=\"3\" y=\"3.4\" width=\"18\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"9\" y=\"8.6\" width=\"12\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"3\" y=\"13.8\" width=\"18\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"9\" y=\"19\" width=\"12\" height=\"2.4\" rx=\"1.2\" />\n </BlockSvg>\n);\n\nexport const AlignJustifyIcon = (p: IconProps) => (\n <BlockSvg {...p}>\n <rect x=\"3\" y=\"3.4\" width=\"18\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"3\" y=\"8.6\" width=\"18\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"3\" y=\"13.8\" width=\"18\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"3\" y=\"19\" width=\"18\" height=\"2.4\" rx=\"1.2\" />\n </BlockSvg>\n);\n\nexport const IndentIncreaseIcon = (p: IconProps) => (\n <BlockSvg {...p}>\n <path d=\"M3 6.6 8.5 10.8 3 15 Z\" />\n <rect x=\"10.5\" y=\"3.6\" width=\"10.5\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"10.5\" y=\"10.8\" width=\"10.5\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"10.5\" y=\"18\" width=\"10.5\" height=\"2.4\" rx=\"1.2\" />\n </BlockSvg>\n);\n\nexport const IndentDecreaseIcon = (p: IconProps) => (\n <BlockSvg {...p}>\n <path d=\"M8.5 6.6 3 10.8 8.5 15 Z\" />\n <rect x=\"10.5\" y=\"3.6\" width=\"10.5\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"10.5\" y=\"10.8\" width=\"10.5\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"10.5\" y=\"18\" width=\"10.5\" height=\"2.4\" rx=\"1.2\" />\n </BlockSvg>\n);\n\n/** 行高:左侧轴 + 双向块三角,右侧两条块线。 */\nexport const LineHeightIcon = (p: IconProps) => (\n <BlockSvg {...p}>\n <rect x=\"1.8\" y=\"4.4\" width=\"2.4\" height=\"15.2\" rx=\"1.2\" />\n <path d=\"M3 2.4 5.4 5.8 H0.6 Z\" />\n <path d=\"M3 21.6 0.6 18.2 H5.4 Z\" />\n <rect x=\"9\" y=\"5.6\" width=\"12\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"9\" y=\"16\" width=\"12\" height=\"2.4\" rx=\"1.2\" />\n </BlockSvg>\n);\n\nexport const CaptionsIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect width=\"18\" height=\"14\" x=\"3\" y=\"5\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 15h4\" />\n <path d=\"M15 15h2\" />\n <path d=\"M7 11h2\" />\n <path d=\"M13 11h4\" />\n </Svg>\n);\n\n/** 裁剪:两把角尺,path 取自 Lucide(ISC)。 */\nexport const CropIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M6 2v14a2 2 0 0 0 2 2h14\" />\n <path d=\"M18 22V8a2 2 0 0 0-2-2H2\" />\n </Svg>\n);\n\nexport const ImportIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M12 3v12\" />\n <path d=\"m8 11 4 4 4-4\" />\n <path d=\"M8 5H4a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-4\" />\n </Svg>\n);\n\nexport const ListUnorderedIcon = (p: IconProps) => (\n <Svg {...p}>\n <line x1=\"8\" x2=\"21\" y1=\"6\" y2=\"6\" />\n <line x1=\"8\" x2=\"21\" y1=\"12\" y2=\"12\" />\n <line x1=\"8\" x2=\"21\" y1=\"18\" y2=\"18\" />\n <line x1=\"3\" x2=\"3.01\" y1=\"6\" y2=\"6\" />\n <line x1=\"3\" x2=\"3.01\" y1=\"12\" y2=\"12\" />\n <line x1=\"3\" x2=\"3.01\" y1=\"18\" y2=\"18\" />\n </Svg>\n);\n\nexport const ListOrderedIcon = (p: IconProps) => (\n <Svg {...p}>\n <line x1=\"10\" x2=\"21\" y1=\"6\" y2=\"6\" />\n <line x1=\"10\" x2=\"21\" y1=\"12\" y2=\"12\" />\n <line x1=\"10\" x2=\"21\" y1=\"18\" y2=\"18\" />\n <path d=\"M4 6h1v4\" />\n <path d=\"M4 10h2\" />\n <path d=\"M6 18H4c0-1 2-2 2-3s-1-1.5-2-1\" />\n </Svg>\n);\n\n/** 折叠块。自绘,不是 Lucide。 */\nexport const DetailsIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"m9 7 4 5-4 5\" />\n <path d=\"M15 7h5\" />\n <path d=\"M15 12h5\" />\n <path d=\"M15 17h5\" />\n </Svg>\n);\n\nexport const ListChecksIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"m3 17 2 2 4-4\" />\n <path d=\"m3 7 2 2 4-4\" />\n <path d=\"M13 6h8\" />\n <path d=\"M13 12h8\" />\n <path d=\"M13 18h8\" />\n </Svg>\n);\n\nexport const UndoIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M9 14 4 9l5-5\" />\n <path d=\"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5 5.5 5.5 0 0 1-5.5 5.5H11\" />\n </Svg>\n);\n\nexport const RedoIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"m15 14 5-5-5-5\" />\n <path d=\"M20 9H9.5A5.5 5.5 0 0 0 4 14.5 5.5 5.5 0 0 0 9.5 20H13\" />\n </Svg>\n);\n\nexport const ChevronDownIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"m6 9 6 6 6-6\" />\n </Svg>\n);\n\nexport const CheckIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M20 6 9 17l-5-5\" />\n </Svg>\n);\n\nexport const TrashIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\" />\n <path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n <line x1=\"10\" x2=\"10\" y1=\"11\" y2=\"17\" />\n <line x1=\"14\" x2=\"14\" y1=\"11\" y2=\"17\" />\n </Svg>\n);\n\nexport const LockIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </Svg>\n);\n\nexport const MenuIcon = (p: IconProps) => (\n <Svg {...p}>\n <line x1=\"4\" x2=\"20\" y1=\"12\" y2=\"12\" />\n <line x1=\"4\" x2=\"20\" y1=\"6\" y2=\"6\" />\n <line x1=\"4\" x2=\"20\" y1=\"18\" y2=\"18\" />\n </Svg>\n);\n\nexport const SearchIcon = (p: IconProps) => (\n <Svg {...p}>\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.3-4.3\" />\n </Svg>\n);\n\nexport const XIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </Svg>\n);\n\nexport const ChevronLeftIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"m15 18-6-6 6-6\" />\n </Svg>\n);\n\nexport const ChevronRightIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"m9 18 6-6-6-6\" />\n </Svg>\n);\n\n/** 放大镜加号,path 取自 Lucide(ISC)。 */\nexport const ZoomInIcon = (p: IconProps) => (\n <Svg {...p}>\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.3-4.3\" />\n <path d=\"M11 8v6\" />\n <path d=\"M8 11h6\" />\n </Svg>\n);\n\n/** 放大镜减号,path 取自 Lucide(ISC)。 */\nexport const ZoomOutIcon = (p: IconProps) => (\n <Svg {...p}>\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.3-4.3\" />\n <path d=\"M8 11h6\" />\n </Svg>\n);\n\n/** 顺时针旋转,path 取自 Lucide(ISC)。 */\nexport const RotateCwIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n </Svg>\n);\n\n/** 四角向内,灯箱「自适应」:缩回视口,path 取自 Lucide shrink(ISC)。 */\nexport const FitIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"m15 15 6 6\" />\n <path d=\"m15 9 6-6\" />\n <path d=\"M21 16v5h-5\" />\n <path d=\"M21 8V3h-5\" />\n <path d=\"M3 16v5h5\" />\n <path d=\"m3 21 6-6\" />\n <path d=\"M3 8V3h5\" />\n <path d=\"M9 9 3 3\" />\n </Svg>\n);\n\n/** 四角展开,编辑器里的「图片预览」入口,path 取自 Lucide(ISC)。 */\nexport const ExpandIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M15 3h6v6\" />\n <path d=\"m21 3-7 7\" />\n <path d=\"M9 21H3v-6\" />\n <path d=\"m3 21 7-7\" />\n </Svg>\n);\n\nexport const ChevronUpIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"m18 15-6-6-6 6\" />\n </Svg>\n);\n\nexport const ReplaceIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M14 4a1 1 0 0 1 1-1\" />\n <path d=\"M15 10a1 1 0 0 1-1-1\" />\n <path d=\"M21 4a1 1 0 0 0-1-1\" />\n <path d=\"M21 9a1 1 0 0 1-1 1\" />\n <path d=\"m3 7 3 3 3-3\" />\n <path d=\"M6 10V5a2 2 0 0 1 2-2h2\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n </Svg>\n);\n\nexport const ReplaceAllIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M14 14a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1\" />\n <path d=\"M14 4a1 1 0 0 1 1-1\" />\n <path d=\"M15 10a1 1 0 0 1-1-1\" />\n <path d=\"M19 14a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1\" />\n <path d=\"M21 4a1 1 0 0 0-1-1\" />\n <path d=\"M21 9a1 1 0 0 1-1 1\" />\n <path d=\"m3 7 3 3 3-3\" />\n <path d=\"M6 10V5a2 2 0 0 1 2-2h2\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n </Svg>\n);\n\n/* ── 表格行列操作图标(自绘:表格轮廓 + 目标边高亮 + 加号/叉号)── */\n\nexport const ColumnBeforeIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect x=\"10\" y=\"4\" width=\"11\" height=\"16\" rx=\"1\" />\n <path d=\"M14 4v16\" />\n <path d=\"M5 9v6\" />\n <path d=\"M2 12h6\" />\n </Svg>\n);\n\nexport const ColumnAfterIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect x=\"3\" y=\"4\" width=\"11\" height=\"16\" rx=\"1\" />\n <path d=\"M10 4v16\" />\n <path d=\"M19 9v6\" />\n <path d=\"M16 12h6\" />\n </Svg>\n);\n\nexport const ColumnDeleteIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"1\" />\n <path d=\"M12 4v16\" />\n <path d=\"m8 9 8 6\" />\n <path d=\"m16 9-8 6\" />\n </Svg>\n);\n\nexport const RowBeforeIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect x=\"4\" y=\"10\" width=\"16\" height=\"11\" rx=\"1\" />\n <path d=\"M4 14h16\" />\n <path d=\"M9 5h6\" />\n <path d=\"M12 2v6\" />\n </Svg>\n);\n\nexport const RowAfterIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect x=\"4\" y=\"3\" width=\"16\" height=\"11\" rx=\"1\" />\n <path d=\"M4 10h16\" />\n <path d=\"M9 19h6\" />\n <path d=\"M12 16v6\" />\n </Svg>\n);\n\nexport const RowDeleteIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"1\" />\n <path d=\"M4 12h16\" />\n <path d=\"m9 8 6 8\" />\n <path d=\"m15 8-6 8\" />\n </Svg>\n);\n\nexport const TableDeleteIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"1\" />\n <path d=\"M3 9h18\" />\n <path d=\"M9 5v14\" />\n <path d=\"M15 5v14\" />\n <path d=\"m7 2 10 20\" />\n </Svg>\n);\n\nexport const CopyIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n </Svg>\n);\n\nexport const ChevronsUpDownIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"m7 15 5 5 5-5\" />\n <path d=\"m7 9 5-5 5 5\" />\n </Svg>\n);\n\n/** 六点握把:块拖拽手柄。 */\nexport const GripIcon = (p: IconProps) => (\n <Svg {...p} fill=\"currentColor\" strokeWidth={0}>\n <circle cx=\"9\" cy=\"6\" r=\"1.25\" />\n <circle cx=\"15\" cy=\"6\" r=\"1.25\" />\n <circle cx=\"9\" cy=\"12\" r=\"1.25\" />\n <circle cx=\"15\" cy=\"12\" r=\"1.25\" />\n <circle cx=\"9\" cy=\"18\" r=\"1.25\" />\n <circle cx=\"15\" cy=\"18\" r=\"1.25\" />\n </Svg>\n);\n\nexport const DownloadIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" x2=\"12\" y1=\"15\" y2=\"3\" />\n </Svg>\n);\n\nexport const KeyboardIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\" />\n <path d=\"M6 8h.01\" />\n <path d=\"M10 8h.01\" />\n <path d=\"M14 8h.01\" />\n <path d=\"M18 8h.01\" />\n <path d=\"M6 12h.01\" />\n <path d=\"M10 12h.01\" />\n <path d=\"M14 12h.01\" />\n <path d=\"M18 12h.01\" />\n <path d=\"M7 16h10\" />\n </Svg>\n);","/**\n * UI 文案类型与英文默认。语言包在 `src/i18n`:宿主传 `locale`,不传单条文案。\n */\n\nexport interface ToolbarLabels {\n undo: string;\n redo: string;\n style: string;\n normalText: string;\n /** 传入层级,返回如 \"Heading 2\"。 */\n headingLabel: (level: number) => string;\n fontSize: string;\n fontSizeDefault: string;\n bold: string;\n italic: string;\n underline: string;\n strike: string;\n code: string;\n textColor: string;\n highlight: string;\n colorNone: string;\n colorTheme: string;\n scriptMenu: string;\n scriptNormal: string;\n superscript: string;\n subscript: string;\n link: string;\n /** 段落对齐下拉:触发器 title / aria-label。 */\n align: string;\n alignLeft: string;\n alignCenter: string;\n alignRight: string;\n alignJustify: string;\n /** 缩进下拉:触发器 + 增加 / 减少两项。 */\n indent: string;\n indentIncrease: string;\n indentDecrease: string;\n /** 行高下拉:触发器 + 「默认」项(其余按数字直显)。 */\n lineHeight: string;\n lineHeightDefault: string;\n /**\n * 链接浮层输入框的占位与无障碍名(原 `window.prompt` 的提示语,现在落到输入框上)。\n */\n linkPrompt: string;\n /** 链接浮层「应用」按钮的 title / aria-label。 */\n linkApply: string;\n /** 链接浮层「在新窗口打开」按钮的 title / aria-label。 */\n linkOpen: string;\n /** 链接浮层「移除链接」按钮的 title / aria-label。 */\n linkRemove: string;\n /** 链接浮层:地址被编辑器拒绝时的提示(落在输入框 title 上)。 */\n linkInvalid: string;\n image: string;\n imageUploadFailed: string;\n /** 图片对齐工具条(悬停图片时浮现)的 aria-label。 */\n imageAlign: string;\n /** 左对齐按钮的 title / aria-label。 */\n imageAlignLeft: string;\n /** 居中对齐按钮的 title / aria-label。 */\n imageAlignCenter: string;\n /** 右对齐按钮的 title / aria-label。 */\n imageAlignRight: string;\n /** 图片描述(图注)按钮的 title / aria-label。 */\n imageCaption: string;\n /** 描述输入框的占位与无障碍名。 */\n imageCaptionPlaceholder: string;\n /** 图片裁剪按钮的 title / aria-label。 */\n imageCrop: string;\n /** 裁剪面板「应用」按钮。 */\n imageCropApply: string;\n /** 裁剪面板「取消」按钮。 */\n imageCropCancel: string;\n /** 裁剪面板「重置」按钮:去掉裁剪,回到整张原图。 */\n imageCropReset: string;\n /** 编辑态工具条「预览」按钮:打开大图灯箱。 */\n imagePreview: string;\n /** 灯箱关闭按钮。 */\n imagePreviewClose: string;\n /** 灯箱上一张。 */\n imagePreviewPrev: string;\n /** 灯箱下一张。 */\n imagePreviewNext: string;\n /** 灯箱缩小。 */\n imagePreviewZoomOut: string;\n /** 灯箱放大。 */\n imagePreviewZoomIn: string;\n /** 灯箱「自适应」:缩回当前视口。 */\n imagePreviewFit: string;\n /** 灯箱顺时针旋转。 */\n imagePreviewRotate: string;\n /** Markdown 文件导入失败(与图片上传共用 onError 回调时,便于宿主区分文案)。 */\n importMarkdownFailed: string;\n /** 主栏导入下拉触发器上的短文案(对齐 style / fontSize)。 */\n importDocument: string;\n /** 导入触发器 title / aria-label。 */\n importDocumentHint: string;\n /** 未传 importMenuItems、但传了 onImportDocument + importAccept 时的第二项。 */\n importDocumentOther: string;\n /** 导入进行中的按钮 title。 */\n importDocumentBusy: string;\n /** 光标占位:上传阶段,传入 0–100。 */\n importDocumentUploading: (percent: number) => string;\n /** 光标占位:转换阶段,不要百分比。 */\n importDocumentConverting: string;\n /** 非 Markdown 文件导入失败(onError 的 source === 'import')。 */\n importDocumentFailed: string;\n blockquote: string;\n /** 折叠块(官方 Details)。工具栏按钮 title / aria-label。 */\n details: string;\n bulletList: string;\n orderedList: string;\n /** 有序列表旁的编号格式下拉:触发器 title / aria-label。 */\n numberingFormat: string;\n taskList: string;\n more: string;\n /**\n * 工具栏的搜索入口(放大镜按钮,落在 More 之后):title 与 aria-label。\n * 只在宿主传了 `onSearch` 时才渲染——它只是入口,条子本身归编辑器\n * (`<MarkdownWysiwygEditor>`),点击后由宿主调 `handle.openFind()`。\n */\n search: string;\n codeBlock: string;\n hr: string;\n /** 导入下拉里的 Markdown 项。 */\n importMarkdown: string;\n tableInsert: string;\n /** 行手柄的 title / aria-label(鼠标悬停单元格时出现在行的左缘)。 */\n tableRowMenu: string;\n /** 列手柄的 title / aria-label(悬停时出现在表格上方、对齐该列)。 */\n tableColumnMenu: string;\n /** 表格菜单:清空选中行 / 列 / 单元格矩形里的内容(保留单元格与表头)。 */\n tableClearContent: string;\n /** 表格菜单:把选中单元格的样式属性复位(列宽、对齐等;不动合并结构)。 */\n tableResetCellStyles: string;\n /** 表格底边 `+` 手柄(末尾追加一行)的 title / aria-label。 */\n tableAppendRow: string;\n /** 表格右边 `+` 手柄(末尾追加一列)的 title / aria-label。 */\n tableAppendColumn: string;\n /** 网格选择器底部尺寸文案,如 \"3 × 4\"。参数顺序:列、行。 */\n tableSizeSelected: (cols: number, rows: number) => string;\n tableAddColumnBefore: string;\n tableAddColumnAfter: string;\n tableDeleteColumn: string;\n tableAddRowBefore: string;\n tableAddRowAfter: string;\n tableDeleteRow: string;\n /** 多格选区:在左侧插入 N 列。 */\n tableAddColumnBeforeN: (n: number) => string;\n /** 多格选区:在右侧插入 N 列。 */\n tableAddColumnAfterN: (n: number) => string;\n /** 多格选区:删除 N 列。 */\n tableDeleteColumnN: (n: number) => string;\n /** 多格选区:在上方插入 N 行。 */\n tableAddRowBeforeN: (n: number) => string;\n /** 多格选区:在下方插入 N 行。 */\n tableAddRowAfterN: (n: number) => string;\n /** 多格选区:删除 N 行。 */\n tableDeleteRowN: (n: number) => string;\n tableDeleteTable: string;\n inlineMath: string;\n blockMath: string;\n mathPlaceholder: string;\n mathDone: string;\n mathCancel: string;\n mathNewInline: string;\n mathNewBlock: string;\n}\n\n/** 斜杠菜单(键入 / 唤起的块级插入弹窗)文案。 */\nexport interface SlashMenuLabels {\n /** 弹窗 aria-label。 */\n menuLabel: string;\n /** 分组标题:文本块。 */\n groupText: string;\n /** 分组标题:列表。 */\n groupList: string;\n /** 分组标题:结构 / 高级块。 */\n groupAdvanced: string;\n normalText: string;\n headingLabel: (level: number) => string;\n bulletList: string;\n orderedList: string;\n taskList: string;\n blockquote: string;\n details: string;\n codeBlock: string;\n divider: string;\n table: string;\n inlineMath: string;\n blockMath: string;\n}\n\nexport interface ChartLabels {\n /** Tab label when config has no title. */\n tabLabel: (chartType: string, index: number) => string;\n done: string;\n cancel: string;\n configLabel: string;\n tableLabel: string;\n /** Modal dialog title. */\n editTitle: string;\n}\n\nexport const defaultChartLabels: ChartLabels = {\n tabLabel: (chartType, index) => `${chartType} ${index + 1}`,\n done: 'Done',\n cancel: 'Cancel',\n configLabel: 'Chart config (JSON)',\n tableLabel: 'Data table (Markdown)',\n editTitle: 'Edit chart',\n};\n\nexport const defaultToolbarLabels: ToolbarLabels = {\n undo: 'Undo',\n redo: 'Redo',\n style: 'Style',\n normalText: 'Normal text',\n headingLabel: (level) => `Heading ${level}`,\n fontSize: 'Font size',\n fontSizeDefault: 'Default',\n bold: 'Bold',\n italic: 'Italic',\n underline: 'Underline',\n strike: 'Strikethrough',\n code: 'Inline code',\n textColor: 'Text color',\n highlight: 'Highlight',\n colorNone: 'None',\n colorTheme: 'THEME',\n scriptMenu: 'Superscript / Subscript',\n scriptNormal: 'Normal',\n superscript: 'Superscript',\n subscript: 'Subscript',\n link: 'Link',\n align: 'Alignment',\n alignLeft: 'Align left',\n alignCenter: 'Align center',\n alignRight: 'Align right',\n alignJustify: 'Justify',\n indent: 'Indent',\n indentIncrease: 'Increase indent',\n indentDecrease: 'Decrease indent',\n lineHeight: 'Line height',\n lineHeightDefault: 'Default',\n linkPrompt: 'Enter URL',\n linkApply: 'Apply link',\n linkOpen: 'Open in new window',\n linkRemove: 'Remove link',\n linkInvalid: 'The editor rejected this address',\n image: 'Image',\n imageUploadFailed: 'Image upload failed',\n imageAlign: 'Image alignment',\n imageAlignLeft: 'Align left',\n imageAlignCenter: 'Align center',\n imageAlignRight: 'Align right',\n imageCaption: 'Caption',\n imageCaptionPlaceholder: 'Add a caption…',\n imageCrop: 'Crop',\n imageCropApply: 'Apply',\n imageCropCancel: 'Cancel',\n imageCropReset: 'Reset crop',\n imagePreview: 'Preview',\n imagePreviewClose: 'Close',\n imagePreviewPrev: 'Previous image',\n imagePreviewNext: 'Next image',\n imagePreviewZoomOut: 'Zoom out',\n imagePreviewZoomIn: 'Zoom in',\n imagePreviewFit: 'Fit',\n imagePreviewRotate: 'Rotate',\n importMarkdownFailed: 'Markdown import failed',\n importDocument: 'Import',\n importDocumentHint: 'Import a file',\n importDocumentOther: 'Document',\n importDocumentBusy: 'Importing…',\n importDocumentUploading: (percent) => `Uploading ${percent}%`,\n importDocumentConverting: 'Converting…',\n importDocumentFailed: 'Import failed',\n blockquote: 'Blockquote',\n details: 'Toggle',\n bulletList: 'Bullet list',\n orderedList: 'Ordered list',\n numberingFormat: 'Numbering format',\n taskList: 'Task list',\n more: 'More',\n search: 'Find & replace',\n codeBlock: 'Code block',\n hr: 'Divider',\n importMarkdown: 'Markdown',\n tableInsert: 'Insert table',\n tableRowMenu: 'Row actions',\n tableColumnMenu: 'Column actions',\n tableClearContent: 'Clear content',\n tableResetCellStyles: 'Reset cell styles',\n tableAppendRow: 'Add row',\n tableAppendColumn: 'Add column',\n tableSizeSelected: (cols, rows) => `${cols} × ${rows}`,\n tableAddColumnBefore: 'Add column before',\n tableAddColumnAfter: 'Add column after',\n tableDeleteColumn: 'Delete column',\n tableAddRowBefore: 'Add row before',\n tableAddRowAfter: 'Add row after',\n tableDeleteRow: 'Delete row',\n tableAddColumnBeforeN: (n) => `Add ${n} columns before`,\n tableAddColumnAfterN: (n) => `Add ${n} columns after`,\n tableDeleteColumnN: (n) => `Delete ${n} columns`,\n tableAddRowBeforeN: (n) => `Add ${n} rows before`,\n tableAddRowAfterN: (n) => `Add ${n} rows after`,\n tableDeleteRowN: (n) => `Delete ${n} rows`,\n tableDeleteTable: 'Delete table',\n inlineMath: 'Inline equation',\n blockMath: 'Block equation',\n mathPlaceholder: 'E = mc^2',\n mathDone: 'Done',\n mathCancel: 'Cancel',\n mathNewInline: 'New equation',\n mathNewBlock: 'Add a TeX equation',\n};\n\n/**\n * 块拖拽手柄和它的菜单。悬停块时出现在左侧,拖动重排,点击出菜单。\n */\nexport interface BlockDragLabels {\n /** 拖拽手柄的 title / aria-label。 */\n dragHandle: string;\n /** 菜单 aria-label。 */\n menuLabel: string;\n /** 「转成」分组标题。 */\n turnInto: string;\n paragraph: string;\n headingLabel: (level: number) => string;\n bulletList: string;\n orderedList: string;\n taskList: string;\n blockquote: string;\n codeBlock: string;\n copy: string;\n duplicate: string;\n resetFormatting: string;\n downloadImage: string;\n delete: string;\n}\n\nexport const defaultBlockDragLabels: BlockDragLabels = {\n dragHandle: 'Drag to move',\n menuLabel: 'Block actions',\n turnInto: 'Turn into',\n paragraph: 'Normal text',\n headingLabel: (level) => `Heading ${level}`,\n bulletList: 'Bullet list',\n orderedList: 'Ordered list',\n taskList: 'Task list',\n blockquote: 'Blockquote',\n codeBlock: 'Code block',\n copy: 'Copy',\n duplicate: 'Duplicate',\n resetFormatting: 'Reset formatting',\n downloadImage: 'Download image',\n delete: 'Delete',\n};\n\nexport const defaultSlashMenuLabels: SlashMenuLabels = {\n menuLabel: 'Insert block',\n groupText: 'Text',\n groupList: 'Lists',\n groupAdvanced: 'Advanced',\n normalText: 'Normal text',\n headingLabel: (level) => `Heading ${level}`,\n bulletList: 'Bullet list',\n orderedList: 'Ordered list',\n taskList: 'Task list',\n blockquote: 'Blockquote',\n details: 'Toggle',\n codeBlock: 'Code block',\n divider: 'Divider',\n table: 'Table',\n inlineMath: 'Inline equation',\n blockMath: 'Block equation',\n};\n\n/** 快捷键抽屉面板(键位 + Markdown 触发写法对照)文案。 */\nexport interface ShortcutLabels {\n /** 抽屉标题。 */\n panelTitle: string;\n /** 关闭按钮 aria / title。 */\n close: string;\n /** 三列表头:格式 / 快捷键 / Markdown。 */\n colFormat: string;\n colShortcut: string;\n colMarkdown: string;\n /** 分组标题。 */\n formatGroup: string;\n insertGroup: string;\n editGroup: string;\n bold: string;\n italic: string;\n strike: string;\n underline: string;\n inlineCode: string;\n highlight: string;\n headingLabel: (level: number) => string;\n paragraph: string;\n blockquote: string;\n bulletList: string;\n orderedList: string;\n taskList: string;\n codeBlock: string;\n divider: string;\n undo: string;\n redo: string;\n hardBreak: string;\n findReplace: string;\n /** 段落对齐四条(官方 TextAlign 的默认键位)。 */\n alignLeft: string;\n alignCenter: string;\n alignRight: string;\n alignJustify: string;\n /** 图片上传占位块(Mod+Shift+I)。 */\n imageUpload: string;\n /** 智能标点:直引号收成弯引号。 */\n smartQuote: string;\n /** 智能标点:`...` 收成省略号。 */\n ellipsis: string;\n /** 智能标点:`--` 收成破折号。 */\n emDash: string;\n /** 表情:`:smile:` 这类短码。 */\n emoji: string;\n}\n\nexport const defaultShortcutLabels: ShortcutLabels = {\n panelTitle: 'Shortcuts',\n close: 'Close',\n colFormat: 'Format',\n colShortcut: 'Shortcut',\n colMarkdown: 'Markdown',\n formatGroup: 'Formatting',\n insertGroup: 'Insert',\n editGroup: 'Editing',\n bold: 'Bold',\n italic: 'Italic',\n strike: 'Strikethrough',\n underline: 'Underline',\n inlineCode: 'Inline code',\n highlight: 'Highlight',\n headingLabel: (level) => `Heading ${level}`,\n paragraph: 'Normal text',\n blockquote: 'Blockquote',\n bulletList: 'Bullet list',\n orderedList: 'Ordered list',\n taskList: 'Task list',\n codeBlock: 'Code block',\n divider: 'Divider',\n undo: 'Undo',\n redo: 'Redo',\n hardBreak: 'Hard break',\n findReplace: 'Find & replace',\n alignLeft: 'Align left',\n alignCenter: 'Align center',\n alignRight: 'Align right',\n alignJustify: 'Justify',\n imageUpload: 'Upload image',\n smartQuote: 'Smart quotes',\n ellipsis: 'Ellipsis',\n emDash: 'Em dash',\n emoji: 'Emoji',\n};\n\n/** 全文统计(官方 CharacterCount)文案。 */\nexport interface CharacterCountLabels {\n /** 统计条的无障碍名。 */\n label: string;\n /** 字符数,如 \"128 characters\"。 */\n characters: (count: number) => string;\n /** 词数,如 \"24 words\"。 */\n words: (count: number) => string;\n}\n\nexport const defaultCharacterCountLabels: CharacterCountLabels = {\n label: 'Document statistics',\n characters: (count) =>\n `${count} ${count === 1 ? 'character' : 'characters'}`,\n words: (count) => `${count} ${count === 1 ? 'word' : 'words'}`,\n};\n\n/** 表情建议列表(键入 `:` 唤起)文案。 */\nexport interface EmojiSuggestionLabels {\n /** 弹窗 aria-label。 */\n menuLabel: string;\n}\n\nexport const defaultEmojiSuggestionLabels: EmojiSuggestionLabels = {\n menuLabel: 'Emoji',\n};\n\n/** 链接编辑浮层(`<LinkPopover>`)文案。 */\nexport interface LinkPopoverLabels {\n /** 输入框占位与无障碍名,也是浮层的 aria-label。 */\n field: string;\n apply: string;\n open: string;\n remove: string;\n /** 地址被编辑器拒绝时的提示(落在输入框 title 上)。 */\n invalid: string;\n}\n\nexport const defaultLinkPopoverLabels: LinkPopoverLabels = {\n field: 'Enter URL',\n apply: 'Apply link',\n open: 'Open in new window',\n remove: 'Remove link',\n invalid: 'The editor rejected this address',\n};\n\nexport interface ColorPaletteLabels {\n none: string;\n theme: string;\n}\n\nexport const defaultColorPaletteLabels: ColorPaletteLabels = {\n none: 'None',\n theme: 'THEME',\n};\n\nexport interface TocLabels {\n title: string;\n expand: string;\n collapse: string;\n}\n\nexport const defaultTocLabels: TocLabels = {\n title: 'Contents',\n expand: 'Expand',\n collapse: 'Collapse',\n};\n\nexport interface CodeBlockLabels {\n autoDetect: string;\n delete: string;\n /** 只读态:复制代码内容。 */\n copy: string;\n /** 只读态:展开超出限高的代码块。 */\n expand: string;\n /** 只读态:收起已展开的代码块。 */\n collapse: string;\n /** 语言选择器的 aria-label。 */\n language: string;\n}\n\nexport const defaultCodeBlockLabels: CodeBlockLabels = {\n autoDetect: 'Auto-detect',\n delete: 'Delete code block',\n copy: 'Copy code',\n expand: 'Expand code',\n collapse: 'Collapse code',\n language: 'Code language',\n};\n\nexport interface CommentLabels {\n open: string;\n resolved: string;\n dismissed: string;\n outdated: string;\n ambiguous: string;\n partial: string;\n gutterTitle: string;\n}\n\nexport const defaultCommentLabels: CommentLabels = {\n open: 'Open',\n resolved: 'Resolved',\n dismissed: 'Dismissed',\n outdated: 'Outdated',\n ambiguous: 'Ambiguous',\n partial: 'Partially matched',\n gutterTitle: 'Comment',\n};\n\nexport interface FindLabels {\n /** 查找输入框的占位与无障碍名,也用作浮动条的 aria-label。 */\n find: string;\n /** 替换输入框的占位与无障碍名。 */\n replace: string;\n next: string;\n previous: string;\n replaceOne: string;\n replaceAll: string;\n close: string;\n caseSensitive: string;\n wholeWord: string;\n useRegex: string;\n /** 计数文案。无结果时 current 传 0;有结果但还没定位到某一条(currentIndex 为 null)时也是 0。 */\n counter: (current: number, total: number) => string;\n /** 正则模式下模式非法(RE2 不支持 lookaround / backreference 等,见官方扩展)。 */\n invalidRegex: string;\n /** 只读态提示:可查不可换。 */\n readOnly: string;\n}\n\nexport const defaultFindLabels: FindLabels = {\n find: 'Find',\n replace: 'Replace with',\n next: 'Next match',\n previous: 'Previous match',\n replaceOne: 'Replace',\n replaceAll: 'Replace all',\n close: 'Close',\n caseSensitive: 'Match case',\n wholeWord: 'Whole word',\n useRegex: 'Use regular expression',\n counter: (current, total) => `${current} / ${total}`,\n invalidRegex: 'Invalid pattern',\n readOnly: 'Read-only',\n};\n\n/** 图片上传占位块(`<MarkdownWysiwygEditor imageUpload={{…}}>`)文案。 */\nexport interface ImageUploadLabels {\n /** 空态主文案前半(下划线强调,对齐官方的 \"Click to upload\"),如 `Click to upload`。 */\n dropzoneClick: string;\n /** 空态主文案后半,如 ` or drag and drop`(中文可写成「,或拖拽到此处」)。 */\n dropzoneRest: string;\n /** 空态副文案:数量与单文件体积上限;`maxSizeMb` 为 null 表示未设上限。 */\n dropzoneLimits: (limit: number, maxSizeMb: number | null) => string;\n /** 多文件排队时的标题,参数为文件数。 */\n uploadingCount: (count: number) => string;\n /** 清空全部排队文件的按钮。 */\n clearAll: string;\n /** 单个文件行的移除按钮(title / aria-label)。 */\n remove: string;\n /** 文件行上传失败时的状态文字(替掉体积位置)。 */\n failed: string;\n /** 上传成功后写入图片 alt / title 的兜底(文件名去扩展名后为空时)。 */\n fallbackAlt: string;\n}\n\nexport const defaultImageUploadLabels: ImageUploadLabels = {\n dropzoneClick: 'Click to upload',\n dropzoneRest: ' or drag and drop',\n dropzoneLimits: (limit, maxSizeMb) => {\n const count = `Maximum ${limit} file${limit === 1 ? '' : 's'}`;\n return maxSizeMb == null ? `${count}.` : `${count}, ${maxSizeMb}MB each.`;\n },\n uploadingCount: (count) => `Uploading ${count} files`,\n clearAll: 'Clear all',\n remove: 'Remove',\n failed: 'Upload failed',\n fallbackAlt: 'image',\n};\n","import type { LocaleBundle } from './types';\n\n/** 内置中文。键必须齐全,宿主不能再补单条。 */\nexport const zh: LocaleBundle = {\n toolbar: {\n undo: '撤销',\n redo: '重做',\n style: '样式',\n normalText: '正文',\n headingLabel: (level) => `标题 ${level}`,\n fontSize: '字号',\n fontSizeDefault: '默认',\n bold: '加粗',\n italic: '斜体',\n underline: '下划线',\n strike: '删除线',\n code: '行内代码',\n textColor: '文字颜色',\n highlight: '高亮',\n colorNone: '无',\n colorTheme: '主题色',\n scriptMenu: '上标 / 下标',\n scriptNormal: '常规',\n superscript: '上标',\n subscript: '下标',\n link: '链接',\n align: '对齐',\n alignLeft: '左对齐',\n alignCenter: '居中',\n alignRight: '右对齐',\n alignJustify: '两端对齐',\n indent: '缩进',\n indentIncrease: '增加缩进',\n indentDecrease: '减少缩进',\n lineHeight: '行高',\n lineHeightDefault: '默认',\n linkPrompt: '输入链接地址',\n linkApply: '应用链接',\n linkOpen: '在新窗口打开',\n linkRemove: '移除链接',\n linkInvalid: '编辑器不接受这个地址',\n image: '图片',\n imageUploadFailed: '图片上传失败',\n imageAlign: '图片对齐',\n imageAlignLeft: '左对齐',\n imageAlignCenter: '居中',\n imageAlignRight: '右对齐',\n imageCaption: '图片描述',\n imageCaptionPlaceholder: '添加描述…',\n imageCrop: '图片剪裁',\n imageCropApply: '应用',\n imageCropCancel: '取消',\n imageCropReset: '重置剪裁',\n imagePreview: '图片预览',\n imagePreviewClose: '关闭',\n imagePreviewPrev: '上一张',\n imagePreviewNext: '下一张',\n imagePreviewZoomOut: '缩小',\n imagePreviewZoomIn: '放大',\n imagePreviewFit: '自适应',\n imagePreviewRotate: '旋转',\n importMarkdownFailed: 'Markdown 导入失败',\n importDocument: '导入',\n importDocumentHint: '导入文件',\n importDocumentOther: '文档',\n importDocumentBusy: '正在导入…',\n importDocumentUploading: (percent) => `上传中 ${percent}%`,\n importDocumentConverting: '正在转换…',\n importDocumentFailed: '导入失败',\n blockquote: '引用',\n details: '折叠块',\n bulletList: '无序列表',\n orderedList: '有序列表',\n numberingFormat: '编号格式',\n taskList: '任务列表',\n more: '更多',\n search: '查找替换',\n codeBlock: '代码块',\n hr: '分隔线',\n importMarkdown: 'Markdown',\n tableInsert: '插入表格',\n tableRowMenu: '行操作',\n tableColumnMenu: '列操作',\n tableClearContent: '清空内容',\n tableResetCellStyles: '重置单元格样式',\n tableAppendRow: '添加行',\n tableAppendColumn: '添加列',\n tableSizeSelected: (cols, rows) => `${cols} × ${rows}`,\n tableAddColumnBefore: '在左侧插入列',\n tableAddColumnAfter: '在右侧插入列',\n tableDeleteColumn: '删除列',\n tableAddRowBefore: '在上方插入行',\n tableAddRowAfter: '在下方插入行',\n tableDeleteRow: '删除行',\n tableAddColumnBeforeN: (n) => `在左侧插入 ${n} 列`,\n tableAddColumnAfterN: (n) => `在右侧插入 ${n} 列`,\n tableDeleteColumnN: (n) => `删除 ${n} 列`,\n tableAddRowBeforeN: (n) => `在上方插入 ${n} 行`,\n tableAddRowAfterN: (n) => `在下方插入 ${n} 行`,\n tableDeleteRowN: (n) => `删除 ${n} 行`,\n tableDeleteTable: '删除表格',\n inlineMath: '行内公式',\n blockMath: '块级公式',\n mathPlaceholder: 'E = mc^2',\n mathDone: '完成',\n mathCancel: '取消',\n mathNewInline: '新建公式',\n mathNewBlock: '插入 TeX 公式',\n },\n slashMenu: {\n menuLabel: '插入块',\n groupText: '文本',\n groupList: '列表',\n groupAdvanced: '高级',\n normalText: '正文',\n headingLabel: (level) => `标题 ${level}`,\n bulletList: '无序列表',\n orderedList: '有序列表',\n taskList: '任务列表',\n blockquote: '引用',\n details: '折叠块',\n codeBlock: '代码块',\n divider: '分隔线',\n table: '表格',\n inlineMath: '行内公式',\n blockMath: '块级公式',\n },\n chart: {\n tabLabel: (chartType, index) => `${chartType} ${index + 1}`,\n done: '完成',\n cancel: '取消',\n configLabel: '图表配置(JSON)',\n tableLabel: '数据表(Markdown)',\n editTitle: '编辑图表',\n },\n blockDrag: {\n dragHandle: '拖动以移动',\n menuLabel: '块操作',\n turnInto: '转换成',\n paragraph: '正文',\n headingLabel: (level) => `标题 ${level}`,\n bulletList: '无序列表',\n orderedList: '有序列表',\n taskList: '任务列表',\n blockquote: '引用',\n codeBlock: '代码块',\n copy: '复制',\n duplicate: '再制一份',\n resetFormatting: '清除格式',\n downloadImage: '下载图片',\n delete: '删除',\n },\n shortcut: {\n panelTitle: '快捷键',\n close: '关闭',\n colFormat: '格式',\n colShortcut: '快捷键',\n colMarkdown: 'Markdown',\n formatGroup: '格式',\n insertGroup: '插入',\n editGroup: '编辑',\n bold: '加粗',\n italic: '斜体',\n strike: '删除线',\n underline: '下划线',\n inlineCode: '行内代码',\n highlight: '高亮',\n headingLabel: (level) => `标题 ${level}`,\n paragraph: '正文',\n blockquote: '引用',\n bulletList: '无序列表',\n orderedList: '有序列表',\n taskList: '任务列表',\n codeBlock: '代码块',\n divider: '分隔线',\n undo: '撤销',\n redo: '重做',\n hardBreak: '硬换行',\n findReplace: '查找替换',\n alignLeft: '左对齐',\n alignCenter: '居中',\n alignRight: '右对齐',\n alignJustify: '两端对齐',\n imageUpload: '上传图片',\n smartQuote: '智能引号',\n ellipsis: '省略号',\n emDash: '破折号',\n emoji: '表情',\n },\n characterCount: {\n label: '字数统计',\n characters: (count) => `${count} 字符`,\n words: (count) => `${count} 词`,\n },\n emoji: {\n menuLabel: '表情',\n },\n link: {\n field: '输入链接地址',\n apply: '应用链接',\n open: '在新窗口打开',\n remove: '移除链接',\n invalid: '编辑器不接受这个地址',\n },\n palette: {\n none: '无',\n theme: '主题色',\n },\n toc: {\n title: '目录',\n expand: '展开',\n collapse: '收起',\n },\n codeBlock: {\n autoDetect: '自动识别',\n delete: '删除代码块',\n copy: '复制代码',\n expand: '展开代码',\n collapse: '收起代码',\n language: '代码语言',\n },\n find: {\n find: '查找',\n replace: '替换为',\n next: '下一处',\n previous: '上一处',\n replaceOne: '替换',\n replaceAll: '全部替换',\n close: '关闭',\n caseSensitive: '区分大小写',\n wholeWord: '全词匹配',\n useRegex: '正则表达式',\n counter: (current, total) => `${current} / ${total}`,\n invalidRegex: '正则无效',\n readOnly: '只读',\n },\n imageUpload: {\n dropzoneClick: '点击上传',\n dropzoneRest: ',或拖拽到此处',\n dropzoneLimits: (limit, maxSizeMb) => {\n const count = `最多 ${limit} 个文件`;\n return maxSizeMb == null ? `${count}。` : `${count},每个 ${maxSizeMb}MB。`;\n },\n uploadingCount: (count) => `正在上传 ${count} 个文件`,\n clearAll: '全部清除',\n remove: '移除',\n failed: '上传失败',\n fallbackAlt: '图片',\n },\n};\n","import {\n defaultBlockDragLabels,\n defaultCharacterCountLabels,\n defaultChartLabels,\n defaultCodeBlockLabels,\n defaultColorPaletteLabels,\n defaultEmojiSuggestionLabels,\n defaultFindLabels,\n defaultImageUploadLabels,\n defaultLinkPopoverLabels,\n defaultShortcutLabels,\n defaultSlashMenuLabels,\n defaultTocLabels,\n defaultToolbarLabels,\n} from '../labels';\nimport type { LocaleBundle, LocaleCode } from './types';\nimport { zh } from './zh';\n\nexport type { LocaleBundle, LocaleCode } from './types';\n\nconst en: LocaleBundle = {\n toolbar: defaultToolbarLabels,\n slashMenu: defaultSlashMenuLabels,\n chart: defaultChartLabels,\n blockDrag: defaultBlockDragLabels,\n shortcut: defaultShortcutLabels,\n characterCount: defaultCharacterCountLabels,\n emoji: defaultEmojiSuggestionLabels,\n link: defaultLinkPopoverLabels,\n palette: defaultColorPaletteLabels,\n toc: defaultTocLabels,\n codeBlock: defaultCodeBlockLabels,\n find: defaultFindLabels,\n imageUpload: defaultImageUploadLabels,\n};\n\nconst bundles: Record<LocaleCode, LocaleBundle> = { en, zh };\n\n/** 取一份完整文案。未知语言回落英文。 */\nexport function getLocaleBundle(locale: LocaleCode = 'en'): LocaleBundle {\n return bundles[locale] ?? en;\n}\n","import { normalizeImageCrop, type ImageCrop } from './imageMarkdown';\n\n/**\n * 图片灯箱的纯逻辑:从正文里收集图、判断点到的是哪一张、以及适应视口的缩放。\n * 阅读态单击打开,编辑态双击或工具条打开;裁剪进行时不抢手势。\n */\n\nexport interface PreviewImage {\n src: string;\n alt: string;\n crop: ImageCrop | null;\n}\n\n/** 灯箱自定义事件。工具条在 body 上,不在正文根里,用它通知所属正文打开这一张。 */\nexport const IMAGE_PREVIEW_EVENT = 'tmr-image-preview';\n\nconst ZOOM_STEP = 1.25;\nconst ZOOM_MIN = 0.25;\nconst ZOOM_MAX = 8;\n/** 视口左右各留出的空隙,避免图贴边。 */\nconst PAD_X = 48;\n/** 视口上下各留出的空隙,给关闭按钮和底部工具条腾位置。 */\nconst PAD_Y = 88;\n\nexport function requestImagePreview(img: HTMLImageElement) {\n img.dispatchEvent(\n new CustomEvent(IMAGE_PREVIEW_EVENT, { bubbles: true, detail: { img } }),\n );\n}\n\n/** 正文里按阅读顺序能预览的图。灯箱自己 portal 出去的图不算。 */\nexport function listPreviewImages(root: ParentNode): HTMLImageElement[] {\n return [...root.querySelectorAll('img')].filter((node): node is HTMLImageElement => {\n if (!(node instanceof HTMLImageElement)) return false;\n if (!node.getAttribute('src')) return false;\n if (node.closest('[data-image-lightbox]')) return false;\n return true;\n });\n}\n\nexport function toPreviewImage(img: HTMLImageElement): PreviewImage {\n return {\n src: img.getAttribute('src') ?? '',\n alt: img.getAttribute('alt') ?? '',\n crop: normalizeImageCrop(img.getAttribute('data-crop')),\n };\n}\n\n/**\n * 点击 / 双击的目标是不是一张正文图。\n * 裁剪进行时、缩放手柄上都不打开,避免和剪裁、缩放抢手势。\n * 裁过的图 img 是 pointer-events:none,点到的是外面的 `.tmr-image-crop`。\n */\nexport function previewImageFromTarget(target: EventTarget | null): HTMLImageElement | null {\n if (!(target instanceof Element)) return null;\n if (target.closest('[data-image-lightbox], [data-resize-handle], [data-image-cropping]')) {\n return null;\n }\n const frame = target.closest('.tmr-image-crop');\n const node = frame ? frame.querySelector('img') : target.closest('img');\n if (!(node instanceof HTMLImageElement)) return null;\n if (!node.getAttribute('src')) return null;\n if (node.closest('[data-image-lightbox]')) return null;\n return node;\n}\n\n/** 灯箱里要显示的像素尺寸:裁剪后是可见区域,不是整张原图。 */\nexport function previewPixelSize(\n naturalWidth: number,\n naturalHeight: number,\n crop: ImageCrop | null,\n): { width: number; height: number } {\n if (naturalWidth <= 0 || naturalHeight <= 0) return { width: 0, height: 0 };\n if (!crop) return { width: naturalWidth, height: naturalHeight };\n return { width: naturalWidth * crop.w, height: naturalHeight * crop.h };\n}\n\nexport interface PreviewFit {\n /** 未旋转时的布局宽(zoom = 1 时正好适应视口)。 */\n width: number;\n /** 未旋转时的布局高。 */\n height: number;\n /** 乘上它之后,屏幕上的一边等于可见区域的像素。放大缩小的上下限用它兜住。 */\n actualZoom: number;\n}\n\n/**\n * zoom = 1 时图适应视口(大图缩小,小图放大,和阅读页灯箱一样铺满可视区域)。\n * 旋转 90/270 后按转过的外接框来适应;返回的宽高仍是旋转前的布局盒,\n * 视觉上的外接框由 CSS rotate 交换。自适应就是 zoom = 1。\n */\nexport function fitPreviewBox(input: {\n viewportWidth: number;\n viewportHeight: number;\n imageWidth: number;\n imageHeight: number;\n rotation: number;\n}): PreviewFit | null {\n const { imageWidth, imageHeight } = input;\n if (imageWidth <= 0 || imageHeight <= 0) return null;\n const quarter = ((input.rotation % 360) + 360) % 360;\n const swapped = quarter === 90 || quarter === 270;\n const screenW = swapped ? imageHeight : imageWidth;\n const screenH = swapped ? imageWidth : imageHeight;\n const availW = Math.max(64, input.viewportWidth - PAD_X * 2);\n const availH = Math.max(64, input.viewportHeight - PAD_Y * 2);\n const fitScale = Math.min(availW / screenW, availH / screenH);\n if (!Number.isFinite(fitScale) || fitScale <= 0) return null;\n return {\n width: imageWidth * fitScale,\n height: imageHeight * fitScale,\n actualZoom: 1 / fitScale,\n };\n}\n\n/** 放大、缩小、自适应(回到适应视口的 zoom = 1)。 */\nexport function nextPreviewZoom(\n action: 'in' | 'out' | 'fit',\n zoom: number,\n actualZoom: number,\n): number {\n if (action === 'fit') return 1;\n const max = Math.max(ZOOM_MAX, actualZoom);\n const min = Math.min(ZOOM_MIN, actualZoom);\n const next = action === 'in' ? zoom * ZOOM_STEP : zoom / ZOOM_STEP;\n return Math.min(max, Math.max(min, next));\n}\n","'use client';\n\nimport {\n useEffect,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport type { LocaleCode } from '../i18n';\nimport { getLocaleBundle } from '../i18n';\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n FitIcon,\n RotateCwIcon,\n XIcon,\n ZoomInIcon,\n ZoomOutIcon,\n} from '../icons';\nimport { cropImageBox } from '../imageMarkdown';\nimport {\n IMAGE_PREVIEW_EVENT,\n fitPreviewBox,\n listPreviewImages,\n nextPreviewZoom,\n previewImageFromTarget,\n previewPixelSize,\n toPreviewImage,\n type PreviewImage,\n} from '../imagePreview';\nimport styles from '../styles/imageLightbox.module.css';\n\n/**\n * 包住一块正文:阅读态单击图片、编辑态双击图片,或收到工具条的预览事件,打开灯箱。\n * 自身 `display: contents`,不改原有布局。\n */\nexport function ImagePreviewHost({\n children,\n locale = 'en',\n activate = 'click',\n}: {\n children: ReactNode;\n locale?: LocaleCode;\n /** 阅读用单击;编辑用双击,单击仍留给选中、缩放和剪裁。 */\n activate?: 'click' | 'dblclick';\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const [session, setSession] = useState<{ images: PreviewImage[]; index: number } | null>(\n null,\n );\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n const openFrom = (img: HTMLImageElement) => {\n if (!el.contains(img)) return;\n const nodes = listPreviewImages(el);\n const index = nodes.indexOf(img);\n if (index < 0) return;\n setSession({ images: nodes.map(toPreviewImage), index });\n };\n const onActivate = (event: Event) => {\n const img = previewImageFromTarget(event.target);\n if (!img) return;\n event.preventDefault();\n openFrom(img);\n };\n const onRequest = (event: Event) => {\n const img = (event as CustomEvent<{ img?: HTMLImageElement }>).detail?.img;\n if (!(img instanceof HTMLImageElement)) return;\n openFrom(img);\n };\n const eventName = activate === 'dblclick' ? 'dblclick' : 'click';\n el.addEventListener(eventName, onActivate);\n el.addEventListener(IMAGE_PREVIEW_EVENT, onRequest);\n return () => {\n el.removeEventListener(eventName, onActivate);\n el.removeEventListener(IMAGE_PREVIEW_EVENT, onRequest);\n };\n }, [activate]);\n\n const labels = getLocaleBundle(locale).toolbar;\n\n return (\n <div\n ref={ref}\n className={styles.root}\n data-image-preview={activate === 'click' ? 'click' : undefined}\n >\n {children}\n {session && typeof document !== 'undefined'\n ? createPortal(\n <ImageLightbox\n images={session.images}\n index={session.index}\n label={labels.imagePreview}\n closeLabel={labels.imagePreviewClose}\n prevLabel={labels.imagePreviewPrev}\n nextLabel={labels.imagePreviewNext}\n zoomOutLabel={labels.imagePreviewZoomOut}\n zoomInLabel={labels.imagePreviewZoomIn}\n fitLabel={labels.imagePreviewFit}\n rotateLabel={labels.imagePreviewRotate}\n onIndex={(index) => setSession((current) => (current ? { ...current, index } : current))}\n onClose={() => setSession(null)}\n />,\n document.body,\n )\n : null}\n </div>\n );\n}\n\nfunction ImageLightbox({\n images,\n index,\n label,\n closeLabel,\n prevLabel,\n nextLabel,\n zoomOutLabel,\n zoomInLabel,\n fitLabel,\n rotateLabel,\n onIndex,\n onClose,\n}: {\n images: PreviewImage[];\n index: number;\n label: string;\n closeLabel: string;\n prevLabel: string;\n nextLabel: string;\n zoomOutLabel: string;\n zoomInLabel: string;\n fitLabel: string;\n rotateLabel: string;\n onIndex: (index: number) => void;\n onClose: () => void;\n}) {\n const image = images[index];\n const dialogRef = useRef<HTMLDivElement>(null);\n const imgRef = useRef<HTMLImageElement>(null);\n const [natural, setNatural] = useState<{ w: number; h: number } | null>(null);\n const [viewport, setViewport] = useState(() => ({\n w: typeof window === 'undefined' ? 0 : window.innerWidth,\n h: typeof window === 'undefined' ? 0 : window.innerHeight,\n }));\n const [zoom, setZoom] = useState(1);\n const [rotation, setRotation] = useState(0);\n\n useEffect(() => {\n setZoom(1);\n setRotation(0);\n setNatural(null);\n }, [index, image?.src]);\n\n useEffect(() => {\n const node = imgRef.current;\n if (!node) return;\n const read = () => {\n if (node.naturalWidth > 0) {\n setNatural({ w: node.naturalWidth, h: node.naturalHeight });\n }\n };\n read();\n node.addEventListener('load', read);\n return () => node.removeEventListener('load', read);\n }, [index, image?.src]);\n\n useEffect(() => {\n const onResize = () => setViewport({ w: window.innerWidth, h: window.innerHeight });\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, []);\n\n useEffect(() => {\n const prev = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n dialogRef.current?.focus();\n return () => {\n document.body.style.overflow = prev;\n };\n }, []);\n\n const pixels = image\n ? previewPixelSize(natural?.w ?? 0, natural?.h ?? 0, image.crop)\n : { width: 0, height: 0 };\n const fit = fitPreviewBox({\n viewportWidth: viewport.w,\n viewportHeight: viewport.h,\n imageWidth: pixels.width,\n imageHeight: pixels.height,\n rotation,\n });\n const actualZoom = fit?.actualZoom ?? 1;\n\n useEffect(() => {\n const onKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n onClose();\n return;\n }\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n event.stopPropagation();\n if (index > 0) onIndex(index - 1);\n return;\n }\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n event.stopPropagation();\n if (index < images.length - 1) onIndex(index + 1);\n return;\n }\n };\n document.addEventListener('keydown', onKey, true);\n return () => document.removeEventListener('keydown', onKey, true);\n }, [images.length, index, onClose, onIndex]);\n\n if (!image) return null;\n\n const applyZoom = (action: 'in' | 'out' | 'fit') => {\n setZoom(nextPreviewZoom(action, zoom, actualZoom));\n };\n\n const cropStyle = image.crop ? cropImageBox(image.crop) : null;\n\n return (\n <div\n ref={dialogRef}\n className={styles.backdrop}\n data-image-lightbox=\"\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={label}\n tabIndex={-1}\n >\n <button\n type=\"button\"\n className={styles.close}\n data-image-preview-action=\"close\"\n title={closeLabel}\n aria-label={closeLabel}\n onClick={onClose}\n >\n <XIcon size={22} />\n </button>\n <div\n className={styles.stage}\n onClick={(event) => {\n if (event.target === event.currentTarget) onClose();\n }}\n >\n <div\n className={styles.frame}\n style={{\n width: fit ? `${fit.width}px` : undefined,\n height: fit ? `${fit.height}px` : undefined,\n visibility: fit ? 'visible' : 'hidden',\n transform: `rotate(${rotation}deg) scale(${zoom})`,\n }}\n >\n <img\n ref={imgRef}\n src={image.src}\n alt={image.alt}\n draggable={false}\n style={\n cropStyle\n ? {\n position: 'absolute',\n maxWidth: 'none',\n width: cropStyle.width,\n height: cropStyle.height,\n left: cropStyle.left,\n top: cropStyle.top,\n }\n : undefined\n }\n />\n </div>\n </div>\n <div className={styles.bar} role=\"toolbar\" aria-label={label}>\n <button\n type=\"button\"\n className={styles.tool}\n data-image-preview-action=\"prev\"\n title={prevLabel}\n aria-label={prevLabel}\n disabled={index <= 0}\n onClick={() => onIndex(index - 1)}\n >\n <ChevronLeftIcon size={16} />\n </button>\n <span className={styles.count}>\n {index + 1}/{images.length}\n </span>\n <button\n type=\"button\"\n className={styles.tool}\n data-image-preview-action=\"next\"\n title={nextLabel}\n aria-label={nextLabel}\n disabled={index >= images.length - 1}\n onClick={() => onIndex(index + 1)}\n >\n <ChevronRightIcon size={16} />\n </button>\n <button\n type=\"button\"\n className={styles.tool}\n data-image-preview-action=\"zoom-out\"\n title={zoomOutLabel}\n aria-label={zoomOutLabel}\n onClick={() => applyZoom('out')}\n >\n <ZoomOutIcon size={16} />\n </button>\n <button\n type=\"button\"\n className={styles.tool}\n data-image-preview-action=\"zoom-in\"\n title={zoomInLabel}\n aria-label={zoomInLabel}\n onClick={() => applyZoom('in')}\n >\n <ZoomInIcon size={16} />\n </button>\n <button\n type=\"button\"\n className={styles.tool}\n data-image-preview-action=\"fit\"\n title={fitLabel}\n aria-label={fitLabel}\n aria-pressed={Math.abs(zoom - 1) < 0.02}\n onClick={() => applyZoom('fit')}\n >\n <FitIcon size={16} />\n </button>\n <button\n type=\"button\"\n className={styles.tool}\n data-image-preview-action=\"rotate\"\n title={rotateLabel}\n aria-label={rotateLabel}\n onClick={() => setRotation((current) => (current + 90) % 360)}\n >\n <RotateCwIcon size={16} />\n </button>\n </div>\n </div>\n );\n}\n","import type { ChartConfig, ChartPayload } from './types';\n\nexport interface ChartJsPoint {\n x: string | number;\n y: number;\n category?: string;\n type?: string;\n}\n\nfunction toNumber(value: unknown): number {\n if (typeof value === 'number' && !Number.isNaN(value)) return value;\n if (typeof value === 'string') {\n const n = Number(value.replace(/,/g, ''));\n if (!Number.isNaN(n)) return n;\n }\n return 0;\n}\n\n/**\n * Map table rows to flat chart points for one config.\n * colorLegend → series `type`; groupBy stored as category (no UI filter in v1).\n */\nexport function mapChartDataItems(\n config: ChartConfig,\n dataSource: Record<string, unknown>[],\n): ChartJsPoint[] {\n const xKey = config.x!;\n const yKey = config.y!;\n const legendKey = config.colorLegend;\n const groupKey = config.groupBy;\n\n let rows = [...dataSource];\n const sortKey = config.sortBy;\n if (sortKey) {\n rows.sort((a, b) => {\n const av = a[sortKey];\n const bv = b[sortKey];\n if (typeof av === 'number' && typeof bv === 'number') return av - bv;\n return String(av ?? '').localeCompare(String(bv ?? ''), undefined, {\n numeric: true,\n });\n });\n }\n\n return rows.map((row) => {\n const point: ChartJsPoint = {\n x: row[xKey] as string | number,\n y: toNumber(row[yKey]),\n };\n if (legendKey) point.type = String(row[legendKey] ?? '');\n if (groupKey) point.category = String(row[groupKey] ?? '');\n return point;\n });\n}\n\nexport interface BuiltChartData {\n labels: string[];\n datasets: {\n label: string;\n data: number[];\n }[];\n isCartesian: boolean;\n}\n\n/** Build Chart.js labels/datasets for one active config. */\nexport function buildChartJsData(\n config: ChartConfig,\n payload: Pick<ChartPayload, 'dataSource'>,\n): BuiltChartData {\n const points = mapChartDataItems(config, payload.dataSource);\n const type = config.chartType;\n const isCartesian = !['pie', 'donut'].includes(type);\n\n if (!isCartesian) {\n return {\n labels: points.map((p) => String(p.x)),\n datasets: [\n {\n label: config.title || config.y || 'value',\n data: points.map((p) => p.y),\n },\n ],\n isCartesian: false,\n };\n }\n\n const seriesKeys = new Set<string>();\n for (const p of points) {\n seriesKeys.add(p.type || config.title || config.y || 'series');\n }\n const seriesList = [...seriesKeys];\n const labelSet: string[] = [];\n for (const p of points) {\n const lab = String(p.x);\n if (!labelSet.includes(lab)) labelSet.push(lab);\n }\n\n const datasets = seriesList.map((series) => ({\n label: series,\n data: labelSet.map((lab) => {\n const hit = points.find(\n (p) =>\n String(p.x) === lab &&\n (p.type || config.title || config.y || 'series') === series,\n );\n return hit ? hit.y : 0;\n }),\n }));\n\n return { labels: labelSet, datasets, isCartesian: true };\n}\n","import type { ChartTheme } from './types';\n\nconst DEFAULT_PALETTE = [\n '#3b82f6',\n '#10b981',\n '#f59e0b',\n '#ef4444',\n '#8b5cf6',\n '#06b6d4',\n '#ec4899',\n '#84cc16',\n];\n\nfunction readCssVar(\n el: HTMLElement | null,\n name: string,\n fallback: string,\n): string {\n if (!el || typeof getComputedStyle === 'undefined') return fallback;\n const v = getComputedStyle(el).getPropertyValue(name).trim();\n return v || fallback;\n}\n\n/** Resolve theme from --tmr-* CSS variables + optional host override. */\nexport function resolveChartTheme(\n host: HTMLElement | null,\n override?: ChartTheme | null,\n): Required<\n Pick<\n ChartTheme,\n | 'backgroundColor'\n | 'textColor'\n | 'gridColor'\n | 'borderColor'\n | 'fontFamily'\n | 'palette'\n >\n> {\n const base = {\n backgroundColor: readCssVar(host, '--tmr-bg', '#ffffff'),\n textColor: readCssVar(host, '--tmr-fg', '#1f2937'),\n gridColor: readCssVar(host, '--tmr-border', '#e5e7eb'),\n borderColor: readCssVar(host, '--tmr-border', '#e5e7eb'),\n fontFamily: readCssVar(\n host,\n '--tmr-font',\n 'ui-sans-serif, system-ui, sans-serif',\n ),\n palette: DEFAULT_PALETTE,\n };\n if (!override) return base;\n return {\n backgroundColor: override.backgroundColor ?? base.backgroundColor,\n textColor: override.textColor ?? base.textColor,\n gridColor: override.gridColor ?? base.gridColor,\n borderColor: override.borderColor ?? base.borderColor,\n fontFamily: override.fontFamily ?? base.fontFamily,\n palette:\n override.palette && override.palette.length > 0\n ? override.palette\n : base.palette,\n };\n}\n","import {\n ArcElement,\n BarController,\n BarElement,\n CategoryScale,\n Chart,\n DoughnutController,\n Filler,\n Legend,\n LineController,\n LineElement,\n LinearScale,\n PieController,\n PointElement,\n Tooltip,\n type ChartConfiguration,\n type ChartType,\n} from 'chart.js';\nimport { buildChartJsData } from './mapData';\nimport { resolveChartTheme } from './theme';\nimport type { ChartConfig, ChartPayload, ChartTheme } from './types';\n\nlet registered = false;\n\nfunction ensureRegister() {\n if (registered) return;\n if (typeof window === 'undefined') return;\n Chart.register(\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n BarElement,\n ArcElement,\n LineController,\n BarController,\n PieController,\n DoughnutController,\n Filler,\n Legend,\n Tooltip,\n );\n registered = true;\n}\n\nfunction toChartJsType(chartType: string): ChartType {\n switch (chartType) {\n case 'bar':\n return 'bar';\n case 'column':\n return 'bar';\n case 'line':\n return 'line';\n case 'area':\n return 'line';\n case 'pie':\n return 'pie';\n case 'donut':\n return 'doughnut';\n default:\n return 'bar';\n }\n}\n\nexport interface RenderChartOptions {\n canvas: HTMLCanvasElement;\n config: ChartConfig;\n payload: Pick<ChartPayload, 'dataSource' | 'columns'>;\n theme?: ChartTheme | null;\n /** Existing instance to update in place (streaming). */\n chart?: Chart | null;\n}\n\nexport function renderOrUpdateChart({\n canvas,\n config,\n payload,\n theme,\n chart,\n}: RenderChartOptions): Chart | null {\n if (typeof window === 'undefined') return null;\n ensureRegister();\n\n const host = canvas.parentElement;\n const colors = resolveChartTheme(host, theme);\n const built = buildChartJsData(config, payload);\n const jsType = toChartJsType(config.chartType);\n const isBarHorizontal = config.chartType === 'bar';\n const isArea = config.chartType === 'area';\n\n const datasets = built.datasets.map((ds, i) => {\n const color = colors.palette[i % colors.palette.length];\n if (!built.isCartesian) {\n return {\n ...ds,\n backgroundColor: built.labels.map(\n (_, j) => colors.palette[j % colors.palette.length],\n ),\n borderWidth: 0,\n };\n }\n return {\n ...ds,\n backgroundColor: isArea ? `${color}33` : color,\n borderColor: color,\n borderWidth: 2,\n fill: isArea,\n tension: 0.25,\n };\n });\n\n const configuration: ChartConfiguration = {\n type: jsType,\n data: {\n labels: built.labels,\n datasets,\n },\n options: {\n indexAxis: isBarHorizontal ? 'y' : 'x',\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: {\n display: built.datasets.length > 1 || !built.isCartesian,\n labels: {\n color: colors.textColor,\n font: { family: colors.fontFamily },\n },\n },\n title: { display: false },\n tooltip: {\n titleFont: { family: colors.fontFamily },\n bodyFont: { family: colors.fontFamily },\n },\n },\n scales: built.isCartesian\n ? {\n x: {\n ticks: {\n color: colors.textColor,\n font: { family: colors.fontFamily },\n },\n grid: { color: colors.gridColor },\n border: { color: colors.borderColor },\n },\n y: {\n ticks: {\n color: colors.textColor,\n font: { family: colors.fontFamily },\n },\n grid: { color: colors.gridColor },\n border: { color: colors.borderColor },\n },\n }\n : undefined,\n },\n };\n\n if (chart) {\n (chart.config as { type: ChartType }).type = jsType;\n chart.data.labels = configuration.data.labels;\n chart.data.datasets = configuration.data.datasets as never;\n chart.options = configuration.options as never;\n chart.update('none');\n return chart;\n }\n\n return new Chart(canvas, configuration);\n}\n\nexport function destroyChart(chart: Chart | null | undefined) {\n chart?.destroy();\n}\n","/**\n * 目录点击 → 平滑滚到对应标题。\n *\n * 不依赖浏览器 `scrollTo({behavior:'smooth'})` / `scrollIntoView({behavior:'smooth'})`——\n * 在 flex + overflow 嵌套布局下(父级 `overflow:hidden`、自身 `flex:1; overflow-y:auto`),\n * Chrome 的 compositor 驱动 smooth scroll 会静默失效。\n *\n * 改用 `requestAnimationFrame` + easeOutCubic 缓动,直接操作 `scrollTop`,\n * 主线程一次性 400ms 动画,点击触发的单次滚动无感知性能差异。\n *\n * 尊重 `prefers-reduced-motion: reduce`——此时瞬间跳转,无动画。\n */\n\n/** 缓动:easeOutCubic。t ∈ [0, 1]。 */\nfunction easeOutCubic(t: number): number {\n return 1 - (1 - t) * (1 - t) * (1 - t);\n}\n\n/**\n * 平滑滚动(或瞬间跳转)到指定 `data-toc-id` 的标题。\n *\n * @param headingId - TOC item 的 id,对应 DOM 上 `data-toc-id` 属性值\n * @param scrollContainer - 滚动容器(如 `.scrollArea`)\n * @param options - `duration`:动画时长 ms,默认 400\n */\nexport function scrollToTocHeading(\n headingId: string,\n scrollContainer: HTMLElement,\n options?: { duration?: number },\n): void {\n const el = scrollContainer.querySelector<HTMLElement>(\n `[data-toc-id=\"${CSS.escape(headingId)}\"]`,\n );\n if (!el) return;\n\n const startTop = scrollContainer.scrollTop;\n const rootRect = scrollContainer.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n const targetTop = startTop + (elRect.top - rootRect.top);\n\n // prefers-reduced-motion:瞬间跳转\n if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\n scrollContainer.scrollTop = targetTop;\n return;\n }\n\n // 手动平滑滚动\n const duration = options?.duration ?? 400;\n const start = performance.now();\n const animate = () => {\n const t = Math.min((performance.now() - start) / duration, 1);\n scrollContainer.scrollTop = startTop + (targetTop - startTop) * easeOutCubic(t);\n if (t < 1) requestAnimationFrame(animate);\n };\n requestAnimationFrame(animate);\n}\n","'use client';\n\nimport { useEffect, useRef, useState, type CSSProperties } from 'react';\nimport { getLocaleBundle, type LocaleCode } from '../i18n';\nimport styles from '../styles/editorToc.module.css';\nimport type { TocItem } from '../toc/extractToc';\nimport { scrollToTocHeading } from '../toc/scrollToTocHeading';\n\n/** 短横线宽度:层级越高越长。 */\nfunction barWidth(level: number): number {\n if (level <= 1) return 20;\n if (level === 2) return 14;\n if (level === 3) return 10;\n return 6;\n}\n\n/**\n * 最近的可滚动祖先。限高但还没溢出的容器也算(内容变长后由它滚)。\n * 都没有时用文档滚动根。\n */\nfunction findScrollParent(start: HTMLElement): HTMLElement {\n let node: HTMLElement | null = start.parentElement;\n while (node && node !== document.documentElement) {\n const style = getComputedStyle(node);\n const overflowY = style.overflowY;\n const canScroll =\n overflowY === 'auto' || overflowY === 'scroll' || overflowY === 'overlay';\n if (\n canScroll &&\n (node.scrollHeight > node.clientHeight + 1 || style.maxHeight !== 'none')\n ) {\n return node;\n }\n node = node.parentElement;\n }\n return (document.scrollingElement as HTMLElement) ?? document.documentElement;\n}\n\nfunction isViewportScroller(node: HTMLElement): boolean {\n return (\n node === document.documentElement ||\n node === document.body ||\n node === document.scrollingElement\n );\n}\n\n/**\n * 标题顶到达滚动区顶,才算滚到这一节。\n * 有 scroll-margin-top 时激活线跟着下移(阅读页用它给固定顶栏留空)。\n */\nfunction headingHasArrived(heading: HTMLElement, rootTop: number): boolean {\n const margin = Number.parseFloat(getComputedStyle(heading).scrollMarginTop);\n const line = rootTop + (Number.isFinite(margin) && margin > 0 ? margin : 8);\n return heading.getBoundingClientRect().top <= line;\n}\n\nexport interface EditorTocProps {\n items: TocItem[];\n /** 编辑器正文根节点,用来找标题和滚动容器。 */\n editorDom: HTMLElement;\n locale?: LocaleCode;\n}\n\n/**\n * 编辑器内目录(Notion 式,贴在左缘)。\n * 收起是一列短横线;悬停或聚焦向右展开标题,点击滚到对应标题。\n */\nexport function EditorToc({ items, editorDom, locale = 'en' }: EditorTocProps) {\n const t = getLocaleBundle(locale).toc;\n const [open, setOpen] = useState(false);\n const [activeId, setActiveId] = useState(items[0]?.id ?? '');\n const [roving, setRoving] = useState(0);\n const navRef = useRef<HTMLElement>(null);\n const itemRefs = useRef<Array<HTMLButtonElement | null>>([]);\n const hideTimer = useRef<number | null>(null);\n /** 点选后先钉住这一项。正文不够长、滚不到激活线时,滚动监听不能把它盖掉。 */\n const pinnedId = useRef<string | null>(null);\n const pinScroll = useRef<number | null>(null);\n const pinTimer = useRef<number | null>(null);\n /** 卸掉「滚动停稳再记下位置」的监听。新的点选会先取消上一次。 */\n const cancelPinWatch = useRef<(() => void) | null>(null);\n /** 按下后等到松开再开始计时,按住不放时不会提前交还高亮。 */\n const cancelPointerWait = useRef<(() => void) | null>(null);\n const cardRef = useRef<HTMLDivElement>(null);\n\n const clearHide = () => {\n if (hideTimer.current !== null) {\n window.clearTimeout(hideTimer.current);\n hideTimer.current = null;\n }\n };\n\n const show = () => {\n clearHide();\n setOpen(true);\n };\n\n const hideSoon = () => {\n clearHide();\n hideTimer.current = window.setTimeout(() => {\n hideTimer.current = null;\n if (navRef.current?.contains(document.activeElement)) return;\n setOpen(false);\n }, 80);\n };\n\n useEffect(\n () => () => {\n clearHide();\n cancelPointerWait.current?.();\n cancelPinWatch.current?.();\n },\n [],\n );\n\n // 当前章节是已经滚过激活线的最后一个标题。下一节要自己顶到线,才会接过高亮。\n useEffect(() => {\n const headings = items\n .map((item) =>\n editorDom.querySelector<HTMLElement>(\n `[data-toc-id=\"${CSS.escape(item.id)}\"]`,\n ),\n )\n .filter((el): el is HTMLElement => el !== null);\n if (!headings.length) return;\n\n const scrollParent = findScrollParent(editorDom);\n const viewport = isViewportScroller(scrollParent);\n\n const scrollPos = () =>\n viewport ? window.scrollY : scrollParent.scrollTop;\n\n const apply = () => {\n const pos = scrollPos();\n if (pinnedId.current) {\n const lockedAt = pinScroll.current;\n if (lockedAt === null || Math.abs(pos - lockedAt) <= 2) {\n setActiveId(pinnedId.current);\n return;\n }\n pinnedId.current = null;\n pinScroll.current = null;\n }\n\n const maxScroll = viewport\n ? Math.max(\n 0,\n (document.scrollingElement?.scrollHeight ?? 0) - window.innerHeight,\n )\n : Math.max(0, scrollParent.scrollHeight - scrollParent.clientHeight);\n // 已经滚到底、后面没有更多正文时,当前项是视口里最靠下的标题。\n if (maxScroll > 1 && pos >= maxScroll - 2) {\n const rootBottom = viewport\n ? window.innerHeight\n : scrollParent.getBoundingClientRect().bottom;\n let lastInView: HTMLElement | null = null;\n for (const heading of headings) {\n if (heading.getBoundingClientRect().top < rootBottom - 8) {\n lastInView = heading;\n }\n }\n const id = (lastInView ?? headings[headings.length - 1]).getAttribute(\n 'data-toc-id',\n );\n if (id) setActiveId(id);\n return;\n }\n\n const rootTop = viewport ? 0 : scrollParent.getBoundingClientRect().top;\n let current = headings[0];\n for (const heading of headings) {\n if (!headingHasArrived(heading, rootTop)) break;\n current = heading;\n }\n const id = current.getAttribute('data-toc-id');\n if (id) setActiveId(id);\n };\n\n const onScroll = () => apply();\n const scrollTarget: HTMLElement | Window = viewport ? window : scrollParent;\n scrollTarget.addEventListener('scroll', onScroll, { passive: true });\n apply();\n\n return () => {\n scrollTarget.removeEventListener('scroll', onScroll);\n };\n }, [items, editorDom]);\n\n // 目录没被键盘占用时,下一个 Tab 落在当前章节上。\n useEffect(() => {\n if (navRef.current?.contains(document.activeElement)) return;\n const index = items.findIndex((item) => item.id === activeId);\n if (index >= 0) setRoving(index);\n }, [activeId, items]);\n\n // 只滚目录卡片自己。scrollIntoView 会把页面一起带走,阅读页的窗口滚动会被它拽偏。\n useEffect(() => {\n if (!open || !activeId) return;\n const card = cardRef.current;\n const button = card?.querySelector<HTMLElement>(\n `[data-toc-item=\"${CSS.escape(activeId)}\"]`,\n );\n if (!card || !button) return;\n const cardRect = card.getBoundingClientRect();\n const buttonRect = button.getBoundingClientRect();\n if (buttonRect.top < cardRect.top) {\n card.scrollTop -= cardRect.top - buttonRect.top;\n } else if (buttonRect.bottom > cardRect.bottom) {\n card.scrollTop += buttonRect.bottom - cardRect.bottom;\n }\n }, [activeId, open]);\n\n // 键盘落在短横线上时,焦点交给已经展开的标题按钮。\n useEffect(() => {\n if (!open || !navRef.current) return;\n const rail = navRef.current.querySelector('[data-toc-rail]');\n if (!rail?.contains(document.activeElement)) return;\n const index = Math.max(\n 0,\n items.findIndex((item) => item.id === activeId),\n );\n itemRefs.current[index]?.focus();\n }, [open, activeId, items]);\n\n /**\n * 滚动停稳后再记下位置。停稳前 pinScroll 一直是 null,滚动监听只能维持钉住的项。\n * 阅读页的平滑滚动常常超过库内那 400ms,不能用固定延时提前解锁。\n */\n const watchPinRelease = (itemId: string, scroller: HTMLElement) => {\n cancelPinWatch.current?.();\n const scrollTarget: HTMLElement | Window = isViewportScroller(scroller)\n ? window\n : scroller;\n let settled = false;\n const lock = () => {\n if (settled) return;\n settled = true;\n scrollTarget.removeEventListener('scroll', arm);\n scrollTarget.removeEventListener('scrollend', lock);\n if (pinTimer.current !== null) {\n window.clearTimeout(pinTimer.current);\n pinTimer.current = null;\n }\n if (cancelPinWatch.current === cancel) cancelPinWatch.current = null;\n if (pinnedId.current !== itemId) return;\n pinScroll.current = isViewportScroller(scroller)\n ? window.scrollY\n : scroller.scrollTop;\n };\n const arm = () => {\n if (settled) return;\n if (pinTimer.current !== null) window.clearTimeout(pinTimer.current);\n pinTimer.current = window.setTimeout(lock, 100);\n };\n const cancel = () => {\n if (settled) return;\n settled = true;\n scrollTarget.removeEventListener('scroll', arm);\n scrollTarget.removeEventListener('scrollend', lock);\n if (pinTimer.current !== null) {\n window.clearTimeout(pinTimer.current);\n pinTimer.current = null;\n }\n if (cancelPinWatch.current === cancel) cancelPinWatch.current = null;\n };\n cancelPinWatch.current = cancel;\n scrollTarget.addEventListener('scroll', arm, { passive: true });\n scrollTarget.addEventListener('scrollend', lock);\n arm();\n };\n\n /** 立刻高亮这一项,并清掉上一次的解锁计时。 */\n const pinHighlight = (item: TocItem) => {\n cancelPinWatch.current?.();\n const scroller = findScrollParent(editorDom);\n pinnedId.current = item.id;\n pinScroll.current = null;\n setActiveId(item.id);\n return scroller;\n };\n\n const jump = (item: TocItem) => {\n const scroller = pinHighlight(item);\n watchPinRelease(item.id, scroller);\n scrollToTocHeading(item.id, scroller);\n };\n\n /**\n * 按下就钉住高亮。阅读页会在捕获阶段停掉 click、自己滚窗口,\n * click 上的 setState 到不了;pointerdown 先于那次拦截。\n * 松开后再等滚动停稳,按住按钮时不会把高亮交回去。\n */\n const pressItem = (item: TocItem, event: { button: number }) => {\n if (event.button !== 0) return;\n cancelPointerWait.current?.();\n const scroller = pinHighlight(item);\n const stop = () => {\n window.removeEventListener('pointerup', stop);\n window.removeEventListener('pointercancel', stop);\n if (cancelPointerWait.current === stop) cancelPointerWait.current = null;\n watchPinRelease(item.id, scroller);\n };\n cancelPointerWait.current = stop;\n window.addEventListener('pointerup', stop);\n window.addEventListener('pointercancel', stop);\n };\n\n const move = (delta: number) => {\n const next = Math.min(items.length - 1, Math.max(0, roving + delta));\n setRoving(next);\n setOpen(true);\n itemRefs.current[next]?.focus();\n };\n\n return (\n <div className={styles.anchor}>\n <nav\n ref={navRef}\n className={styles.nav}\n aria-label={t.title}\n data-editor-toc=\"\"\n onMouseEnter={show}\n onMouseLeave={hideSoon}\n onFocus={show}\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) hideSoon();\n }}\n onKeyDown={(event) => {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n move(1);\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n move(-1);\n } else if (event.key === 'Escape') {\n setOpen(false);\n }\n }}\n >\n <ul className={styles.rail} data-toc-rail=\"\" aria-hidden={open} inert={open}>\n {items.map((item, index) => {\n const active = item.id === activeId;\n return (\n <li key={item.id}>\n <button\n type=\"button\"\n tabIndex={!open && index === roving ? 0 : -1}\n className={styles.tick}\n style={{ '--bar-width': `${barWidth(item.level)}px` } as CSSProperties}\n aria-current={active ? 'true' : undefined}\n aria-label={item.text}\n onPointerDown={(event) => pressItem(item, event)}\n onClick={() => jump(item)}\n >\n <span className={active ? styles.barActive : styles.bar} />\n </button>\n </li>\n );\n })}\n </ul>\n <div\n ref={cardRef}\n className={open ? styles.cardOpen : styles.card}\n inert={!open}\n >\n <div className={styles.cardInner}>\n <ul className={styles.list}>\n {items.map((item, index) => {\n const active = item.id === activeId;\n return (\n <li key={item.id}>\n <button\n type=\"button\"\n ref={(node) => {\n itemRefs.current[index] = node;\n }}\n data-toc-item={item.id}\n tabIndex={open && index === roving ? 0 : -1}\n className={active ? `${styles.item} ${styles.itemActive}` : styles.item}\n style={\n {\n '--toc-indent': `${(item.level - 1) * 12 + 10}px`,\n } as CSSProperties\n }\n aria-current={active ? 'true' : undefined}\n aria-label={item.text}\n onPointerDown={(event) => pressItem(item, event)}\n onClick={() => jump(item)}\n >\n <span className={styles.itemText}>{item.text}</span>\n </button>\n </li>\n );\n })}\n </ul>\n </div>\n </div>\n </nav>\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\n\n/**\n * 是否窄屏(默认 <768px)。取代原项目的 useDevice,内联为纯 matchMedia,\n * 无第三方依赖。SSR 首帧返回 false,挂载后按实际视口更新。\n */\nexport function useIsMobile(breakpoint = 768): boolean {\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n const mq = window.matchMedia(`(max-width: ${breakpoint - 1}px)`);\n const update = () => setIsMobile(mq.matches);\n update();\n mq.addEventListener('change', update);\n return () => mq.removeEventListener('change', update);\n }, [breakpoint]);\n\n return isMobile;\n}\n","import type { TocItem } from './extractToc';\n\nconst HEADING_TAG = /^H([1-6])$/;\n\nexport function sameTocItems(a: TocItem[], b: TocItem[]): boolean {\n if (a.length !== b.length) return false;\n return a.every(\n (item, index) =>\n item.id === b[index]?.id &&\n item.level === b[index]?.level &&\n item.text === b[index]?.text,\n );\n}\n\n/** 从已渲染的标题上收集目录。只认带 data-toc-id 的 h1–h6。 */\nexport function readTocItems(root: ParentNode): TocItem[] {\n const nodes = root.querySelectorAll<HTMLElement>('[data-toc-id]');\n const items: TocItem[] = [];\n nodes.forEach((el) => {\n const id = el.getAttribute('data-toc-id');\n const match = HEADING_TAG.exec(el.tagName);\n if (!id || !match) return;\n const text = (el.textContent ?? '').replace(/\\s+/g, ' ').trim();\n if (!text) return;\n items.push({ id, level: Number(match[1]), text });\n });\n return items;\n}\n","/**\n * 从事件目标向上找到 `.citation-ref`(且必须在 root 内)。\n * SSR 阅读页事件委托与单测共用。\n */\nexport function findCitationRefElement(\n target: EventTarget | null,\n root: ParentNode,\n): HTMLElement | null {\n let node: Node | null = null;\n if (target instanceof Element) node = target;\n else if (target instanceof Text) node = target.parentElement;\n else if (target instanceof Node) node = target.parentElement;\n if (!(node instanceof Element)) return null;\n const el = node.closest('.citation-ref');\n if (!(el instanceof HTMLElement)) return null;\n if (!root.contains(el)) return null;\n return el;\n}\n\n/** 从圆标 DOM 读取 attrs(与 CitationRef renderHTML 的 data-* 对齐)。 */\nexport function readCitationAttrs(el: HTMLElement): {\n index: string;\n url: string | null;\n title: string | null;\n} {\n return {\n index: el.getAttribute('data-index') || el.textContent?.trim() || '',\n url: el.getAttribute('data-url'),\n title: el.getAttribute('data-title'),\n };\n}\n","'use client';\n\nimport { useEffect, useRef, type RefObject } from 'react';\nimport {\n findCitationRefElement,\n readCitationAttrs,\n} from '../citationDom';\nimport type {\n OnCitationEnter,\n OnCitationLeave,\n} from '../citationTypes';\n\nexport interface CitationInteractiveProps {\n /**\n * 包含 `ReportContent` HTML 的根节点(其内应有 `.citation-ref`)。\n * 用同一 ref 包住 ReportContent 即可。\n */\n containerRef: RefObject<HTMLElement | null>;\n /** 点击圆标。宿主据此 setState 打开自己的 Popover。 */\n onCitationEnter: OnCitationEnter;\n /**\n * 点正文非圆标处 / 再点同一圆标 / Escape。\n * 库立即回调;浮层开关由宿主管。\n */\n onCitationLeave: OnCitationLeave;\n}\n\n/**\n * SSR 阅读页脚注增强:只做 **click** 事件委托,不持有 open 状态。\n *\n * ```tsx\n * <CitationInteractive\n * containerRef={ref}\n * onCitationEnter={setActive}\n * onCitationLeave={() => setActive(null)}\n * />\n * ```\n */\nexport function CitationInteractive({\n containerRef,\n onCitationEnter,\n onCitationLeave,\n}: CitationInteractiveProps) {\n const enterRef = useRef(onCitationEnter);\n const leaveRef = useRef(onCitationLeave);\n enterRef.current = onCitationEnter;\n leaveRef.current = onCitationLeave;\n\n useEffect(() => {\n const root = containerRef.current;\n if (!root) return;\n\n let currentEl: HTMLElement | null = null;\n\n const emitEnter = (el: HTMLElement) => {\n currentEl = el;\n const attrs = readCitationAttrs(el);\n enterRef.current({ index: attrs.index, attrs, anchorEl: el });\n };\n\n const emitLeave = () => {\n if (!currentEl) return;\n currentEl = null;\n leaveRef.current();\n };\n\n const ACTIVE_ATTR = 'data-tmr-citation-active';\n\n const onClick = (e: MouseEvent) => {\n const el = findCitationRefElement(e.target, root);\n if (el) {\n // 捕获阶段就取消默认,避免圆标内 <a> 跳转\n e.preventDefault();\n e.stopPropagation();\n // 仅当该圆标仍处于打开态时再点才关闭(宿主可能已外部关闭,attr 已清)\n if (el === currentEl && el.hasAttribute(ACTIVE_ATTR)) {\n emitLeave();\n return;\n }\n emitEnter(el);\n return;\n }\n emitLeave();\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') emitLeave();\n };\n\n root.addEventListener('click', onClick, true);\n document.addEventListener('keydown', onKeyDown);\n\n return () => {\n root.removeEventListener('click', onClick, true);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [containerRef]);\n\n return null;\n}\n","'use client';\n\nimport { useLayoutEffect, useRef, useState, type ReactNode } from 'react';\nimport type { LocaleCode } from '../i18n';\nimport { useIsMobile } from '../hooks/useIsMobile';\nimport styles from '../styles/content.module.css';\nimport { readTocItems, sameTocItems } from '../toc/readTocItems';\nimport type { TocItem } from '../toc/extractToc';\nimport { EditorToc } from './EditorToc';\n\nexport function ContentOutline({\n toc = false,\n locale = 'en',\n watch,\n children,\n}: {\n /** 内置左缘目录。默认关。无标题或宽度小于 768px 时也不显示。 */\n toc?: boolean;\n locale?: LocaleCode;\n /** 正文变化时重读标题,一般传 html 字符串。 */\n watch?: string;\n children: ReactNode;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const [items, setItems] = useState<TocItem[]>([]);\n const mobile = useIsMobile(768);\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el || !toc) {\n setItems((prev) => (prev.length === 0 ? prev : []));\n return;\n }\n const read = () => {\n const next = readTocItems(el);\n setItems((prev) => (sameTocItems(prev, next) ? prev : next));\n };\n read();\n const observer = new MutationObserver(read);\n observer.observe(el, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n return () => observer.disconnect();\n }, [toc, watch]);\n\n const root = ref.current;\n const show = toc && !mobile && items.length > 0 && root !== null;\n\n return (\n <div className={styles.editorHost}>\n {show && root ? (\n <EditorToc items={items} editorDom={root} locale={locale} />\n ) : null}\n <div ref={ref} className={show ? styles.withToc : undefined}>\n {children}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport type { LocaleCode } from '../i18n';\nimport {\n ReportContent,\n type ReportContentProps,\n} from '../ReportContent';\nimport { ContentOutline } from './ContentOutline';\nimport { ImagePreviewHost } from './ImageLightbox';\n\nexport interface ReaderReportContentProps extends ReportContentProps {\n /**\n * 内置左缘目录(默认关闭)。传入后,有 `data-toc-id` 的标题时显示短横线,\n * 悬停展开,点击滚动。宽度小于 768px 时不显示。\n */\n toc?: boolean;\n /** 目录按钮的无障碍文案。默认英文。 */\n locale?: LocaleCode;\n}\n\n/**\n * `./reader` 的 ReportContent:静态 HTML 加上和编辑器同一套左缘目录。\n * `./server` 导出的同名组件仍是纯 HTML,没有这块界面。\n */\nexport function ReaderReportContent({\n html,\n className,\n toc = false,\n locale = 'en',\n ...rest\n}: ReaderReportContentProps) {\n return (\n <ContentOutline toc={toc} locale={locale} watch={html}>\n <ImagePreviewHost locale={locale} activate=\"click\">\n <ReportContent html={html} className={className} {...rest} />\n </ImagePreviewHost>\n </ContentOutline>\n );\n}\n","'use client';\n\nimport { useRef, type ComponentProps } from 'react';\nimport type { OnCitationEnter, OnCitationLeave } from '../citationTypes';\nimport type { LocaleCode } from '../i18n';\nimport { ReportContent } from '../ReportContent';\nimport { CitationInteractive } from './CitationInteractive';\nimport { ReaderReportContent } from './ReaderReportContent';\n\nexport interface ReportContentInteractiveProps\n extends Omit<ComponentProps<typeof ReportContent>, 'ref'> {\n /** 点击圆标:宿主 setState 打开自己的 Popover。 */\n onCitationEnter: OnCitationEnter;\n /** 点外部 / 再点圆标 / Escape:宿主关闭。 */\n onCitationLeave: OnCitationLeave;\n /** 内置左缘目录,默认关闭。 */\n toc?: boolean;\n /** 目录按钮的无障碍文案。默认英文。 */\n locale?: LocaleCode;\n}\n\n/**\n * SSR HTML 阅读 + 脚注 click 委托的便捷封装。\n * 内部:`ReportContent` + `CitationInteractive`(只报事件,仅 click)。\n */\nexport function ReportContentInteractive({\n onCitationEnter,\n onCitationLeave,\n className,\n html,\n toc = false,\n locale = 'en',\n ...rest\n}: ReportContentInteractiveProps) {\n const ref = useRef<HTMLDivElement>(null);\n\n return (\n <div ref={ref} className={className}>\n <ReaderReportContent html={html} toc={toc} locale={locale} {...rest} />\n <CitationInteractive\n containerRef={ref}\n onCitationEnter={onCitationEnter}\n onCitationLeave={onCitationLeave}\n />\n </div>\n );\n}\n","'use client';\n\nimport type { Chart as ChartJs } from 'chart.js';\nimport { useEffect, useRef, type RefObject } from 'react';\nimport { parseChartFenceBody } from '../chart/parse';\nimport { destroyChart, renderOrUpdateChart } from '../chart/renderChart';\nimport type { ChartTheme } from '../chart/types';\nimport '../styles/chart.css';\n\nexport interface ChartMountProps {\n containerRef: RefObject<HTMLElement | null>;\n chartTheme?: ChartTheme | null;\n /** Re-scan when this changes (e.g. html string). */\n html?: string;\n}\n\nfunction hydrateOne(\n el: HTMLElement,\n theme: ChartTheme | null | undefined,\n registry: Map<HTMLElement, ChartJs>,\n) {\n const raw = el.getAttribute('data-chart');\n const payload = parseChartFenceBody(raw ?? '');\n if (!payload?.config.length) return;\n\n let host = el.querySelector('.tmr-chart-canvas-host') as HTMLElement | null;\n if (!host) {\n host = document.createElement('div');\n host.className = 'tmr-chart-canvas-host';\n el.appendChild(host);\n }\n host.classList.remove('tmr-chart-skeleton');\n\n let canvas = host.querySelector('canvas');\n if (!canvas) {\n canvas = document.createElement('canvas');\n host.innerHTML = '';\n host.appendChild(canvas);\n }\n\n const config = payload.config[0];\n const height = config.height ?? 320;\n host.style.height = `${height}px`;\n\n if (payload.config.length > 1 && !el.querySelector('.tmr-chart-tabs')) {\n const tabs = document.createElement('div');\n tabs.className = 'tmr-chart-tabs';\n tabs.setAttribute('role', 'tablist');\n payload.config.forEach((c, i) => {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'tmr-chart-tab';\n btn.setAttribute('role', 'tab');\n btn.dataset.active = i === 0 ? 'true' : 'false';\n btn.textContent = c.title?.trim() || `${c.chartType} ${i + 1}`;\n btn.addEventListener('click', () => {\n tabs.querySelectorAll('.tmr-chart-tab').forEach((b, j) => {\n (b as HTMLElement).dataset.active = j === i ? 'true' : 'false';\n });\n const existing = registry.get(el);\n destroyChart(existing);\n const next = renderOrUpdateChart({\n canvas: canvas!,\n config: payload.config[i],\n payload,\n theme,\n chart: null,\n });\n if (next) registry.set(el, next);\n const titleEl = el.querySelector('.tmr-chart-title');\n if (titleEl && payload.config[i].title) {\n titleEl.textContent = String(payload.config[i].title);\n titleEl.classList.remove('tmr-chart-title--empty');\n }\n });\n tabs.appendChild(btn);\n });\n el.insertBefore(tabs, host);\n }\n\n const existing = registry.get(el);\n const chart = renderOrUpdateChart({\n canvas,\n config,\n payload,\n theme,\n chart: existing ?? null,\n });\n if (chart) registry.set(el, chart);\n}\n\n/**\n * Hydrate SSR chart placeholders inside a container (reading page).\n */\nexport function ChartMount({\n containerRef,\n chartTheme,\n html,\n}: ChartMountProps) {\n const registryRef = useRef(new Map<HTMLElement, ChartJs>());\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n const registry = registryRef.current;\n registry.forEach((chart) => destroyChart(chart));\n registry.clear();\n\n container\n .querySelectorAll<HTMLElement>('div[data-type=\"chart\"]')\n .forEach((el) => hydrateOne(el, chartTheme, registry));\n\n return () => {\n registry.forEach((chart) => destroyChart(chart));\n registry.clear();\n };\n }, [containerRef, chartTheme, html]);\n\n return null;\n}\n\n/** Imperative helper for hosts that prefer not to use the component. */\nexport function mountChartsInContainer(\n container: HTMLElement,\n chartTheme?: ChartTheme | null,\n): () => void {\n const registry = new Map<HTMLElement, ChartJs>();\n container\n .querySelectorAll<HTMLElement>('div[data-type=\"chart\"]')\n .forEach((el) => hydrateOne(el, chartTheme, registry));\n return () => {\n registry.forEach((c) => destroyChart(c));\n registry.clear();\n };\n}\n","'use client';\n\nimport { useRef, type ComponentProps } from 'react';\nimport type { ChartTheme } from '../chart/types';\nimport type { OnCitationEnter, OnCitationLeave } from '../citationTypes';\nimport type { LocaleCode } from '../i18n';\nimport { ReportContent } from '../ReportContent';\nimport { ChartMount } from './ChartMount';\nimport { CitationInteractive } from './CitationInteractive';\nimport { ReaderReportContent } from './ReaderReportContent';\n\nexport interface ReportContentWithChartsProps\n extends Omit<ComponentProps<typeof ReportContent>, 'ref'> {\n onCitationEnter?: OnCitationEnter;\n onCitationLeave?: OnCitationLeave;\n chartTheme?: ChartTheme | null;\n /** 内置左缘目录,默认关闭。 */\n toc?: boolean;\n /** 目录按钮的无障碍文案。默认英文。 */\n locale?: LocaleCode;\n}\n\n/**\n * SSR HTML reading surface with Chart.js hydration (+ optional citation clicks).\n */\nexport function ReportContentWithCharts({\n onCitationEnter,\n onCitationLeave,\n chartTheme,\n className,\n html,\n toc = false,\n locale = 'en',\n ...rest\n}: ReportContentWithChartsProps) {\n const ref = useRef<HTMLDivElement>(null);\n\n return (\n <div ref={ref} className={className}>\n <ReaderReportContent html={html} toc={toc} locale={locale} {...rest} />\n <ChartMount\n containerRef={ref}\n chartTheme={chartTheme}\n html={html}\n />\n {onCitationEnter && onCitationLeave ? (\n <CitationInteractive\n containerRef={ref}\n onCitationEnter={onCitationEnter}\n onCitationLeave={onCitationLeave}\n />\n ) : null}\n </div>\n );\n}\n"],"names":["count","root","frame","styles","_a","item","id","card","rail","existing"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { Markdown, MarkdownManager } from "@tiptap/markdown";
3
- import { g as getLocaleBundle, S as SearchIcon, d as ChevronUpIcon, e as ChevronDownIcon, X as XIcon, h as ReplaceIcon, i as ReplaceAllIcon, j as renderOrUpdateChart, k as destroyChart, l as CheckIcon, T as TrashIcon, n as CopyIcon, o as ChevronsUpDownIcon, G as GripIcon, E as EraserIcon, D as DownloadIcon, u as useIsMobile, K as KeyboardIcon, p as EditorToc, I as ImagePreviewHost, q as sameTocItems$1, A as AlignRightIcon, t as AlignCenterIcon, v as AlignLeftIcon, w as CropIcon, x as CaptionsIcon, y as ExpandIcon, z as requestImagePreview, B as RotateCcwIcon, F as ExternalLinkIcon, H as TableDeleteIcon, J as ColumnBeforeIcon, L as ColumnAfterIcon, M as ColumnDeleteIcon, N as RowBeforeIcon, O as RowAfterIcon, P as RowDeleteIcon, U as UndoIcon, Q as RedoIcon, V as BoldIcon, W as ItalicIcon, Y as UnderlineIcon, Z as StrikethroughIcon, _ as CodeIcon, $ as LinkIcon, a0 as ImageIcon, a1 as DetailsIcon, a2 as AlignJustifyIcon, a3 as IndentIncreaseIcon, a4 as IndentDecreaseIcon, a5 as LineHeightIcon, a6 as ListUnorderedIcon, a7 as ListOrderedIcon, a8 as ListChecksIcon } from "./ReportContentWithCharts-cjidlvfi.js";
4
- import { C, a9, aa, a, ab, ac, ad, ae, b, c, af, ag, ah, f, m, r, s } from "./ReportContentWithCharts-cjidlvfi.js";
3
+ import { g as getLocaleBundle, S as SearchIcon, d as ChevronUpIcon, e as ChevronDownIcon, X as XIcon, h as ReplaceIcon, i as ReplaceAllIcon, j as renderOrUpdateChart, k as destroyChart, l as CheckIcon, T as TrashIcon, n as CopyIcon, o as ChevronsUpDownIcon, G as GripIcon, E as EraserIcon, D as DownloadIcon, u as useIsMobile, K as KeyboardIcon, p as EditorToc, I as ImagePreviewHost, q as sameTocItems$1, A as AlignRightIcon, t as AlignCenterIcon, v as AlignLeftIcon, w as CropIcon, x as CaptionsIcon, y as ExpandIcon, z as requestImagePreview, B as RotateCcwIcon, F as ExternalLinkIcon, H as TableDeleteIcon, J as ColumnBeforeIcon, L as ColumnAfterIcon, M as ColumnDeleteIcon, N as RowBeforeIcon, O as RowAfterIcon, P as RowDeleteIcon, U as UndoIcon, Q as RedoIcon, V as BoldIcon, W as ItalicIcon, Y as UnderlineIcon, Z as StrikethroughIcon, _ as CodeIcon, $ as LinkIcon, a0 as ImageIcon, a1 as DetailsIcon, a2 as AlignJustifyIcon, a3 as IndentIncreaseIcon, a4 as IndentDecreaseIcon, a5 as LineHeightIcon, a6 as ListUnorderedIcon, a7 as ListOrderedIcon, a8 as ListChecksIcon } from "./ReportContentWithCharts-BOskBjBI.js";
4
+ import { C, a9, aa, a, ab, ac, ad, ae, b, c, af, ag, ah, f, m, r, s } from "./ReportContentWithCharts-BOskBjBI.js";
5
5
  import { jsx, jsxs, Fragment as Fragment$2 } from "react/jsx-runtime";
6
6
  import CodeBlockLowlight from "@tiptap/extension-code-block-lowlight";
7
7
  import FindAndReplace, { FindAndReplacePluginKey, createSearchRegex } from "@tiptap/extension-find-and-replace";
package/dist/reader.js CHANGED
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { C, a, R, b, c, f, m, r, s } from "./ReportContentWithCharts-cjidlvfi.js";
2
+ import { C, a, R, b, c, f, m, r, s } from "./ReportContentWithCharts-BOskBjBI.js";
3
3
  import { a as a2, e, b as b2 } from "./ReportContent-Bc5q1bYp.js";
4
4
  export {
5
5
  C as ChartMount,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tiptap-markdown-react",
3
- "version": "1.3.1",
3
+ "version": "1.3.3",
4
4
  "description": "A batteries-included, self-styled Markdown WYSIWYG editor and reader suite built on Tiptap v3. Markdown in/out, SSR/static rendering, table of contents, themeable via CSS variables.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1 +0,0 @@
1
- {"version":3,"file":"ReportContentWithCharts-cjidlvfi.js","sources":["../src/icons/index.tsx","../src/labels.ts","../src/i18n/zh.ts","../src/i18n/index.ts","../src/imagePreview.ts","../src/components/ImageLightbox.tsx","../src/chart/mapData.ts","../src/chart/theme.ts","../src/chart/renderChart.ts","../src/toc/scrollToTocHeading.ts","../src/components/EditorToc.tsx","../src/hooks/useIsMobile.ts","../src/toc/readTocItems.ts","../src/citationDom.ts","../src/components/CitationInteractive.tsx","../src/components/ContentOutline.tsx","../src/components/ReaderReportContent.tsx","../src/components/ReportContentInteractive.tsx","../src/components/ChartMount.tsx","../src/components/ReportContentWithCharts.tsx"],"sourcesContent":["import type { SVGProps } from 'react';\n\n/**\n * 内联 SVG 图标集(0 运行时依赖)。stroke 走 currentColor,尺寸默认 1em 跟随字号,\n * 故颜色/大小随文本与主题自动变化。\n *\n * 通用图标(粗体/斜体/下划线/列表/撤销/查找等,本文件表格图标之前的部分)的 path 取自\n * Lucide,其许可证为 ISC,其中部分图形源自 Feather 的 MIT——完整版权声明见\n * 仓库根目录 THIRD_PARTY_LICENSES.md。表格行列操作图标(Column / Row / TableDelete 系列)为自绘。\n */\nexport interface IconProps extends SVGProps<SVGSVGElement> {\n size?: number | string;\n}\n\nfunction Svg({ size = '1em', children, ...rest }: IconProps & { children: React.ReactNode }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n {...rest}\n >\n {children}\n </svg>\n );\n}\n\nexport const BoldIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\" />\n <path d=\"M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\" />\n </Svg>\n);\n\nexport const ItalicIcon = (p: IconProps) => (\n <Svg {...p}>\n <line x1=\"19\" x2=\"10\" y1=\"4\" y2=\"4\" />\n <line x1=\"14\" x2=\"5\" y1=\"20\" y2=\"20\" />\n <line x1=\"15\" x2=\"9\" y1=\"4\" y2=\"20\" />\n </Svg>\n);\n\nexport const UnderlineIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M6 4v6a6 6 0 0 0 12 0V4\" />\n <line x1=\"4\" x2=\"20\" y1=\"20\" y2=\"20\" />\n </Svg>\n);\n\nexport const StrikethroughIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M16 4H9a3 3 0 0 0-2.83 4\" />\n <path d=\"M14 12a4 4 0 0 1 0 8H6\" />\n <line x1=\"4\" x2=\"20\" y1=\"12\" y2=\"12\" />\n </Svg>\n);\n\nexport const CodeIcon = (p: IconProps) => (\n <Svg {...p}>\n <polyline points=\"16 18 22 12 16 6\" />\n <polyline points=\"8 6 2 12 8 18\" />\n </Svg>\n);\n\nexport const LinkIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" />\n <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" />\n </Svg>\n);\n\n/** 橡皮擦:表格菜单的「清空内容」。 */\nexport const EraserIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"m7 21-4.3-4.3c-1-1-1-2.5 0-3.4l9.6-9.6c1-1 2.5-1 3.4 0l5.6 5.6c1 1 1 2.5 0 3.4L13 21\" />\n <path d=\"M22 21H7\" />\n <path d=\"m5 11 9 9\" />\n </Svg>\n);\n\n/** 逆时针回转:表格菜单的「重置单元格样式」。 */\nexport const RotateCcwIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n </Svg>\n);\n\n/** 在新窗口打开(链接浮层的「打开」按钮)。 */\nexport const ExternalLinkIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M15 3h6v6\" />\n <path d=\"M10 14 21 3\" />\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n </Svg>\n);\n\nexport const ImageIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\" />\n <circle cx=\"9\" cy=\"9\" r=\"2\" />\n <path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\" />\n </Svg>\n);\n\n/**\n * 段落排版图标(对齐四件 / 缩进两件 / 行高):块状 fill 风格,自绘。\n * 细线条(stroke 2)在 14px 下会发虚——这组统一用带圆角的实心块。\n */\nconst BlockSvg = ({ size = '1em', children, ...rest }: IconProps & { children: React.ReactNode }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n stroke=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n {...rest}\n >\n {children}\n </svg>\n);\n\nexport const AlignLeftIcon = (p: IconProps) => (\n <BlockSvg {...p}>\n <rect x=\"3\" y=\"3.4\" width=\"18\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"3\" y=\"8.6\" width=\"12\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"3\" y=\"13.8\" width=\"18\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"3\" y=\"19\" width=\"12\" height=\"2.4\" rx=\"1.2\" />\n </BlockSvg>\n);\n\nexport const AlignCenterIcon = (p: IconProps) => (\n <BlockSvg {...p}>\n <rect x=\"3\" y=\"3.4\" width=\"18\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"6\" y=\"8.6\" width=\"12\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"3\" y=\"13.8\" width=\"18\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"6\" y=\"19\" width=\"12\" height=\"2.4\" rx=\"1.2\" />\n </BlockSvg>\n);\n\nexport const AlignRightIcon = (p: IconProps) => (\n <BlockSvg {...p}>\n <rect x=\"3\" y=\"3.4\" width=\"18\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"9\" y=\"8.6\" width=\"12\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"3\" y=\"13.8\" width=\"18\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"9\" y=\"19\" width=\"12\" height=\"2.4\" rx=\"1.2\" />\n </BlockSvg>\n);\n\nexport const AlignJustifyIcon = (p: IconProps) => (\n <BlockSvg {...p}>\n <rect x=\"3\" y=\"3.4\" width=\"18\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"3\" y=\"8.6\" width=\"18\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"3\" y=\"13.8\" width=\"18\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"3\" y=\"19\" width=\"18\" height=\"2.4\" rx=\"1.2\" />\n </BlockSvg>\n);\n\nexport const IndentIncreaseIcon = (p: IconProps) => (\n <BlockSvg {...p}>\n <path d=\"M3 6.6 8.5 10.8 3 15 Z\" />\n <rect x=\"10.5\" y=\"3.6\" width=\"10.5\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"10.5\" y=\"10.8\" width=\"10.5\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"10.5\" y=\"18\" width=\"10.5\" height=\"2.4\" rx=\"1.2\" />\n </BlockSvg>\n);\n\nexport const IndentDecreaseIcon = (p: IconProps) => (\n <BlockSvg {...p}>\n <path d=\"M8.5 6.6 3 10.8 8.5 15 Z\" />\n <rect x=\"10.5\" y=\"3.6\" width=\"10.5\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"10.5\" y=\"10.8\" width=\"10.5\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"10.5\" y=\"18\" width=\"10.5\" height=\"2.4\" rx=\"1.2\" />\n </BlockSvg>\n);\n\n/** 行高:左侧轴 + 双向块三角,右侧两条块线。 */\nexport const LineHeightIcon = (p: IconProps) => (\n <BlockSvg {...p}>\n <rect x=\"1.8\" y=\"4.4\" width=\"2.4\" height=\"15.2\" rx=\"1.2\" />\n <path d=\"M3 2.4 5.4 5.8 H0.6 Z\" />\n <path d=\"M3 21.6 0.6 18.2 H5.4 Z\" />\n <rect x=\"9\" y=\"5.6\" width=\"12\" height=\"2.4\" rx=\"1.2\" />\n <rect x=\"9\" y=\"16\" width=\"12\" height=\"2.4\" rx=\"1.2\" />\n </BlockSvg>\n);\n\nexport const CaptionsIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect width=\"18\" height=\"14\" x=\"3\" y=\"5\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 15h4\" />\n <path d=\"M15 15h2\" />\n <path d=\"M7 11h2\" />\n <path d=\"M13 11h4\" />\n </Svg>\n);\n\n/** 裁剪:两把角尺,path 取自 Lucide(ISC)。 */\nexport const CropIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M6 2v14a2 2 0 0 0 2 2h14\" />\n <path d=\"M18 22V8a2 2 0 0 0-2-2H2\" />\n </Svg>\n);\n\nexport const ImportIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M12 3v12\" />\n <path d=\"m8 11 4 4 4-4\" />\n <path d=\"M8 5H4a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-4\" />\n </Svg>\n);\n\nexport const ListUnorderedIcon = (p: IconProps) => (\n <Svg {...p}>\n <line x1=\"8\" x2=\"21\" y1=\"6\" y2=\"6\" />\n <line x1=\"8\" x2=\"21\" y1=\"12\" y2=\"12\" />\n <line x1=\"8\" x2=\"21\" y1=\"18\" y2=\"18\" />\n <line x1=\"3\" x2=\"3.01\" y1=\"6\" y2=\"6\" />\n <line x1=\"3\" x2=\"3.01\" y1=\"12\" y2=\"12\" />\n <line x1=\"3\" x2=\"3.01\" y1=\"18\" y2=\"18\" />\n </Svg>\n);\n\nexport const ListOrderedIcon = (p: IconProps) => (\n <Svg {...p}>\n <line x1=\"10\" x2=\"21\" y1=\"6\" y2=\"6\" />\n <line x1=\"10\" x2=\"21\" y1=\"12\" y2=\"12\" />\n <line x1=\"10\" x2=\"21\" y1=\"18\" y2=\"18\" />\n <path d=\"M4 6h1v4\" />\n <path d=\"M4 10h2\" />\n <path d=\"M6 18H4c0-1 2-2 2-3s-1-1.5-2-1\" />\n </Svg>\n);\n\n/** 折叠块。自绘,不是 Lucide。 */\nexport const DetailsIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"m9 7 4 5-4 5\" />\n <path d=\"M15 7h5\" />\n <path d=\"M15 12h5\" />\n <path d=\"M15 17h5\" />\n </Svg>\n);\n\nexport const ListChecksIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"m3 17 2 2 4-4\" />\n <path d=\"m3 7 2 2 4-4\" />\n <path d=\"M13 6h8\" />\n <path d=\"M13 12h8\" />\n <path d=\"M13 18h8\" />\n </Svg>\n);\n\nexport const UndoIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M9 14 4 9l5-5\" />\n <path d=\"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5 5.5 5.5 0 0 1-5.5 5.5H11\" />\n </Svg>\n);\n\nexport const RedoIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"m15 14 5-5-5-5\" />\n <path d=\"M20 9H9.5A5.5 5.5 0 0 0 4 14.5 5.5 5.5 0 0 0 9.5 20H13\" />\n </Svg>\n);\n\nexport const ChevronDownIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"m6 9 6 6 6-6\" />\n </Svg>\n);\n\nexport const CheckIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M20 6 9 17l-5-5\" />\n </Svg>\n);\n\nexport const TrashIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\" />\n <path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n <line x1=\"10\" x2=\"10\" y1=\"11\" y2=\"17\" />\n <line x1=\"14\" x2=\"14\" y1=\"11\" y2=\"17\" />\n </Svg>\n);\n\nexport const LockIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </Svg>\n);\n\nexport const MenuIcon = (p: IconProps) => (\n <Svg {...p}>\n <line x1=\"4\" x2=\"20\" y1=\"12\" y2=\"12\" />\n <line x1=\"4\" x2=\"20\" y1=\"6\" y2=\"6\" />\n <line x1=\"4\" x2=\"20\" y1=\"18\" y2=\"18\" />\n </Svg>\n);\n\nexport const SearchIcon = (p: IconProps) => (\n <Svg {...p}>\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.3-4.3\" />\n </Svg>\n);\n\nexport const XIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </Svg>\n);\n\nexport const ChevronLeftIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"m15 18-6-6 6-6\" />\n </Svg>\n);\n\nexport const ChevronRightIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"m9 18 6-6-6-6\" />\n </Svg>\n);\n\n/** 放大镜加号,path 取自 Lucide(ISC)。 */\nexport const ZoomInIcon = (p: IconProps) => (\n <Svg {...p}>\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.3-4.3\" />\n <path d=\"M11 8v6\" />\n <path d=\"M8 11h6\" />\n </Svg>\n);\n\n/** 放大镜减号,path 取自 Lucide(ISC)。 */\nexport const ZoomOutIcon = (p: IconProps) => (\n <Svg {...p}>\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.3-4.3\" />\n <path d=\"M8 11h6\" />\n </Svg>\n);\n\n/** 顺时针旋转,path 取自 Lucide(ISC)。 */\nexport const RotateCwIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n </Svg>\n);\n\n/** 四角向内,灯箱「自适应」:缩回视口,path 取自 Lucide shrink(ISC)。 */\nexport const FitIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"m15 15 6 6\" />\n <path d=\"m15 9 6-6\" />\n <path d=\"M21 16v5h-5\" />\n <path d=\"M21 8V3h-5\" />\n <path d=\"M3 16v5h5\" />\n <path d=\"m3 21 6-6\" />\n <path d=\"M3 8V3h5\" />\n <path d=\"M9 9 3 3\" />\n </Svg>\n);\n\n/** 四角展开,编辑器里的「图片预览」入口,path 取自 Lucide(ISC)。 */\nexport const ExpandIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M15 3h6v6\" />\n <path d=\"m21 3-7 7\" />\n <path d=\"M9 21H3v-6\" />\n <path d=\"m3 21 7-7\" />\n </Svg>\n);\n\nexport const ChevronUpIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"m18 15-6-6-6 6\" />\n </Svg>\n);\n\nexport const ReplaceIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M14 4a1 1 0 0 1 1-1\" />\n <path d=\"M15 10a1 1 0 0 1-1-1\" />\n <path d=\"M21 4a1 1 0 0 0-1-1\" />\n <path d=\"M21 9a1 1 0 0 1-1 1\" />\n <path d=\"m3 7 3 3 3-3\" />\n <path d=\"M6 10V5a2 2 0 0 1 2-2h2\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n </Svg>\n);\n\nexport const ReplaceAllIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M14 14a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1\" />\n <path d=\"M14 4a1 1 0 0 1 1-1\" />\n <path d=\"M15 10a1 1 0 0 1-1-1\" />\n <path d=\"M19 14a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1\" />\n <path d=\"M21 4a1 1 0 0 0-1-1\" />\n <path d=\"M21 9a1 1 0 0 1-1 1\" />\n <path d=\"m3 7 3 3 3-3\" />\n <path d=\"M6 10V5a2 2 0 0 1 2-2h2\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n </Svg>\n);\n\n/* ── 表格行列操作图标(自绘:表格轮廓 + 目标边高亮 + 加号/叉号)── */\n\nexport const ColumnBeforeIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect x=\"10\" y=\"4\" width=\"11\" height=\"16\" rx=\"1\" />\n <path d=\"M14 4v16\" />\n <path d=\"M5 9v6\" />\n <path d=\"M2 12h6\" />\n </Svg>\n);\n\nexport const ColumnAfterIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect x=\"3\" y=\"4\" width=\"11\" height=\"16\" rx=\"1\" />\n <path d=\"M10 4v16\" />\n <path d=\"M19 9v6\" />\n <path d=\"M16 12h6\" />\n </Svg>\n);\n\nexport const ColumnDeleteIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"1\" />\n <path d=\"M12 4v16\" />\n <path d=\"m8 9 8 6\" />\n <path d=\"m16 9-8 6\" />\n </Svg>\n);\n\nexport const RowBeforeIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect x=\"4\" y=\"10\" width=\"16\" height=\"11\" rx=\"1\" />\n <path d=\"M4 14h16\" />\n <path d=\"M9 5h6\" />\n <path d=\"M12 2v6\" />\n </Svg>\n);\n\nexport const RowAfterIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect x=\"4\" y=\"3\" width=\"16\" height=\"11\" rx=\"1\" />\n <path d=\"M4 10h16\" />\n <path d=\"M9 19h6\" />\n <path d=\"M12 16v6\" />\n </Svg>\n);\n\nexport const RowDeleteIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"1\" />\n <path d=\"M4 12h16\" />\n <path d=\"m9 8 6 8\" />\n <path d=\"m15 8-6 8\" />\n </Svg>\n);\n\nexport const TableDeleteIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"1\" />\n <path d=\"M3 9h18\" />\n <path d=\"M9 5v14\" />\n <path d=\"M15 5v14\" />\n <path d=\"m7 2 10 20\" />\n </Svg>\n);\n\nexport const CopyIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n </Svg>\n);\n\nexport const ChevronsUpDownIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"m7 15 5 5 5-5\" />\n <path d=\"m7 9 5-5 5 5\" />\n </Svg>\n);\n\n/** 六点握把:块拖拽手柄。 */\nexport const GripIcon = (p: IconProps) => (\n <Svg {...p} fill=\"currentColor\" strokeWidth={0}>\n <circle cx=\"9\" cy=\"6\" r=\"1.25\" />\n <circle cx=\"15\" cy=\"6\" r=\"1.25\" />\n <circle cx=\"9\" cy=\"12\" r=\"1.25\" />\n <circle cx=\"15\" cy=\"12\" r=\"1.25\" />\n <circle cx=\"9\" cy=\"18\" r=\"1.25\" />\n <circle cx=\"15\" cy=\"18\" r=\"1.25\" />\n </Svg>\n);\n\nexport const DownloadIcon = (p: IconProps) => (\n <Svg {...p}>\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" x2=\"12\" y1=\"15\" y2=\"3\" />\n </Svg>\n);\n\nexport const KeyboardIcon = (p: IconProps) => (\n <Svg {...p}>\n <rect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\" />\n <path d=\"M6 8h.01\" />\n <path d=\"M10 8h.01\" />\n <path d=\"M14 8h.01\" />\n <path d=\"M18 8h.01\" />\n <path d=\"M6 12h.01\" />\n <path d=\"M10 12h.01\" />\n <path d=\"M14 12h.01\" />\n <path d=\"M18 12h.01\" />\n <path d=\"M7 16h10\" />\n </Svg>\n);","/**\n * UI 文案类型与英文默认。语言包在 `src/i18n`:宿主传 `locale`,不传单条文案。\n */\n\nexport interface ToolbarLabels {\n undo: string;\n redo: string;\n style: string;\n normalText: string;\n /** 传入层级,返回如 \"Heading 2\"。 */\n headingLabel: (level: number) => string;\n fontSize: string;\n fontSizeDefault: string;\n bold: string;\n italic: string;\n underline: string;\n strike: string;\n code: string;\n textColor: string;\n highlight: string;\n colorNone: string;\n colorTheme: string;\n scriptMenu: string;\n scriptNormal: string;\n superscript: string;\n subscript: string;\n link: string;\n /** 段落对齐下拉:触发器 title / aria-label。 */\n align: string;\n alignLeft: string;\n alignCenter: string;\n alignRight: string;\n alignJustify: string;\n /** 缩进下拉:触发器 + 增加 / 减少两项。 */\n indent: string;\n indentIncrease: string;\n indentDecrease: string;\n /** 行高下拉:触发器 + 「默认」项(其余按数字直显)。 */\n lineHeight: string;\n lineHeightDefault: string;\n /**\n * 链接浮层输入框的占位与无障碍名(原 `window.prompt` 的提示语,现在落到输入框上)。\n */\n linkPrompt: string;\n /** 链接浮层「应用」按钮的 title / aria-label。 */\n linkApply: string;\n /** 链接浮层「在新窗口打开」按钮的 title / aria-label。 */\n linkOpen: string;\n /** 链接浮层「移除链接」按钮的 title / aria-label。 */\n linkRemove: string;\n /** 链接浮层:地址被编辑器拒绝时的提示(落在输入框 title 上)。 */\n linkInvalid: string;\n image: string;\n imageUploadFailed: string;\n /** 图片对齐工具条(悬停图片时浮现)的 aria-label。 */\n imageAlign: string;\n /** 左对齐按钮的 title / aria-label。 */\n imageAlignLeft: string;\n /** 居中对齐按钮的 title / aria-label。 */\n imageAlignCenter: string;\n /** 右对齐按钮的 title / aria-label。 */\n imageAlignRight: string;\n /** 图片描述(图注)按钮的 title / aria-label。 */\n imageCaption: string;\n /** 描述输入框的占位与无障碍名。 */\n imageCaptionPlaceholder: string;\n /** 图片裁剪按钮的 title / aria-label。 */\n imageCrop: string;\n /** 裁剪面板「应用」按钮。 */\n imageCropApply: string;\n /** 裁剪面板「取消」按钮。 */\n imageCropCancel: string;\n /** 裁剪面板「重置」按钮:去掉裁剪,回到整张原图。 */\n imageCropReset: string;\n /** 编辑态工具条「预览」按钮:打开大图灯箱。 */\n imagePreview: string;\n /** 灯箱关闭按钮。 */\n imagePreviewClose: string;\n /** 灯箱上一张。 */\n imagePreviewPrev: string;\n /** 灯箱下一张。 */\n imagePreviewNext: string;\n /** 灯箱缩小。 */\n imagePreviewZoomOut: string;\n /** 灯箱放大。 */\n imagePreviewZoomIn: string;\n /** 灯箱「自适应」:缩回当前视口。 */\n imagePreviewFit: string;\n /** 灯箱顺时针旋转。 */\n imagePreviewRotate: string;\n /** Markdown 文件导入失败(与图片上传共用 onError 回调时,便于宿主区分文案)。 */\n importMarkdownFailed: string;\n /** 主栏导入下拉触发器上的短文案(对齐 style / fontSize)。 */\n importDocument: string;\n /** 导入触发器 title / aria-label。 */\n importDocumentHint: string;\n /** 未传 importMenuItems、但传了 onImportDocument + importAccept 时的第二项。 */\n importDocumentOther: string;\n /** 导入进行中的按钮 title。 */\n importDocumentBusy: string;\n /** 光标占位:上传阶段,传入 0–100。 */\n importDocumentUploading: (percent: number) => string;\n /** 光标占位:转换阶段,不要百分比。 */\n importDocumentConverting: string;\n /** 非 Markdown 文件导入失败(onError 的 source === 'import')。 */\n importDocumentFailed: string;\n blockquote: string;\n /** 折叠块(官方 Details)。工具栏按钮 title / aria-label。 */\n details: string;\n bulletList: string;\n orderedList: string;\n /** 有序列表旁的编号格式下拉:触发器 title / aria-label。 */\n numberingFormat: string;\n taskList: string;\n more: string;\n /**\n * 工具栏的搜索入口(放大镜按钮,落在 More 之后):title 与 aria-label。\n * 只在宿主传了 `onSearch` 时才渲染——它只是入口,条子本身归编辑器\n * (`<MarkdownWysiwygEditor>`),点击后由宿主调 `handle.openFind()`。\n */\n search: string;\n codeBlock: string;\n hr: string;\n /** 导入下拉里的 Markdown 项。 */\n importMarkdown: string;\n tableInsert: string;\n /** 行手柄的 title / aria-label(鼠标悬停单元格时出现在行的左缘)。 */\n tableRowMenu: string;\n /** 列手柄的 title / aria-label(悬停时出现在表格上方、对齐该列)。 */\n tableColumnMenu: string;\n /** 表格菜单:清空选中行 / 列 / 单元格矩形里的内容(保留单元格与表头)。 */\n tableClearContent: string;\n /** 表格菜单:把选中单元格的样式属性复位(列宽、对齐等;不动合并结构)。 */\n tableResetCellStyles: string;\n /** 表格底边 `+` 手柄(末尾追加一行)的 title / aria-label。 */\n tableAppendRow: string;\n /** 表格右边 `+` 手柄(末尾追加一列)的 title / aria-label。 */\n tableAppendColumn: string;\n /** 网格选择器底部尺寸文案,如 \"3 × 4\"。参数顺序:列、行。 */\n tableSizeSelected: (cols: number, rows: number) => string;\n tableAddColumnBefore: string;\n tableAddColumnAfter: string;\n tableDeleteColumn: string;\n tableAddRowBefore: string;\n tableAddRowAfter: string;\n tableDeleteRow: string;\n /** 多格选区:在左侧插入 N 列。 */\n tableAddColumnBeforeN: (n: number) => string;\n /** 多格选区:在右侧插入 N 列。 */\n tableAddColumnAfterN: (n: number) => string;\n /** 多格选区:删除 N 列。 */\n tableDeleteColumnN: (n: number) => string;\n /** 多格选区:在上方插入 N 行。 */\n tableAddRowBeforeN: (n: number) => string;\n /** 多格选区:在下方插入 N 行。 */\n tableAddRowAfterN: (n: number) => string;\n /** 多格选区:删除 N 行。 */\n tableDeleteRowN: (n: number) => string;\n tableDeleteTable: string;\n inlineMath: string;\n blockMath: string;\n mathPlaceholder: string;\n mathDone: string;\n mathCancel: string;\n mathNewInline: string;\n mathNewBlock: string;\n}\n\n/** 斜杠菜单(键入 / 唤起的块级插入弹窗)文案。 */\nexport interface SlashMenuLabels {\n /** 弹窗 aria-label。 */\n menuLabel: string;\n /** 分组标题:文本块。 */\n groupText: string;\n /** 分组标题:列表。 */\n groupList: string;\n /** 分组标题:结构 / 高级块。 */\n groupAdvanced: string;\n normalText: string;\n headingLabel: (level: number) => string;\n bulletList: string;\n orderedList: string;\n taskList: string;\n blockquote: string;\n details: string;\n codeBlock: string;\n divider: string;\n table: string;\n inlineMath: string;\n blockMath: string;\n}\n\nexport interface ChartLabels {\n /** Tab label when config has no title. */\n tabLabel: (chartType: string, index: number) => string;\n done: string;\n cancel: string;\n configLabel: string;\n tableLabel: string;\n /** Modal dialog title. */\n editTitle: string;\n}\n\nexport const defaultChartLabels: ChartLabels = {\n tabLabel: (chartType, index) => `${chartType} ${index + 1}`,\n done: 'Done',\n cancel: 'Cancel',\n configLabel: 'Chart config (JSON)',\n tableLabel: 'Data table (Markdown)',\n editTitle: 'Edit chart',\n};\n\nexport const defaultToolbarLabels: ToolbarLabels = {\n undo: 'Undo',\n redo: 'Redo',\n style: 'Style',\n normalText: 'Normal text',\n headingLabel: (level) => `Heading ${level}`,\n fontSize: 'Font size',\n fontSizeDefault: 'Default',\n bold: 'Bold',\n italic: 'Italic',\n underline: 'Underline',\n strike: 'Strikethrough',\n code: 'Inline code',\n textColor: 'Text color',\n highlight: 'Highlight',\n colorNone: 'None',\n colorTheme: 'THEME',\n scriptMenu: 'Superscript / Subscript',\n scriptNormal: 'Normal',\n superscript: 'Superscript',\n subscript: 'Subscript',\n link: 'Link',\n align: 'Alignment',\n alignLeft: 'Align left',\n alignCenter: 'Align center',\n alignRight: 'Align right',\n alignJustify: 'Justify',\n indent: 'Indent',\n indentIncrease: 'Increase indent',\n indentDecrease: 'Decrease indent',\n lineHeight: 'Line height',\n lineHeightDefault: 'Default',\n linkPrompt: 'Enter URL',\n linkApply: 'Apply link',\n linkOpen: 'Open in new window',\n linkRemove: 'Remove link',\n linkInvalid: 'The editor rejected this address',\n image: 'Image',\n imageUploadFailed: 'Image upload failed',\n imageAlign: 'Image alignment',\n imageAlignLeft: 'Align left',\n imageAlignCenter: 'Align center',\n imageAlignRight: 'Align right',\n imageCaption: 'Caption',\n imageCaptionPlaceholder: 'Add a caption…',\n imageCrop: 'Crop',\n imageCropApply: 'Apply',\n imageCropCancel: 'Cancel',\n imageCropReset: 'Reset crop',\n imagePreview: 'Preview',\n imagePreviewClose: 'Close',\n imagePreviewPrev: 'Previous image',\n imagePreviewNext: 'Next image',\n imagePreviewZoomOut: 'Zoom out',\n imagePreviewZoomIn: 'Zoom in',\n imagePreviewFit: 'Fit',\n imagePreviewRotate: 'Rotate',\n importMarkdownFailed: 'Markdown import failed',\n importDocument: 'Import',\n importDocumentHint: 'Import a file',\n importDocumentOther: 'Document',\n importDocumentBusy: 'Importing…',\n importDocumentUploading: (percent) => `Uploading ${percent}%`,\n importDocumentConverting: 'Converting…',\n importDocumentFailed: 'Import failed',\n blockquote: 'Blockquote',\n details: 'Toggle',\n bulletList: 'Bullet list',\n orderedList: 'Ordered list',\n numberingFormat: 'Numbering format',\n taskList: 'Task list',\n more: 'More',\n search: 'Find & replace',\n codeBlock: 'Code block',\n hr: 'Divider',\n importMarkdown: 'Markdown',\n tableInsert: 'Insert table',\n tableRowMenu: 'Row actions',\n tableColumnMenu: 'Column actions',\n tableClearContent: 'Clear content',\n tableResetCellStyles: 'Reset cell styles',\n tableAppendRow: 'Add row',\n tableAppendColumn: 'Add column',\n tableSizeSelected: (cols, rows) => `${cols} × ${rows}`,\n tableAddColumnBefore: 'Add column before',\n tableAddColumnAfter: 'Add column after',\n tableDeleteColumn: 'Delete column',\n tableAddRowBefore: 'Add row before',\n tableAddRowAfter: 'Add row after',\n tableDeleteRow: 'Delete row',\n tableAddColumnBeforeN: (n) => `Add ${n} columns before`,\n tableAddColumnAfterN: (n) => `Add ${n} columns after`,\n tableDeleteColumnN: (n) => `Delete ${n} columns`,\n tableAddRowBeforeN: (n) => `Add ${n} rows before`,\n tableAddRowAfterN: (n) => `Add ${n} rows after`,\n tableDeleteRowN: (n) => `Delete ${n} rows`,\n tableDeleteTable: 'Delete table',\n inlineMath: 'Inline equation',\n blockMath: 'Block equation',\n mathPlaceholder: 'E = mc^2',\n mathDone: 'Done',\n mathCancel: 'Cancel',\n mathNewInline: 'New equation',\n mathNewBlock: 'Add a TeX equation',\n};\n\n/**\n * 块拖拽手柄和它的菜单。悬停块时出现在左侧,拖动重排,点击出菜单。\n */\nexport interface BlockDragLabels {\n /** 拖拽手柄的 title / aria-label。 */\n dragHandle: string;\n /** 菜单 aria-label。 */\n menuLabel: string;\n /** 「转成」分组标题。 */\n turnInto: string;\n paragraph: string;\n headingLabel: (level: number) => string;\n bulletList: string;\n orderedList: string;\n taskList: string;\n blockquote: string;\n codeBlock: string;\n copy: string;\n duplicate: string;\n resetFormatting: string;\n downloadImage: string;\n delete: string;\n}\n\nexport const defaultBlockDragLabels: BlockDragLabels = {\n dragHandle: 'Drag to move',\n menuLabel: 'Block actions',\n turnInto: 'Turn into',\n paragraph: 'Normal text',\n headingLabel: (level) => `Heading ${level}`,\n bulletList: 'Bullet list',\n orderedList: 'Ordered list',\n taskList: 'Task list',\n blockquote: 'Blockquote',\n codeBlock: 'Code block',\n copy: 'Copy',\n duplicate: 'Duplicate',\n resetFormatting: 'Reset formatting',\n downloadImage: 'Download image',\n delete: 'Delete',\n};\n\nexport const defaultSlashMenuLabels: SlashMenuLabels = {\n menuLabel: 'Insert block',\n groupText: 'Text',\n groupList: 'Lists',\n groupAdvanced: 'Advanced',\n normalText: 'Normal text',\n headingLabel: (level) => `Heading ${level}`,\n bulletList: 'Bullet list',\n orderedList: 'Ordered list',\n taskList: 'Task list',\n blockquote: 'Blockquote',\n details: 'Toggle',\n codeBlock: 'Code block',\n divider: 'Divider',\n table: 'Table',\n inlineMath: 'Inline equation',\n blockMath: 'Block equation',\n};\n\n/** 快捷键抽屉面板(键位 + Markdown 触发写法对照)文案。 */\nexport interface ShortcutLabels {\n /** 抽屉标题。 */\n panelTitle: string;\n /** 关闭按钮 aria / title。 */\n close: string;\n /** 三列表头:格式 / 快捷键 / Markdown。 */\n colFormat: string;\n colShortcut: string;\n colMarkdown: string;\n /** 分组标题。 */\n formatGroup: string;\n insertGroup: string;\n editGroup: string;\n bold: string;\n italic: string;\n strike: string;\n underline: string;\n inlineCode: string;\n highlight: string;\n headingLabel: (level: number) => string;\n paragraph: string;\n blockquote: string;\n bulletList: string;\n orderedList: string;\n taskList: string;\n codeBlock: string;\n divider: string;\n undo: string;\n redo: string;\n hardBreak: string;\n findReplace: string;\n /** 段落对齐四条(官方 TextAlign 的默认键位)。 */\n alignLeft: string;\n alignCenter: string;\n alignRight: string;\n alignJustify: string;\n /** 图片上传占位块(Mod+Shift+I)。 */\n imageUpload: string;\n /** 智能标点:直引号收成弯引号。 */\n smartQuote: string;\n /** 智能标点:`...` 收成省略号。 */\n ellipsis: string;\n /** 智能标点:`--` 收成破折号。 */\n emDash: string;\n /** 表情:`:smile:` 这类短码。 */\n emoji: string;\n}\n\nexport const defaultShortcutLabels: ShortcutLabels = {\n panelTitle: 'Shortcuts',\n close: 'Close',\n colFormat: 'Format',\n colShortcut: 'Shortcut',\n colMarkdown: 'Markdown',\n formatGroup: 'Formatting',\n insertGroup: 'Insert',\n editGroup: 'Editing',\n bold: 'Bold',\n italic: 'Italic',\n strike: 'Strikethrough',\n underline: 'Underline',\n inlineCode: 'Inline code',\n highlight: 'Highlight',\n headingLabel: (level) => `Heading ${level}`,\n paragraph: 'Normal text',\n blockquote: 'Blockquote',\n bulletList: 'Bullet list',\n orderedList: 'Ordered list',\n taskList: 'Task list',\n codeBlock: 'Code block',\n divider: 'Divider',\n undo: 'Undo',\n redo: 'Redo',\n hardBreak: 'Hard break',\n findReplace: 'Find & replace',\n alignLeft: 'Align left',\n alignCenter: 'Align center',\n alignRight: 'Align right',\n alignJustify: 'Justify',\n imageUpload: 'Upload image',\n smartQuote: 'Smart quotes',\n ellipsis: 'Ellipsis',\n emDash: 'Em dash',\n emoji: 'Emoji',\n};\n\n/** 全文统计(官方 CharacterCount)文案。 */\nexport interface CharacterCountLabels {\n /** 统计条的无障碍名。 */\n label: string;\n /** 字符数,如 \"128 characters\"。 */\n characters: (count: number) => string;\n /** 词数,如 \"24 words\"。 */\n words: (count: number) => string;\n}\n\nexport const defaultCharacterCountLabels: CharacterCountLabels = {\n label: 'Document statistics',\n characters: (count) =>\n `${count} ${count === 1 ? 'character' : 'characters'}`,\n words: (count) => `${count} ${count === 1 ? 'word' : 'words'}`,\n};\n\n/** 表情建议列表(键入 `:` 唤起)文案。 */\nexport interface EmojiSuggestionLabels {\n /** 弹窗 aria-label。 */\n menuLabel: string;\n}\n\nexport const defaultEmojiSuggestionLabels: EmojiSuggestionLabels = {\n menuLabel: 'Emoji',\n};\n\n/** 链接编辑浮层(`<LinkPopover>`)文案。 */\nexport interface LinkPopoverLabels {\n /** 输入框占位与无障碍名,也是浮层的 aria-label。 */\n field: string;\n apply: string;\n open: string;\n remove: string;\n /** 地址被编辑器拒绝时的提示(落在输入框 title 上)。 */\n invalid: string;\n}\n\nexport const defaultLinkPopoverLabels: LinkPopoverLabels = {\n field: 'Enter URL',\n apply: 'Apply link',\n open: 'Open in new window',\n remove: 'Remove link',\n invalid: 'The editor rejected this address',\n};\n\nexport interface ColorPaletteLabels {\n none: string;\n theme: string;\n}\n\nexport const defaultColorPaletteLabels: ColorPaletteLabels = {\n none: 'None',\n theme: 'THEME',\n};\n\nexport interface TocLabels {\n title: string;\n expand: string;\n collapse: string;\n}\n\nexport const defaultTocLabels: TocLabels = {\n title: 'Contents',\n expand: 'Expand',\n collapse: 'Collapse',\n};\n\nexport interface CodeBlockLabels {\n autoDetect: string;\n delete: string;\n /** 只读态:复制代码内容。 */\n copy: string;\n /** 只读态:展开超出限高的代码块。 */\n expand: string;\n /** 只读态:收起已展开的代码块。 */\n collapse: string;\n /** 语言选择器的 aria-label。 */\n language: string;\n}\n\nexport const defaultCodeBlockLabels: CodeBlockLabels = {\n autoDetect: 'Auto-detect',\n delete: 'Delete code block',\n copy: 'Copy code',\n expand: 'Expand code',\n collapse: 'Collapse code',\n language: 'Code language',\n};\n\nexport interface CommentLabels {\n open: string;\n resolved: string;\n dismissed: string;\n outdated: string;\n ambiguous: string;\n partial: string;\n gutterTitle: string;\n}\n\nexport const defaultCommentLabels: CommentLabels = {\n open: 'Open',\n resolved: 'Resolved',\n dismissed: 'Dismissed',\n outdated: 'Outdated',\n ambiguous: 'Ambiguous',\n partial: 'Partially matched',\n gutterTitle: 'Comment',\n};\n\nexport interface FindLabels {\n /** 查找输入框的占位与无障碍名,也用作浮动条的 aria-label。 */\n find: string;\n /** 替换输入框的占位与无障碍名。 */\n replace: string;\n next: string;\n previous: string;\n replaceOne: string;\n replaceAll: string;\n close: string;\n caseSensitive: string;\n wholeWord: string;\n useRegex: string;\n /** 计数文案。无结果时 current 传 0;有结果但还没定位到某一条(currentIndex 为 null)时也是 0。 */\n counter: (current: number, total: number) => string;\n /** 正则模式下模式非法(RE2 不支持 lookaround / backreference 等,见官方扩展)。 */\n invalidRegex: string;\n /** 只读态提示:可查不可换。 */\n readOnly: string;\n}\n\nexport const defaultFindLabels: FindLabels = {\n find: 'Find',\n replace: 'Replace with',\n next: 'Next match',\n previous: 'Previous match',\n replaceOne: 'Replace',\n replaceAll: 'Replace all',\n close: 'Close',\n caseSensitive: 'Match case',\n wholeWord: 'Whole word',\n useRegex: 'Use regular expression',\n counter: (current, total) => `${current} / ${total}`,\n invalidRegex: 'Invalid pattern',\n readOnly: 'Read-only',\n};\n\n/** 图片上传占位块(`<MarkdownWysiwygEditor imageUpload={{…}}>`)文案。 */\nexport interface ImageUploadLabels {\n /** 空态主文案前半(下划线强调,对齐官方的 \"Click to upload\"),如 `Click to upload`。 */\n dropzoneClick: string;\n /** 空态主文案后半,如 ` or drag and drop`(中文可写成「,或拖拽到此处」)。 */\n dropzoneRest: string;\n /** 空态副文案:数量与单文件体积上限;`maxSizeMb` 为 null 表示未设上限。 */\n dropzoneLimits: (limit: number, maxSizeMb: number | null) => string;\n /** 多文件排队时的标题,参数为文件数。 */\n uploadingCount: (count: number) => string;\n /** 清空全部排队文件的按钮。 */\n clearAll: string;\n /** 单个文件行的移除按钮(title / aria-label)。 */\n remove: string;\n /** 文件行上传失败时的状态文字(替掉体积位置)。 */\n failed: string;\n /** 上传成功后写入图片 alt / title 的兜底(文件名去扩展名后为空时)。 */\n fallbackAlt: string;\n}\n\nexport const defaultImageUploadLabels: ImageUploadLabels = {\n dropzoneClick: 'Click to upload',\n dropzoneRest: ' or drag and drop',\n dropzoneLimits: (limit, maxSizeMb) => {\n const count = `Maximum ${limit} file${limit === 1 ? '' : 's'}`;\n return maxSizeMb == null ? `${count}.` : `${count}, ${maxSizeMb}MB each.`;\n },\n uploadingCount: (count) => `Uploading ${count} files`,\n clearAll: 'Clear all',\n remove: 'Remove',\n failed: 'Upload failed',\n fallbackAlt: 'image',\n};\n","import type { LocaleBundle } from './types';\n\n/** 内置中文。键必须齐全,宿主不能再补单条。 */\nexport const zh: LocaleBundle = {\n toolbar: {\n undo: '撤销',\n redo: '重做',\n style: '样式',\n normalText: '正文',\n headingLabel: (level) => `标题 ${level}`,\n fontSize: '字号',\n fontSizeDefault: '默认',\n bold: '加粗',\n italic: '斜体',\n underline: '下划线',\n strike: '删除线',\n code: '行内代码',\n textColor: '文字颜色',\n highlight: '高亮',\n colorNone: '无',\n colorTheme: '主题色',\n scriptMenu: '上标 / 下标',\n scriptNormal: '常规',\n superscript: '上标',\n subscript: '下标',\n link: '链接',\n align: '对齐',\n alignLeft: '左对齐',\n alignCenter: '居中',\n alignRight: '右对齐',\n alignJustify: '两端对齐',\n indent: '缩进',\n indentIncrease: '增加缩进',\n indentDecrease: '减少缩进',\n lineHeight: '行高',\n lineHeightDefault: '默认',\n linkPrompt: '输入链接地址',\n linkApply: '应用链接',\n linkOpen: '在新窗口打开',\n linkRemove: '移除链接',\n linkInvalid: '编辑器不接受这个地址',\n image: '图片',\n imageUploadFailed: '图片上传失败',\n imageAlign: '图片对齐',\n imageAlignLeft: '左对齐',\n imageAlignCenter: '居中',\n imageAlignRight: '右对齐',\n imageCaption: '图片描述',\n imageCaptionPlaceholder: '添加描述…',\n imageCrop: '图片剪裁',\n imageCropApply: '应用',\n imageCropCancel: '取消',\n imageCropReset: '重置剪裁',\n imagePreview: '图片预览',\n imagePreviewClose: '关闭',\n imagePreviewPrev: '上一张',\n imagePreviewNext: '下一张',\n imagePreviewZoomOut: '缩小',\n imagePreviewZoomIn: '放大',\n imagePreviewFit: '自适应',\n imagePreviewRotate: '旋转',\n importMarkdownFailed: 'Markdown 导入失败',\n importDocument: '导入',\n importDocumentHint: '导入文件',\n importDocumentOther: '文档',\n importDocumentBusy: '正在导入…',\n importDocumentUploading: (percent) => `上传中 ${percent}%`,\n importDocumentConverting: '正在转换…',\n importDocumentFailed: '导入失败',\n blockquote: '引用',\n details: '折叠块',\n bulletList: '无序列表',\n orderedList: '有序列表',\n numberingFormat: '编号格式',\n taskList: '任务列表',\n more: '更多',\n search: '查找替换',\n codeBlock: '代码块',\n hr: '分隔线',\n importMarkdown: 'Markdown',\n tableInsert: '插入表格',\n tableRowMenu: '行操作',\n tableColumnMenu: '列操作',\n tableClearContent: '清空内容',\n tableResetCellStyles: '重置单元格样式',\n tableAppendRow: '添加行',\n tableAppendColumn: '添加列',\n tableSizeSelected: (cols, rows) => `${cols} × ${rows}`,\n tableAddColumnBefore: '在左侧插入列',\n tableAddColumnAfter: '在右侧插入列',\n tableDeleteColumn: '删除列',\n tableAddRowBefore: '在上方插入行',\n tableAddRowAfter: '在下方插入行',\n tableDeleteRow: '删除行',\n tableAddColumnBeforeN: (n) => `在左侧插入 ${n} 列`,\n tableAddColumnAfterN: (n) => `在右侧插入 ${n} 列`,\n tableDeleteColumnN: (n) => `删除 ${n} 列`,\n tableAddRowBeforeN: (n) => `在上方插入 ${n} 行`,\n tableAddRowAfterN: (n) => `在下方插入 ${n} 行`,\n tableDeleteRowN: (n) => `删除 ${n} 行`,\n tableDeleteTable: '删除表格',\n inlineMath: '行内公式',\n blockMath: '块级公式',\n mathPlaceholder: 'E = mc^2',\n mathDone: '完成',\n mathCancel: '取消',\n mathNewInline: '新建公式',\n mathNewBlock: '插入 TeX 公式',\n },\n slashMenu: {\n menuLabel: '插入块',\n groupText: '文本',\n groupList: '列表',\n groupAdvanced: '高级',\n normalText: '正文',\n headingLabel: (level) => `标题 ${level}`,\n bulletList: '无序列表',\n orderedList: '有序列表',\n taskList: '任务列表',\n blockquote: '引用',\n details: '折叠块',\n codeBlock: '代码块',\n divider: '分隔线',\n table: '表格',\n inlineMath: '行内公式',\n blockMath: '块级公式',\n },\n chart: {\n tabLabel: (chartType, index) => `${chartType} ${index + 1}`,\n done: '完成',\n cancel: '取消',\n configLabel: '图表配置(JSON)',\n tableLabel: '数据表(Markdown)',\n editTitle: '编辑图表',\n },\n blockDrag: {\n dragHandle: '拖动以移动',\n menuLabel: '块操作',\n turnInto: '转换成',\n paragraph: '正文',\n headingLabel: (level) => `标题 ${level}`,\n bulletList: '无序列表',\n orderedList: '有序列表',\n taskList: '任务列表',\n blockquote: '引用',\n codeBlock: '代码块',\n copy: '复制',\n duplicate: '再制一份',\n resetFormatting: '清除格式',\n downloadImage: '下载图片',\n delete: '删除',\n },\n shortcut: {\n panelTitle: '快捷键',\n close: '关闭',\n colFormat: '格式',\n colShortcut: '快捷键',\n colMarkdown: 'Markdown',\n formatGroup: '格式',\n insertGroup: '插入',\n editGroup: '编辑',\n bold: '加粗',\n italic: '斜体',\n strike: '删除线',\n underline: '下划线',\n inlineCode: '行内代码',\n highlight: '高亮',\n headingLabel: (level) => `标题 ${level}`,\n paragraph: '正文',\n blockquote: '引用',\n bulletList: '无序列表',\n orderedList: '有序列表',\n taskList: '任务列表',\n codeBlock: '代码块',\n divider: '分隔线',\n undo: '撤销',\n redo: '重做',\n hardBreak: '硬换行',\n findReplace: '查找替换',\n alignLeft: '左对齐',\n alignCenter: '居中',\n alignRight: '右对齐',\n alignJustify: '两端对齐',\n imageUpload: '上传图片',\n smartQuote: '智能引号',\n ellipsis: '省略号',\n emDash: '破折号',\n emoji: '表情',\n },\n characterCount: {\n label: '字数统计',\n characters: (count) => `${count} 字符`,\n words: (count) => `${count} 词`,\n },\n emoji: {\n menuLabel: '表情',\n },\n link: {\n field: '输入链接地址',\n apply: '应用链接',\n open: '在新窗口打开',\n remove: '移除链接',\n invalid: '编辑器不接受这个地址',\n },\n palette: {\n none: '无',\n theme: '主题色',\n },\n toc: {\n title: '目录',\n expand: '展开',\n collapse: '收起',\n },\n codeBlock: {\n autoDetect: '自动识别',\n delete: '删除代码块',\n copy: '复制代码',\n expand: '展开代码',\n collapse: '收起代码',\n language: '代码语言',\n },\n find: {\n find: '查找',\n replace: '替换为',\n next: '下一处',\n previous: '上一处',\n replaceOne: '替换',\n replaceAll: '全部替换',\n close: '关闭',\n caseSensitive: '区分大小写',\n wholeWord: '全词匹配',\n useRegex: '正则表达式',\n counter: (current, total) => `${current} / ${total}`,\n invalidRegex: '正则无效',\n readOnly: '只读',\n },\n imageUpload: {\n dropzoneClick: '点击上传',\n dropzoneRest: ',或拖拽到此处',\n dropzoneLimits: (limit, maxSizeMb) => {\n const count = `最多 ${limit} 个文件`;\n return maxSizeMb == null ? `${count}。` : `${count},每个 ${maxSizeMb}MB。`;\n },\n uploadingCount: (count) => `正在上传 ${count} 个文件`,\n clearAll: '全部清除',\n remove: '移除',\n failed: '上传失败',\n fallbackAlt: '图片',\n },\n};\n","import {\n defaultBlockDragLabels,\n defaultCharacterCountLabels,\n defaultChartLabels,\n defaultCodeBlockLabels,\n defaultColorPaletteLabels,\n defaultEmojiSuggestionLabels,\n defaultFindLabels,\n defaultImageUploadLabels,\n defaultLinkPopoverLabels,\n defaultShortcutLabels,\n defaultSlashMenuLabels,\n defaultTocLabels,\n defaultToolbarLabels,\n} from '../labels';\nimport type { LocaleBundle, LocaleCode } from './types';\nimport { zh } from './zh';\n\nexport type { LocaleBundle, LocaleCode } from './types';\n\nconst en: LocaleBundle = {\n toolbar: defaultToolbarLabels,\n slashMenu: defaultSlashMenuLabels,\n chart: defaultChartLabels,\n blockDrag: defaultBlockDragLabels,\n shortcut: defaultShortcutLabels,\n characterCount: defaultCharacterCountLabels,\n emoji: defaultEmojiSuggestionLabels,\n link: defaultLinkPopoverLabels,\n palette: defaultColorPaletteLabels,\n toc: defaultTocLabels,\n codeBlock: defaultCodeBlockLabels,\n find: defaultFindLabels,\n imageUpload: defaultImageUploadLabels,\n};\n\nconst bundles: Record<LocaleCode, LocaleBundle> = { en, zh };\n\n/** 取一份完整文案。未知语言回落英文。 */\nexport function getLocaleBundle(locale: LocaleCode = 'en'): LocaleBundle {\n return bundles[locale] ?? en;\n}\n","import { normalizeImageCrop, type ImageCrop } from './imageMarkdown';\n\n/**\n * 图片灯箱的纯逻辑:从正文里收集图、判断点到的是哪一张、以及适应视口的缩放。\n * 阅读态单击打开,编辑态双击或工具条打开;裁剪进行时不抢手势。\n */\n\nexport interface PreviewImage {\n src: string;\n alt: string;\n crop: ImageCrop | null;\n}\n\n/** 灯箱自定义事件。工具条在 body 上,不在正文根里,用它通知所属正文打开这一张。 */\nexport const IMAGE_PREVIEW_EVENT = 'tmr-image-preview';\n\nconst ZOOM_STEP = 1.25;\nconst ZOOM_MIN = 0.25;\nconst ZOOM_MAX = 8;\n/** 视口左右各留出的空隙,避免图贴边。 */\nconst PAD_X = 48;\n/** 视口上下各留出的空隙,给关闭按钮和底部工具条腾位置。 */\nconst PAD_Y = 88;\n\nexport function requestImagePreview(img: HTMLImageElement) {\n img.dispatchEvent(\n new CustomEvent(IMAGE_PREVIEW_EVENT, { bubbles: true, detail: { img } }),\n );\n}\n\n/** 正文里按阅读顺序能预览的图。灯箱自己 portal 出去的图不算。 */\nexport function listPreviewImages(root: ParentNode): HTMLImageElement[] {\n return [...root.querySelectorAll('img')].filter((node): node is HTMLImageElement => {\n if (!(node instanceof HTMLImageElement)) return false;\n if (!node.getAttribute('src')) return false;\n if (node.closest('[data-image-lightbox]')) return false;\n return true;\n });\n}\n\nexport function toPreviewImage(img: HTMLImageElement): PreviewImage {\n return {\n src: img.getAttribute('src') ?? '',\n alt: img.getAttribute('alt') ?? '',\n crop: normalizeImageCrop(img.getAttribute('data-crop')),\n };\n}\n\n/**\n * 点击 / 双击的目标是不是一张正文图。\n * 裁剪进行时、缩放手柄上都不打开,避免和剪裁、缩放抢手势。\n * 裁过的图 img 是 pointer-events:none,点到的是外面的 `.tmr-image-crop`。\n */\nexport function previewImageFromTarget(target: EventTarget | null): HTMLImageElement | null {\n if (!(target instanceof Element)) return null;\n if (target.closest('[data-image-lightbox], [data-resize-handle], [data-image-cropping]')) {\n return null;\n }\n const frame = target.closest('.tmr-image-crop');\n const node = frame ? frame.querySelector('img') : target.closest('img');\n if (!(node instanceof HTMLImageElement)) return null;\n if (!node.getAttribute('src')) return null;\n if (node.closest('[data-image-lightbox]')) return null;\n return node;\n}\n\n/** 灯箱里要显示的像素尺寸:裁剪后是可见区域,不是整张原图。 */\nexport function previewPixelSize(\n naturalWidth: number,\n naturalHeight: number,\n crop: ImageCrop | null,\n): { width: number; height: number } {\n if (naturalWidth <= 0 || naturalHeight <= 0) return { width: 0, height: 0 };\n if (!crop) return { width: naturalWidth, height: naturalHeight };\n return { width: naturalWidth * crop.w, height: naturalHeight * crop.h };\n}\n\nexport interface PreviewFit {\n /** 未旋转时的布局宽(zoom = 1 时正好适应视口)。 */\n width: number;\n /** 未旋转时的布局高。 */\n height: number;\n /** 乘上它之后,屏幕上的一边等于可见区域的像素。放大缩小的上下限用它兜住。 */\n actualZoom: number;\n}\n\n/**\n * zoom = 1 时图适应视口(大图缩小,小图放大,和阅读页灯箱一样铺满可视区域)。\n * 旋转 90/270 后按转过的外接框来适应;返回的宽高仍是旋转前的布局盒,\n * 视觉上的外接框由 CSS rotate 交换。自适应就是 zoom = 1。\n */\nexport function fitPreviewBox(input: {\n viewportWidth: number;\n viewportHeight: number;\n imageWidth: number;\n imageHeight: number;\n rotation: number;\n}): PreviewFit | null {\n const { imageWidth, imageHeight } = input;\n if (imageWidth <= 0 || imageHeight <= 0) return null;\n const quarter = ((input.rotation % 360) + 360) % 360;\n const swapped = quarter === 90 || quarter === 270;\n const screenW = swapped ? imageHeight : imageWidth;\n const screenH = swapped ? imageWidth : imageHeight;\n const availW = Math.max(64, input.viewportWidth - PAD_X * 2);\n const availH = Math.max(64, input.viewportHeight - PAD_Y * 2);\n const fitScale = Math.min(availW / screenW, availH / screenH);\n if (!Number.isFinite(fitScale) || fitScale <= 0) return null;\n return {\n width: imageWidth * fitScale,\n height: imageHeight * fitScale,\n actualZoom: 1 / fitScale,\n };\n}\n\n/** 放大、缩小、自适应(回到适应视口的 zoom = 1)。 */\nexport function nextPreviewZoom(\n action: 'in' | 'out' | 'fit',\n zoom: number,\n actualZoom: number,\n): number {\n if (action === 'fit') return 1;\n const max = Math.max(ZOOM_MAX, actualZoom);\n const min = Math.min(ZOOM_MIN, actualZoom);\n const next = action === 'in' ? zoom * ZOOM_STEP : zoom / ZOOM_STEP;\n return Math.min(max, Math.max(min, next));\n}\n","'use client';\n\nimport {\n useEffect,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport type { LocaleCode } from '../i18n';\nimport { getLocaleBundle } from '../i18n';\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n FitIcon,\n RotateCwIcon,\n XIcon,\n ZoomInIcon,\n ZoomOutIcon,\n} from '../icons';\nimport { cropImageBox } from '../imageMarkdown';\nimport {\n IMAGE_PREVIEW_EVENT,\n fitPreviewBox,\n listPreviewImages,\n nextPreviewZoom,\n previewImageFromTarget,\n previewPixelSize,\n toPreviewImage,\n type PreviewImage,\n} from '../imagePreview';\nimport styles from '../styles/imageLightbox.module.css';\n\n/**\n * 包住一块正文:阅读态单击图片、编辑态双击图片,或收到工具条的预览事件,打开灯箱。\n * 自身 `display: contents`,不改原有布局。\n */\nexport function ImagePreviewHost({\n children,\n locale = 'en',\n activate = 'click',\n}: {\n children: ReactNode;\n locale?: LocaleCode;\n /** 阅读用单击;编辑用双击,单击仍留给选中、缩放和剪裁。 */\n activate?: 'click' | 'dblclick';\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const [session, setSession] = useState<{ images: PreviewImage[]; index: number } | null>(\n null,\n );\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n const openFrom = (img: HTMLImageElement) => {\n if (!el.contains(img)) return;\n const nodes = listPreviewImages(el);\n const index = nodes.indexOf(img);\n if (index < 0) return;\n setSession({ images: nodes.map(toPreviewImage), index });\n };\n const onActivate = (event: Event) => {\n const img = previewImageFromTarget(event.target);\n if (!img) return;\n event.preventDefault();\n openFrom(img);\n };\n const onRequest = (event: Event) => {\n const img = (event as CustomEvent<{ img?: HTMLImageElement }>).detail?.img;\n if (!(img instanceof HTMLImageElement)) return;\n openFrom(img);\n };\n const eventName = activate === 'dblclick' ? 'dblclick' : 'click';\n el.addEventListener(eventName, onActivate);\n el.addEventListener(IMAGE_PREVIEW_EVENT, onRequest);\n return () => {\n el.removeEventListener(eventName, onActivate);\n el.removeEventListener(IMAGE_PREVIEW_EVENT, onRequest);\n };\n }, [activate]);\n\n const labels = getLocaleBundle(locale).toolbar;\n\n return (\n <div\n ref={ref}\n className={styles.root}\n data-image-preview={activate === 'click' ? 'click' : undefined}\n >\n {children}\n {session && typeof document !== 'undefined'\n ? createPortal(\n <ImageLightbox\n images={session.images}\n index={session.index}\n label={labels.imagePreview}\n closeLabel={labels.imagePreviewClose}\n prevLabel={labels.imagePreviewPrev}\n nextLabel={labels.imagePreviewNext}\n zoomOutLabel={labels.imagePreviewZoomOut}\n zoomInLabel={labels.imagePreviewZoomIn}\n fitLabel={labels.imagePreviewFit}\n rotateLabel={labels.imagePreviewRotate}\n onIndex={(index) => setSession((current) => (current ? { ...current, index } : current))}\n onClose={() => setSession(null)}\n />,\n document.body,\n )\n : null}\n </div>\n );\n}\n\nfunction ImageLightbox({\n images,\n index,\n label,\n closeLabel,\n prevLabel,\n nextLabel,\n zoomOutLabel,\n zoomInLabel,\n fitLabel,\n rotateLabel,\n onIndex,\n onClose,\n}: {\n images: PreviewImage[];\n index: number;\n label: string;\n closeLabel: string;\n prevLabel: string;\n nextLabel: string;\n zoomOutLabel: string;\n zoomInLabel: string;\n fitLabel: string;\n rotateLabel: string;\n onIndex: (index: number) => void;\n onClose: () => void;\n}) {\n const image = images[index];\n const dialogRef = useRef<HTMLDivElement>(null);\n const imgRef = useRef<HTMLImageElement>(null);\n const [natural, setNatural] = useState<{ w: number; h: number } | null>(null);\n const [viewport, setViewport] = useState(() => ({\n w: typeof window === 'undefined' ? 0 : window.innerWidth,\n h: typeof window === 'undefined' ? 0 : window.innerHeight,\n }));\n const [zoom, setZoom] = useState(1);\n const [rotation, setRotation] = useState(0);\n\n useEffect(() => {\n setZoom(1);\n setRotation(0);\n setNatural(null);\n }, [index, image?.src]);\n\n useEffect(() => {\n const node = imgRef.current;\n if (!node) return;\n const read = () => {\n if (node.naturalWidth > 0) {\n setNatural({ w: node.naturalWidth, h: node.naturalHeight });\n }\n };\n read();\n node.addEventListener('load', read);\n return () => node.removeEventListener('load', read);\n }, [index, image?.src]);\n\n useEffect(() => {\n const onResize = () => setViewport({ w: window.innerWidth, h: window.innerHeight });\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, []);\n\n useEffect(() => {\n const prev = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n dialogRef.current?.focus();\n return () => {\n document.body.style.overflow = prev;\n };\n }, []);\n\n const pixels = image\n ? previewPixelSize(natural?.w ?? 0, natural?.h ?? 0, image.crop)\n : { width: 0, height: 0 };\n const fit = fitPreviewBox({\n viewportWidth: viewport.w,\n viewportHeight: viewport.h,\n imageWidth: pixels.width,\n imageHeight: pixels.height,\n rotation,\n });\n const actualZoom = fit?.actualZoom ?? 1;\n\n useEffect(() => {\n const onKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n onClose();\n return;\n }\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n event.stopPropagation();\n if (index > 0) onIndex(index - 1);\n return;\n }\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n event.stopPropagation();\n if (index < images.length - 1) onIndex(index + 1);\n return;\n }\n };\n document.addEventListener('keydown', onKey, true);\n return () => document.removeEventListener('keydown', onKey, true);\n }, [images.length, index, onClose, onIndex]);\n\n if (!image) return null;\n\n const applyZoom = (action: 'in' | 'out' | 'fit') => {\n setZoom(nextPreviewZoom(action, zoom, actualZoom));\n };\n\n const cropStyle = image.crop ? cropImageBox(image.crop) : null;\n\n return (\n <div\n ref={dialogRef}\n className={styles.backdrop}\n data-image-lightbox=\"\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={label}\n tabIndex={-1}\n >\n <button\n type=\"button\"\n className={styles.close}\n data-image-preview-action=\"close\"\n title={closeLabel}\n aria-label={closeLabel}\n onClick={onClose}\n >\n <XIcon size={22} />\n </button>\n <div\n className={styles.stage}\n onClick={(event) => {\n if (event.target === event.currentTarget) onClose();\n }}\n >\n <div\n className={styles.frame}\n style={{\n width: fit ? `${fit.width}px` : undefined,\n height: fit ? `${fit.height}px` : undefined,\n visibility: fit ? 'visible' : 'hidden',\n transform: `rotate(${rotation}deg) scale(${zoom})`,\n }}\n >\n <img\n ref={imgRef}\n src={image.src}\n alt={image.alt}\n draggable={false}\n style={\n cropStyle\n ? {\n position: 'absolute',\n maxWidth: 'none',\n width: cropStyle.width,\n height: cropStyle.height,\n left: cropStyle.left,\n top: cropStyle.top,\n }\n : undefined\n }\n />\n </div>\n </div>\n <div className={styles.bar} role=\"toolbar\" aria-label={label}>\n <button\n type=\"button\"\n className={styles.tool}\n data-image-preview-action=\"prev\"\n title={prevLabel}\n aria-label={prevLabel}\n disabled={index <= 0}\n onClick={() => onIndex(index - 1)}\n >\n <ChevronLeftIcon size={16} />\n </button>\n <span className={styles.count}>\n {index + 1}/{images.length}\n </span>\n <button\n type=\"button\"\n className={styles.tool}\n data-image-preview-action=\"next\"\n title={nextLabel}\n aria-label={nextLabel}\n disabled={index >= images.length - 1}\n onClick={() => onIndex(index + 1)}\n >\n <ChevronRightIcon size={16} />\n </button>\n <button\n type=\"button\"\n className={styles.tool}\n data-image-preview-action=\"zoom-out\"\n title={zoomOutLabel}\n aria-label={zoomOutLabel}\n onClick={() => applyZoom('out')}\n >\n <ZoomOutIcon size={16} />\n </button>\n <button\n type=\"button\"\n className={styles.tool}\n data-image-preview-action=\"zoom-in\"\n title={zoomInLabel}\n aria-label={zoomInLabel}\n onClick={() => applyZoom('in')}\n >\n <ZoomInIcon size={16} />\n </button>\n <button\n type=\"button\"\n className={styles.tool}\n data-image-preview-action=\"fit\"\n title={fitLabel}\n aria-label={fitLabel}\n aria-pressed={Math.abs(zoom - 1) < 0.02}\n onClick={() => applyZoom('fit')}\n >\n <FitIcon size={16} />\n </button>\n <button\n type=\"button\"\n className={styles.tool}\n data-image-preview-action=\"rotate\"\n title={rotateLabel}\n aria-label={rotateLabel}\n onClick={() => setRotation((current) => (current + 90) % 360)}\n >\n <RotateCwIcon size={16} />\n </button>\n </div>\n </div>\n );\n}\n","import type { ChartConfig, ChartPayload } from './types';\n\nexport interface ChartJsPoint {\n x: string | number;\n y: number;\n category?: string;\n type?: string;\n}\n\nfunction toNumber(value: unknown): number {\n if (typeof value === 'number' && !Number.isNaN(value)) return value;\n if (typeof value === 'string') {\n const n = Number(value.replace(/,/g, ''));\n if (!Number.isNaN(n)) return n;\n }\n return 0;\n}\n\n/**\n * Map table rows to flat chart points for one config.\n * colorLegend → series `type`; groupBy stored as category (no UI filter in v1).\n */\nexport function mapChartDataItems(\n config: ChartConfig,\n dataSource: Record<string, unknown>[],\n): ChartJsPoint[] {\n const xKey = config.x!;\n const yKey = config.y!;\n const legendKey = config.colorLegend;\n const groupKey = config.groupBy;\n\n let rows = [...dataSource];\n const sortKey = config.sortBy;\n if (sortKey) {\n rows.sort((a, b) => {\n const av = a[sortKey];\n const bv = b[sortKey];\n if (typeof av === 'number' && typeof bv === 'number') return av - bv;\n return String(av ?? '').localeCompare(String(bv ?? ''), undefined, {\n numeric: true,\n });\n });\n }\n\n return rows.map((row) => {\n const point: ChartJsPoint = {\n x: row[xKey] as string | number,\n y: toNumber(row[yKey]),\n };\n if (legendKey) point.type = String(row[legendKey] ?? '');\n if (groupKey) point.category = String(row[groupKey] ?? '');\n return point;\n });\n}\n\nexport interface BuiltChartData {\n labels: string[];\n datasets: {\n label: string;\n data: number[];\n }[];\n isCartesian: boolean;\n}\n\n/** Build Chart.js labels/datasets for one active config. */\nexport function buildChartJsData(\n config: ChartConfig,\n payload: Pick<ChartPayload, 'dataSource'>,\n): BuiltChartData {\n const points = mapChartDataItems(config, payload.dataSource);\n const type = config.chartType;\n const isCartesian = !['pie', 'donut'].includes(type);\n\n if (!isCartesian) {\n return {\n labels: points.map((p) => String(p.x)),\n datasets: [\n {\n label: config.title || config.y || 'value',\n data: points.map((p) => p.y),\n },\n ],\n isCartesian: false,\n };\n }\n\n const seriesKeys = new Set<string>();\n for (const p of points) {\n seriesKeys.add(p.type || config.title || config.y || 'series');\n }\n const seriesList = [...seriesKeys];\n const labelSet: string[] = [];\n for (const p of points) {\n const lab = String(p.x);\n if (!labelSet.includes(lab)) labelSet.push(lab);\n }\n\n const datasets = seriesList.map((series) => ({\n label: series,\n data: labelSet.map((lab) => {\n const hit = points.find(\n (p) =>\n String(p.x) === lab &&\n (p.type || config.title || config.y || 'series') === series,\n );\n return hit ? hit.y : 0;\n }),\n }));\n\n return { labels: labelSet, datasets, isCartesian: true };\n}\n","import type { ChartTheme } from './types';\n\nconst DEFAULT_PALETTE = [\n '#3b82f6',\n '#10b981',\n '#f59e0b',\n '#ef4444',\n '#8b5cf6',\n '#06b6d4',\n '#ec4899',\n '#84cc16',\n];\n\nfunction readCssVar(\n el: HTMLElement | null,\n name: string,\n fallback: string,\n): string {\n if (!el || typeof getComputedStyle === 'undefined') return fallback;\n const v = getComputedStyle(el).getPropertyValue(name).trim();\n return v || fallback;\n}\n\n/** Resolve theme from --tmr-* CSS variables + optional host override. */\nexport function resolveChartTheme(\n host: HTMLElement | null,\n override?: ChartTheme | null,\n): Required<\n Pick<\n ChartTheme,\n | 'backgroundColor'\n | 'textColor'\n | 'gridColor'\n | 'borderColor'\n | 'fontFamily'\n | 'palette'\n >\n> {\n const base = {\n backgroundColor: readCssVar(host, '--tmr-bg', '#ffffff'),\n textColor: readCssVar(host, '--tmr-fg', '#1f2937'),\n gridColor: readCssVar(host, '--tmr-border', '#e5e7eb'),\n borderColor: readCssVar(host, '--tmr-border', '#e5e7eb'),\n fontFamily: readCssVar(\n host,\n '--tmr-font',\n 'ui-sans-serif, system-ui, sans-serif',\n ),\n palette: DEFAULT_PALETTE,\n };\n if (!override) return base;\n return {\n backgroundColor: override.backgroundColor ?? base.backgroundColor,\n textColor: override.textColor ?? base.textColor,\n gridColor: override.gridColor ?? base.gridColor,\n borderColor: override.borderColor ?? base.borderColor,\n fontFamily: override.fontFamily ?? base.fontFamily,\n palette:\n override.palette && override.palette.length > 0\n ? override.palette\n : base.palette,\n };\n}\n","import {\n ArcElement,\n BarController,\n BarElement,\n CategoryScale,\n Chart,\n DoughnutController,\n Filler,\n Legend,\n LineController,\n LineElement,\n LinearScale,\n PieController,\n PointElement,\n Tooltip,\n type ChartConfiguration,\n type ChartType,\n} from 'chart.js';\nimport { buildChartJsData } from './mapData';\nimport { resolveChartTheme } from './theme';\nimport type { ChartConfig, ChartPayload, ChartTheme } from './types';\n\nlet registered = false;\n\nfunction ensureRegister() {\n if (registered) return;\n if (typeof window === 'undefined') return;\n Chart.register(\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n BarElement,\n ArcElement,\n LineController,\n BarController,\n PieController,\n DoughnutController,\n Filler,\n Legend,\n Tooltip,\n );\n registered = true;\n}\n\nfunction toChartJsType(chartType: string): ChartType {\n switch (chartType) {\n case 'bar':\n return 'bar';\n case 'column':\n return 'bar';\n case 'line':\n return 'line';\n case 'area':\n return 'line';\n case 'pie':\n return 'pie';\n case 'donut':\n return 'doughnut';\n default:\n return 'bar';\n }\n}\n\nexport interface RenderChartOptions {\n canvas: HTMLCanvasElement;\n config: ChartConfig;\n payload: Pick<ChartPayload, 'dataSource' | 'columns'>;\n theme?: ChartTheme | null;\n /** Existing instance to update in place (streaming). */\n chart?: Chart | null;\n}\n\nexport function renderOrUpdateChart({\n canvas,\n config,\n payload,\n theme,\n chart,\n}: RenderChartOptions): Chart | null {\n if (typeof window === 'undefined') return null;\n ensureRegister();\n\n const host = canvas.parentElement;\n const colors = resolveChartTheme(host, theme);\n const built = buildChartJsData(config, payload);\n const jsType = toChartJsType(config.chartType);\n const isBarHorizontal = config.chartType === 'bar';\n const isArea = config.chartType === 'area';\n\n const datasets = built.datasets.map((ds, i) => {\n const color = colors.palette[i % colors.palette.length];\n if (!built.isCartesian) {\n return {\n ...ds,\n backgroundColor: built.labels.map(\n (_, j) => colors.palette[j % colors.palette.length],\n ),\n borderWidth: 0,\n };\n }\n return {\n ...ds,\n backgroundColor: isArea ? `${color}33` : color,\n borderColor: color,\n borderWidth: 2,\n fill: isArea,\n tension: 0.25,\n };\n });\n\n const configuration: ChartConfiguration = {\n type: jsType,\n data: {\n labels: built.labels,\n datasets,\n },\n options: {\n indexAxis: isBarHorizontal ? 'y' : 'x',\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: {\n display: built.datasets.length > 1 || !built.isCartesian,\n labels: {\n color: colors.textColor,\n font: { family: colors.fontFamily },\n },\n },\n title: { display: false },\n tooltip: {\n titleFont: { family: colors.fontFamily },\n bodyFont: { family: colors.fontFamily },\n },\n },\n scales: built.isCartesian\n ? {\n x: {\n ticks: {\n color: colors.textColor,\n font: { family: colors.fontFamily },\n },\n grid: { color: colors.gridColor },\n border: { color: colors.borderColor },\n },\n y: {\n ticks: {\n color: colors.textColor,\n font: { family: colors.fontFamily },\n },\n grid: { color: colors.gridColor },\n border: { color: colors.borderColor },\n },\n }\n : undefined,\n },\n };\n\n if (chart) {\n (chart.config as { type: ChartType }).type = jsType;\n chart.data.labels = configuration.data.labels;\n chart.data.datasets = configuration.data.datasets as never;\n chart.options = configuration.options as never;\n chart.update('none');\n return chart;\n }\n\n return new Chart(canvas, configuration);\n}\n\nexport function destroyChart(chart: Chart | null | undefined) {\n chart?.destroy();\n}\n","/**\n * 目录点击 → 平滑滚到对应标题。\n *\n * 不依赖浏览器 `scrollTo({behavior:'smooth'})` / `scrollIntoView({behavior:'smooth'})`——\n * 在 flex + overflow 嵌套布局下(父级 `overflow:hidden`、自身 `flex:1; overflow-y:auto`),\n * Chrome 的 compositor 驱动 smooth scroll 会静默失效。\n *\n * 改用 `requestAnimationFrame` + easeOutCubic 缓动,直接操作 `scrollTop`,\n * 主线程一次性 400ms 动画,点击触发的单次滚动无感知性能差异。\n *\n * 尊重 `prefers-reduced-motion: reduce`——此时瞬间跳转,无动画。\n */\n\n/** 缓动:easeOutCubic。t ∈ [0, 1]。 */\nfunction easeOutCubic(t: number): number {\n return 1 - (1 - t) * (1 - t) * (1 - t);\n}\n\n/**\n * 平滑滚动(或瞬间跳转)到指定 `data-toc-id` 的标题。\n *\n * @param headingId - TOC item 的 id,对应 DOM 上 `data-toc-id` 属性值\n * @param scrollContainer - 滚动容器(如 `.scrollArea`)\n * @param options - `duration`:动画时长 ms,默认 400\n */\nexport function scrollToTocHeading(\n headingId: string,\n scrollContainer: HTMLElement,\n options?: { duration?: number },\n): void {\n const el = scrollContainer.querySelector<HTMLElement>(\n `[data-toc-id=\"${CSS.escape(headingId)}\"]`,\n );\n if (!el) return;\n\n const startTop = scrollContainer.scrollTop;\n const rootRect = scrollContainer.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n const targetTop = startTop + (elRect.top - rootRect.top);\n\n // prefers-reduced-motion:瞬间跳转\n if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\n scrollContainer.scrollTop = targetTop;\n return;\n }\n\n // 手动平滑滚动\n const duration = options?.duration ?? 400;\n const start = performance.now();\n const animate = () => {\n const t = Math.min((performance.now() - start) / duration, 1);\n scrollContainer.scrollTop = startTop + (targetTop - startTop) * easeOutCubic(t);\n if (t < 1) requestAnimationFrame(animate);\n };\n requestAnimationFrame(animate);\n}\n","'use client';\n\nimport { useEffect, useRef, useState, type CSSProperties } from 'react';\nimport { getLocaleBundle, type LocaleCode } from '../i18n';\nimport styles from '../styles/editorToc.module.css';\nimport type { TocItem } from '../toc/extractToc';\nimport { scrollToTocHeading } from '../toc/scrollToTocHeading';\n\n/** 短横线宽度:层级越高越长。 */\nfunction barWidth(level: number): number {\n if (level <= 1) return 20;\n if (level === 2) return 14;\n if (level === 3) return 10;\n return 6;\n}\n\n/**\n * 最近的可滚动祖先。限高但还没溢出的容器也算(内容变长后由它滚)。\n * 都没有时用文档滚动根。\n */\nfunction findScrollParent(start: HTMLElement): HTMLElement {\n let node: HTMLElement | null = start.parentElement;\n while (node && node !== document.documentElement) {\n const style = getComputedStyle(node);\n const overflowY = style.overflowY;\n const canScroll =\n overflowY === 'auto' || overflowY === 'scroll' || overflowY === 'overlay';\n if (\n canScroll &&\n (node.scrollHeight > node.clientHeight + 1 || style.maxHeight !== 'none')\n ) {\n return node;\n }\n node = node.parentElement;\n }\n return (document.scrollingElement as HTMLElement) ?? document.documentElement;\n}\n\nfunction isViewportScroller(node: HTMLElement): boolean {\n return (\n node === document.documentElement ||\n node === document.body ||\n node === document.scrollingElement\n );\n}\n\nexport interface EditorTocProps {\n items: TocItem[];\n /** 编辑器正文根节点,用来找标题和滚动容器。 */\n editorDom: HTMLElement;\n locale?: LocaleCode;\n}\n\n/**\n * 编辑器内目录(Notion 式,贴在左缘)。\n * 收起是一列短横线;悬停或聚焦向右展开标题,点击滚到对应标题。\n */\nexport function EditorToc({ items, editorDom, locale = 'en' }: EditorTocProps) {\n const t = getLocaleBundle(locale).toc;\n const [open, setOpen] = useState(false);\n const [activeId, setActiveId] = useState(items[0]?.id ?? '');\n const [roving, setRoving] = useState(0);\n const navRef = useRef<HTMLElement>(null);\n const itemRefs = useRef<Array<HTMLButtonElement | null>>([]);\n const hideTimer = useRef<number | null>(null);\n /** 点击后先钉住这一项。正文不够长、滚不到激活线时,滚动监听不能把它盖掉。 */\n const pinnedId = useRef<string | null>(null);\n const pinScroll = useRef<number | null>(null);\n const pinTimer = useRef<number | null>(null);\n\n const clearHide = () => {\n if (hideTimer.current !== null) {\n window.clearTimeout(hideTimer.current);\n hideTimer.current = null;\n }\n };\n\n const show = () => {\n clearHide();\n setOpen(true);\n };\n\n const hideSoon = () => {\n clearHide();\n hideTimer.current = window.setTimeout(() => {\n hideTimer.current = null;\n if (navRef.current?.contains(document.activeElement)) return;\n setOpen(false);\n }, 80);\n };\n\n useEffect(\n () => () => {\n clearHide();\n if (pinTimer.current !== null) window.clearTimeout(pinTimer.current);\n },\n [],\n );\n\n // 视口上半区里最靠上的标题为当前章节;都离开上半区时,取已经滚过去的最后一个。\n useEffect(() => {\n const headings = items\n .map((item) =>\n editorDom.querySelector<HTMLElement>(\n `[data-toc-id=\"${CSS.escape(item.id)}\"]`,\n ),\n )\n .filter((el): el is HTMLElement => el !== null);\n if (!headings.length) return;\n\n const scrollParent = findScrollParent(editorDom);\n const viewport = isViewportScroller(scrollParent);\n const visible = new Set<Element>();\n\n const scrollPos = () =>\n viewport ? window.scrollY : scrollParent.scrollTop;\n\n const apply = () => {\n const pos = scrollPos();\n if (pinnedId.current) {\n const lockedAt = pinScroll.current;\n if (lockedAt === null || Math.abs(pos - lockedAt) <= 2) {\n setActiveId(pinnedId.current);\n return;\n }\n pinnedId.current = null;\n pinScroll.current = null;\n }\n\n const maxScroll = viewport\n ? Math.max(\n 0,\n (document.scrollingElement?.scrollHeight ?? 0) - window.innerHeight,\n )\n : Math.max(0, scrollParent.scrollHeight - scrollParent.clientHeight);\n // 已经滚到底、后面没有更多正文时,当前项是视口里最靠下的标题。\n if (maxScroll > 1 && pos >= maxScroll - 2) {\n const rootBottom = viewport\n ? window.innerHeight\n : scrollParent.getBoundingClientRect().bottom;\n let lastInView: HTMLElement | null = null;\n for (const heading of headings) {\n if (heading.getBoundingClientRect().top < rootBottom - 8) {\n lastInView = heading;\n }\n }\n const id = (lastInView ?? headings[headings.length - 1]).getAttribute(\n 'data-toc-id',\n );\n if (id) setActiveId(id);\n return;\n }\n\n const rootTop = viewport ? 0 : scrollParent.getBoundingClientRect().top;\n let best: HTMLElement | null = null;\n let bestTop = Infinity;\n for (const el of visible) {\n const top = (el as HTMLElement).getBoundingClientRect().top;\n if (top < bestTop) {\n bestTop = top;\n best = el as HTMLElement;\n }\n }\n if (!best) {\n let last: HTMLElement | null = null;\n for (const heading of headings) {\n if (heading.getBoundingClientRect().top <= rootTop + 12) last = heading;\n }\n best = last ?? headings[0];\n }\n const id = best.getAttribute('data-toc-id');\n if (id) setActiveId(id);\n };\n\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) visible.add(entry.target);\n else visible.delete(entry.target);\n }\n apply();\n },\n {\n root: viewport ? null : scrollParent,\n rootMargin: '0px 0px -60% 0px',\n threshold: [0, 1],\n },\n );\n for (const heading of headings) observer.observe(heading);\n\n const onScroll = () => apply();\n const scrollTarget: HTMLElement | Window = viewport ? window : scrollParent;\n scrollTarget.addEventListener('scroll', onScroll, { passive: true });\n apply();\n\n return () => {\n observer.disconnect();\n scrollTarget.removeEventListener('scroll', onScroll);\n };\n }, [items, editorDom]);\n\n // 目录没被键盘占用时,下一个 Tab 落在当前章节上。\n useEffect(() => {\n if (navRef.current?.contains(document.activeElement)) return;\n const index = items.findIndex((item) => item.id === activeId);\n if (index >= 0) setRoving(index);\n }, [activeId, items]);\n\n useEffect(() => {\n if (!open || !activeId) return;\n const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n navRef.current\n ?.querySelector(`[data-toc-item=\"${CSS.escape(activeId)}\"]`)\n ?.scrollIntoView({ block: 'nearest', behavior: reduce ? 'auto' : 'smooth' });\n }, [activeId, open]);\n\n // 键盘落在短横线上时,焦点交给已经展开的标题按钮。\n useEffect(() => {\n if (!open || !navRef.current) return;\n const rail = navRef.current.querySelector('[data-toc-rail]');\n if (!rail?.contains(document.activeElement)) return;\n const index = Math.max(\n 0,\n items.findIndex((item) => item.id === activeId),\n );\n itemRefs.current[index]?.focus();\n }, [open, activeId, items]);\n\n const jump = (item: TocItem) => {\n const scroller = findScrollParent(editorDom);\n pinnedId.current = item.id;\n pinScroll.current = null;\n setActiveId(item.id);\n scrollToTocHeading(item.id, scroller);\n if (pinTimer.current !== null) window.clearTimeout(pinTimer.current);\n pinTimer.current = window.setTimeout(() => {\n pinTimer.current = null;\n if (pinnedId.current !== item.id) return;\n pinScroll.current = isViewportScroller(scroller)\n ? window.scrollY\n : scroller.scrollTop;\n }, 480);\n };\n\n const move = (delta: number) => {\n const next = Math.min(items.length - 1, Math.max(0, roving + delta));\n setRoving(next);\n setOpen(true);\n itemRefs.current[next]?.focus();\n };\n\n return (\n <div className={styles.anchor}>\n <nav\n ref={navRef}\n className={styles.nav}\n aria-label={t.title}\n data-editor-toc=\"\"\n onMouseEnter={show}\n onMouseLeave={hideSoon}\n onFocus={show}\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) hideSoon();\n }}\n onKeyDown={(event) => {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n move(1);\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n move(-1);\n } else if (event.key === 'Escape') {\n setOpen(false);\n }\n }}\n >\n <ul className={styles.rail} data-toc-rail=\"\" aria-hidden={open} inert={open}>\n {items.map((item, index) => {\n const active = item.id === activeId;\n return (\n <li key={item.id}>\n <button\n type=\"button\"\n tabIndex={!open && index === roving ? 0 : -1}\n className={styles.tick}\n style={{ '--bar-width': `${barWidth(item.level)}px` } as CSSProperties}\n aria-current={active ? 'true' : undefined}\n aria-label={item.text}\n onClick={() => jump(item)}\n >\n <span className={active ? styles.barActive : styles.bar} />\n </button>\n </li>\n );\n })}\n </ul>\n <div className={open ? styles.cardOpen : styles.card} inert={!open}>\n <div className={styles.cardInner}>\n <ul className={styles.list}>\n {items.map((item, index) => {\n const active = item.id === activeId;\n return (\n <li key={item.id}>\n <button\n type=\"button\"\n ref={(node) => {\n itemRefs.current[index] = node;\n }}\n data-toc-item={item.id}\n tabIndex={open && index === roving ? 0 : -1}\n className={active ? `${styles.item} ${styles.itemActive}` : styles.item}\n style={\n {\n '--toc-indent': `${(item.level - 1) * 12 + 10}px`,\n } as CSSProperties\n }\n aria-current={active ? 'true' : undefined}\n aria-label={item.text}\n onClick={() => jump(item)}\n >\n <span className={styles.itemText}>{item.text}</span>\n </button>\n </li>\n );\n })}\n </ul>\n </div>\n </div>\n </nav>\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\n\n/**\n * 是否窄屏(默认 <768px)。取代原项目的 useDevice,内联为纯 matchMedia,\n * 无第三方依赖。SSR 首帧返回 false,挂载后按实际视口更新。\n */\nexport function useIsMobile(breakpoint = 768): boolean {\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n const mq = window.matchMedia(`(max-width: ${breakpoint - 1}px)`);\n const update = () => setIsMobile(mq.matches);\n update();\n mq.addEventListener('change', update);\n return () => mq.removeEventListener('change', update);\n }, [breakpoint]);\n\n return isMobile;\n}\n","import type { TocItem } from './extractToc';\n\nconst HEADING_TAG = /^H([1-6])$/;\n\nexport function sameTocItems(a: TocItem[], b: TocItem[]): boolean {\n if (a.length !== b.length) return false;\n return a.every(\n (item, index) =>\n item.id === b[index]?.id &&\n item.level === b[index]?.level &&\n item.text === b[index]?.text,\n );\n}\n\n/** 从已渲染的标题上收集目录。只认带 data-toc-id 的 h1–h6。 */\nexport function readTocItems(root: ParentNode): TocItem[] {\n const nodes = root.querySelectorAll<HTMLElement>('[data-toc-id]');\n const items: TocItem[] = [];\n nodes.forEach((el) => {\n const id = el.getAttribute('data-toc-id');\n const match = HEADING_TAG.exec(el.tagName);\n if (!id || !match) return;\n const text = (el.textContent ?? '').replace(/\\s+/g, ' ').trim();\n if (!text) return;\n items.push({ id, level: Number(match[1]), text });\n });\n return items;\n}\n","/**\n * 从事件目标向上找到 `.citation-ref`(且必须在 root 内)。\n * SSR 阅读页事件委托与单测共用。\n */\nexport function findCitationRefElement(\n target: EventTarget | null,\n root: ParentNode,\n): HTMLElement | null {\n let node: Node | null = null;\n if (target instanceof Element) node = target;\n else if (target instanceof Text) node = target.parentElement;\n else if (target instanceof Node) node = target.parentElement;\n if (!(node instanceof Element)) return null;\n const el = node.closest('.citation-ref');\n if (!(el instanceof HTMLElement)) return null;\n if (!root.contains(el)) return null;\n return el;\n}\n\n/** 从圆标 DOM 读取 attrs(与 CitationRef renderHTML 的 data-* 对齐)。 */\nexport function readCitationAttrs(el: HTMLElement): {\n index: string;\n url: string | null;\n title: string | null;\n} {\n return {\n index: el.getAttribute('data-index') || el.textContent?.trim() || '',\n url: el.getAttribute('data-url'),\n title: el.getAttribute('data-title'),\n };\n}\n","'use client';\n\nimport { useEffect, useRef, type RefObject } from 'react';\nimport {\n findCitationRefElement,\n readCitationAttrs,\n} from '../citationDom';\nimport type {\n OnCitationEnter,\n OnCitationLeave,\n} from '../citationTypes';\n\nexport interface CitationInteractiveProps {\n /**\n * 包含 `ReportContent` HTML 的根节点(其内应有 `.citation-ref`)。\n * 用同一 ref 包住 ReportContent 即可。\n */\n containerRef: RefObject<HTMLElement | null>;\n /** 点击圆标。宿主据此 setState 打开自己的 Popover。 */\n onCitationEnter: OnCitationEnter;\n /**\n * 点正文非圆标处 / 再点同一圆标 / Escape。\n * 库立即回调;浮层开关由宿主管。\n */\n onCitationLeave: OnCitationLeave;\n}\n\n/**\n * SSR 阅读页脚注增强:只做 **click** 事件委托,不持有 open 状态。\n *\n * ```tsx\n * <CitationInteractive\n * containerRef={ref}\n * onCitationEnter={setActive}\n * onCitationLeave={() => setActive(null)}\n * />\n * ```\n */\nexport function CitationInteractive({\n containerRef,\n onCitationEnter,\n onCitationLeave,\n}: CitationInteractiveProps) {\n const enterRef = useRef(onCitationEnter);\n const leaveRef = useRef(onCitationLeave);\n enterRef.current = onCitationEnter;\n leaveRef.current = onCitationLeave;\n\n useEffect(() => {\n const root = containerRef.current;\n if (!root) return;\n\n let currentEl: HTMLElement | null = null;\n\n const emitEnter = (el: HTMLElement) => {\n currentEl = el;\n const attrs = readCitationAttrs(el);\n enterRef.current({ index: attrs.index, attrs, anchorEl: el });\n };\n\n const emitLeave = () => {\n if (!currentEl) return;\n currentEl = null;\n leaveRef.current();\n };\n\n const ACTIVE_ATTR = 'data-tmr-citation-active';\n\n const onClick = (e: MouseEvent) => {\n const el = findCitationRefElement(e.target, root);\n if (el) {\n // 捕获阶段就取消默认,避免圆标内 <a> 跳转\n e.preventDefault();\n e.stopPropagation();\n // 仅当该圆标仍处于打开态时再点才关闭(宿主可能已外部关闭,attr 已清)\n if (el === currentEl && el.hasAttribute(ACTIVE_ATTR)) {\n emitLeave();\n return;\n }\n emitEnter(el);\n return;\n }\n emitLeave();\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') emitLeave();\n };\n\n root.addEventListener('click', onClick, true);\n document.addEventListener('keydown', onKeyDown);\n\n return () => {\n root.removeEventListener('click', onClick, true);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [containerRef]);\n\n return null;\n}\n","'use client';\n\nimport { useLayoutEffect, useRef, useState, type ReactNode } from 'react';\nimport type { LocaleCode } from '../i18n';\nimport { useIsMobile } from '../hooks/useIsMobile';\nimport styles from '../styles/content.module.css';\nimport { readTocItems, sameTocItems } from '../toc/readTocItems';\nimport type { TocItem } from '../toc/extractToc';\nimport { EditorToc } from './EditorToc';\n\nexport function ContentOutline({\n toc = false,\n locale = 'en',\n watch,\n children,\n}: {\n /** 内置左缘目录。默认关。无标题或宽度小于 768px 时也不显示。 */\n toc?: boolean;\n locale?: LocaleCode;\n /** 正文变化时重读标题,一般传 html 字符串。 */\n watch?: string;\n children: ReactNode;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const [items, setItems] = useState<TocItem[]>([]);\n const mobile = useIsMobile(768);\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el || !toc) {\n setItems((prev) => (prev.length === 0 ? prev : []));\n return;\n }\n const read = () => {\n const next = readTocItems(el);\n setItems((prev) => (sameTocItems(prev, next) ? prev : next));\n };\n read();\n const observer = new MutationObserver(read);\n observer.observe(el, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n return () => observer.disconnect();\n }, [toc, watch]);\n\n const root = ref.current;\n const show = toc && !mobile && items.length > 0 && root !== null;\n\n return (\n <div className={styles.editorHost}>\n {show && root ? (\n <EditorToc items={items} editorDom={root} locale={locale} />\n ) : null}\n <div ref={ref} className={show ? styles.withToc : undefined}>\n {children}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport type { LocaleCode } from '../i18n';\nimport {\n ReportContent,\n type ReportContentProps,\n} from '../ReportContent';\nimport { ContentOutline } from './ContentOutline';\nimport { ImagePreviewHost } from './ImageLightbox';\n\nexport interface ReaderReportContentProps extends ReportContentProps {\n /**\n * 内置左缘目录(默认关闭)。传入后,有 `data-toc-id` 的标题时显示短横线,\n * 悬停展开,点击滚动。宽度小于 768px 时不显示。\n */\n toc?: boolean;\n /** 目录按钮的无障碍文案。默认英文。 */\n locale?: LocaleCode;\n}\n\n/**\n * `./reader` 的 ReportContent:静态 HTML 加上和编辑器同一套左缘目录。\n * `./server` 导出的同名组件仍是纯 HTML,没有这块界面。\n */\nexport function ReaderReportContent({\n html,\n className,\n toc = false,\n locale = 'en',\n ...rest\n}: ReaderReportContentProps) {\n return (\n <ContentOutline toc={toc} locale={locale} watch={html}>\n <ImagePreviewHost locale={locale} activate=\"click\">\n <ReportContent html={html} className={className} {...rest} />\n </ImagePreviewHost>\n </ContentOutline>\n );\n}\n","'use client';\n\nimport { useRef, type ComponentProps } from 'react';\nimport type { OnCitationEnter, OnCitationLeave } from '../citationTypes';\nimport type { LocaleCode } from '../i18n';\nimport { ReportContent } from '../ReportContent';\nimport { CitationInteractive } from './CitationInteractive';\nimport { ReaderReportContent } from './ReaderReportContent';\n\nexport interface ReportContentInteractiveProps\n extends Omit<ComponentProps<typeof ReportContent>, 'ref'> {\n /** 点击圆标:宿主 setState 打开自己的 Popover。 */\n onCitationEnter: OnCitationEnter;\n /** 点外部 / 再点圆标 / Escape:宿主关闭。 */\n onCitationLeave: OnCitationLeave;\n /** 内置左缘目录,默认关闭。 */\n toc?: boolean;\n /** 目录按钮的无障碍文案。默认英文。 */\n locale?: LocaleCode;\n}\n\n/**\n * SSR HTML 阅读 + 脚注 click 委托的便捷封装。\n * 内部:`ReportContent` + `CitationInteractive`(只报事件,仅 click)。\n */\nexport function ReportContentInteractive({\n onCitationEnter,\n onCitationLeave,\n className,\n html,\n toc = false,\n locale = 'en',\n ...rest\n}: ReportContentInteractiveProps) {\n const ref = useRef<HTMLDivElement>(null);\n\n return (\n <div ref={ref} className={className}>\n <ReaderReportContent html={html} toc={toc} locale={locale} {...rest} />\n <CitationInteractive\n containerRef={ref}\n onCitationEnter={onCitationEnter}\n onCitationLeave={onCitationLeave}\n />\n </div>\n );\n}\n","'use client';\n\nimport type { Chart as ChartJs } from 'chart.js';\nimport { useEffect, useRef, type RefObject } from 'react';\nimport { parseChartFenceBody } from '../chart/parse';\nimport { destroyChart, renderOrUpdateChart } from '../chart/renderChart';\nimport type { ChartTheme } from '../chart/types';\nimport '../styles/chart.css';\n\nexport interface ChartMountProps {\n containerRef: RefObject<HTMLElement | null>;\n chartTheme?: ChartTheme | null;\n /** Re-scan when this changes (e.g. html string). */\n html?: string;\n}\n\nfunction hydrateOne(\n el: HTMLElement,\n theme: ChartTheme | null | undefined,\n registry: Map<HTMLElement, ChartJs>,\n) {\n const raw = el.getAttribute('data-chart');\n const payload = parseChartFenceBody(raw ?? '');\n if (!payload?.config.length) return;\n\n let host = el.querySelector('.tmr-chart-canvas-host') as HTMLElement | null;\n if (!host) {\n host = document.createElement('div');\n host.className = 'tmr-chart-canvas-host';\n el.appendChild(host);\n }\n host.classList.remove('tmr-chart-skeleton');\n\n let canvas = host.querySelector('canvas');\n if (!canvas) {\n canvas = document.createElement('canvas');\n host.innerHTML = '';\n host.appendChild(canvas);\n }\n\n const config = payload.config[0];\n const height = config.height ?? 320;\n host.style.height = `${height}px`;\n\n if (payload.config.length > 1 && !el.querySelector('.tmr-chart-tabs')) {\n const tabs = document.createElement('div');\n tabs.className = 'tmr-chart-tabs';\n tabs.setAttribute('role', 'tablist');\n payload.config.forEach((c, i) => {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'tmr-chart-tab';\n btn.setAttribute('role', 'tab');\n btn.dataset.active = i === 0 ? 'true' : 'false';\n btn.textContent = c.title?.trim() || `${c.chartType} ${i + 1}`;\n btn.addEventListener('click', () => {\n tabs.querySelectorAll('.tmr-chart-tab').forEach((b, j) => {\n (b as HTMLElement).dataset.active = j === i ? 'true' : 'false';\n });\n const existing = registry.get(el);\n destroyChart(existing);\n const next = renderOrUpdateChart({\n canvas: canvas!,\n config: payload.config[i],\n payload,\n theme,\n chart: null,\n });\n if (next) registry.set(el, next);\n const titleEl = el.querySelector('.tmr-chart-title');\n if (titleEl && payload.config[i].title) {\n titleEl.textContent = String(payload.config[i].title);\n titleEl.classList.remove('tmr-chart-title--empty');\n }\n });\n tabs.appendChild(btn);\n });\n el.insertBefore(tabs, host);\n }\n\n const existing = registry.get(el);\n const chart = renderOrUpdateChart({\n canvas,\n config,\n payload,\n theme,\n chart: existing ?? null,\n });\n if (chart) registry.set(el, chart);\n}\n\n/**\n * Hydrate SSR chart placeholders inside a container (reading page).\n */\nexport function ChartMount({\n containerRef,\n chartTheme,\n html,\n}: ChartMountProps) {\n const registryRef = useRef(new Map<HTMLElement, ChartJs>());\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n const registry = registryRef.current;\n registry.forEach((chart) => destroyChart(chart));\n registry.clear();\n\n container\n .querySelectorAll<HTMLElement>('div[data-type=\"chart\"]')\n .forEach((el) => hydrateOne(el, chartTheme, registry));\n\n return () => {\n registry.forEach((chart) => destroyChart(chart));\n registry.clear();\n };\n }, [containerRef, chartTheme, html]);\n\n return null;\n}\n\n/** Imperative helper for hosts that prefer not to use the component. */\nexport function mountChartsInContainer(\n container: HTMLElement,\n chartTheme?: ChartTheme | null,\n): () => void {\n const registry = new Map<HTMLElement, ChartJs>();\n container\n .querySelectorAll<HTMLElement>('div[data-type=\"chart\"]')\n .forEach((el) => hydrateOne(el, chartTheme, registry));\n return () => {\n registry.forEach((c) => destroyChart(c));\n registry.clear();\n };\n}\n","'use client';\n\nimport { useRef, type ComponentProps } from 'react';\nimport type { ChartTheme } from '../chart/types';\nimport type { OnCitationEnter, OnCitationLeave } from '../citationTypes';\nimport type { LocaleCode } from '../i18n';\nimport { ReportContent } from '../ReportContent';\nimport { ChartMount } from './ChartMount';\nimport { CitationInteractive } from './CitationInteractive';\nimport { ReaderReportContent } from './ReaderReportContent';\n\nexport interface ReportContentWithChartsProps\n extends Omit<ComponentProps<typeof ReportContent>, 'ref'> {\n onCitationEnter?: OnCitationEnter;\n onCitationLeave?: OnCitationLeave;\n chartTheme?: ChartTheme | null;\n /** 内置左缘目录,默认关闭。 */\n toc?: boolean;\n /** 目录按钮的无障碍文案。默认英文。 */\n locale?: LocaleCode;\n}\n\n/**\n * SSR HTML reading surface with Chart.js hydration (+ optional citation clicks).\n */\nexport function ReportContentWithCharts({\n onCitationEnter,\n onCitationLeave,\n chartTheme,\n className,\n html,\n toc = false,\n locale = 'en',\n ...rest\n}: ReportContentWithChartsProps) {\n const ref = useRef<HTMLDivElement>(null);\n\n return (\n <div ref={ref} className={className}>\n <ReaderReportContent html={html} toc={toc} locale={locale} {...rest} />\n <ChartMount\n containerRef={ref}\n chartTheme={chartTheme}\n html={html}\n />\n {onCitationEnter && onCitationLeave ? (\n <CitationInteractive\n containerRef={ref}\n onCitationEnter={onCitationEnter}\n onCitationLeave={onCitationLeave}\n />\n ) : null}\n </div>\n );\n}\n"],"names":["count","root","frame","styles","_a","item","id","rail","existing"],"mappings":"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"}