@dxos/plugin-markdown 0.6.9 → 0.6.10-main.3cfcc89

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 (52) hide show
  1. package/dist/lib/browser/{DocumentCard-CDWDPILF.mjs → DocumentCard-2P4EICBA.mjs} +3 -3
  2. package/dist/lib/browser/DocumentEditor-ZBSGRJRH.mjs +11 -0
  3. package/dist/lib/browser/{MarkdownEditor-5M5II34Y.mjs → MarkdownEditor-5DHI4ORZ.mjs} +2 -2
  4. package/dist/lib/browser/{chunk-MDX3MAMP.mjs → chunk-354DCID5.mjs} +18 -20
  5. package/dist/lib/browser/chunk-354DCID5.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-IWA4H2T7.mjs → chunk-CJO5DJVS.mjs} +17 -7
  7. package/dist/lib/browser/chunk-CJO5DJVS.mjs.map +7 -0
  8. package/dist/lib/browser/{chunk-52M37CDH.mjs → chunk-KWE52M7F.mjs} +3 -3
  9. package/dist/lib/browser/{chunk-DX3K37SM.mjs → chunk-RL7QY322.mjs} +2 -2
  10. package/dist/lib/browser/index.mjs +11 -11
  11. package/dist/lib/browser/index.mjs.map +3 -3
  12. package/dist/lib/browser/meta.json +1 -1
  13. package/dist/lib/node/{DocumentCard-SOTFILJY.cjs → DocumentCard-EHJDDSRY.cjs} +8 -8
  14. package/dist/lib/node/{DocumentCard-SOTFILJY.cjs.map → DocumentCard-EHJDDSRY.cjs.map} +2 -2
  15. package/dist/lib/node/{DocumentEditor-UMWEXCDU.cjs → DocumentEditor-INTWSBO5.cjs} +8 -8
  16. package/dist/lib/node/{DocumentEditor-UMWEXCDU.cjs.map → DocumentEditor-INTWSBO5.cjs.map} +2 -2
  17. package/dist/lib/node/{MarkdownEditor-SJAWKOPB.cjs → MarkdownEditor-X3U7B4FU.cjs} +7 -7
  18. package/dist/lib/node/{MarkdownEditor-SJAWKOPB.cjs.map → MarkdownEditor-X3U7B4FU.cjs.map} +2 -2
  19. package/dist/lib/node/{chunk-TZDYK4MV.cjs → chunk-KTYIOXL5.cjs} +21 -23
  20. package/dist/lib/node/chunk-KTYIOXL5.cjs.map +7 -0
  21. package/dist/lib/node/{chunk-7EEMD6CH.cjs → chunk-MFMEH5GP.cjs} +8 -8
  22. package/dist/lib/node/{chunk-OIOOPQLA.cjs → chunk-MMYLEP2V.cjs} +20 -10
  23. package/dist/lib/node/chunk-MMYLEP2V.cjs.map +7 -0
  24. package/dist/lib/node/{chunk-FW5O2I25.cjs → chunk-Q4ZSCBQE.cjs} +6 -6
  25. package/dist/lib/node/index.cjs +18 -18
  26. package/dist/lib/node/index.cjs.map +3 -3
  27. package/dist/lib/node/meta.json +1 -1
  28. package/dist/types/src/components/MarkdownEditor.d.ts.map +1 -1
  29. package/dist/types/src/components/MarkdownEditor.stories.d.ts +1 -1
  30. package/dist/types/src/components/MarkdownEditor.stories.d.ts.map +1 -1
  31. package/dist/types/src/components/Toolbar.stories.d.ts +1 -1
  32. package/dist/types/src/components/Toolbar.stories.d.ts.map +1 -1
  33. package/dist/types/src/extensions.d.ts.map +1 -1
  34. package/dist/types/src/types/document.d.ts +2 -2
  35. package/package.json +29 -28
  36. package/src/MarkdownPlugin.tsx +2 -2
  37. package/src/components/MarkdownEditor.stories.tsx +1 -1
  38. package/src/components/MarkdownEditor.tsx +16 -6
  39. package/src/components/Toolbar.stories.tsx +1 -1
  40. package/src/extensions.tsx +39 -35
  41. package/dist/lib/browser/DocumentEditor-NTERM6NF.mjs +0 -11
  42. package/dist/lib/browser/chunk-IWA4H2T7.mjs.map +0 -7
  43. package/dist/lib/browser/chunk-MDX3MAMP.mjs.map +0 -7
  44. package/dist/lib/node/chunk-OIOOPQLA.cjs.map +0 -7
  45. package/dist/lib/node/chunk-TZDYK4MV.cjs.map +0 -7
  46. /package/dist/lib/browser/{DocumentCard-CDWDPILF.mjs.map → DocumentCard-2P4EICBA.mjs.map} +0 -0
  47. /package/dist/lib/browser/{DocumentEditor-NTERM6NF.mjs.map → DocumentEditor-ZBSGRJRH.mjs.map} +0 -0
  48. /package/dist/lib/browser/{MarkdownEditor-5M5II34Y.mjs.map → MarkdownEditor-5DHI4ORZ.mjs.map} +0 -0
  49. /package/dist/lib/browser/{chunk-52M37CDH.mjs.map → chunk-KWE52M7F.mjs.map} +0 -0
  50. /package/dist/lib/browser/{chunk-DX3K37SM.mjs.map → chunk-RL7QY322.mjs.map} +0 -0
  51. /package/dist/lib/node/{chunk-7EEMD6CH.cjs.map → chunk-MFMEH5GP.cjs.map} +0 -0
  52. /package/dist/lib/node/{chunk-FW5O2I25.cjs.map → chunk-Q4ZSCBQE.cjs.map} +0 -0
@@ -249,9 +249,9 @@ export const MarkdownPlugin = (): PluginDefinition<MarkdownPluginProvides> => {
249
249
  document={doc}
250
250
  extensionProviders={state.values.extensionProviders}
251
251
  settings={settings.values}
252
+ scrollPastEnd
252
253
  viewMode={getViewMode(fullyQualifiedId(doc))}
253
254
  onViewModeChange={setViewMode}
254
- scrollPastEnd
255
255
  />
256
256
  );
