@dxos/react-ui-markdown 0.8.4-main.3fbcb4aa9b → 0.8.4-main.4668b7de9b
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/LICENSE +102 -5
- package/dist/lib/browser/index.mjs +32 -9
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/types/src/MarkdownStream/MarkdownStream.d.ts.map +1 -1
- package/dist/types/src/MarkdownStream/stream.d.ts.map +1 -1
- package/dist/types/src/{MarkdownBlock/MarkdownBlock.d.ts → MarkdownView/MarkdownView.d.ts} +3 -3
- package/dist/types/src/MarkdownView/MarkdownView.d.ts.map +1 -0
- package/dist/types/src/{MarkdownBlock/MarkdownBlock.stories.d.ts → MarkdownView/MarkdownView.stories.d.ts} +4 -4
- package/dist/types/src/MarkdownView/MarkdownView.stories.d.ts.map +1 -0
- package/dist/types/src/MarkdownView/index.d.ts +2 -0
- package/dist/types/src/MarkdownView/index.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +1 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +34 -34
- package/src/MarkdownStream/MarkdownStream.tsx +4 -6
- package/src/MarkdownStream/stream.ts +1 -1
- package/src/{MarkdownBlock/MarkdownBlock.stories.tsx → MarkdownView/MarkdownView.stories.tsx} +6 -6
- package/src/{MarkdownBlock/MarkdownBlock.tsx → MarkdownView/MarkdownView.tsx} +19 -3
- package/src/{MarkdownBlock → MarkdownView}/index.ts +1 -1
- package/src/index.ts +1 -1
- package/dist/types/src/MarkdownBlock/MarkdownBlock.d.ts.map +0 -1
- package/dist/types/src/MarkdownBlock/MarkdownBlock.stories.d.ts.map +0 -1
- package/dist/types/src/MarkdownBlock/index.d.ts +0 -2
- package/dist/types/src/MarkdownBlock/index.d.ts.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/react-ui-markdown",
|
|
3
|
-
"version": "0.8.4-main.
|
|
3
|
+
"version": "0.8.4-main.4668b7de9b",
|
|
4
4
|
"description": "Markdown components.",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -8,14 +8,14 @@
|
|
|
8
8
|
"type": "git",
|
|
9
9
|
"url": "https://github.com/dxos/dxos"
|
|
10
10
|
},
|
|
11
|
-
"license": "
|
|
11
|
+
"license": "FSL-1.1-Apache-2.0",
|
|
12
12
|
"author": "DXOS.org",
|
|
13
13
|
"type": "module",
|
|
14
14
|
"exports": {
|
|
15
15
|
".": {
|
|
16
16
|
"source": "./src/index.ts",
|
|
17
17
|
"types": "./dist/types/src/index.d.ts",
|
|
18
|
-
"
|
|
18
|
+
"default": "./dist/lib/browser/index.mjs"
|
|
19
19
|
}
|
|
20
20
|
},
|
|
21
21
|
"types": "dist/types/src/index.d.ts",
|
|
@@ -24,13 +24,13 @@
|
|
|
24
24
|
"src"
|
|
25
25
|
],
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@codemirror/autocomplete": "^6.
|
|
28
|
-
"@codemirror/language": "^6.
|
|
29
|
-
"@codemirror/state": "^6.
|
|
30
|
-
"@codemirror/view": "^6.
|
|
31
|
-
"@lezer/common": "^1.
|
|
32
|
-
"@lezer/highlight": "^1.2.
|
|
33
|
-
"@lezer/markdown": "^1.3
|
|
27
|
+
"@codemirror/autocomplete": "^6.20.2",
|
|
28
|
+
"@codemirror/language": "^6.12.3",
|
|
29
|
+
"@codemirror/state": "^6.6.0",
|
|
30
|
+
"@codemirror/view": "^6.43.0",
|
|
31
|
+
"@lezer/common": "^1.5.2",
|
|
32
|
+
"@lezer/highlight": "^1.2.3",
|
|
33
|
+
"@lezer/markdown": "^1.6.3",
|
|
34
34
|
"@lezer/xml": "^1.0.6",
|
|
35
35
|
"@radix-ui/react-compose-refs": "1.1.1",
|
|
36
36
|
"@radix-ui/react-context": "1.1.1",
|
|
@@ -39,18 +39,18 @@
|
|
|
39
39
|
"react-markdown": "^10.1.0",
|
|
40
40
|
"react-resize-detector": "^11.0.1",
|
|
41
41
|
"remark-gfm": "^4.0.1",
|
|
42
|
-
"@dxos/
|
|
43
|
-
"@dxos/
|
|
44
|
-
"@dxos/
|
|
45
|
-
"@dxos/invariant": "0.8.4-main.
|
|
46
|
-
"@dxos/
|
|
47
|
-
"@dxos/react-ui": "0.8.4-main.
|
|
48
|
-
"@dxos/
|
|
49
|
-
"@dxos/
|
|
50
|
-
"@dxos/ui": "0.8.4-main.
|
|
51
|
-
"@dxos/ui-editor": "0.8.4-main.
|
|
52
|
-
"@dxos/ui-theme": "0.8.4-main.
|
|
53
|
-
"@dxos/util": "0.8.4-main.
|
|
42
|
+
"@dxos/async": "0.8.4-main.4668b7de9b",
|
|
43
|
+
"@dxos/echo": "0.8.4-main.4668b7de9b",
|
|
44
|
+
"@dxos/effect": "0.8.4-main.4668b7de9b",
|
|
45
|
+
"@dxos/invariant": "0.8.4-main.4668b7de9b",
|
|
46
|
+
"@dxos/react-ui": "0.8.4-main.4668b7de9b",
|
|
47
|
+
"@dxos/react-ui-syntax-highlighter": "0.8.4-main.4668b7de9b",
|
|
48
|
+
"@dxos/log": "0.8.4-main.4668b7de9b",
|
|
49
|
+
"@dxos/ui": "0.8.4-main.4668b7de9b",
|
|
50
|
+
"@dxos/ui-editor": "0.8.4-main.4668b7de9b",
|
|
51
|
+
"@dxos/react-ui-editor": "0.8.4-main.4668b7de9b",
|
|
52
|
+
"@dxos/ui-theme": "0.8.4-main.4668b7de9b",
|
|
53
|
+
"@dxos/util": "0.8.4-main.4668b7de9b"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@effect/vitest": "0.29.0",
|
|
@@ -58,23 +58,23 @@
|
|
|
58
58
|
"@types/react-dom": "~19.2.3",
|
|
59
59
|
"react": "~19.2.3",
|
|
60
60
|
"react-dom": "~19.2.3",
|
|
61
|
-
"vite": "^8.0.
|
|
62
|
-
"@dxos/
|
|
63
|
-
"@dxos/keys": "0.8.4-main.
|
|
64
|
-
"@dxos/
|
|
65
|
-
"@dxos/
|
|
66
|
-
"@dxos/
|
|
67
|
-
"@dxos/
|
|
68
|
-
"@dxos/
|
|
69
|
-
"@dxos/
|
|
70
|
-
"@dxos/
|
|
61
|
+
"vite": "^8.0.14",
|
|
62
|
+
"@dxos/echo": "0.8.4-main.4668b7de9b",
|
|
63
|
+
"@dxos/keys": "0.8.4-main.4668b7de9b",
|
|
64
|
+
"@dxos/lit-ui": "0.8.4-main.4668b7de9b",
|
|
65
|
+
"@dxos/random": "0.8.4-main.4668b7de9b",
|
|
66
|
+
"@dxos/react-ui": "0.8.4-main.4668b7de9b",
|
|
67
|
+
"@dxos/react-client": "0.8.4-main.4668b7de9b",
|
|
68
|
+
"@dxos/schema": "0.8.4-main.4668b7de9b",
|
|
69
|
+
"@dxos/ui-theme": "0.8.4-main.4668b7de9b",
|
|
70
|
+
"@dxos/storybook-utils": "0.8.4-main.4668b7de9b"
|
|
71
71
|
},
|
|
72
72
|
"peerDependencies": {
|
|
73
73
|
"effect": "3.20.0",
|
|
74
74
|
"react": "~19.2.3",
|
|
75
75
|
"react-dom": "~19.2.3",
|
|
76
|
-
"@dxos/react-ui": "0.8.4-main.
|
|
77
|
-
"@dxos/ui-theme": "0.8.4-main.
|
|
76
|
+
"@dxos/react-ui": "0.8.4-main.4668b7de9b",
|
|
77
|
+
"@dxos/ui-theme": "0.8.4-main.4668b7de9b"
|
|
78
78
|
},
|
|
79
79
|
"publishConfig": {
|
|
80
80
|
"access": "public"
|
|
@@ -37,7 +37,7 @@ import {
|
|
|
37
37
|
navigatePreviousEffect,
|
|
38
38
|
preview,
|
|
39
39
|
scroller,
|
|
40
|
-
|
|
40
|
+
crawlerLineEffect,
|
|
41
41
|
fader,
|
|
42
42
|
typewriter,
|
|
43
43
|
typewriterBypass,
|
|
@@ -45,7 +45,6 @@ import {
|
|
|
45
45
|
xmlTagResetEffect,
|
|
46
46
|
xmlTagUpdateEffect,
|
|
47
47
|
xmlTags,
|
|
48
|
-
autoScroll,
|
|
49
48
|
documentSlots,
|
|
50
49
|
xmlFormatting,
|
|
51
50
|
xmlBlockDecoration,
|
|
@@ -283,12 +282,11 @@ const useMarkdownStreamTextEditor = (
|
|
|
283
282
|
xmlBlockDecoration({
|
|
284
283
|
tag: 'prompt',
|
|
285
284
|
lineClass: 'cm-prompt-line my-8',
|
|
286
|
-
contentClass: 'cm-prompt-bubble dx-panel px-2 py-1.5 rounded-sm [&_*]:text-inherit!',
|
|
285
|
+
contentClass: 'cm-prompt-bubble dx-panel px-2 py-1.5 box-decoration-clone rounded-sm [&_*]:text-inherit!',
|
|
287
286
|
hideTags: true,
|
|
288
287
|
}),
|
|
289
288
|
xmlTags({ registry, setWidgets, bookmarks: ['prompt'] }),
|
|
290
|
-
scroller({ overScroll: 80 }),
|
|
291
|
-
options?.autoScroll && autoScroll(),
|
|
289
|
+
scroller({ overScroll: 80, autoScroll: options?.autoScroll }),
|
|
292
290
|
options?.typewriter &&
|
|
293
291
|
typewriter({
|
|
294
292
|
cursor: options?.cursor,
|
|
@@ -390,7 +388,7 @@ const createMarkdownStreamController = ({
|
|
|
390
388
|
/** Scroll to bottom. */
|
|
391
389
|
scrollToBottom: (behavior?: ScrollBehavior) => {
|
|
392
390
|
viewRef.current?.dispatch({
|
|
393
|
-
effects:
|
|
391
|
+
effects: crawlerLineEffect.of({ line: -1, behavior }),
|
|
394
392
|
});
|
|
395
393
|
},
|
|
396
394
|
|
|
@@ -8,7 +8,7 @@ import * as Stream from 'effect/Stream';
|
|
|
8
8
|
import { Obj } from '@dxos/echo';
|
|
9
9
|
|
|
10
10
|
export const renderObjectLink = (obj: Obj.Unknown, block?: boolean) =>
|
|
11
|
-
`${block ? '!' : ''}[${Obj.getLabel(obj)}](${Obj.
|
|
11
|
+
`${block ? '!' : ''}[${Obj.getLabel(obj)}](${Obj.getURI(obj)})`;
|
|
12
12
|
|
|
13
13
|
export type StreamerOptions = {
|
|
14
14
|
/**
|
package/src/{MarkdownBlock/MarkdownBlock.stories.tsx → MarkdownView/MarkdownView.stories.tsx}
RENAMED
|
@@ -8,24 +8,24 @@ import { random } from '@dxos/random';
|
|
|
8
8
|
import { withLayout, withTheme } from '@dxos/react-ui/testing';
|
|
9
9
|
import { trim } from '@dxos/util';
|
|
10
10
|
|
|
11
|
-
import {
|
|
11
|
+
import { MarkdownView } from './MarkdownView';
|
|
12
12
|
|
|
13
13
|
random.seed(0);
|
|
14
14
|
|
|
15
15
|
const meta = {
|
|
16
|
-
title: 'ui/react-ui-markdown/
|
|
17
|
-
component:
|
|
16
|
+
title: 'ui/react-ui-markdown/MarkdownView',
|
|
17
|
+
component: MarkdownView,
|
|
18
18
|
decorators: [withTheme(), withLayout({ layout: 'column' })],
|
|
19
|
-
} satisfies Meta<typeof
|
|
19
|
+
} satisfies Meta<typeof MarkdownView>;
|
|
20
20
|
|
|
21
21
|
export default meta;
|
|
22
22
|
|
|
23
|
-
type Story = StoryObj<typeof
|
|
23
|
+
type Story = StoryObj<typeof MarkdownView>;
|
|
24
24
|
|
|
25
25
|
const content = trim`
|
|
26
26
|
# Hello World!
|
|
27
27
|
|
|
28
|
-
> An example of the
|
|
28
|
+
> An example of the MarkdownView component.
|
|
29
29
|
|
|
30
30
|
${random.lorem.paragraphs(1)}
|
|
31
31
|
|
|
@@ -6,11 +6,11 @@ import React, { type PropsWithChildren } from 'react';
|
|
|
6
6
|
import ReactMarkdown, { type Options as ReactMarkdownOptions } from 'react-markdown';
|
|
7
7
|
import remarkGfm from 'remark-gfm';
|
|
8
8
|
|
|
9
|
-
import { type ThemedClassName } from '@dxos/react-ui';
|
|
9
|
+
import { MediaPlayer, type ThemedClassName } from '@dxos/react-ui';
|
|
10
10
|
import { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';
|
|
11
11
|
import { mx } from '@dxos/ui-theme';
|
|
12
12
|
|
|
13
|
-
export type
|
|
13
|
+
export type MarkdownViewProps = ThemedClassName<
|
|
14
14
|
PropsWithChildren<{
|
|
15
15
|
content?: string;
|
|
16
16
|
components?: ReactMarkdownOptions['components'];
|
|
@@ -23,7 +23,7 @@ export type MarkdownBlockProps = ThemedClassName<
|
|
|
23
23
|
* markdown -> remark -> [mdast -> remark plugins] -> [hast -> rehype plugins] -> components -> react elements.
|
|
24
24
|
* Consider using @dxos/react-ui-editor.
|
|
25
25
|
*/
|
|
26
|
-
export const
|
|
26
|
+
export const MarkdownView = ({ classNames, children, components, content = '' }: MarkdownViewProps) => {
|
|
27
27
|
return (
|
|
28
28
|
<div className={mx(classNames)}>
|
|
29
29
|
<ReactMarkdown remarkPlugins={[remarkGfm]} skipHtml components={{ ...defaultComponents, ...components }}>
|
|
@@ -44,6 +44,9 @@ const defaultComponents: ReactMarkdownOptions['components'] = {
|
|
|
44
44
|
h3: ({ children }) => {
|
|
45
45
|
return <h3 className='pt-1 pb-1 text-accent-text text-base'>{children}</h3>;
|
|
46
46
|
},
|
|
47
|
+
h4: ({ children }) => {
|
|
48
|
+
return <h4 className='pt-1 pb-1 uppercase text-base'>{children}</h4>;
|
|
49
|
+
},
|
|
47
50
|
blockquote: ({ children, ...props }) => (
|
|
48
51
|
<blockquote className='my-2 py-2 ps-4 border-l-4 border-accent-text text-accent-text' {...props}>
|
|
49
52
|
{children}
|
|
@@ -63,6 +66,19 @@ const defaultComponents: ReactMarkdownOptions['components'] = {
|
|
|
63
66
|
{children}
|
|
64
67
|
</a>
|
|
65
68
|
),
|
|
69
|
+
// Hide broken images: many markdown sources reference remote URLs that
|
|
70
|
+
// 404 or are blocked. Drop the element on load failure rather than
|
|
71
|
+
// leaving the browser's broken-image placeholder.
|
|
72
|
+
//
|
|
73
|
+
// Media URLs (mp4/mp3/etc. or legacy `iframe`-style embeds) are swapped to a
|
|
74
|
+
// native `<video>` / `<audio>` element by {@link MediaPlayer} so playable
|
|
75
|
+
// media in the source document renders inline.
|
|
76
|
+
img: ({ src, alt }) => {
|
|
77
|
+
if (!src) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
return <MediaPlayer src={src} alt={alt} classNames='w-full' />;
|
|
81
|
+
},
|
|
66
82
|
ol: ({ children, ...props }) => (
|
|
67
83
|
<ol className='pt-1 pb-1 ps-6 leading-tight list-decimal' {...props}>
|
|
68
84
|
{children}
|
package/src/index.ts
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownBlock.d.ts","sourceRoot":"","sources":["../../../../src/MarkdownBlock/MarkdownBlock.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAAE,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AACtD,OAAsB,EAAE,KAAK,OAAO,IAAI,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAGrF,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAItD,MAAM,MAAM,kBAAkB,GAAG,eAAe,CAC9C,iBAAiB,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,oBAAoB,CAAC,YAAY,CAAC,CAAC;CACjD,CAAC,CACH,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,aAAa,kDAAwD,kBAAkB,sBASnG,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownBlock.stories.d.ts","sourceRoot":"","sources":["../../../../src/MarkdownBlock/MarkdownBlock.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAMjE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIhD,QAAA,MAAM,IAAI;;;;CAI4B,CAAC;eAExB,IAAI;AAEnB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,aAAa,CAAC,CAAC;AA+C5C,eAAO,MAAM,OAAO,EAAE,KAKrB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/MarkdownBlock/index.ts"],"names":[],"mappings":"AAIA,cAAc,iBAAiB,CAAC"}
|