@tangle-network/ui 11.8.0 → 11.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @tangle-network/ui
2
2
 
3
+ ## 11.9.0
4
+
5
+ ### Minor Changes
6
+
7
+ - b047084: Expose react-markdown's typed `urlTransform` hook through the shared Markdown component.
8
+
3
9
  ## 11.8.0
4
10
 
5
11
  ### Minor Changes
package/dist/chat.js CHANGED
@@ -5,19 +5,19 @@ import {
5
5
  MessageList,
6
6
  ThinkingIndicator,
7
7
  UserMessage
8
- } from "./chunk-X53RZSX6.js";
8
+ } from "./chunk-7YOCS6IF.js";
9
9
  import "./chunk-565EATZZ.js";
10
- import "./chunk-OXZRCXJK.js";
10
+ import "./chunk-TN4FUEWY.js";
11
11
  import "./chunk-KNYSKNZX.js";
12
12
  import "./chunk-ND3ZFXQK.js";
13
13
  import "./chunk-NWECTSOH.js";
14
14
  import "./chunk-L57WRIND.js";
15
- import "./chunk-3M7BPSSW.js";
15
+ import "./chunk-3TI5DEHV.js";
16
16
  import "./chunk-GYPQXTJU.js";
17
17
  import "./chunk-4CLN43XT.js";
18
18
  import "./chunk-XU3HB5QL.js";
19
19
  import "./chunk-MKTSMWVD.js";
20
- import "./chunk-P5F43A65.js";
20
+ import "./chunk-EOAX2ENE.js";
21
21
  import "./chunk-WUQDUBJG.js";
22
22
  import "./chunk-RQHJBTEU.js";
23
23
  export {
@@ -17,7 +17,7 @@ import {
17
17
  } from "./chunk-MKTSMWVD.js";
18
18
  import {
19
19
  Markdown
20
- } from "./chunk-P5F43A65.js";
20
+ } from "./chunk-EOAX2ENE.js";
21
21
  import {
22
22
  CodeBlock
23
23
  } from "./chunk-WUQDUBJG.js";
@@ -6,7 +6,7 @@ import {
6
6
  import {
7
7
  InlineThinkingItem,
8
8
  RunGroup
9
- } from "./chunk-OXZRCXJK.js";
9
+ } from "./chunk-TN4FUEWY.js";
10
10
  import {
11
11
  ToolCallGroup,
12
12
  ToolCallStep
@@ -16,10 +16,10 @@ import {
16
16
  } from "./chunk-ND3ZFXQK.js";
17
17
  import {
18
18
  OpenUIArtifactRenderer
19
- } from "./chunk-3M7BPSSW.js";
19
+ } from "./chunk-3TI5DEHV.js";
20
20
  import {
21
21
  Markdown
22
- } from "./chunk-P5F43A65.js";
22
+ } from "./chunk-EOAX2ENE.js";
23
23
  import {
24
24
  cn
25
25
  } from "./chunk-RQHJBTEU.js";
@@ -12,7 +12,7 @@ import ReactMarkdown from "react-markdown";
12
12
  import remarkGfm from "remark-gfm";
13
13
  import rehypeSanitize from "rehype-sanitize";
14
14
  import { Fragment, jsx } from "react/jsx-runtime";