257
257
  } else if (isEditorModel(data.object)) {
@@ -264,9 +264,9 @@ export const MarkdownPlugin = (): PluginDefinition<MarkdownPluginProvides> => {
264
264
  extensionProviders={state.values.extensionProviders}
265
265
  inputMode={settings.values.editorInputMode}
266
266
  toolbar={settings.values.toolbar}
267
+ scrollPastEnd
267
268
  viewMode={getViewMode(data.object.id)}
268
269
  onViewModeChange={setViewMode}
269
- scrollPastEnd
270
270
  />
271
271
  );
272
272
  }
@@ -2,7 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxosTheme';
5
+ import '@dxos-theme';
6
6
  import React, { useMemo, type FC } from 'react';
7
7
 
8
8
  import { createDocAccessor, createEchoObject } from '@dxos/react-client/echo';
@@ -2,6 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ import { openSearchPanel } from '@codemirror/search';
5
6
  import { EditorView } from '@codemirror/view';
6
7
  import React, { useMemo, useEffect, useCallback } from 'react';
7
8
 
@@ -47,7 +48,7 @@ import type { MarkdownPluginState } from '../types';
47
48
 
48
49
  const attentionFragment = mx(
49
50
  'group-focus-within/editor:attention-surface group-[[aria-current]]/editor:attention-surface',
50
- 'group-focus-within/editor:separator-separator',
51
+ 'group-focus-within/editor:border-separator',
51
52
  );
52
53
 
53
54
  const DEFAULT_VIEW_MODE: EditorViewMode = 'preview';
