@stream-mdx/react 0.4.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/CHANGELOG.md +385 -4
  2. package/README.md +141 -16
  3. package/dist/blocks-renderer-DAOBFBfi.d.ts +29 -0
  4. package/dist/blocks-renderer-DQEL1kJW.d.cts +29 -0
  5. package/dist/components/bottom-stick-scroll-area.cjs +268 -0
  6. package/dist/components/bottom-stick-scroll-area.d.cts +36 -0
  7. package/dist/components/bottom-stick-scroll-area.d.ts +36 -0
  8. package/dist/components/bottom-stick-scroll-area.mjs +249 -0
  9. package/dist/components/diff-renderer.cjs +86 -0
  10. package/dist/components/diff-renderer.d.cts +11 -0
  11. package/dist/components/diff-renderer.d.ts +11 -0
  12. package/dist/components/diff-renderer.mjs +66 -0
  13. package/dist/components/index.cjs +2879 -1295
  14. package/dist/components/index.d.cts +9 -2
  15. package/dist/components/index.d.ts +9 -2
  16. package/dist/components/index.mjs +2842 -1277
  17. package/dist/components/katex-math.cjs +220 -0
  18. package/dist/components/katex-math.d.cts +10 -0
  19. package/dist/components/katex-math.d.ts +10 -0
  20. package/dist/components/katex-math.mjs +188 -0
  21. package/dist/contexts/math-tracker.cjs +240 -521
  22. package/dist/contexts/math-tracker.mjs +235 -513
  23. package/dist/index-Cmne1yUK.d.cts +723 -0
  24. package/dist/index-D7dyyu3q.d.ts +723 -0
  25. package/dist/index.cjs +13180 -5640
  26. package/dist/index.d.cts +72 -40
  27. package/dist/index.d.ts +72 -40
  28. package/dist/index.mjs +12587 -5038
  29. package/dist/math/display-wrapper.cjs +7 -15
  30. package/dist/math/display-wrapper.d.cts +2 -2
  31. package/dist/math/display-wrapper.d.ts +2 -2
  32. package/dist/math/display-wrapper.mjs +2 -6
  33. package/dist/node-views-Bpc6Gkgl.d.cts +13 -0
  34. package/dist/node-views-DpnYdaAS.d.ts +13 -0
  35. package/dist/renderer/hooks.cjs +35 -20
  36. package/dist/renderer/hooks.d.cts +22 -1
  37. package/dist/renderer/hooks.d.ts +22 -1
  38. package/dist/renderer/hooks.mjs +27 -12
  39. package/dist/renderer/patch-batching.cjs +7 -8
  40. package/dist/renderer/patch-batching.d.cts +1 -1
  41. package/dist/renderer/patch-batching.d.ts +1 -1
  42. package/dist/renderer/patch-batching.mjs +2 -1
  43. package/dist/renderer/patch-coalescing.cjs +5 -8
  44. package/dist/renderer/patch-commit-scheduler.cjs +160 -326
  45. package/dist/renderer/patch-commit-scheduler.d.cts +28 -4
  46. package/dist/renderer/patch-commit-scheduler.d.ts +28 -4
  47. package/dist/renderer/patch-commit-scheduler.mjs +157 -318
  48. package/dist/renderer/store.cjs +3847 -1099
  49. package/dist/renderer/store.d.cts +111 -3
  50. package/dist/renderer/store.d.ts +111 -3
  51. package/dist/renderer/store.mjs +3847 -1085
  52. package/dist/renderer/virtualized-code.cjs +415 -71
  53. package/dist/renderer/virtualized-code.d.cts +24 -23
  54. package/dist/renderer/virtualized-code.d.ts +24 -23
  55. package/dist/renderer/virtualized-code.mjs +409 -62
  56. package/dist/renderer.cjs +10939 -3974
  57. package/dist/renderer.d.cts +100 -29
  58. package/dist/renderer.d.ts +100 -29
  59. package/dist/renderer.mjs +10711 -3697
  60. package/dist/server-regions-CPLHGli0.d.cts +32 -0
  61. package/dist/server-regions-mUhyoKi7.d.ts +32 -0
  62. package/dist/server.cjs +10286 -3365
  63. package/dist/server.d.cts +17 -247
  64. package/dist/server.d.ts +17 -247
  65. package/dist/server.mjs +10565 -3619
  66. package/dist/{streaming-markdown-DOc2uLiP.d.ts → streaming-markdown-yELbJxyH.d.ts} +51 -55
  67. package/dist/{streaming-markdown-D-JcByd9.d.cts → streaming-markdown-zVwFuaJG.d.cts} +51 -55
  68. package/dist/streaming-markdown.cjs +11828 -4879
  69. package/dist/streaming-markdown.d.cts +9 -2
  70. package/dist/streaming-markdown.d.ts +9 -2
  71. package/dist/streaming-markdown.mjs +11820 -4821
  72. package/dist/trusted-mdx/index.cjs +833 -0
  73. package/dist/trusted-mdx/index.d.cts +11 -0
  74. package/dist/trusted-mdx/index.d.ts +11 -0
  75. package/dist/trusted-mdx/index.mjs +807 -0
  76. package/dist/trusted-mdx/native-children-slot.cjs +45 -0
  77. package/dist/trusted-mdx/native-children-slot.d.cts +11 -0
  78. package/dist/trusted-mdx/native-children-slot.d.ts +11 -0
  79. package/dist/trusted-mdx/native-children-slot.mjs +24 -0
  80. package/dist/trusted-mdx/server.cjs +752 -0
  81. package/dist/trusted-mdx/server.d.cts +24 -0
  82. package/dist/trusted-mdx/server.d.ts +24 -0
  83. package/dist/trusted-mdx/server.mjs +724 -0
  84. package/dist/trusted-mdx-contract-ElKpkDI5.d.cts +113 -0
  85. package/dist/trusted-mdx-contract-ElKpkDI5.d.ts +113 -0
  86. package/dist/utils/inline-html.cjs +246 -147
  87. package/dist/utils/inline-html.d.cts +39 -6
  88. package/dist/utils/inline-html.d.ts +39 -6
  89. package/dist/utils/inline-html.mjs +237 -134
  90. package/package.json +52 -18
  91. package/shadcn/README.md +28 -0
  92. package/shadcn/bottom-stick-scroll-area.tsx +358 -0
  93. package/dist/index-D2MYusAM.d.cts +0 -248
  94. package/dist/index-D2MYusAM.d.ts +0 -248
  95. package/dist/mdx-client.cjs +0 -408
  96. package/dist/mdx-client.d.cts +0 -113
  97. package/dist/mdx-client.d.ts +0 -113
  98. package/dist/mdx-client.mjs +0 -369
  99. package/dist/mdx-coordinator.cjs +0 -563
  100. package/dist/mdx-coordinator.d.cts +0 -21
  101. package/dist/mdx-coordinator.d.ts +0 -21
  102. package/dist/mdx-coordinator.mjs +0 -529
  103. package/dist/renderer/node-views.cjs +0 -1642
  104. package/dist/renderer/node-views.d.cts +0 -12
  105. package/dist/renderer/node-views.d.ts +0 -12
  106. package/dist/renderer/node-views.mjs +0 -1616