15
- var Markdown = memo(({ children, className }) => {
15
+ var Markdown = memo(({ children, className, urlTransform }) => {
16
16
  return /* @__PURE__ */ jsx(
17
17
  "div",
18
18
  {
@@ -22,6 +22,7 @@ var Markdown = memo(({ children, className }) => {
22
22
  {
23
23
  remarkPlugins: [remarkGfm],
24
24
  rehypePlugins: [rehypeSanitize],
25
+ urlTransform,
25
26
  components: {
26
27
  pre({ children: preChildren }) {
27
28
  return /* @__PURE__ */ jsx(Fragment, { children: preChildren });
@@ -8,14 +8,14 @@ import {
8
8
  } from "./chunk-L57WRIND.js";
9
9
  import {
10
10
  OpenUIArtifactRenderer
11
- } from "./chunk-3M7BPSSW.js";
11
+ } from "./chunk-3TI5DEHV.js";
12
12
  import {
13
13
  formatDuration,
14
14
  truncateText
15
15
  } from "./chunk-4CLN43XT.js";
16
16
  import {
17
17
  Markdown
18
- } from "./chunk-P5F43A65.js";
18
+ } from "./chunk-EOAX2ENE.js";
19
19
  import {
20
20
  cn
21
21
  } from "./chunk-RQHJBTEU.js";
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-OEX7NZE3.js";
12
12
  import {
13
13
  parseToolEvent
14
- } from "./chunk-Q7ZR6LSD.js";
14
+ } from "./chunk-XYAIX4SU.js";
15
15
 
16
16
  // src/hooks/use-dropdown-menu.ts
17
17
  import { useEffect, useRef, useState } from "react";
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-KNYSKNZX.js";
5
5
  import {
6
6
  Markdown
7
- } from "./chunk-P5F43A65.js";
7
+ } from "./chunk-EOAX2ENE.js";
8
8
  import {
9
9
  cn
10
10
  } from "./chunk-RQHJBTEU.js";
@@ -16,7 +16,7 @@ import {
16
16
  } from "./chunk-LTEKI7YJ.js";
17
17
  import {
18
18
  Markdown
19
- } from "./chunk-P5F43A65.js";
19
+ } from "./chunk-EOAX2ENE.js";
20
20
  import {
21
21
  CodeBlock,
22
22
  CopyButton
@@ -719,7 +719,7 @@ import { lazy, Suspense } from "react";
719
719
  import { Download as Download2, X as X3 } from "lucide-react";
720
720
  import { Fragment, jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
721
721
  var LazyDocumentEditorPane = lazy(async () => {
722
- const module = await import("./document-editor-pane-A3JURPW5.js");
722
+ const module = await import("./document-editor-pane-EX25CEYW.js");
723
723
  return { default: module.DocumentEditorPane };
724
724
  });
725
725
  function FileArtifactPane({
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-LTEKI7YJ.js";
10
10
  import {
11
11
  Markdown
12
- } from "./chunk-P5F43A65.js";
12
+ } from "./chunk-EOAX2ENE.js";
13
13
  import {
14
14
  cn
15
15
  } from "./chunk-RQHJBTEU.js";
@@ -1,10 +1,10 @@
1
1
  "use client";
2
2
  import {
3
3
  DocumentEditorPane
4
- } from "./chunk-QGTIBEPX.js";
4
+ } from "./chunk-ZKCEAIIZ.js";
5
5
  import "./chunk-Q56BYXQF.js";
6
6
  import "./chunk-LTEKI7YJ.js";
7
- import "./chunk-P5F43A65.js";
7
+ import "./chunk-EOAX2ENE.js";
8
8
  import "./chunk-WUQDUBJG.js";
9
9
  import "./chunk-RQHJBTEU.js";
10
10
  export {
package/dist/editor.js CHANGED
@@ -11,10 +11,10 @@ import {
11
11
  useEditorConnection,
12
12
  useEditorContext,
13
13
  useYjsState
14
- } from "./chunk-QGTIBEPX.js";
14
+ } from "./chunk-ZKCEAIIZ.js";
15
15
  import "./chunk-Q56BYXQF.js";
16
16
  import "./chunk-LTEKI7YJ.js";
17
- import "./chunk-P5F43A65.js";
17
+ import "./chunk-EOAX2ENE.js";
18
18
  import "./chunk-WUQDUBJG.js";
19
19
  import "./chunk-RQHJBTEU.js";
20
20
  export {
package/dist/files.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  RichFileTree,
8
8
  filterFileTree,
9
9
  parseCsv
10
- } from "./chunk-XGOWUDDW.js";
10
+ } from "./chunk-YJ6RE5WV.js";
11
11
  import "./chunk-4CLN43XT.js";
12
12
  import {
13
13
  detectFileFormat,
@@ -19,7 +19,7 @@ import {
19
19
  } from "./chunk-XU3HB5QL.js";
20
20
  import "./chunk-MKTSMWVD.js";
21
21
  import "./chunk-LTEKI7YJ.js";
22
- import "./chunk-P5F43A65.js";
22
+ import "./chunk-EOAX2ENE.js";
23
23
  import "./chunk-WUQDUBJG.js";
24
24
  import "./chunk-RQHJBTEU.js";
25
25
  export {
package/dist/hooks.js CHANGED
@@ -11,21 +11,21 @@ import {
11
11
  useSSEStream,
12
12
  useSdkSession,
13
13
  useToolCallStream
14
- } from "./chunk-BWOUSEHM.js";
14
+ } from "./chunk-VPWY4I5O.js";
15
15
  import "./chunk-OEX7NZE3.js";
16
16
  import {
17
17
  useAutoScroll,
18
18
  useRunCollapseState,
19
19
  useRunGroups
20
20
  } from "./chunk-565EATZZ.js";
21
- import "./chunk-Q7ZR6LSD.js";
21
+ import "./chunk-XYAIX4SU.js";
22
22
  import "./chunk-KNYSKNZX.js";
23
23
  import "./chunk-ND3ZFXQK.js";
24
24
  import "./chunk-NWECTSOH.js";
25
25
  import "./chunk-L57WRIND.js";
26
26
  import "./chunk-4CLN43XT.js";
27
27
  import "./chunk-XU3HB5QL.js";
28
- import "./chunk-P5F43A65.js";
28
+ import "./chunk-EOAX2ENE.js";
29
29
  import "./chunk-WUQDUBJG.js";
30
30
  import "./chunk-RQHJBTEU.js";
31
31
  export {
package/dist/index.d.ts CHANGED
@@ -38,5 +38,6 @@ import '@pierre/trees';
38
38
  import './document-editor-pane-IAEQn_Dl.js';
39
39
  import '@hocuspocus/provider';
40
40
  import 'yjs';
41
+ import 'react-markdown';
41
42
  import 'nanostores';
42
43
  import 'clsx';
package/dist/index.js CHANGED
@@ -20,7 +20,7 @@ import {
20
20
  useSSEStream,
21
21
  useSdkSession,
22
22
  useToolCallStream
23
- } from "./chunk-BWOUSEHM.js";
23
+ } from "./chunk-VPWY4I5O.js";
24
24
  import {
25
25
  addMessage,
26
26
  addParts,
@@ -146,7 +146,7 @@ import {
146
146
  MessageList,
147
147
  ThinkingIndicator,
148
148
  UserMessage
149
- } from "./chunk-X53RZSX6.js";
149
+ } from "./chunk-7YOCS6IF.js";
150
150
  import {
151
151
  useAutoScroll,
152
152
  useRunCollapseState,
@@ -158,11 +158,11 @@ import {
158
158
  import {
159
159
  ToolCallFeed,
160
160
  parseToolEvent
161
- } from "./chunk-Q7ZR6LSD.js";
161
+ } from "./chunk-XYAIX4SU.js";
162
162
  import {
163
163
  InlineThinkingItem,
164
164
  RunGroup
165
- } from "./chunk-OXZRCXJK.js";
165
+ } from "./chunk-TN4FUEWY.js";
166
166
  import {
167
167
  ExpandedToolDetail,
168
168
  InlineToolItem,
@@ -190,7 +190,7 @@ import {
190
190
  import "./chunk-RQGKSCEZ.js";
191
191
  import {
192
192
  OpenUIArtifactRenderer
193
- } from "./chunk-3M7BPSSW.js";
193
+ } from "./chunk-3TI5DEHV.js";
194
194
  import {
195
195
  Badge,
196
196
  Card,
@@ -219,7 +219,7 @@ import {
219
219
  RichFileTree,
220
220
  filterFileTree,
221
221
  parseCsv
222
- } from "./chunk-XGOWUDDW.js";
222
+ } from "./chunk-YJ6RE5WV.js";
223
223
  import {
224
224
  formatBytes,
225
225
  formatDuration,
@@ -250,7 +250,7 @@ import {
250
250
  import "./chunk-5Z5ZYMOJ.js";
251
251
  import {
252
252
  Markdown
253
- } from "./chunk-P5F43A65.js";
253
+ } from "./chunk-EOAX2ENE.js";
254
254
  import {
255
255
  CodeBlock,
256
256
  CopyButton
@@ -1,15 +1,18 @@
1
1
  import * as React from 'react';
2
2
  import * as react_jsx_runtime from 'react/jsx-runtime';
3
+ import { UrlTransform } from 'react-markdown';
3
4
  export { C as CodeBlock, a as CodeBlockProps, b as CopyButton } from './code-block-0kSpWMnf.js';
4
5
 
5
6
  interface MarkdownProps {
6
7
  children: string;
7
8
  className?: string;
9
+ /** Transform parsed link and image URLs before sanitisation. */
10
+ urlTransform?: UrlTransform;
8
11
  }
9
12
  /**
10
13
  * Renders Markdown content with GFM support, XSS sanitisation, and
11
14
  * custom code block rendering via our CodeBlock component.
12
15
  */
13
- declare const Markdown: React.MemoExoticComponent<({ children, className }: MarkdownProps) => react_jsx_runtime.JSX.Element>;
16
+ declare const Markdown: React.MemoExoticComponent<({ children, className, urlTransform }: MarkdownProps) => react_jsx_runtime.JSX.Element>;
14
17
 
15
18
  export { Markdown, type MarkdownProps };
package/dist/markdown.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import "./chunk-5Z5ZYMOJ.js";
2
2
  import {
3
3
  Markdown
4
- } from "./chunk-P5F43A65.js";
4
+ } from "./chunk-EOAX2ENE.js";
5
5
  import {
6
6
  CodeBlock,
7
7
  CopyButton
package/dist/openui.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import "./chunk-RQGKSCEZ.js";
2
2
  import {
3
3
  OpenUIArtifactRenderer
4
- } from "./chunk-3M7BPSSW.js";
4
+ } from "./chunk-3TI5DEHV.js";
5
5
  import "./chunk-GYPQXTJU.js";
6
6
  import "./chunk-MKTSMWVD.js";
7
- import "./chunk-P5F43A65.js";
7
+ import "./chunk-EOAX2ENE.js";
8
8
  import "./chunk-WUQDUBJG.js";
9
9
  import "./chunk-RQHJBTEU.js";
10
10
  export {
package/dist/run.js CHANGED
@@ -4,11 +4,11 @@ import {
4
4
  import {
5
5
  ToolCallFeed,
6
6
  parseToolEvent
7
- } from "./chunk-Q7ZR6LSD.js";
7
+ } from "./chunk-XYAIX4SU.js";
8
8
  import {
9
9
  InlineThinkingItem,
10
10
  RunGroup
11
- } from "./chunk-OXZRCXJK.js";
11
+ } from "./chunk-TN4FUEWY.js";
12
12
  import {
13
13
  ExpandedToolDetail,
14
14
  InlineToolItem,
@@ -18,12 +18,12 @@ import {
18
18
  import "./chunk-ND3ZFXQK.js";
19
19
  import "./chunk-NWECTSOH.js";
20
20
  import "./chunk-L57WRIND.js";
21
- import "./chunk-3M7BPSSW.js";
21
+ import "./chunk-3TI5DEHV.js";
22
22
  import "./chunk-GYPQXTJU.js";
23
23
  import "./chunk-4CLN43XT.js";
24
24
  import "./chunk-XU3HB5QL.js";
25
25
  import "./chunk-MKTSMWVD.js";
26
- import "./chunk-P5F43A65.js";
26
+ import "./chunk-EOAX2ENE.js";
27
27
  import "./chunk-WUQDUBJG.js";
28
28
  import "./chunk-RQHJBTEU.js";
29
29
  export {
package/dist/sdk-hooks.js CHANGED
@@ -5,21 +5,21 @@ import {
5
5
  useSSEStream,
6
6
  useSdkSession,
7
7
  useToolCallStream
8
- } from "./chunk-BWOUSEHM.js";
8
+ } from "./chunk-VPWY4I5O.js";
9
9
  import "./chunk-OEX7NZE3.js";
10
10
  import {
11
11
  useAutoScroll,
12
12
  useRunCollapseState,
13
13
  useRunGroups
14
14
  } from "./chunk-565EATZZ.js";
15
- import "./chunk-Q7ZR6LSD.js";
15
+ import "./chunk-XYAIX4SU.js";
16
16
  import "./chunk-KNYSKNZX.js";
17
17
  import "./chunk-ND3ZFXQK.js";
18
18
  import "./chunk-NWECTSOH.js";
19
19
  import "./chunk-L57WRIND.js";
20
20
  import "./chunk-4CLN43XT.js";
21
21
  import "./chunk-XU3HB5QL.js";
22
- import "./chunk-P5F43A65.js";
22
+ import "./chunk-EOAX2ENE.js";
23
23
  import "./chunk-WUQDUBJG.js";
24
24
  import "./chunk-RQHJBTEU.js";
25
25
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/ui",
3
- "version": "11.8.0",
3
+ "version": "11.9.0",
4
4
  "description": "Generic React UI components for Tangle products — primitives, chat, run, files, editor, markdown.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -134,6 +134,7 @@
134
134
  "turndown": "^7.2.2"
135
135
  },
136
136
  "peerDependencies": {
137
+ "@tangle-network/brand": "^1.5.0",
137
138
  "@hocuspocus/provider": ">=2.15.0 <5.0.0",
138
139
  "@nanostores/react": ">=0.8.4 <2.0.0",
139
140
  "@tiptap/core": ">=3.20.4 <4.0.0",
@@ -145,8 +146,7 @@
145
146
  "react": "^18 || ^19",
146
147
  "react-dom": "^18 || ^19",
147
148
  "react-router": "^7 || ^8",
148
- "yjs": "^13.6.0",
149
- "@tangle-network/brand": "^1.5.0"
149
+ "yjs": "^13.6.0"
150
150
  },
151
151
  "peerDependenciesMeta": {
152
152
  "@nanostores/react": {
@@ -1,5 +1,5 @@
1
- import { describe, expect, it } from "vitest";
2
- import { render } from "@testing-library/react";
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { render, screen } from "@testing-library/react";
3
3
  import { Markdown } from "./markdown";
4
4
 
5
5
  describe("Markdown", () => {
@@ -20,4 +20,28 @@ describe("Markdown", () => {
20
20
  expect(inlineCode).toHaveClass("bg-card");
21
21
  expect(inlineCode).toHaveClass("text-[var(--code-keyword)]");
22
22
  });
23
+
24
+ it("passes parsed URLs through the typed transform hook", () => {
25
+ const urlTransform = vi.fn((url: string, key: string) => (
26
+ key === "href" && url === "system/brief.md"
27
+ ? "/app/ws-1/vault?file=system%2Fbrief.md"
28
+ : url
29
+ ));
30
+
31
+ render(
32
+ <Markdown urlTransform={urlTransform}>
33
+ {'[Brief](system/brief.md)'}
34
+ </Markdown>,
35
+ );
36
+
37
+ expect(screen.getByRole("link", { name: "Brief" })).toHaveAttribute(
38
+ "href",
39
+ "/app/ws-1/vault?file=system%2Fbrief.md",
40
+ );
41
+ expect(urlTransform).toHaveBeenCalledWith(
42
+ "system/brief.md",
43
+ "href",
44
+ expect.objectContaining({ tagName: "a" }),
45
+ );
46
+ });
23
47
  });
@@ -1,5 +1,5 @@
1
1
  import { memo } from "react";
2
- import ReactMarkdown from "react-markdown";
2
+ import ReactMarkdown, { type UrlTransform } from "react-markdown";
3
3
  import remarkGfm from "remark-gfm";
4
4
  import rehypeSanitize from "rehype-sanitize";
5
5
  import { CodeBlock, CopyButton } from "./code-block";
@@ -8,13 +8,15 @@ import { cn } from "../lib/utils";
8
8
  export interface MarkdownProps {
9
9
  children: string;
10
10
  className?: string;
11
+ /** Transform parsed link and image URLs before sanitisation. */
12
+ urlTransform?: UrlTransform;
11
13
  }
12
14
 
13
15
  /**
14
16
  * Renders Markdown content with GFM support, XSS sanitisation, and
15
17
  * custom code block rendering via our CodeBlock component.
16
18
  */
17
- export const Markdown = memo(({ children, className }: MarkdownProps) => {
19
+ export const Markdown = memo(({ children, className, urlTransform }: MarkdownProps) => {
18
20
  return (
19
21
  <div
20
22
  className={cn("tangle-prose max-w-none text-sm", className)}
@@ -22,6 +24,7 @@ export const Markdown = memo(({ children, className }: MarkdownProps) => {
22
24
  <ReactMarkdown
23
25
  remarkPlugins={[remarkGfm]}
24
26
  rehypePlugins={[rehypeSanitize]}
27
+ urlTransform={urlTransform}
25
28
  components={{
26
29
  pre({ children: preChildren }) {
27
30
  return <>{preChildren}</>;