@@ -106,7 +107,7 @@ export const MarkdownEditor = ({
106
107
  if (editorView && data?.id === id && data?.cursor) {
107
108
  // TODO(burdon): We need typed intents.
108
109
  const range = Cursor.getRangeFromCursor(editorView.state, data.cursor);
109
- if (range?.from) {
110
+ if (range) {
110
111
  const selection = editorView.state.selection.main.from !== range.from ? { anchor: range.from } : undefined;
111
112
  const effects = [
112
113
  // NOTE: This does not use the DOM scrollIntoView function.
@@ -164,7 +165,7 @@ export const MarkdownEditor = ({
164
165
  id,
165
166
  scrollTo,
166
167
  selection,
167
- // TODO(wittjosiah): Autofocus based on layout is racey.
168
+ // TODO(wittjosiah): Autofocus based on layout is racy.
168
169
  autoFocus: layoutPlugin?.provides.layout ? layoutPlugin?.provides.layout.scrollIntoView === id : true,
169
170
  moveToEndOfLine: true,
170
171
  }),
@@ -177,8 +178,17 @@ export const MarkdownEditor = ({
177
178
  // Toolbar handler.
178
179
  const handleToolbarAction = useActionHandler(editorView);
179
180
  const handleAction = (action: Action) => {
180
- if (action.type === 'view-mode') {
181
- onViewModeChange?.(id, action.data);
181
+ switch (action.type) {
182
+ case 'search': {
183
+ if (editorView) {
184
+ openSearchPanel(editorView);
185
+ }
186
+ return;
187
+ }
188
+ case 'view-mode': {
189
+ onViewModeChange?.(id, action.data);
190
+ return;
191
+ }
182
192
  }
183
193
 
184
194
  handleToolbarAction?.(action);
@@ -208,7 +218,7 @@ export const MarkdownEditor = ({
208
218
  ]
209
219
  : [
210
220
  textBlockWidth,
211
- 'group-focus-within/editor:separator-separator group-[[aria-current]]/editor:separator-separator',
221
+ 'group-focus-within/editor:border-separator group-[[aria-current]]/editor:border-separator',
212
222
  ]
213
223
  }
214
224
  state={formattingState && { ...formattingState, ...commentsState }}
@@ -2,7 +2,7 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import '@dxosTheme';
5
+ import '@dxos-theme';
6
6
 
7
7
  import React, { type FC, useState } from 'react';
8
8
 
@@ -48,37 +48,7 @@ export const createBaseExtensions = ({
48
48
  query,
49
49
  dispatch,
50
50
  }: ExtensionsOptions): Extension[] => {
51
- const extensions: Extension[] = [
52
- //
53
- // Common.
54
- //
55
- ...(viewMode === 'source'
56
- ? []
57
- : [
58
- decorateMarkdown({
59
- selectionChangeDelay: 100,
60
- numberedHeadings: settings?.numberedHeadings ? { from: 2 } : undefined,
61
- // TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.
62
- renderLinkButton:
63
- dispatch && document
64
- ? onRenderLink((id: string) => {
65
- void dispatch({
66
- action: NavigationAction.ADD_TO_ACTIVE,
67
- data: {
68
- id,
69
- part: 'main',
70
- pivotId: fullyQualifiedId(document),
71
- scrollIntoView: true,
72
- },
73
- });
74
- })
75
- : undefined,
76
- }),
77
- settings?.folding && folding(),
78
- ].filter(isNotFalsy)),
79
- formattingKeymap(),
80
- linkTooltip(renderLinkTooltip),
81
- ];
51
+ const extensions: Extension[] = [];
82
52
 
83
53
  //
84
54
  // Editor mode.
@@ -90,6 +60,37 @@ export const createBaseExtensions = ({
90
60
  }
91
61
  }
92
62
 
63
+ //
64
+ // Markdown
65
+ //
66
+ if (viewMode !== 'source') {
67
+ extensions.push(
68
+ ...[
69
+ formattingKeymap(),
70
+ decorateMarkdown({
71
+ selectionChangeDelay: 100,
72
+ numberedHeadings: settings?.numberedHeadings ? { from: 2 } : undefined,
73
+ // TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.
74
+ renderLinkButton:
75
+ dispatch && document
76
+ ? onRenderLink((id: string) => {
77
+ void dispatch({
78
+ action: NavigationAction.ADD_TO_ACTIVE,
79
+ data: {
80
+ id,
81
+ part: 'main',
82
+ pivotId: fullyQualifiedId(document),
83
+ scrollIntoView: true,
84
+ },
85
+ });
86
+ })
87
+ : undefined,
88
+ }),
89
+ linkTooltip(renderLinkTooltip),
90
+ ],
91
+ );
92
+ }
93
+
93
94
  //
94
95
  // Autocomplete object links.
95
96
  //
@@ -115,15 +116,18 @@ export const createBaseExtensions = ({
115
116
  );
116
117
  }
117
118
 
119
+ extensions.push(
120
+ ...[
121
+ //
122
+ settings?.folding && folding(),
123
+ ].filter(isNotFalsy),
124
+ );
125
+
118
126
  if (settings?.debug) {
119
127
  const items = settings.typewriter ?? '';
120
128
  extensions.push(...[items ? typewriter({ items: items.split(/[,\n]/) }) : undefined].filter(nonNullable));
121
129
  }
122
130
 
123
- if (settings?.experimental) {
124
- extensions.push(...[].filter(nonNullable));
125
- }
126
-
127
131
  return extensions;
128
132
  };
129
133
 
@@ -1,11 +0,0 @@
1
- import {
2
- DocumentEditor_default
3
- } from "./chunk-52M37CDH.mjs";
4
- import "./chunk-RETREORA.mjs";
5
- import "./chunk-MDX3MAMP.mjs";
6
- import "./chunk-IWA4H2T7.mjs";
7
- import "./chunk-4GGD6YJO.mjs";
8
- export {
9
- DocumentEditor_default as default
10
- };
11
- //# sourceMappingURL=DocumentEditor-NTERM6NF.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/MarkdownEditor.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { EditorView } from '@codemirror/view';\nimport React, { useMemo, useEffect, useCallback } from 'react';\n\nimport {\n type FileInfo,\n LayoutAction,\n type LayoutCoordinate,\n useResolvePlugin,\n useIntentResolver,\n parseLayoutPlugin,\n useIntentDispatcher,\n} from '@dxos/app-framework';\nimport { parseAttentionPlugin } from '@dxos/plugin-attention';\nimport { useThemeContext, useTranslation } from '@dxos/react-ui';\nimport {\n type Action,\n type DNDOptions,\n type EditorViewMode,\n type EditorInputMode,\n type UseTextEditorProps,\n Toolbar,\n createBasicExtensions,\n createMarkdownExtensions,\n createThemeExtensions,\n dropFile,\n processAction,\n useActionHandler,\n useCommentState,\n useCommentClickListener,\n useFormattingState,\n useTextEditor,\n editorContent,\n editorGutter,\n Cursor,\n setSelection,\n} from '@dxos/react-ui-editor';\nimport { sectionToolbarLayout } from '@dxos/react-ui-stack';\nimport { textBlockWidth, focusRing, mx } from '@dxos/react-ui-theme';\nimport { nonNullable } from '@dxos/util';\n\nimport { MARKDOWN_PLUGIN } from '../meta';\nimport type { MarkdownPluginState } from '../types';\n\nconst attentionFragment = mx(\n 'group-focus-within/editor:attention-surface group-[[aria-current]]/editor:attention-surface',\n 'group-focus-within/editor:separator-separator',\n);\n\nconst DEFAULT_VIEW_MODE: EditorViewMode = 'preview';\n\nexport type MarkdownEditorProps = {\n id: string;\n coordinate?: LayoutCoordinate;\n inputMode?: EditorInputMode;\n role?: string;\n scrollPastEnd?: boolean;\n toolbar?: boolean;\n viewMode?: EditorViewMode;\n onViewModeChange?: (id: string, mode: EditorViewMode) => void;\n onFileUpload?: (file: File) => Promise<FileInfo | undefined>;\n} & Pick<UseTextEditorProps, 'initialValue' | 'scrollTo' | 'selection' | 'extensions'> &\n Partial<Pick<MarkdownPluginState, 'extensionProviders'>>;\n\nexport const MarkdownEditor = ({\n id,\n role = 'article',\n initialValue,\n extensions,\n extensionProviders,\n scrollPastEnd,\n scrollTo,\n selection,\n toolbar,\n viewMode,\n onFileUpload,\n onViewModeChange,\n}: MarkdownEditorProps) => {\n const { t } = useTranslation(MARKDOWN_PLUGIN);\n const { themeMode } = useThemeContext();\n const dispatch = useIntentDispatcher();\n const attentionPlugin = useResolvePlugin(parseAttentionPlugin);\n const layoutPlugin = useResolvePlugin(parseLayoutPlugin);\n const attended = Array.from(attentionPlugin?.provides.attention?.attended ?? []);\n const isDirectlyAttended = attended.length === 1 && attended[0] === id;\n const [formattingState, formattingObserver] = useFormattingState();\n\n // Extensions from other plugins.\n const providerExtensions = useMemo(() => extensionProviders?.map((provider) => provider({})), [extensionProviders]);\n\n // TODO(Zan): Move these into thread plugin as well?\n const [commentsState, commentObserver] = useCommentState();\n const onCommentClick = useCallback(() => {\n void dispatch({ action: LayoutAction.SET_LAYOUT, data: { element: 'complementary', state: true } });\n }, [dispatch]);\n const commentClickObserver = useCommentClickListener(onCommentClick);\n\n // Focus the space that references the comment.\n useIntentResolver(MARKDOWN_PLUGIN, ({ action, data }) => {\n switch (action) {\n // TODO(burdon): Use fully qualified ids everywhere.\n case LayoutAction.SCROLL_INTO_VIEW: {\n if (editorView && data?.id === id && data?.cursor) {\n // TODO(burdon): We need typed intents.\n const range = Cursor.getRangeFromCursor(editorView.state, data.cursor);\n if (range?.from) {\n const selection = editorView.state.selection.main.from !== range.from ? { anchor: range.from } : undefined;\n const effects = [\n // NOTE: This does not use the DOM scrollIntoView function.\n EditorView.scrollIntoView(range.from, { y: 'start', yMargin: 96 }),\n ];\n if (selection) {\n // Update the editor selection to get bi-directional highlighting.\n effects.push(setSelection.of({ current: id }));\n }\n\n editorView.dispatch({\n effects,\n selection: selection ? { anchor: range.from } : undefined,\n });\n }\n }\n break;\n }\n }\n });\n\n // Drag files.\n const handleDrop: DNDOptions['onDrop'] = async (view, { files }) => {\n const file = files[0];\n const info = file && onFileUpload ? await onFileUpload(file) : undefined;\n if (info) {\n processAction(view, { type: 'image', data: info.url });\n }\n };\n\n const {\n parentRef,\n view: editorView,\n focusAttributes,\n } = useTextEditor(\n () => ({\n initialValue,\n extensions: [\n formattingObserver,\n commentObserver,\n commentClickObserver,\n createBasicExtensions({\n readonly: viewMode === 'readonly',\n placeholder: t('editor placeholder'),\n scrollPastEnd: role === 'section' ? false : scrollPastEnd,\n }),\n createMarkdownExtensions({ themeMode }),\n createThemeExtensions({ themeMode, slots: { content: { className: editorContent } } }),\n editorGutter,\n role !== 'section' && onFileUpload ? dropFile({ onDrop: handleDrop }) : [],\n providerExtensions,\n extensions,\n ].filter(nonNullable),\n ...(role !== 'section' && {\n id,\n scrollTo,\n selection,\n // TODO(wittjosiah): Autofocus based on layout is racey.\n autoFocus: layoutPlugin?.provides.layout ? layoutPlugin?.provides.layout.scrollIntoView === id : true,\n moveToEndOfLine: true,\n }),\n }),\n [id, initialValue, formattingObserver, viewMode, themeMode, extensions, providerExtensions],\n );\n\n useTest(editorView);\n\n // Toolbar handler.\n const handleToolbarAction = useActionHandler(editorView);\n const handleAction = (action: Action) => {\n if (action.type === 'view-mode') {\n onViewModeChange?.(id, action.data);\n }\n\n handleToolbarAction?.(action);\n };\n\n return (\n <div\n role='none'\n // TODO(burdon): Move role logic out of here (see sheet, table, sketch, etc.)\n {...(role === 'section'\n ? { className: 'flex flex-col' }\n : {\n className: 'contents group/editor',\n ...(isDirectlyAttended && { 'aria-current': 'location' }),\n })}\n >\n {toolbar && (\n <div role='none' className={mx('flex shrink-0 justify-center overflow-x-auto', attentionFragment)}>\n <Toolbar.Root\n classNames={\n role === 'section'\n ? [\n textBlockWidth,\n 'z-[2] group-focus-within/section:visible',\n !isDirectlyAttended && 'invisible',\n sectionToolbarLayout,\n ]\n : [\n textBlockWidth,\n 'group-focus-within/editor:separator-separator group-[[aria-current]]/editor:separator-separator',\n ]\n }\n state={formattingState && { ...formattingState, ...commentsState }}\n onAction={handleAction}\n >\n <Toolbar.Markdown />\n {onFileUpload && <Toolbar.Custom onUpload={onFileUpload} />}\n <Toolbar.Separator />\n <Toolbar.View mode={viewMode ?? DEFAULT_VIEW_MODE} />\n <Toolbar.Actions />\n </Toolbar.Root>\n </div>\n )}\n <div\n role='none'\n ref={parentRef}\n data-testid='composer.markdownRoot'\n data-toolbar={toolbar ? 'enabled' : 'disabled'}\n className={\n role === 'section'\n ? mx('flex flex-col flex-1 min-bs-[12rem]', focusRing)\n : mx(\n 'flex is-full bs-full overflow-hidden',\n focusRing,\n attentionFragment,\n 'focus-visible:ring-inset',\n 'data-[toolbar=disabled]:pbs-2 data-[toolbar=disabled]:row-span-2',\n )\n }\n {...focusAttributes}\n />\n </div>\n );\n};\n\n// Expose editor view for playwright tests.\n// TODO(wittjosiah): Find a better way to expose this or find a way to limit it to test runs.\nconst useTest = (view?: EditorView) => {\n useEffect(() => {\n const composer = (window as any).composer;\n if (composer) {\n composer.editorView = view;\n }\n }, [view]);\n};\n\nexport default MarkdownEditor;\n"],
5
- "mappings": "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",
6
- "names": ["EditorView", "React", "useMemo", "useEffect", "useCallback", "LayoutAction", "useResolvePlugin", "useIntentResolver", "parseLayoutPlugin", "useIntentDispatcher", "parseAttentionPlugin", "useThemeContext", "useTranslation", "Toolbar", "createBasicExtensions", "createMarkdownExtensions", "createThemeExtensions", "dropFile", "processAction", "useActionHandler", "useCommentState", "useCommentClickListener", "useFormattingState", "useTextEditor", "editorContent", "editorGutter", "Cursor", "setSelection", "sectionToolbarLayout", "textBlockWidth", "focusRing", "mx", "nonNullable", "attentionFragment", "mx", "DEFAULT_VIEW_MODE", "MarkdownEditor", "id", "role", "initialValue", "extensions", "extensionProviders", "scrollPastEnd", "scrollTo", "selection", "toolbar", "viewMode", "onFileUpload", "onViewModeChange", "t", "useTranslation", "MARKDOWN_PLUGIN", "themeMode", "useThemeContext", "dispatch", "useIntentDispatcher", "attentionPlugin", "useResolvePlugin", "parseAttentionPlugin", "layoutPlugin", "parseLayoutPlugin", "attended", "Array", "from", "provides", "attention", "isDirectlyAttended", "length", "formattingState", "formattingObserver", "useFormattingState", "providerExtensions", "useMemo", "map", "provider", "commentsState", "commentObserver", "useCommentState", "onCommentClick", "useCallback", "action", "LayoutAction", "SET_LAYOUT", "data", "element", "state", "commentClickObserver", "useCommentClickListener", "useIntentResolver", "SCROLL_INTO_VIEW", "editorView", "cursor", "range", "Cursor", "getRangeFromCursor", "main", "anchor", "undefined", "effects", "EditorView", "scrollIntoView", "y", "yMargin", "push", "setSelection", "of", "current", "handleDrop", "view", "files", "file", "info", "processAction", "type", "url", "parentRef", "focusAttributes", "useTextEditor", "createBasicExtensions", "readonly", "placeholder", "createMarkdownExtensions", "createThemeExtensions", "slots", "content", "className", "editorContent", "editorGutter", "dropFile", "onDrop", "filter", "nonNullable", "autoFocus", "layout", "moveToEndOfLine", "useTest", "handleToolbarAction", "useActionHandler", "handleAction", "div", "Toolbar", "Root", "classNames", "textBlockWidth", "sectionToolbarLayout", "onAction", "Markdown", "Custom", "onUpload", "Separator", "View", "mode", "Actions", "ref", "data-testid", "data-toolbar", "focusRing", "useEffect", "composer", "window"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/extensions.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { ArrowSquareDown, ArrowSquareOut, type Icon } from '@phosphor-icons/react';\nimport React, { type AnchorHTMLAttributes, StrictMode } from 'react';\nimport { createRoot } from 'react-dom/client';\n\nimport { type IntentDispatcher, NavigationAction } from '@dxos/app-framework';\nimport { invariant } from '@dxos/invariant';\nimport { fullyQualifiedId, type Query } from '@dxos/react-client/echo';\nimport {\n type AutocompleteResult,\n type Extension,\n type EditorViewMode,\n autocomplete,\n decorateMarkdown,\n linkTooltip,\n typewriter,\n formattingKeymap,\n InputModeExtensions,\n folding,\n} from '@dxos/react-ui-editor';\nimport { getSize, mx } from '@dxos/react-ui-theme';\nimport { isNotFalsy, nonNullable } from '@dxos/util';\n\nimport { type DocumentType, type MarkdownSettingsProps } from './types';\n\nexport type ExtensionsOptions = {\n viewMode?: EditorViewMode;\n settings?: MarkdownSettingsProps;\n document?: DocumentType;\n debug?: boolean;\n experimental?: boolean;\n numberedHeadings?: boolean;\n folding?: boolean;\n query?: Query<DocumentType>;\n dispatch?: IntentDispatcher;\n};\n\n/**\n * Create extension instances for editor.\n */\nexport const createBaseExtensions = ({\n viewMode,\n settings,\n document,\n query,\n dispatch,\n}: ExtensionsOptions): Extension[] => {\n const extensions: Extension[] = [\n //\n // Common.\n //\n ...(viewMode === 'source'\n ? []\n : [\n decorateMarkdown({\n selectionChangeDelay: 100,\n numberedHeadings: settings?.numberedHeadings ? { from: 2 } : undefined,\n // TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.\n renderLinkButton:\n dispatch && document\n ? onRenderLink((id: string) => {\n void dispatch({\n action: NavigationAction.ADD_TO_ACTIVE,\n data: {\n id,\n part: 'main',\n pivotId: fullyQualifiedId(document),\n scrollIntoView: true,\n },\n });\n })\n : undefined,\n }),\n settings?.folding && folding(),\n ].filter(isNotFalsy)),\n formattingKeymap(),\n linkTooltip(renderLinkTooltip),\n ];\n\n //\n // Editor mode.\n //\n if (settings?.editorInputMode) {\n const extension = InputModeExtensions[settings.editorInputMode];\n if (extension) {\n extensions.push(extension);\n }\n }\n\n //\n // Autocomplete object links.\n //\n if (query) {\n extensions.push(\n autocomplete({\n onSearch: (text: string) => {\n // TODO query\n // TODO(burdon): Specify filter (e.g., stack).\n return query.objects\n .map<AutocompleteResult | undefined>((object) =>\n object.name?.length && object.id !== document?.id\n ? {\n label: object.name,\n // TODO(burdon): Factor out URL builder.\n apply: `[${object.name}](/${fullyQualifiedId(object)})`,\n }\n : undefined,\n )\n .filter(nonNullable);\n },\n }),\n );\n }\n\n if (settings?.debug) {\n const items = settings.typewriter ?? '';\n extensions.push(...[items ? typewriter({ items: items.split(/[,\\n]/) }) : undefined].filter(nonNullable));\n }\n\n if (settings?.experimental) {\n extensions.push(...[].filter(nonNullable));\n }\n\n return extensions;\n};\n\n// TODO(burdon): Factor out style.\nconst hover = 'rounded-sm text-primary-600 hover:text-primary-500 dark:text-primary-300 hover:dark:text-primary-200';\n\nconst onRenderLink = (onSelectObject: (id: string) => void) => (el: Element, url: string) => {\n // TODO(burdon): Formalize/document internal link format.\n const isInternal =\n url.startsWith('/') ||\n // TODO(wittjosiah): This should probably be parsed out on paste?\n url.startsWith(window.location.origin);\n\n const options: AnchorHTMLAttributes<any> = isInternal\n ? {\n onClick: () => {\n const qualifiedId = url.split('/').at(-1);\n invariant(qualifiedId, 'Invalid link format.');\n onSelectObject(qualifiedId);\n },\n }\n : {\n href: url,\n rel: 'noreferrer',\n target: '_blank',\n };\n\n const LinkIcon: Icon = isInternal ? ArrowSquareDown : ArrowSquareOut;\n\n createRoot(el).render(\n <StrictMode>\n <a {...options} className={hover}>\n <LinkIcon weight='bold' className={mx(getSize(4), 'inline-block leading-none mis-1 cursor-pointer')} />\n </a>\n </StrictMode>,\n );\n};\n\nconst renderLinkTooltip = (el: Element, url: string) => {\n const web = new URL(url);\n createRoot(el).render(\n <StrictMode>\n <a href={url} target='_blank' rel='noreferrer' className={hover}>\n {web.origin}\n <ArrowSquareOut weight='bold' className={mx(getSize(4), 'inline-block leading-none mis-1 cursor-pointer')} />\n </a>\n </StrictMode>,\n );\n};\n"],
5
- "mappings": "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",
6
- "names": ["ArrowSquareDown", "ArrowSquareOut", "React", "StrictMode", "createRoot", "NavigationAction", "invariant", "fullyQualifiedId", "autocomplete", "decorateMarkdown", "linkTooltip", "typewriter", "formattingKeymap", "InputModeExtensions", "folding", "getSize", "mx", "isNotFalsy", "nonNullable", "createBaseExtensions", "viewMode", "settings", "document", "query", "dispatch", "extensions", "selectionChangeDelay", "numberedHeadings", "from", "undefined", "renderLinkButton", "onRenderLink", "id", "action", "ADD_TO_ACTIVE", "data", "part", "pivotId", "scrollIntoView", "filter", "renderLinkTooltip", "editorInputMode", "extension", "push", "onSearch", "text", "objects", "map", "object", "name", "length", "label", "apply", "debug", "items", "split", "experimental", "hover", "onSelectObject", "el", "url", "isInternal", "startsWith", "window", "location", "origin", "options", "onClick", "qualifiedId", "at", "href", "rel", "target", "LinkIcon", "render", "a", "className", "weight", "web", "URL"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/MarkdownEditor.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { EditorView } from '@codemirror/view';\nimport React, { useMemo, useEffect, useCallback } from 'react';\n\nimport {\n type FileInfo,\n LayoutAction,\n type LayoutCoordinate,\n useResolvePlugin,\n useIntentResolver,\n parseLayoutPlugin,\n useIntentDispatcher,\n} from '@dxos/app-framework';\nimport { parseAttentionPlugin } from '@dxos/plugin-attention';\nimport { useThemeContext, useTranslation } from '@dxos/react-ui';\nimport {\n type Action,\n type DNDOptions,\n type EditorViewMode,\n type EditorInputMode,\n type UseTextEditorProps,\n Toolbar,\n createBasicExtensions,\n createMarkdownExtensions,\n createThemeExtensions,\n dropFile,\n processAction,\n useActionHandler,\n useCommentState,\n useCommentClickListener,\n useFormattingState,\n useTextEditor,\n editorContent,\n editorGutter,\n Cursor,\n setSelection,\n} from '@dxos/react-ui-editor';\nimport { sectionToolbarLayout } from '@dxos/react-ui-stack';\nimport { textBlockWidth, focusRing, mx } from '@dxos/react-ui-theme';\nimport { nonNullable } from '@dxos/util';\n\nimport { MARKDOWN_PLUGIN } from '../meta';\nimport type { MarkdownPluginState } from '../types';\n\nconst attentionFragment = mx(\n 'group-focus-within/editor:attention-surface group-[[aria-current]]/editor:attention-surface',\n 'group-focus-within/editor:separator-separator',\n);\n\nconst DEFAULT_VIEW_MODE: EditorViewMode = 'preview';\n\nexport type MarkdownEditorProps = {\n id: string;\n coordinate?: LayoutCoordinate;\n inputMode?: EditorInputMode;\n role?: string;\n scrollPastEnd?: boolean;\n toolbar?: boolean;\n viewMode?: EditorViewMode;\n onViewModeChange?: (id: string, mode: EditorViewMode) => void;\n onFileUpload?: (file: File) => Promise<FileInfo | undefined>;\n} & Pick<UseTextEditorProps, 'initialValue' | 'scrollTo' | 'selection' | 'extensions'> &\n Partial<Pick<MarkdownPluginState, 'extensionProviders'>>;\n\nexport const MarkdownEditor = ({\n id,\n role = 'article',\n initialValue,\n extensions,\n extensionProviders,\n scrollPastEnd,\n scrollTo,\n selection,\n toolbar,\n viewMode,\n onFileUpload,\n onViewModeChange,\n}: MarkdownEditorProps) => {\n const { t } = useTranslation(MARKDOWN_PLUGIN);\n const { themeMode } = useThemeContext();\n const dispatch = useIntentDispatcher();\n const attentionPlugin = useResolvePlugin(parseAttentionPlugin);\n const layoutPlugin = useResolvePlugin(parseLayoutPlugin);\n const attended = Array.from(attentionPlugin?.provides.attention?.attended ?? []);\n const isDirectlyAttended = attended.length === 1 && attended[0] === id;\n const [formattingState, formattingObserver] = useFormattingState();\n\n // Extensions from other plugins.\n const providerExtensions = useMemo(() => extensionProviders?.map((provider) => provider({})), [extensionProviders]);\n\n // TODO(Zan): Move these into thread plugin as well?\n const [commentsState, commentObserver] = useCommentState();\n const onCommentClick = useCallback(() => {\n void dispatch({ action: LayoutAction.SET_LAYOUT, data: { element: 'complementary', state: true } });\n }, [dispatch]);\n const commentClickObserver = useCommentClickListener(onCommentClick);\n\n // Focus the space that references the comment.\n useIntentResolver(MARKDOWN_PLUGIN, ({ action, data }) => {\n switch (action) {\n // TODO(burdon): Use fully qualified ids everywhere.\n case LayoutAction.SCROLL_INTO_VIEW: {\n if (editorView && data?.id === id && data?.cursor) {\n // TODO(burdon): We need typed intents.\n const range = Cursor.getRangeFromCursor(editorView.state, data.cursor);\n if (range?.from) {\n const selection = editorView.state.selection.main.from !== range.from ? { anchor: range.from } : undefined;\n const effects = [\n // NOTE: This does not use the DOM scrollIntoView function.\n EditorView.scrollIntoView(range.from, { y: 'start', yMargin: 96 }),\n ];\n if (selection) {\n // Update the editor selection to get bi-directional highlighting.\n effects.push(setSelection.of({ current: id }));\n }\n\n editorView.dispatch({\n effects,\n selection: selection ? { anchor: range.from } : undefined,\n });\n }\n }\n break;\n }\n }\n });\n\n // Drag files.\n const handleDrop: DNDOptions['onDrop'] = async (view, { files }) => {\n const file = files[0];\n const info = file && onFileUpload ? await onFileUpload(file) : undefined;\n if (info) {\n processAction(view, { type: 'image', data: info.url });\n }\n };\n\n const {\n parentRef,\n view: editorView,\n focusAttributes,\n } = useTextEditor(\n () => ({\n initialValue,\n extensions: [\n formattingObserver,\n commentObserver,\n commentClickObserver,\n createBasicExtensions({\n readonly: viewMode === 'readonly',\n placeholder: t('editor placeholder'),\n scrollPastEnd: role === 'section' ? false : scrollPastEnd,\n }),\n createMarkdownExtensions({ themeMode }),\n createThemeExtensions({ themeMode, slots: { content: { className: editorContent } } }),\n editorGutter,\n role !== 'section' && onFileUpload ? dropFile({ onDrop: handleDrop }) : [],\n providerExtensions,\n extensions,\n ].filter(nonNullable),\n ...(role !== 'section' && {\n id,\n scrollTo,\n selection,\n // TODO(wittjosiah): Autofocus based on layout is racey.\n autoFocus: layoutPlugin?.provides.layout ? layoutPlugin?.provides.layout.scrollIntoView === id : true,\n moveToEndOfLine: true,\n }),\n }),\n [id, initialValue, formattingObserver, viewMode, themeMode, extensions, providerExtensions],\n );\n\n useTest(editorView);\n\n // Toolbar handler.\n const handleToolbarAction = useActionHandler(editorView);\n const handleAction = (action: Action) => {\n if (action.type === 'view-mode') {\n onViewModeChange?.(id, action.data);\n }\n\n handleToolbarAction?.(action);\n };\n\n return (\n <div\n role='none'\n // TODO(burdon): Move role logic out of here (see sheet, table, sketch, etc.)\n {...(role === 'section'\n ? { className: 'flex flex-col' }\n : {\n className: 'contents group/editor',\n ...(isDirectlyAttended && { 'aria-current': 'location' }),\n })}\n >\n {toolbar && (\n <div role='none' className={mx('flex shrink-0 justify-center overflow-x-auto', attentionFragment)}>\n <Toolbar.Root\n classNames={\n role === 'section'\n ? [\n textBlockWidth,\n 'z-[2] group-focus-within/section:visible',\n !isDirectlyAttended && 'invisible',\n sectionToolbarLayout,\n ]\n : [\n textBlockWidth,\n 'group-focus-within/editor:separator-separator group-[[aria-current]]/editor:separator-separator',\n ]\n }\n state={formattingState && { ...formattingState, ...commentsState }}\n onAction={handleAction}\n >\n <Toolbar.Markdown />\n {onFileUpload && <Toolbar.Custom onUpload={onFileUpload} />}\n <Toolbar.Separator />\n <Toolbar.View mode={viewMode ?? DEFAULT_VIEW_MODE} />\n <Toolbar.Actions />\n </Toolbar.Root>\n </div>\n )}\n <div\n role='none'\n ref={parentRef}\n data-testid='composer.markdownRoot'\n data-toolbar={toolbar ? 'enabled' : 'disabled'}\n className={\n role === 'section'\n ? mx('flex flex-col flex-1 min-bs-[12rem]', focusRing)\n : mx(\n 'flex is-full bs-full overflow-hidden',\n focusRing,\n attentionFragment,\n 'focus-visible:ring-inset',\n 'data-[toolbar=disabled]:pbs-2 data-[toolbar=disabled]:row-span-2',\n )\n }\n {...focusAttributes}\n />\n </div>\n );\n};\n\n// Expose editor view for playwright tests.\n// TODO(wittjosiah): Find a better way to expose this or find a way to limit it to test runs.\nconst useTest = (view?: EditorView) => {\n useEffect(() => {\n const composer = (window as any).composer;\n if (composer) {\n composer.editorView = view;\n }\n }, [view]);\n};\n\nexport default MarkdownEditor;\n"],
5
- "mappings": "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",
6
- "names": ["attentionFragment", "mx", "DEFAULT_VIEW_MODE", "MarkdownEditor", "id", "role", "initialValue", "extensions", "extensionProviders", "scrollPastEnd", "scrollTo", "selection", "toolbar", "viewMode", "onFileUpload", "onViewModeChange", "t", "useTranslation", "MARKDOWN_PLUGIN", "themeMode", "useThemeContext", "dispatch", "useIntentDispatcher", "attentionPlugin", "useResolvePlugin", "parseAttentionPlugin", "layoutPlugin", "parseLayoutPlugin", "attended", "Array", "from", "provides", "attention", "isDirectlyAttended", "length", "formattingState", "formattingObserver", "useFormattingState", "providerExtensions", "useMemo", "map", "provider", "commentsState", "commentObserver", "useCommentState", "onCommentClick", "useCallback", "action", "LayoutAction", "SET_LAYOUT", "data", "element", "state", "commentClickObserver", "useCommentClickListener", "useIntentResolver", "SCROLL_INTO_VIEW", "editorView", "cursor", "range", "Cursor", "getRangeFromCursor", "main", "anchor", "undefined", "effects", "EditorView", "scrollIntoView", "y", "yMargin", "push", "setSelection", "of", "current", "handleDrop", "view", "files", "file", "info", "processAction", "type", "url", "parentRef", "focusAttributes", "useTextEditor", "createBasicExtensions", "readonly", "placeholder", "createMarkdownExtensions", "createThemeExtensions", "slots", "content", "className", "editorContent", "editorGutter", "dropFile", "onDrop", "filter", "nonNullable", "autoFocus", "layout", "moveToEndOfLine", "useTest", "handleToolbarAction", "useActionHandler", "handleAction", "React", "div", "Toolbar", "Root", "classNames", "textBlockWidth", "sectionToolbarLayout", "onAction", "Markdown", "Custom", "onUpload", "Separator", "View", "mode", "Actions", "ref", "data-testid", "data-toolbar", "focusRing", "useEffect", "composer", "window"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/extensions.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { ArrowSquareDown, ArrowSquareOut, type Icon } from '@phosphor-icons/react';\nimport React, { type AnchorHTMLAttributes, StrictMode } from 'react';\nimport { createRoot } from 'react-dom/client';\n\nimport { type IntentDispatcher, NavigationAction } from '@dxos/app-framework';\nimport { invariant } from '@dxos/invariant';\nimport { fullyQualifiedId, type Query } from '@dxos/react-client/echo';\nimport {\n type AutocompleteResult,\n type Extension,\n type EditorViewMode,\n autocomplete,\n decorateMarkdown,\n linkTooltip,\n typewriter,\n formattingKeymap,\n InputModeExtensions,\n folding,\n} from '@dxos/react-ui-editor';\nimport { getSize, mx } from '@dxos/react-ui-theme';\nimport { isNotFalsy, nonNullable } from '@dxos/util';\n\nimport { type DocumentType, type MarkdownSettingsProps } from './types';\n\nexport type ExtensionsOptions = {\n viewMode?: EditorViewMode;\n settings?: MarkdownSettingsProps;\n document?: DocumentType;\n debug?: boolean;\n experimental?: boolean;\n numberedHeadings?: boolean;\n folding?: boolean;\n query?: Query<DocumentType>;\n dispatch?: IntentDispatcher;\n};\n\n/**\n * Create extension instances for editor.\n */\nexport const createBaseExtensions = ({\n viewMode,\n settings,\n document,\n query,\n dispatch,\n}: ExtensionsOptions): Extension[] => {\n const extensions: Extension[] = [\n //\n // Common.\n //\n ...(viewMode === 'source'\n ? []\n : [\n decorateMarkdown({\n selectionChangeDelay: 100,\n numberedHeadings: settings?.numberedHeadings ? { from: 2 } : undefined,\n // TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.\n renderLinkButton:\n dispatch && document\n ? onRenderLink((id: string) => {\n void dispatch({\n action: NavigationAction.ADD_TO_ACTIVE,\n data: {\n id,\n part: 'main',\n pivotId: fullyQualifiedId(document),\n scrollIntoView: true,\n },\n });\n })\n : undefined,\n }),\n settings?.folding && folding(),\n ].filter(isNotFalsy)),\n formattingKeymap(),\n linkTooltip(renderLinkTooltip),\n ];\n\n //\n // Editor mode.\n //\n if (settings?.editorInputMode) {\n const extension = InputModeExtensions[settings.editorInputMode];\n if (extension) {\n extensions.push(extension);\n }\n }\n\n //\n // Autocomplete object links.\n //\n if (query) {\n extensions.push(\n autocomplete({\n onSearch: (text: string) => {\n // TODO query\n // TODO(burdon): Specify filter (e.g., stack).\n return query.objects\n .map<AutocompleteResult | undefined>((object) =>\n object.name?.length && object.id !== document?.id\n ? {\n label: object.name,\n // TODO(burdon): Factor out URL builder.\n apply: `[${object.name}](/${fullyQualifiedId(object)})`,\n }\n : undefined,\n )\n .filter(nonNullable);\n },\n }),\n );\n }\n\n if (settings?.debug) {\n const items = settings.typewriter ?? '';\n extensions.push(...[items ? typewriter({ items: items.split(/[,\\n]/) }) : undefined].filter(nonNullable));\n }\n\n if (settings?.experimental) {\n extensions.push(...[].filter(nonNullable));\n }\n\n return extensions;\n};\n\n// TODO(burdon): Factor out style.\nconst hover = 'rounded-sm text-primary-600 hover:text-primary-500 dark:text-primary-300 hover:dark:text-primary-200';\n\nconst onRenderLink = (onSelectObject: (id: string) => void) => (el: Element, url: string) => {\n // TODO(burdon): Formalize/document internal link format.\n const isInternal =\n url.startsWith('/') ||\n // TODO(wittjosiah): This should probably be parsed out on paste?\n url.startsWith(window.location.origin);\n\n const options: AnchorHTMLAttributes<any> = isInternal\n ? {\n onClick: () => {\n const qualifiedId = url.split('/').at(-1);\n invariant(qualifiedId, 'Invalid link format.');\n onSelectObject(qualifiedId);\n },\n }\n : {\n href: url,\n rel: 'noreferrer',\n target: '_blank',\n };\n\n const LinkIcon: Icon = isInternal ? ArrowSquareDown : ArrowSquareOut;\n\n createRoot(el).render(\n <StrictMode>\n <a {...options} className={hover}>\n <LinkIcon weight='bold' className={mx(getSize(4), 'inline-block leading-none mis-1 cursor-pointer')} />\n </a>\n </StrictMode>,\n );\n};\n\nconst renderLinkTooltip = (el: Element, url: string) => {\n const web = new URL(url);\n createRoot(el).render(\n <StrictMode>\n <a href={url} target='_blank' rel='noreferrer' className={hover}>\n {web.origin}\n <ArrowSquareOut weight='bold' className={mx(getSize(4), 'inline-block leading-none mis-1 cursor-pointer')} />\n </a>\n </StrictMode>,\n );\n};\n"],
5
- "mappings": "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",
6
- "names": ["import_react", "createBaseExtensions", "viewMode", "settings", "document", "query", "dispatch", "extensions", "decorateMarkdown", "selectionChangeDelay", "numberedHeadings", "from", "undefined", "renderLinkButton", "onRenderLink", "id", "action", "NavigationAction", "ADD_TO_ACTIVE", "data", "part", "pivotId", "fullyQualifiedId", "scrollIntoView", "folding", "filter", "isNotFalsy", "formattingKeymap", "linkTooltip", "renderLinkTooltip", "editorInputMode", "extension", "InputModeExtensions", "push", "autocomplete", "onSearch", "text", "objects", "map", "object", "name", "length", "label", "apply", "nonNullable", "debug", "items", "typewriter", "split", "experimental", "hover", "onSelectObject", "el", "url", "isInternal", "startsWith", "window", "location", "origin", "options", "onClick", "qualifiedId", "at", "invariant", "href", "rel", "target", "LinkIcon", "ArrowSquareDown", "ArrowSquareOut", "createRoot", "render", "React", "StrictMode", "a", "className", "weight", "mx", "getSize", "web", "URL"]
7
- }