@@ -0,0 +1,249 @@
1
+ "use client";
2
+ "use client";
3
+
4
+ // src/components/bottom-stick-scroll-area.tsx
5
+ import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ var EPS_BOTTOM_PX = 2, EPS_OVERFLOW_PX = 1, DETACH_SCROLL_DELTA_PX = 1, RETURN_MIN_MS = 180, RETURN_MAX_MS = 520, RETURN_PX_PER_MS = 2.2, RETURN_SETTLE_FRAMES = 2;
8
+ function clamp01(value) {
9
+ return value < 0 ? 0 : value > 1 ? 1 : value;
10
+ }
11
+ function easeOutCubic(value) {
12
+ return 1 - (1 - value) ** 3;
13
+ }
14
+ function joinClasses(...parts) {
15
+ return parts.filter(Boolean).join(" ");
16
+ }
17
+ function measure(viewport) {
18
+ let scrollTop = viewport.scrollTop, scrollHeight = viewport.scrollHeight, clientHeight = viewport.clientHeight, maxScrollTop = Math.max(0, scrollHeight - clientHeight), distanceToBottom = Math.max(0, maxScrollTop - scrollTop), isOverflowing = scrollHeight > clientHeight + EPS_OVERFLOW_PX;
19
+ return { scrollTop, scrollHeight, clientHeight, maxScrollTop, distanceToBottom, isOverflowing };
20
+ }
21
+ function isEditableTarget(target) {
22
+ if (!(target instanceof Element)) return !1;
23
+ if (target.closest("input, textarea, select, [role='textbox']")) return !0;
24
+ let contentEditable = target.closest("[contenteditable]");
25
+ return contentEditable !== null && contentEditable.getAttribute("contenteditable")?.toLowerCase() !== "false";
26
+ }
27
+ function isScrollKeyIntent(event) {
28
+ if (event.defaultPrevented || isEditableTarget(event.target)) return !1;
29
+ switch (event.key) {
30
+ case "ArrowDown":
31
+ case "ArrowUp":
32
+ case "PageDown":
33
+ case "PageUp":
34
+ case "Home":
35
+ case "End":
36
+ return !0;
37
+ case " ":
38
+ case "Spacebar":
39
+ return event.target instanceof Element ? event.target.closest(
40
+ "button, input, summary, [role='button'], [role='checkbox'], [role='switch'], [role='radio'], [role='menuitem'], [role='menuitemcheckbox'], [role='menuitemradio']"
41
+ ) === null : !0;
42
+ default:
43
+ return !1;
44
+ }
45
+ }
46
+ function DefaultJumpButton({ canJump, jumpToBottom }) {
47
+ return /* @__PURE__ */ jsx(
48
+ "button",
49
+ {
50
+ type: "button",
51
+ onClick: jumpToBottom,
52
+ "aria-label": "Scroll to bottom",
53
+ style: {
54
+ pointerEvents: canJump ? "auto" : "none",
55
+ borderRadius: 9999,
56
+ border: "1px solid color-mix(in srgb, currentColor 20%, transparent)",
57
+ width: 40,
58
+ height: 40,
59
+ display: "grid",
60
+ placeItems: "center",
61
+ boxShadow: "0 8px 20px rgba(0,0,0,0.18)",
62
+ background: "color-mix(in srgb, var(--background, #fff) 92%, transparent)",
63
+ color: "var(--foreground, #111)",
64
+ cursor: canJump ? "pointer" : "default"
65
+ },
66
+ children: /* @__PURE__ */ jsx("span", { "aria-hidden": !0, children: "\u2193" })
67
+ }
68
+ );
69
+ }
70
+ function BottomStickScrollArea({
71
+ children,
72
+ className,
73
+ viewportClassName,
74
+ contentClassName,
75
+ showJumpToBottom = !0,
76
+ onDebugStateChange,
77
+ onModeChange,
78
+ debugDomAttributes = !1,
79
+ renderJumpToBottom,
80
+ jumpContainerClassName
81
+ }) {
82
+ let viewportRef = useRef(null), contentRef = useRef(null), modeRef = useRef("STICKY_INSTANT"), [mode, setMode] = useState("STICKY_INSTANT"), [isOverflowing, setIsOverflowing] = useState(!1), [distanceToBottom, setDistanceToBottom] = useState(0), [prefersReducedMotion, setPrefersReducedMotion] = useState(!1), prefersReducedMotionRef = useRef(!1), prevScrollTopRef = useRef(0), lastProgrammaticWriteRef = useRef(null), programmaticWriteCountRef = useRef(0), pendingStickRafRef = useRef(null), stickRequestedRef = useRef(!1), returnRafRef = useRef(null), returnAnimRef = useRef(null), setModeBoth = useCallback(
83
+ (next) => {
84
+ modeRef.current = next, setMode(next), onModeChange?.(next);
85
+ },
86
+ [onModeChange]
87
+ ), updateDebug = useCallback(() => {
88
+ let viewport = viewportRef.current;
89
+ if (!viewport) return;
90
+ let m = measure(viewport);
91
+ debugDomAttributes && (viewport.dataset.stickyMode = modeRef.current, viewport.dataset.distanceToBottom = String(m.distanceToBottom), viewport.dataset.isOverflowing = m.isOverflowing ? "1" : "0", viewport.dataset.programmaticWrites = String(programmaticWriteCountRef.current)), onDebugStateChange?.({
92
+ mode: modeRef.current,
93
+ isOverflowing: m.isOverflowing,
94
+ distanceToBottom: m.distanceToBottom,
95
+ scrollTop: m.scrollTop,
96
+ maxScrollTop: m.maxScrollTop,
97
+ scrollHeight: m.scrollHeight,
98
+ clientHeight: m.clientHeight,
99
+ programmaticWrites: programmaticWriteCountRef.current
100
+ }), setDistanceToBottom(
101
+ (previous) => Math.abs(previous - m.distanceToBottom) <= 0.1 ? previous : m.distanceToBottom
102
+ );
103
+ }, [debugDomAttributes, onDebugStateChange]), writeScrollTop = useCallback((nextTop) => {
104
+ let viewport = viewportRef.current;
105
+ viewport && (viewport.scrollTop = nextTop, programmaticWriteCountRef.current += 1, lastProgrammaticWriteRef.current = { at: performance.now(), top: nextTop });
106
+ }, []), cancelPendingStick = useCallback(() => {
107
+ pendingStickRafRef.current !== null && (cancelAnimationFrame(pendingStickRafRef.current), pendingStickRafRef.current = null), stickRequestedRef.current = !1;
108
+ }, []), cancelReturn = useCallback(() => {
109
+ returnRafRef.current !== null && (cancelAnimationFrame(returnRafRef.current), returnRafRef.current = null), returnAnimRef.current = null;
110
+ }, []), handleReducedMotionChange = useCallback(
111
+ (matches) => {
112
+ if (prefersReducedMotionRef.current !== matches && (prefersReducedMotionRef.current = matches, setPrefersReducedMotion(matches)), !matches || modeRef.current !== "RETURNING_SMOOTH") return;
113
+ cancelPendingStick(), cancelReturn(), setModeBoth("STICKY_INSTANT");
114
+ let viewport = viewportRef.current;
115
+ viewport && (writeScrollTop(measure(viewport).maxScrollTop), prevScrollTopRef.current = viewport.scrollTop), updateDebug();
116
+ },
117
+ [cancelPendingStick, cancelReturn, setModeBoth, updateDebug, writeScrollTop]
118
+ ), reducedMotionChangeHandlerRef = useRef(handleReducedMotionChange);
119
+ reducedMotionChangeHandlerRef.current = handleReducedMotionChange;
120
+ let interruptReturnForUserIntent = useCallback(() => {
121
+ modeRef.current === "RETURNING_SMOOTH" && (cancelPendingStick(), cancelReturn(), setModeBoth("DETACHED"), updateDebug());
122
+ }, [cancelPendingStick, cancelReturn, setModeBoth, updateDebug]), onViewportKeyDown = useCallback(
123
+ (event) => {
124
+ isScrollKeyIntent(event) && interruptReturnForUserIntent();
125
+ },
126
+ [interruptReturnForUserIntent]
127
+ ), stickToBottomInstant = useCallback(() => {
128
+ let viewport = viewportRef.current;
129
+ viewport && (stickRequestedRef.current = !0, pendingStickRafRef.current === null && (pendingStickRafRef.current = requestAnimationFrame(() => {
130
+ if (pendingStickRafRef.current = null, !stickRequestedRef.current || (stickRequestedRef.current = !1, modeRef.current !== "STICKY_INSTANT")) return;
131
+ let m = measure(viewport);
132
+ writeScrollTop(m.maxScrollTop), updateDebug();
133
+ })));
134
+ }, [updateDebug, writeScrollTop]), startReturnToBottomSmooth = useCallback(() => {
135
+ let viewport = viewportRef.current;
136
+ if (!viewport) return;
137
+ if (prefersReducedMotionRef.current) {
138
+ cancelPendingStick(), cancelReturn(), setModeBoth("STICKY_INSTANT"), writeScrollTop(measure(viewport).maxScrollTop), prevScrollTopRef.current = viewport.scrollTop, updateDebug();
139
+ return;
140
+ }
141
+ cancelPendingStick(), cancelReturn();
142
+ let initial = measure(viewport);
143
+ if (initial.distanceToBottom <= EPS_BOTTOM_PX) {
144
+ setModeBoth("STICKY_INSTANT"), stickToBottomInstant(), updateDebug();
145
+ return;
146
+ }
147
+ let durationMs = Math.max(
148
+ RETURN_MIN_MS,
149
+ Math.min(RETURN_MAX_MS, initial.distanceToBottom / RETURN_PX_PER_MS)
150
+ );
151
+ returnAnimRef.current = {
152
+ startTime: performance.now(),
153
+ startTop: initial.scrollTop,
154
+ durationMs,
155
+ settleFrames: 0
156
+ }, setModeBoth("RETURNING_SMOOTH");
157
+ let tick = (now) => {
158
+ let viewportCurrent = viewportRef.current, anim = returnAnimRef.current;
159
+ if (!viewportCurrent || !anim || modeRef.current !== "RETURNING_SMOOTH") {
160
+ cancelReturn();
161
+ return;
162
+ }
163
+ let before = measure(viewportCurrent), progress = clamp01((now - anim.startTime) / anim.durationMs), eased = easeOutCubic(progress), targetBottom = before.maxScrollTop, nextTop = anim.startTop + (targetBottom - anim.startTop) * eased;
164
+ nextTop < before.scrollTop && (nextTop = before.scrollTop), writeScrollTop(nextTop), measure(viewportCurrent).distanceToBottom <= EPS_BOTTOM_PX ? anim.settleFrames += 1 : anim.settleFrames = 0;
165
+ let doneByTime = progress >= 1, doneBySettle = anim.settleFrames >= RETURN_SETTLE_FRAMES && progress >= 0.6;
166
+ if (doneByTime && doneBySettle) {
167
+ cancelReturn(), setModeBoth("STICKY_INSTANT"), stickToBottomInstant(), updateDebug();
168
+ return;
169
+ }
170
+ updateDebug(), returnRafRef.current = requestAnimationFrame(tick);
171
+ };
172
+ returnRafRef.current = requestAnimationFrame(tick);
173
+ }, [cancelPendingStick, cancelReturn, setModeBoth, stickToBottomInstant, updateDebug, writeScrollTop]), onViewportScroll = useCallback(
174
+ (event) => {
175
+ let viewport = event.currentTarget, m = measure(viewport);
176
+ setIsOverflowing((previous) => previous === m.isOverflowing ? previous : m.isOverflowing);
177
+ let previousTop = prevScrollTopRef.current, delta = m.scrollTop - previousTop, lastWrite = lastProgrammaticWriteRef.current, isLikelyOwnWrite = lastWrite !== null && performance.now() - lastWrite.at < 60 && lastWrite !== null && Math.abs(m.scrollTop - lastWrite.top) <= 2;
178
+ modeRef.current === "RETURNING_SMOOTH" ? !isLikelyOwnWrite && delta < -DETACH_SCROLL_DELTA_PX && (cancelReturn(), setModeBoth("DETACHED")) : modeRef.current === "STICKY_INSTANT" ? !isLikelyOwnWrite && delta < -DETACH_SCROLL_DELTA_PX && m.isOverflowing && (cancelPendingStick(), setModeBoth("DETACHED")) : modeRef.current === "DETACHED" && m.distanceToBottom <= EPS_BOTTOM_PX && (setModeBoth("STICKY_INSTANT"), stickToBottomInstant()), prevScrollTopRef.current = m.scrollTop, updateDebug();
179
+ },
180
+ [cancelPendingStick, cancelReturn, setModeBoth, stickToBottomInstant, updateDebug]
181
+ );
182
+ useEffect(() => {
183
+ let viewport = viewportRef.current, content = contentRef.current;
184
+ if (!viewport || !content) return;
185
+ let observer = new ResizeObserver(() => {
186
+ let m = measure(viewport);
187
+ setIsOverflowing((previous) => previous === m.isOverflowing ? previous : m.isOverflowing), modeRef.current === "STICKY_INSTANT" && stickToBottomInstant(), updateDebug();
188
+ });
189
+ return observer.observe(content), observer.observe(viewport), () => observer.disconnect();
190
+ }, [stickToBottomInstant, updateDebug]), useLayoutEffect(() => {
191
+ let viewport = viewportRef.current;
192
+ if (!viewport) return;
193
+ setModeBoth("STICKY_INSTANT");
194
+ let initial = measure(viewport);
195
+ writeScrollTop(initial.maxScrollTop), prevScrollTopRef.current = viewport.scrollTop, setIsOverflowing(initial.isOverflowing), setDistanceToBottom(initial.distanceToBottom), updateDebug();
196
+ }, [setModeBoth, updateDebug, writeScrollTop]), useLayoutEffect(() => {
197
+ if (typeof window > "u" || typeof window.matchMedia != "function") return;
198
+ let mediaQuery = window.matchMedia("(prefers-reduced-motion: reduce)"), onChange = () => reducedMotionChangeHandlerRef.current(mediaQuery.matches);
199
+ return onChange(), typeof mediaQuery.addEventListener == "function" ? (mediaQuery.addEventListener("change", onChange), () => mediaQuery.removeEventListener("change", onChange)) : (mediaQuery.addListener(onChange), () => mediaQuery.removeListener(onChange));
200
+ }, []), useEffect(() => () => {
201
+ cancelPendingStick(), cancelReturn();
202
+ }, [cancelPendingStick, cancelReturn]);
203
+ let canJump = isOverflowing && mode === "DETACHED", jumpButton = renderJumpToBottom?.({
204
+ mode,
205
+ canJump,
206
+ isOverflowing,
207
+ distanceToBottom,
208
+ jumpToBottom: startReturnToBottomSmooth
209
+ }) ?? /* @__PURE__ */ jsx(DefaultJumpButton, { canJump, jumpToBottom: startReturnToBottomSmooth }), jumpContainerClassNameBase = "pointer-events-none absolute z-20", jumpContainerStyle = {
210
+ position: "absolute",
211
+ zIndex: 20,
212
+ left: 0,
213
+ right: 0,
214
+ bottom: 12,
215
+ display: "flex",
216
+ justifyContent: "center",
217
+ opacity: canJump ? 1 : 0,
218
+ transform: prefersReducedMotion ? "none" : canJump ? "translateY(0px)" : "translateY(4px)",
219
+ transition: prefersReducedMotion ? "none" : "opacity 150ms ease, transform 150ms ease",
220
+ pointerEvents: "none"
221
+ };
222
+ return /* @__PURE__ */ jsxs("div", { className: joinClasses("relative h-full w-full overflow-hidden", className), children: [
223
+ /* @__PURE__ */ jsx(
224
+ "div",
225
+ {
226
+ ref: viewportRef,
227
+ className: joinClasses("h-full w-full overflow-auto", viewportClassName),
228
+ onScroll: onViewportScroll,
229
+ onWheel: interruptReturnForUserIntent,
230
+ onTouchStart: interruptReturnForUserIntent,
231
+ onKeyDown: onViewportKeyDown,
232
+ "data-testid": "sticky-scroll-viewport",
233
+ children: /* @__PURE__ */ jsx("div", { ref: contentRef, className: joinClasses("flex min-h-full w-full flex-col", contentClassName), children })
234
+ }
235
+ ),
236
+ showJumpToBottom ? /* @__PURE__ */ jsx(
237
+ "div",
238
+ {
239
+ className: joinClasses(jumpContainerClassNameBase, jumpContainerClassName),
240
+ style: jumpContainerStyle,
241
+ "aria-hidden": !canJump,
242
+ children: /* @__PURE__ */ jsx("div", { className: canJump ? "pointer-events-auto" : "pointer-events-none", children: jumpButton })
243
+ }
244
+ ) : null
245
+ ] });
246
+ }
247
+ export {
248
+ BottomStickScrollArea
249
+ };
@@ -0,0 +1,86 @@
1
+ "use client";
2
+ "use strict";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: !0 });
10
+ }, __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from == "object" || typeof from == "function")
12
+ for (let key of __getOwnPropNames(from))
13
+ !__hasOwnProp.call(to, key) && key !== except && __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ return to;
15
+ };
16
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: !0 }), mod);
17
+
18
+ // src/components/diff-renderer.tsx
19
+ var diff_renderer_exports = {};
20
+ __export(diff_renderer_exports, {
21
+ DefaultDiffRenderer: () => DefaultDiffRenderer
22
+ });
23
+ module.exports = __toCommonJS(diff_renderer_exports);
24
+ var import_jsx_runtime = require("react/jsx-runtime"), DefaultDiffRenderer = ({
25
+ meta,
26
+ renderCode,
27
+ className = "",
28
+ style
29
+ }) => {
30
+ let diffBlocks = Array.isArray(meta?.diffBlocks) ? meta.diffBlocks : null;
31
+ return !diffBlocks || diffBlocks.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: renderCode }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
32
+ "div",
33
+ {
34
+ className: `stream-mdx-diff-container my-4 rounded-md border border-border bg-muted/20 font-mono text-sm overflow-hidden ${className}`.trim(),
35
+ style,
36
+ children: diffBlocks.map((diffBlock, bIdx) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "stream-mdx-diff-block", children: [
37
+ (diffBlock.filePath || diffBlock.additions != null || diffBlock.deletions != null) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "stream-mdx-diff-header flex items-center justify-between border-b border-border bg-muted/40 px-4 py-2 text-xs font-semibold text-muted-foreground", children: [
38
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "stream-mdx-diff-filepath", children: diffBlock.filePath ?? "diff" }),
39
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "stream-mdx-diff-stats flex gap-2", children: [
40
+ diffBlock.additions != null && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "stream-mdx-diff-stat-add text-green-600 dark:text-green-400", children: [
41
+ "+",
42
+ diffBlock.additions
43
+ ] }),
44
+ diffBlock.deletions != null && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "stream-mdx-diff-stat-del text-red-600 dark:text-red-400", children: [
45
+ "-",
46
+ diffBlock.deletions
47
+ ] })
48
+ ] })
49
+ ] }),
50
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "stream-mdx-diff-lines overflow-x-auto", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("table", { className: "w-full border-collapse font-mono text-xs", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("tbody", { children: diffBlock.lines.map((line, lIdx) => {
51
+ let kindClass = `diff-line-${line.kind} ${line.kind === "add" ? "bg-green-500/10 text-green-900 dark:text-green-200" : line.kind === "del" ? "bg-red-500/10 text-red-900 dark:text-red-200" : line.kind === "hunk" ? "bg-blue-500/10 text-blue-800 dark:text-blue-300 font-semibold" : line.kind === "meta" ? "bg-muted/50 text-muted-foreground italic" : "text-foreground"}`;
52
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
53
+ "tr",
54
+ {
55
+ className: `stream-mdx-diff-row ${kindClass}`,
56
+ "data-diff-kind": line.kind,
57
+ children: [
58
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { className: "stream-mdx-diff-old-no select-none px-2 py-0.5 text-right opacity-50 w-10", children: line.oldNo != null ? line.oldNo : "" }),
59
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { className: "stream-mdx-diff-new-no select-none px-2 py-0.5 text-right opacity-50 w-10", children: line.newNo != null ? line.newNo : "" }),
60
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { className: "stream-mdx-diff-prefix select-none px-1 py-0.5 text-center w-4 font-bold", children: line.kind === "add" ? "+" : line.kind === "del" ? "-" : line.kind === "hunk" ? "@" : " " }),
61
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { className: "stream-mdx-diff-content px-2 py-0.5 whitespace-pre", children: line.tokens && line.tokens.length > 0 ? line.tokens.map((token, tIdx) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
62
+ "span",
63
+ {
64
+ style: {
65
+ color: token.color ?? void 0,
66
+ fontStyle: token.fontStyle === 1 || token.fontStyle === 3 ? "italic" : void 0,
67
+ fontWeight: token.fontStyle === 2 || token.fontStyle === 3 ? "bold" : void 0
68
+ },
69
+ children: token.content
70
+ },
71
+ tIdx
72
+ )) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: line.raw.replace(/^[+\- ]/, "") }) })
73
+ ]
74
+ },
75
+ lIdx
76
+ );
77
+ }) }) }) })
78
+ ] }, bIdx))
79
+ }
80
+ );
81
+ };
82
+ DefaultDiffRenderer.displayName = "DefaultDiffRenderer";
83
+ // Annotate the CommonJS export names for ESM import in node:
84
+ 0 && (module.exports = {
85
+ DefaultDiffRenderer
86
+ });
@@ -0,0 +1,11 @@
1
+ import React__default from 'react';
2
+
3
+ interface DiffRendererProps {
4
+ meta?: Record<string, unknown>;
5
+ renderCode: React__default.ReactNode;
6
+ className?: string;
7
+ style?: React__default.CSSProperties;
8
+ }
9
+ declare const DefaultDiffRenderer: React__default.FC<DiffRendererProps>;
10
+
11
+ export { DefaultDiffRenderer, type DiffRendererProps };
@@ -0,0 +1,11 @@
1
+ import React__default from 'react';
2
+
3
+ interface DiffRendererProps {
4
+ meta?: Record<string, unknown>;
5
+ renderCode: React__default.ReactNode;
6
+ className?: string;
7
+ style?: React__default.CSSProperties;
8
+ }
9
+ declare const DefaultDiffRenderer: React__default.FC<DiffRendererProps>;
10
+
11
+ export { DefaultDiffRenderer, type DiffRendererProps };
@@ -0,0 +1,66 @@
1
+ "use client";
2
+
3
+ // src/components/diff-renderer.tsx
4
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
+ var DefaultDiffRenderer = ({
6
+ meta,
7
+ renderCode,
8
+ className = "",
9
+ style
10
+ }) => {
11
+ let diffBlocks = Array.isArray(meta?.diffBlocks) ? meta.diffBlocks : null;
12
+ return !diffBlocks || diffBlocks.length === 0 ? /* @__PURE__ */ jsx(Fragment, { children: renderCode }) : /* @__PURE__ */ jsx(
13
+ "div",
14
+ {
15
+ className: `stream-mdx-diff-container my-4 rounded-md border border-border bg-muted/20 font-mono text-sm overflow-hidden ${className}`.trim(),
16
+ style,
17
+ children: diffBlocks.map((diffBlock, bIdx) => /* @__PURE__ */ jsxs("div", { className: "stream-mdx-diff-block", children: [
18
+ (diffBlock.filePath || diffBlock.additions != null || diffBlock.deletions != null) && /* @__PURE__ */ jsxs("div", { className: "stream-mdx-diff-header flex items-center justify-between border-b border-border bg-muted/40 px-4 py-2 text-xs font-semibold text-muted-foreground", children: [
19
+ /* @__PURE__ */ jsx("span", { className: "stream-mdx-diff-filepath", children: diffBlock.filePath ?? "diff" }),
20
+ /* @__PURE__ */ jsxs("span", { className: "stream-mdx-diff-stats flex gap-2", children: [
21
+ diffBlock.additions != null && /* @__PURE__ */ jsxs("span", { className: "stream-mdx-diff-stat-add text-green-600 dark:text-green-400", children: [
22
+ "+",
23
+ diffBlock.additions
24
+ ] }),
25
+ diffBlock.deletions != null && /* @__PURE__ */ jsxs("span", { className: "stream-mdx-diff-stat-del text-red-600 dark:text-red-400", children: [
26
+ "-",
27
+ diffBlock.deletions
28
+ ] })
29
+ ] })
30
+ ] }),
31
+ /* @__PURE__ */ jsx("div", { className: "stream-mdx-diff-lines overflow-x-auto", children: /* @__PURE__ */ jsx("table", { className: "w-full border-collapse font-mono text-xs", children: /* @__PURE__ */ jsx("tbody", { children: diffBlock.lines.map((line, lIdx) => {
32
+ let kindClass = `diff-line-${line.kind} ${line.kind === "add" ? "bg-green-500/10 text-green-900 dark:text-green-200" : line.kind === "del" ? "bg-red-500/10 text-red-900 dark:text-red-200" : line.kind === "hunk" ? "bg-blue-500/10 text-blue-800 dark:text-blue-300 font-semibold" : line.kind === "meta" ? "bg-muted/50 text-muted-foreground italic" : "text-foreground"}`;
33
+ return /* @__PURE__ */ jsxs(
34
+ "tr",
35
+ {
36
+ className: `stream-mdx-diff-row ${kindClass}`,
37
+ "data-diff-kind": line.kind,
38
+ children: [
39
+ /* @__PURE__ */ jsx("td", { className: "stream-mdx-diff-old-no select-none px-2 py-0.5 text-right opacity-50 w-10", children: line.oldNo != null ? line.oldNo : "" }),
40
+ /* @__PURE__ */ jsx("td", { className: "stream-mdx-diff-new-no select-none px-2 py-0.5 text-right opacity-50 w-10", children: line.newNo != null ? line.newNo : "" }),
41
+ /* @__PURE__ */ jsx("td", { className: "stream-mdx-diff-prefix select-none px-1 py-0.5 text-center w-4 font-bold", children: line.kind === "add" ? "+" : line.kind === "del" ? "-" : line.kind === "hunk" ? "@" : " " }),
42
+ /* @__PURE__ */ jsx("td", { className: "stream-mdx-diff-content px-2 py-0.5 whitespace-pre", children: line.tokens && line.tokens.length > 0 ? line.tokens.map((token, tIdx) => /* @__PURE__ */ jsx(
43
+ "span",
44
+ {
45
+ style: {
46
+ color: token.color ?? void 0,
47
+ fontStyle: token.fontStyle === 1 || token.fontStyle === 3 ? "italic" : void 0,
48
+ fontWeight: token.fontStyle === 2 || token.fontStyle === 3 ? "bold" : void 0
49
+ },
50
+ children: token.content
51
+ },
52
+ tIdx
53
+ )) : /* @__PURE__ */ jsx("span", { children: line.raw.replace(/^[+\- ]/, "") }) })
54
+ ]
55
+ },
56
+ lIdx
57
+ );
58
+ }) }) }) })
59
+ ] }, bIdx))
60
+ }
61
+ );
62
+ };
63
+ DefaultDiffRenderer.displayName = "DefaultDiffRenderer";
64
+ export {
65
+ DefaultDiffRenderer
66
+ };