@dxos/react-ui-editor 0.3.9 → 0.3.10-main.051aa7d
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/dist/lib/browser/index.mjs +952 -736
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts +38 -0
- package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/TextEditor.d.ts +5 -2
- package/dist/types/src/components/TextEditor/TextEditor.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts +9 -4
- package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/extensions/autocomplete.d.ts +10 -0
- package/dist/types/src/components/TextEditor/extensions/autocomplete.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/extensions/{basic/bundle.d.ts → basic.d.ts} +1 -1
- package/dist/types/src/components/TextEditor/extensions/basic.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/extensions/comments.d.ts +18 -0
- package/dist/types/src/components/TextEditor/extensions/comments.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/extensions/demo.d.ts +10 -0
- package/dist/types/src/components/TextEditor/extensions/demo.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/extensions/{hyperlink/hyperlinkWidget.d.ts → experimental.d.ts} +2 -2
- package/dist/types/src/components/TextEditor/extensions/experimental.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/extensions/index.d.ts +7 -2
- package/dist/types/src/components/TextEditor/extensions/index.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/extensions/link.d.ts +11 -0
- package/dist/types/src/components/TextEditor/extensions/link.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/extensions/listener.d.ts +9 -0
- package/dist/types/src/components/TextEditor/extensions/listener.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/extensions/markdown/bundle.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/extensions/markdown/highlight.d.ts +31 -0
- package/dist/types/src/components/TextEditor/extensions/markdown/highlight.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/extensions/markdown/index.d.ts +1 -1
- package/dist/types/src/components/TextEditor/extensions/markdown/index.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/extensions/tasklist.d.ts +2 -0
- package/dist/types/src/components/TextEditor/extensions/tasklist.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/extensions/tooltip.d.ts +12 -0
- package/dist/types/src/components/TextEditor/extensions/tooltip.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/index.d.ts +2 -0
- package/dist/types/src/components/TextEditor/index.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/themes/default.d.ts +20 -0
- package/dist/types/src/components/TextEditor/themes/default.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/themes/index.d.ts +2 -0
- package/dist/types/src/components/TextEditor/themes/index.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/yjs.stories.d.ts +1 -0
- package/dist/types/src/components/TextEditor/yjs.stories.d.ts.map +1 -1
- package/dist/types/src/hooks/automerge/PatchSemaphore.d.ts.map +1 -0
- package/dist/types/src/hooks/automerge/amToCodemirror.d.ts.map +1 -0
- package/dist/types/src/hooks/automerge/automerge.stories.d.ts.map +1 -0
- package/dist/types/src/hooks/automerge/codeMirrorToAm.d.ts.map +1 -0
- package/dist/types/src/hooks/automerge/handle.d.ts.map +1 -0
- package/dist/types/src/hooks/automerge/index.d.ts.map +1 -0
- package/dist/types/src/hooks/automerge/plugin.d.ts.map +1 -0
- package/dist/types/src/hooks/index.d.ts +0 -1
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useTextModel.d.ts +4 -4
- package/dist/types/src/hooks/useTextModel.d.ts.map +1 -1
- package/dist/types/src/styles/markdown.d.ts +12 -10
- package/dist/types/src/styles/markdown.d.ts.map +1 -1
- package/dist/types/src/testing/replicator.d.ts.map +1 -1
- package/package.json +22 -32
- package/src/components/TextEditor/MarkdownEditor.stories.tsx +275 -0
- package/src/components/TextEditor/TextEditor.stories.tsx +46 -43
- package/src/components/TextEditor/TextEditor.tsx +79 -44
- package/src/components/TextEditor/extensions/autocomplete.ts +74 -0
- package/src/components/TextEditor/extensions/{basic/bundle.ts → basic.ts} +4 -2
- package/src/components/TextEditor/extensions/comments.ts +190 -0
- package/src/components/TextEditor/extensions/demo.ts +66 -0
- package/src/components/TextEditor/extensions/{hyperlink/hyperlinkWidget.tsx → experimental.tsx} +18 -2
- package/src/components/TextEditor/extensions/index.ts +7 -2
- package/src/components/TextEditor/extensions/{hyperlink/hyperlinkDecoration.ts → link.ts} +76 -31
- package/src/components/TextEditor/extensions/{change.ts → listener.ts} +4 -3
- package/src/components/TextEditor/extensions/markdown/bundle.ts +21 -25
- package/src/components/TextEditor/extensions/markdown/highlight.ts +167 -0
- package/src/components/TextEditor/extensions/markdown/index.ts +1 -1
- package/src/components/TextEditor/extensions/tasklist.ts +107 -0
- package/src/components/TextEditor/extensions/{hyperlink/hyperlinkTooltip.tsx → tooltip.tsx} +9 -9
- package/src/components/TextEditor/index.ts +3 -0
- package/src/components/TextEditor/themes/default.ts +185 -0
- package/src/components/TextEditor/themes/index.ts +5 -0
- package/src/components/TextEditor/yjs.stories.tsx +1 -0
- package/src/{automerge → hooks/automerge}/automerge.stories.tsx +2 -1
- package/src/hooks/index.ts +0 -1
- package/src/hooks/useTextModel.ts +52 -39
- package/src/styles/markdown.ts +26 -24
- package/src/testing/replicator.ts +6 -6
- package/dist/types/src/automerge/automerge-plugin/PatchSemaphore.d.ts.map +0 -1
- package/dist/types/src/automerge/automerge-plugin/amToCodemirror.d.ts.map +0 -1
- package/dist/types/src/automerge/automerge-plugin/codeMirrorToAm.d.ts.map +0 -1
- package/dist/types/src/automerge/automerge-plugin/handle.d.ts.map +0 -1
- package/dist/types/src/automerge/automerge-plugin/index.d.ts.map +0 -1
- package/dist/types/src/automerge/automerge-plugin/plugin.d.ts.map +0 -1
- package/dist/types/src/automerge/automerge.stories.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/basic/bundle.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/basic/index.d.ts +0 -3
- package/dist/types/src/components/TextEditor/extensions/basic/index.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/basic/theme.d.ts +0 -10
- package/dist/types/src/components/TextEditor/extensions/basic/theme.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/change.d.ts +0 -7
- package/dist/types/src/components/TextEditor/extensions/change.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/hyperlink/hyperlinkDecoration.d.ts +0 -11
- package/dist/types/src/components/TextEditor/extensions/hyperlink/hyperlinkDecoration.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/hyperlink/hyperlinkTooltip.d.ts +0 -8
- package/dist/types/src/components/TextEditor/extensions/hyperlink/hyperlinkTooltip.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/hyperlink/hyperlinkWidget.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/hyperlink/index.d.ts +0 -4
- package/dist/types/src/components/TextEditor/extensions/hyperlink/index.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/markdown/tags.d.ts +0 -17
- package/dist/types/src/components/TextEditor/extensions/markdown/tags.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/markdown/theme.d.ts +0 -21
- package/dist/types/src/components/TextEditor/extensions/markdown/theme.d.ts.map +0 -1
- package/dist/types/src/hooks/useCollaboration.d.ts +0 -9
- package/dist/types/src/hooks/useCollaboration.d.ts.map +0 -1
- package/src/components/TextEditor/extensions/basic/index.ts +0 -6
- package/src/components/TextEditor/extensions/basic/theme.ts +0 -49
- package/src/components/TextEditor/extensions/hyperlink/index.ts +0 -7
- package/src/components/TextEditor/extensions/markdown/tags.ts +0 -38
- package/src/components/TextEditor/extensions/markdown/theme.ts +0 -265
- package/src/hooks/useCollaboration.ts +0 -45
- /package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/PatchSemaphore.d.ts +0 -0
- /package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/amToCodemirror.d.ts +0 -0
- /package/dist/types/src/{automerge → hooks/automerge}/automerge.stories.d.ts +0 -0
- /package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/codeMirrorToAm.d.ts +0 -0
- /package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/handle.d.ts +0 -0
- /package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/index.d.ts +0 -0
- /package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/plugin.d.ts +0 -0
- /package/src/{automerge/automerge-plugin → hooks/automerge}/PatchSemaphore.ts +0 -0
- /package/src/{automerge/automerge-plugin → hooks/automerge}/amToCodemirror.ts +0 -0
- /package/src/{automerge/automerge-plugin → hooks/automerge}/codeMirrorToAm.ts +0 -0
- /package/src/{automerge/automerge-plugin → hooks/automerge}/handle.ts +0 -0
- /package/src/{automerge/automerge-plugin → hooks/automerge}/index.ts +0 -0
- /package/src/{automerge/automerge-plugin → hooks/automerge}/plugin.ts +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../src/index.ts", "../../../src/components/TextEditor/index.ts", "../../../src/components/TextEditor/extensions/
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nexport { TextKind } from '@dxos/protocols/proto/dxos/echo/model/text';\nexport { Doc, YText, YXmlFragment } from '@dxos/text-model';\n\nexport * from './components';\nexport * from './hooks';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nexport { tags } from '@lezer/highlight';\n\nexport * from './extensions';\nexport * from './TextEditor';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { closeBrackets } from '@codemirror/autocomplete';\nimport { bracketMatching, defaultHighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { type Extension } from '@codemirror/state';\nimport { oneDarkHighlightStyle } from '@codemirror/theme-one-dark';\nimport { EditorView, placeholder } from '@codemirror/view';\n\nimport type { ThemeMode } from '@dxos/react-ui';\n\nexport type BasicBundleOptions = {\n themeMode?: ThemeMode;\n placeholder?: string;\n};\n\nexport const basicBundle = ({ themeMode, placeholder: _placeholder }: BasicBundleOptions): Extension[] =>\n [\n bracketMatching(),\n closeBrackets(),\n _placeholder && placeholder(_placeholder),\n\n EditorView.lineWrapping,\n\n // TODO(burdon): Is this required?\n themeMode === 'dark' ? syntaxHighlighting(oneDarkHighlightStyle) : syntaxHighlighting(defaultHighlightStyle),\n ].filter(Boolean) as Extension[];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport get from 'lodash.get';\nimport { type StyleSpec } from 'style-mod';\n\nimport { tokens } from '../../../../styles';\n\n/**\n * Minimal styles.\n * NOTE: The '&' prefix denotes the CM editor root.\n * https://codemirror.net/examples/styling\n */\n// TODO(burdon): Remove?\nexport const basicTheme: {\n [selector: string]: StyleSpec;\n} = {\n '&.cm-focused': {\n outline: 'none',\n },\n '& .cm-line': {\n paddingInline: 0,\n lineHeight: 1.6,\n minBlockSize: '1.6em',\n },\n '& .cm-line *': {\n lineHeight: 1.6,\n },\n '& .cm-scroller': {\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n overflow: 'visible',\n },\n '& .cm-content': {\n padding: 0,\n caretColor: 'black',\n },\n '.dark & .cm-content': {\n caretColor: 'white',\n },\n '& .cm-tooltip': {\n backgroundColor: 'transparent',\n border: 'none',\n },\n '& .cm-link': {\n color: get(tokens, 'extend.colors.primary.500'),\n textDecoration: 'underline',\n },\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { mx } from '@dxos/react-ui-theme';\n\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport const heading: Record<HeadingLevel, string> = {\n 1: 'mbs-4 mbe-2 text-4xl font-semibold text-inherit no-underline',\n 2: 'mbs-4 mbe-2 text-3xl font-bold text-inherit no-underline',\n 3: 'mbs-4 mbe-2 text-2xl font-bold text-inherit no-underline',\n 4: 'mbs-4 mbe-2 text-xl font-extrabold text-inherit no-underline',\n 5: 'mbs-4 mbe-2 text-lg font-extrabold text-inherit no-underline',\n 6: 'mbs-4 mbe-2 font-black text-inherit no-underline',\n};\n\nexport const blockquote = 'mlb-2 border-is-4 border-neutral-500/50 pis-5';\n\n// TODO(thure): Tailwind was not seeing `[&>li:before]:content-[\"•\"]` as a utility class, but it would work if instead of `\"•\"` it was `\"X\"`… why?\nexport const unorderedList =\n 'mlb-2 grid grid-cols-[min-content_1fr] [&>li:before]:content-[attr(marker)] [&>li:before]:mlb-1 [&>li:before]:mie-2';\nexport const orderedList =\n 'mlb-2 grid grid-cols-[min-content_1fr] [&>li:before]:content-[counters(section,_\".\")_\"._\"] [counter-reset:section] [&>li:before]:mlb-1';\n\nexport const listItem = 'contents before:[counter-increment:section]';\n\nexport const codeBlock = 'mlb-2 font-mono bg-neutral-500/10 p-3 rounded';\n\nexport const horizontalRule = 'mlb-4 border-neutral-500/50';\n\nexport const paragraph = 'mlb-1';\n\nexport const bold = 'font-bold';\n\nexport const code = 'font-mono bg-neutral-500/10 rounded pli-0.5 plb-0.5 -mlb-0.5';\n\nexport const placeholder = 'font-mono';\n\nexport const codeWithoutMarks = mx(code, 'pli-1.5 mli-0.5');\n\nexport const italic = 'italic';\n\nexport const strikethrough = 'line-through';\n\nexport const mark = '!font-normal !no-underline !text-inherit opacity-40';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport type { StyleSpec } from 'style-mod';\n\nimport { tailwindConfig, type TailwindConfig } from '@dxos/react-ui-theme';\n\nexport type ThemeStyles = {\n [selector: string]: StyleSpec;\n};\n\n// TODO(thure): Why export the whole theme? Can this be done differently?\nexport const tokens: TailwindConfig['theme'] = tailwindConfig({}).theme;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { StateField } from '@codemirror/state';\n\n/**\n * Based on https://github.com/codemirror/dev/issues/44#issuecomment-789093799\n * @param onChange\n */\n// TODO(burdon): Name?\nexport const onChangeExtension = (onChange: (text: string) => void) =>\n StateField.define({\n create: () => null,\n update: (_value, transaction) => {\n if (transaction.docChanged && onChange) {\n onChange(transaction.newDoc.toString());\n }\n\n return null;\n },\n });\n", "//\n// Copyright 2023 DXOS.org\n// Copyright CodeMirror\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport { type EditorState, type RangeSet, RangeSetBuilder, StateField, type Transaction } from '@codemirror/state';\nimport { Decoration, EditorView, WidgetType } from '@codemirror/view';\n\n// Adapted from:\n// https://codemirror.net/try/?c=aW1wb3J0IHsgYmFzaWNTZXR1cCwgRWRpdG9yVmlldyB9IGZyb20gImNvZGVtaXJyb3IiCmltcG9ydCB7IG1hcmtkb3duIH0gZnJvbSAiQGNvZGVtaXJyb3IvbGFuZy1tYXJrZG93biIKaW1wb3J0IHsgc3ludGF4VHJlZSB9IGZyb20gIkBjb2RlbWlycm9yL2xhbmd1YWdlIjsKaW1wb3J0IHsgRWRpdG9yU3RhdGUsIFJhbmdlU2V0QnVpbGRlciwgU3RhdGVGaWVsZCB9IGZyb20gIkBjb2RlbWlycm9yL3N0YXRlIjsKaW1wb3J0IHsgRGVjb3JhdGlvbiwgV2lkZ2V0VHlwZSB9IGZyb20gIkBjb2RlbWlycm9yL3ZpZXciOwoKY2xhc3MgTGluayBleHRlbmRzIFdpZGdldFR5cGUgewogIGNvbnN0cnVjdG9yKHRleHQsIHVybCkgewogICAgc3VwZXIoKQogICAgdGhpcy50ZXh0ID0gdGV4dAogICAgdGhpcy51cmwgPSB1cmwKICB9CiAgZXEob3RoZXIpIHsgcmV0dXJuIHRoaXMudGV4dCA9PSBvdGhlci50ZXh0ICYmIHRoaXMudXJsID09IG90aGVyLnVybCB9CiAgdG9ET00oKSB7CiAgICBsZXQgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgbGluay50ZXh0Q29udGVudCA9IHRoaXMudGV4dAogICAgbGluay5ocmVmID0gdGhpcy51cmwKICAgIHJldHVybiBsaW5rOwogIH0KfQoKbGV0IGRlY29yYXRpb25zRmllbGQgPSBTdGF0ZUZpZWxkLmRlZmluZSh7CiAgY3JlYXRlKCkgewogICAgcmV0dXJuIERlY29yYXRpb24ubm9uZTsKICB9LAogIHVwZGF0ZShfLCB0cikgewogICAgY29uc3QgYnVpbGRlciA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKTsKICAgIGxldCBjdXJzb3IgPSB0ci5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5oZWFkOwogICAgc3ludGF4VHJlZSh0ci5zdGF0ZSkuaXRlcmF0ZSh7CiAgICAgIGVudGVyOiAobm9kZSkgPT4gewogICAgICAgIGlmICgoY3Vyc29yIDwgbm9kZS5mcm9tIHx8IGN1cnNvciA+IG5vZGUudG8pICYmIG5vZGUubmFtZSA9PSAiTGluayIpIHsKICAgICAgICAgIGxldCBtYXJrcyA9IG5vZGUubm9kZS5nZXRDaGlsZHJlbigiTGlua01hcmsiKTsKICAgICAgICAgIGxldCB0ZXh0ID0gbWFya3MubGVuZ3RoID49IDIgPyB0ci5zdGF0ZS5zbGljZURvYyhtYXJrc1swXS50bywgbWFya3NbMV0uZnJvbSkgOiAiIgoKICAgICAgICAgIGxldCB1cmxOb2RlID0gbm9kZS5ub2RlLmdldENoaWxkKCJVUkwiKTsKICAgICAgICAgIGxldCB1cmwgPSB1cmxOb2RlID8gdHIuc3RhdGUuc2xpY2VEb2ModXJsTm9kZS5mcm9tLCB1cmxOb2RlLnRvKSA6ICIiCiAgICAgICAgICBidWlsZGVyLmFkZChub2RlLmZyb20sIG5vZGUudG8sIERlY29yYXRpb24ucmVwbGFjZSh7CiAgICAgICAgICAgIHdpZGdldDogbmV3IExpbmsodGV4dCwgdXJsKSwKICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSwKICAgIH0pOwogICAgcmV0dXJuIGJ1aWxkZXIuZmluaXNoKCk7CiAgfSwKICBwcm92aWRlOiAoZikgPT4gRWRpdG9yVmlldy5kZWNvcmF0aW9ucy5mcm9tKGYpLAp9KTsKCmxldCB2aWV3ID0gbmV3IEVkaXRvclZpZXcoewogIGRvYzogIiMgSGVsbG8gV29ybGRcblxuW1Rlc3RdKGh0dHBzOi8vZXhhbXBsZS5jb20pXG5cblxuIiwKICBleHRlbnNpb25zOiBbZGVjb3JhdGlvbnNGaWVsZCwgbWFya2Rvd24oKV0sCiAgcGFyZW50OiBkb2N1bWVudC5ib2R5LAp9KTsKCnZpZXcuZm9jdXMoKTs=\n// https://discuss.codemirror.net/t/link-widget-is-clicked-only-if-editor-is-out-of-focus/7433\n\n// TODO(burdon): Adapt to make all markdown editable?\n\n// TODO(burdon): Research overlays.\n// https://stackoverflow.com/questions/26933344/codemirror-detect-and-create-links-inside-editor\n// https://codemirror.net/5/doc/manual.html#addOverlay\n// https://codemirror.net/5/demo/simplemode.html\n// https://codemirror.net/5/demo/search.html (Search dialog).\n\nclass Link extends WidgetType {\n constructor(private readonly _anchor: number, private readonly _text: string, private readonly _url?: string) {\n super();\n }\n\n override eq(other: any) {\n return this._text === other.text && this._url === other.url;\n }\n\n toDOM(view: EditorView) {\n const link = document.createElement('a');\n link.setAttribute('class', 'cm-link');\n link.textContent = this._text;\n if (this._url) {\n link.setAttribute('target', '_blank');\n link.href = this._url;\n } else {\n link.onclick = () => {\n view.dispatch({\n selection: {\n anchor: this._anchor,\n },\n });\n };\n }\n\n return link;\n }\n}\n\ntype HyperlinkDecorationConfig = {\n link?: boolean;\n};\n\n/**\n * Creates a state field to replace AST elements with a hyperlink widget.\n * https://codemirror.net/docs/ref/#state.StateField\n */\nexport const hyperlinkDecoration = ({ link }: HyperlinkDecorationConfig = {}) => {\n return StateField.define<RangeSet<any>>({\n create: (state) => update(state, link),\n update: (_: RangeSet<any>, tr: Transaction) => update(tr.state, link),\n provide: (field) => EditorView.decorations.from(field),\n });\n};\n\nconst update = (state: EditorState, link?: boolean) => {\n const builder = new RangeSetBuilder();\n const cursor = state.selection.main.head;\n syntaxTree(state).iterate({\n enter: (node) => {\n // Check if cursor is inside text.\n if (cursor < node.from || cursor > node.to) {\n if (node.name === 'Link') {\n const marks = node.node.getChildren('LinkMark');\n const text = marks.length >= 2 ? state.sliceDoc(marks[0].to, marks[1].from) : '';\n\n const urlNode = node.node.getChild('URL');\n const url = urlNode ? state.sliceDoc(urlNode.from, urlNode.to) : '';\n\n builder.add(\n node.from,\n node.to,\n Decoration.replace({\n widget: new Link(node.from, text, link ? url : undefined),\n }),\n );\n\n return false;\n }\n }\n\n return true;\n },\n });\n\n return builder.finish();\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { hoverTooltip } from '@codemirror/view';\n\nimport { tooltipContent } from '@dxos/react-ui-theme';\n\nconst markdownLinkRegexp = /\\[([^\\]]+)]\\(([^)]+)\\)/;\n\nexport type OnHyperlinkHover = (el: Element, url: string) => void;\n\n/**\n * https://codemirror.net/examples/tooltip\n * https://codemirror.net/docs/ref/#view.hoverTooltip\n * https://github.com/codemirror/view/blob/main/src/tooltip.ts\n */\n// TODO(burdon): Create config object.\nexport const createHyperlinkTooltip = (onHover: OnHyperlinkHover, regexp = markdownLinkRegexp) =>\n hoverTooltip((view, pos) => {\n const { from, text } = view.state.doc.lineAt(pos);\n const p = pos - from;\n\n let idx = 0;\n let match;\n do {\n match = text.substring(idx).match(regexp);\n if (!match) {\n match = undefined;\n break;\n }\n\n idx = text.indexOf(match[0]);\n if (p >= idx && p < idx + match[0].length) {\n break;\n }\n\n idx += match[0].length;\n } while (true);\n\n if (!match) {\n return null;\n }\n\n const [, , url] = match ?? [];\n\n return {\n pos: idx + from,\n end: idx + from + match[0].length,\n above: true,\n create: () => {\n const el = document.createElement('a');\n el.innerText = '_'; // Required so doesn't collapse.\n el.className = tooltipContent({}, 'mb-2 p-1');\n el.setAttribute('target', '_blank');\n el.setAttribute('href', url);\n onHover(el, url);\n return { dom: el };\n },\n };\n });\n", "//\n// Copyright 2023 DXOS.org\n// Adapted from: https://github.com/uiwjs/react-codemirror/blob/master/extensions/hyper-link/src/index.ts\n//\n\nimport { type Extension } from '@codemirror/state';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n MatchDecorator,\n ViewPlugin,\n type ViewUpdate,\n} from '@codemirror/view';\n\n// Notes: Can't edit widget content (or cursor nav through them).\n// - https://discuss.codemirror.net/t/focusing-inputs-within-widgets/5178/7\n// Widgets intentionally always get set to contenteditable=false,\n// or they would become part of CodeMirror’s editable content element.\n// You should be able to introduce new contenteditable=true child elements inside of them.\n\nconst markdownLinkRegexp = /\\[([^\\]]+)]\\(([^)]+)\\)(!?)/gi;\n\n/**\n * Custom link decorator.\n * NOTE: The default markdown extension formats links by default.\n * @deprecated\n */\nconst linkDecorator = () =>\n new MatchDecorator({\n regexp: markdownLinkRegexp,\n decorate: (add, from, to, match, view) => {\n const [_, label, url] = match;\n const p0 = {\n start: from,\n end: from + 1,\n };\n\n const p1 = {\n start: from + 1,\n end: from + 1 + label.length,\n };\n\n const p2 = {\n start: p1.end,\n end: p1.end + 1,\n };\n\n const p3 = {\n start: p1.end + 1,\n end: p1.end + 1 + url.length + 2,\n };\n\n add(\n p0.start,\n p0.end,\n Decoration.mark({ class: 'cm-hyperlink-bracket', _attributes: { style: 'display: none' } }),\n );\n add(p1.start, p1.end, Decoration.mark({ class: 'cm-hyperlink-label' }));\n add(\n p2.start,\n p2.end,\n Decoration.mark({ class: 'cm-hyperlink-bracket', _attributes: { style: 'display: none' } }),\n );\n add(p3.start, p3.end, Decoration.mark({ class: 'cm-hyperlink-url', _attributes: { style: 'display: none' } }));\n },\n });\n\nexport function hyperLinkExtension() {\n return ViewPlugin.fromClass(\n class HyperLinkView {\n readonly decorator: MatchDecorator;\n decorations: DecorationSet;\n constructor(view: EditorView) {\n this.decorator = linkDecorator();\n this.decorations = this.decorator.createDeco(view);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = this.decorator.updateDeco(update, this.decorations);\n }\n }\n },\n {\n decorations: (view) => view.decorations,\n eventHandlers: {\n // TODO(burdon): CLick to expand link.\n // https://discuss.codemirror.net/t/decorator-iteration-on-click-event/4226/2\n mousedown: function (event, view) {\n const pos = view.posAtDOM(event.target as Node);\n if (pos !== 0) {\n console.log(this);\n }\n },\n // TODO(burdon): Hide when cursor moves away.\n keydown: (event, view) => {\n view.update([]);\n },\n },\n },\n );\n}\n\nexport const hyperlinkStyle = EditorView.baseTheme({\n '.cm-hyperlink-label': {\n cursor: 'pointer',\n textDecoration: 'underline',\n },\n '.cm-hyperlink-bracket': {\n opacity: 0.2,\n },\n '.cm-hyperlink-url': {\n opacity: 0.5,\n fontFamily: 'monospace',\n },\n});\n\nexport const hyperlinkWidget: Extension = [hyperLinkExtension(), hyperlinkStyle];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { closeBrackets, closeBracketsKeymap } from '@codemirror/autocomplete';\nimport { defaultKeymap, history, historyKeymap, indentWithTab } from '@codemirror/commands';\nimport { markdownLanguage, markdown } from '@codemirror/lang-markdown';\nimport {\n bracketMatching,\n defaultHighlightStyle,\n foldKeymap,\n indentOnInput,\n syntaxHighlighting,\n} from '@codemirror/language';\nimport { languages } from '@codemirror/language-data';\nimport { lintKeymap } from '@codemirror/lint';\nimport { highlightSelectionMatches, searchKeymap } from '@codemirror/search';\nimport { EditorState, type Extension } from '@codemirror/state';\nimport { oneDarkHighlightStyle } from '@codemirror/theme-one-dark';\nimport {\n crosshairCursor,\n drawSelection,\n dropCursor,\n EditorView,\n highlightActiveLine,\n highlightActiveLineGutter,\n highlightSpecialChars,\n keymap,\n placeholder,\n rectangularSelection,\n} from '@codemirror/view';\n// import { GFM } from '@lezer/markdown';\n\nimport type { ThemeMode } from '@dxos/react-ui';\n\nimport { markdownTagsExtension } from './tags';\nimport { markdownHighlightStyle } from './theme';\n\nexport type MarkdownBundleOptions = {\n themeMode?: ThemeMode;\n placeholder?: string;\n};\n\nexport const markdownBundle = ({ themeMode, placeholder: _placeholder }: MarkdownBundleOptions): Extension[] => {\n // All of https://github.com/codemirror/basic-setup minus line numbers and fold gutter.\n // https://codemirror.net/docs/ref/#codemirror.basicSetup\n return [\n bracketMatching(),\n closeBrackets(),\n _placeholder && placeholder(_placeholder),\n\n EditorState.allowMultipleSelections.of(true),\n EditorView.lineWrapping,\n\n // autocompletion(),\n crosshairCursor(),\n dropCursor(),\n drawSelection(),\n highlightActiveLine(),\n highlightActiveLineGutter(),\n highlightSelectionMatches(),\n highlightSpecialChars(),\n history(),\n indentOnInput(),\n rectangularSelection(),\n\n keymap.of([\n ...closeBracketsKeymap,\n // ...completionKeymap,\n ...defaultKeymap,\n ...foldKeymap,\n ...historyKeymap,\n ...lintKeymap,\n ...searchKeymap,\n indentWithTab,\n ]),\n\n // Main extension.\n // https://github.com/codemirror/lang-markdown\n markdown({\n base: markdownLanguage,\n codeLanguages: languages,\n extensions: [\n // TODO(burdon): This seems to upgrade the parser.\n // GitHub flavored markdown bundle: Table, TaskList, Strikethrough, and Autolink.\n // https://github.com/lezer-parser/markdown?tab=readme-ov-file#github-flavored-markdown\n // https://github.github.com/gfm\n // GFM,\n\n // Custom styling.\n markdownTagsExtension,\n ],\n }),\n\n // TODO(thure): All but one rule here apply to both themes; rename or refactor.\n syntaxHighlighting(markdownHighlightStyle),\n themeMode === 'dark' ? syntaxHighlighting(oneDarkHighlightStyle) : syntaxHighlighting(defaultHighlightStyle),\n ].filter(Boolean) as Extension[];\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { styleTags, Tag } from '@lezer/highlight';\nimport { type MarkdownConfig } from '@lezer/markdown';\n\nexport const markdownTags = {\n headingMark: Tag.define(),\n quoteMark: Tag.define(),\n listMark: Tag.define(),\n linkMark: Tag.define(),\n emphasisMark: Tag.define(),\n codeMark: Tag.define(),\n codeText: Tag.define(),\n inlineCode: Tag.define(),\n url: Tag.define(),\n linkReference: Tag.define(),\n linkLabel: Tag.define(),\n};\n\nexport const markdownTagsExtension: MarkdownConfig = {\n props: [\n styleTags({\n HeaderMark: markdownTags.headingMark,\n QuoteMark: markdownTags.quoteMark,\n ListMark: markdownTags.listMark,\n LinkMark: markdownTags.linkMark,\n EmphasisMark: markdownTags.emphasisMark,\n CodeMark: markdownTags.codeMark,\n CodeText: markdownTags.codeText,\n InlineCode: markdownTags.inlineCode,\n URL: markdownTags.url,\n LinkReference: markdownTags.linkReference,\n LinkLabel: markdownTags.linkLabel,\n }),\n ],\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { markdownLanguage } from '@codemirror/lang-markdown';\nimport { HighlightStyle } from '@codemirror/language';\nimport { tags } from '@lezer/highlight';\nimport get from 'lodash.get';\n\nimport { markdownTags } from './tags';\nimport { bold, heading, italic, mark, strikethrough, tokens, type ThemeStyles } from '../../../../styles';\n\n// TODO(burdon): Rationalize theme/colors. Hoist onto single property object.\nexport const chalky = '#e5c07b';\nexport const coral = '#e06c75';\nexport const cyan = '#56b6c2';\nexport const invalid = '#ffffff';\nexport const ivory = '#abb2bf';\nexport const stone = '#7d8799';\nexport const malibu = '#61afef';\nexport const sage = '#98c379';\nexport const whiskey = '#d19a66';\nexport const violet = '#c678dd';\nconst _darkBackground = '#21252b';\nexport const highlightBackground = '#2c313a';\nconst _background = '#282c34';\nexport const tooltipBackground = '#353a42';\nconst _selection = '#3E4451';\n\nconst monospace = get(tokens, 'fontFamily.mono', ['monospace']).join(',');\n\n/**\n * NOTE: The '&' prefix denotes the CM editor root.\n * https://codemirror.net/examples/styling\n */\nexport const markdownTheme: ThemeStyles = {\n // TODO(thure): Consider whether these commented-out rules from one-dark-theme should be integrated.\n // '&': {\n // color: ivory,\n // backgroundColor: background\n // },\n // '.cm-cursor, .cm-dropCursor': { borderLeftColor: cursor },\n // '&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection': {\n // backgroundColor: selection\n // },\n // '.cm-panels': { backgroundColor: darkBackground, color: ivory },\n // '.cm-panels.cm-panels-top': { borderBottom: '2px solid black' },\n // '.cm-panels.cm-panels-bottom': { borderTop: '2px solid black' },\n // '.cm-searchMatch': {\n // backgroundColor: '#72a1ff59',\n // outline: '1px solid #457dff'\n // },\n // '.cm-searchMatch.cm-searchMatch-selected': {\n // backgroundColor: '#6199ff2f'\n // },\n // '.cm-activeLine': { backgroundColor: '#6699ff0b' },\n // '.cm-selectionMatch': { backgroundColor: '#aafe661a' },\n // '&.cm-focused .cm-matchingBracket, &.cm-focused .cm-nonmatchingBracket': {\n // backgroundColor: '#bad0f847'\n // },\n // '.cm-gutters': {\n // backgroundColor: background,\n // color: stone,\n // border: 'none'\n // },\n // '.cm-activeLineGutter': {\n // backgroundColor: highlightBackground\n // },\n // '.cm-foldPlaceholder': {\n // backgroundColor: 'transparent',\n // border: 'none',\n // color: '#ddd'\n // },\n\n '& .cm-tooltip': {\n backgroundColor: 'transparent',\n border: 'none',\n },\n // '.dark & .cm-tooltip': {\n // border: 'none',\n // backgroundColor: tooltipBackground,\n // },\n // '.dark & .cm-tooltip .cm-tooltip-arrow:before': {\n // borderTopColor: 'transparent',\n // borderBottomColor: 'transparent',\n // },\n // '.dark & .cm-tooltip .cm-tooltip-arrow:after': {\n // borderTopColor: tooltipBackground,\n // borderBottomColor: tooltipBackground,\n // },\n // '.dark & .cm-tooltip-autocomplete': {\n // '& > ul > li[aria-selected]': {\n // backgroundColor: highlightBackground,\n // color: ivory,\n // },\n // },\n '&.cm-focused': {\n outline: 'none',\n },\n '& .cm-line': {\n paddingInline: 0,\n lineHeight: 1.6,\n minBlockSize: '1.6em',\n },\n '& .cm-line *': {\n lineHeight: 1.6,\n },\n '&.cm-focused .cm-selectionBackground, & .cm-selectionBackground': {\n background: get(tokens, 'extend.colors.primary.150', '#00ffff'),\n },\n '.dark & .cm-selectionBackground, .dark &.cm-focused .cm-selectionBackground': {\n background: get(tokens, 'extend.colors.primary.850', '#00ffff'),\n },\n '& .cm-selectionMatch': {\n background: get(tokens, 'extend.colors.primary.250', '#00ffff') + '44',\n },\n '.dark & .cm-selectionMatch': {\n background: get(tokens, 'extend.colors.primary.600', '#00ffff') + '44',\n },\n '& .cm-content': {\n padding: 0,\n caretColor: 'black',\n },\n '.dark & .cm-content': {\n caretColor: 'white',\n },\n '& .cm-cursor': {\n borderLeftColor: 'black',\n },\n '.dark & .cm-cursor': {\n borderLeftColor: 'white',\n },\n '.cm-placeholder': {\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n },\n '& .cm-scroller': {\n fontFamily: get(tokens, 'fontFamily.mono', []).join(','),\n overflow: 'visible',\n },\n '& .cm-activeLine': {\n backgroundColor: 'transparent',\n },\n '.dark & .cm-activeLine': {\n backgroundColor: 'transparent',\n },\n '& .cm-ySelectionInfo': {\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n padding: '2px 4px',\n marginBlockStart: '-4px',\n },\n '& .cm-ySelection, & .cm-selectionMatch': {\n paddingBlockStart: '.15em',\n paddingBlockEnd: '.15em',\n },\n '& .cm-ySelection, & .cm-yLineSelection': {\n mixBlendMode: 'multiply',\n },\n '.dark & .cm-ySelection, .dark & .cm-yLineSelection': {\n mixBlendMode: 'screen',\n },\n '& .cm-ySelectionCaret': {\n display: 'inline-block',\n insetBlockStart: '.1em',\n blockSize: '1.4em',\n verticalAlign: 'top',\n },\n '& .cm-yLineSelection': {\n margin: '0',\n },\n '.cm-link': {\n color: 'rgb(20 89 208)', // TODO(burdon): Rationalize.\n textDecorationLine: 'underline',\n textDecorationThickness: '1px',\n textUnderlineOffset: '2px',\n borderRadius: '.125rem',\n },\n // TODO(burdon): Document.\n ...Object.keys(get(tokens, 'extend.fontSize', {})).reduce((acc: Record<string, any>, fontSize) => {\n const height = get(tokens, ['extend', 'fontSize', fontSize, 1, 'lineHeight']);\n // TODO(thure): This appears to be the best or only way to set selection caret heights, but it's far more verbose than it needs to be.\n acc[`& .text-${fontSize} + .cm-ySelectionCaret`] = { height };\n acc[`& .text-${fontSize} + .cm-ySelection + .cm-ySelectionCaret`] = { height };\n acc[`& .text-${fontSize} + .cm-widgetBuffer + .cm-ySelectionCaret`] = { height };\n return acc;\n }, {}),\n};\n\nexport const markdownHighlightStyle = HighlightStyle.define(\n [\n {\n tag: [\n tags.keyword,\n tags.name,\n tags.deleted,\n tags.character,\n tags.propertyName,\n tags.macroName,\n tags.color,\n tags.constant(tags.name),\n tags.standard(tags.name),\n tags.definition(tags.name),\n tags.separator,\n tags.typeName,\n tags.className,\n tags.number,\n tags.changed,\n tags.annotation,\n tags.modifier,\n tags.self,\n tags.namespace,\n tags.operator,\n tags.operatorKeyword,\n tags.escape,\n tags.regexp,\n tags.special(tags.string),\n tags.meta,\n tags.comment,\n tags.atom,\n tags.bool,\n tags.special(tags.variableName),\n tags.processingInstruction,\n tags.string,\n tags.inserted,\n tags.invalid,\n ],\n color: 'inherit !important',\n },\n {\n tag: [tags.link, tags.url],\n color: 'inherit !important',\n textDecoration: 'none !important',\n },\n {\n tag: [tags.function(tags.variableName), tags.labelName],\n color: malibu,\n fontFamily: monospace,\n },\n {\n tag: [\n markdownTags.codeMark,\n markdownTags.emphasisMark,\n markdownTags.headingMark,\n markdownTags.linkLabel,\n markdownTags.linkReference,\n markdownTags.listMark,\n markdownTags.quoteMark,\n markdownTags.url,\n tags.meta,\n tags.processingInstruction,\n ],\n class: mark,\n },\n { tag: [markdownTags.codeText, markdownTags.inlineCode], class: 'font-mono' },\n { tag: tags.emphasis, class: italic },\n { tag: tags.heading1, class: heading[1] },\n { tag: tags.heading2, class: heading[2] },\n { tag: tags.heading3, class: heading[3] },\n { tag: tags.heading4, class: heading[4] },\n { tag: tags.heading5, class: heading[5] },\n { tag: tags.heading6, class: heading[6] },\n { tag: tags.strikethrough, class: strikethrough },\n { tag: tags.strong, class: bold },\n ],\n { scope: markdownLanguage, all: { fontFamily: get(tokens, 'fontFamily.body', []).join(',') } },\n);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { EditorState, type Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport { useFocusableGroup } from '@fluentui/react-tabster';\nimport { vim } from '@replit/codemirror-vim';\nimport defaultsDeep from 'lodash.defaultsdeep';\nimport get from 'lodash.get';\nimport React, {\n type KeyboardEvent,\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useState,\n type ComponentProps,\n} from 'react';\n\nimport { isDocAccessor } from '@dxos/echo-schema';\nimport { useThemeContext } from '@dxos/react-ui';\n\nimport { basicBundle, basicTheme, markdownBundle, markdownTheme } from './extensions';\nimport { type EditorModel, useCollaboration } from '../../hooks';\nimport type { ThemeStyles } from '../../styles';\n\nexport const EditorModes = ['default', 'vim'] as const;\nexport type EditorMode = (typeof EditorModes)[number];\n\nexport type CursorInfo = {\n from: number;\n to: number;\n line: number;\n lines: number;\n after?: string;\n};\n\nexport type TextEditorRef = {\n editor: HTMLDivElement | null;\n state?: EditorState;\n view?: EditorView;\n};\n\nexport type TextEditorSlots = {\n root?: Omit<ComponentProps<'div'>, 'ref'>;\n editor?: {\n className?: string;\n placeholder?: string;\n spellCheck?: boolean;\n tabIndex?: number;\n theme?: ThemeStyles;\n };\n};\n\nexport type TextEditorProps = {\n model: EditorModel;\n extensions?: Extension[];\n slots?: TextEditorSlots;\n editorMode?: EditorMode;\n};\n\n/**\n * Base text editor.\n * NOTE: Rather than adding properties, try to create extensions that can be reused.\n */\nexport const BaseTextEditor = forwardRef<TextEditorRef, TextEditorProps>(\n ({ model, extensions = [], slots, editorMode }, forwardedRef) => {\n const { themeMode } = useThemeContext();\n const tabsterDOMAttribute = useFocusableGroup({ tabBehavior: 'limited' });\n\n const [parent, setParent] = useState<HTMLDivElement | null>(null);\n const [state, setState] = useState<EditorState>();\n const [view, setView] = useState<EditorView>();\n useImperativeHandle(\n forwardedRef,\n () => ({\n editor: parent,\n state,\n view,\n }),\n [view, state, parent],\n );\n\n // TODO(burdon): Pass in extension?\n const collaboration = useCollaboration(model, themeMode);\n\n useEffect(() => {\n if (!parent) {\n return;\n }\n\n const initialText = isDocAccessor(model.content)\n ? get(model.content.handle.docSync(), model.content.path)\n : model.content?.toString();\n\n const state = EditorState.create({\n doc: initialText,\n extensions: [\n // TODO(burdon): Factor out VIM mode?\n editorMode === 'vim' && vim(),\n\n // Replication.\n collaboration,\n\n // Theme.\n slots?.editor?.theme && EditorView.theme(slots?.editor?.theme),\n\n // Custom.\n ...extensions,\n ].filter(Boolean) as Extension[],\n });\n\n setState(state);\n\n // NOTE: This repaints the editor.\n // If the new state is derived from the old state, it will likely not be visible other than the cursor resetting.\n // Ideally this should not be hit except when changing between text objects.\n view?.destroy();\n setView(new EditorView({ state, parent }));\n\n return () => {\n view?.destroy();\n setView(undefined);\n setState(undefined);\n };\n }, [parent, model.content, themeMode, editorMode]);\n\n const handleKeyUp = useCallback(\n (event: KeyboardEvent) => {\n const { key, altKey, shiftKey, metaKey, ctrlKey } = event;\n switch (key) {\n case 'Enter': {\n view?.contentDOM.focus();\n break;\n }\n\n case 'Escape': {\n editorMode === 'vim' && (altKey || shiftKey || metaKey || ctrlKey) && parent?.focus();\n break;\n }\n }\n },\n [view, editorMode],\n );\n\n return (\n <div\n key={model.id}\n ref={setParent}\n tabIndex={0}\n {...slots?.root}\n {...(editorMode !== 'vim' && tabsterDOMAttribute)}\n onKeyUp={handleKeyUp}\n />\n );\n },\n);\n\nexport const TextEditor = forwardRef<TextEditorRef, TextEditorProps>(\n ({ extensions: _extensions, slots, ...props }, forwardedRef) => {\n const { themeMode } = useThemeContext();\n const extensions = [...(_extensions ?? []), basicBundle({ themeMode, placeholder: slots?.editor?.placeholder })];\n return (\n <BaseTextEditor\n ref={forwardedRef}\n extensions={extensions}\n slots={defaultsDeep({}, slots, { editor: { theme: basicTheme } })}\n {...props}\n />\n );\n },\n);\n\nexport const MarkdownEditor = forwardRef<TextEditorRef, TextEditorProps>(\n ({ extensions: _extensions, slots, ...props }, forwardedRef) => {\n const { themeMode } = useThemeContext();\n const extensions = [...(_extensions ?? []), markdownBundle({ themeMode })];\n return (\n <BaseTextEditor\n ref={forwardedRef}\n extensions={extensions}\n slots={defaultsDeep({}, slots, { editor: { theme: markdownTheme } })}\n {...props}\n />\n );\n },\n);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport type { Extension } from '@codemirror/state';\nimport { useEffect, useMemo } from 'react';\nimport { yCollab } from 'y-codemirror.next';\n\nimport { generateName } from '@dxos/display-name';\nimport { isDocAccessor } from '@dxos/echo-schema';\nimport type { ThemeMode } from '@dxos/react-ui';\nimport { getColorForValue } from '@dxos/react-ui-theme';\nimport { YText } from '@dxos/text-model';\n\nimport type { EditorModel } from './useTextModel';\nimport { automergePlugin } from '../automerge/automerge-plugin';\n\n/**\n * Replication and awareness (incl. remote selection).\n * https://codemirror.net/docs/ref/#collab\n */\nexport const useCollaboration = (model: EditorModel, themeMode: ThemeMode): Extension | undefined => {\n const { provider, peer, content } = model;\n const extension = useMemo(() => {\n if (content instanceof YText) {\n return yCollab(content, provider?.awareness);\n } else if (isDocAccessor(content)) {\n return automergePlugin(content.handle, content.path);\n } else {\n return undefined;\n }\n }, []);\n\n useEffect(() => {\n if (provider && peer) {\n provider.awareness.setLocalStateField('user', {\n name: peer.name ?? generateName(peer.id),\n color: getColorForValue({ value: peer.id, type: 'color' }),\n colorLight: getColorForValue({ value: peer.id, themeMode, type: 'highlight' }),\n });\n }\n }, [provider, peer, themeMode]);\n\n return extension;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport {\n Annotation,\n type EditorState,\n type Extension,\n Facet,\n StateEffect,\n StateField,\n type Transaction,\n type TransactionSpec,\n} from '@codemirror/state';\nimport { ViewPlugin, type EditorView, type PluginValue, type ViewUpdate } from '@codemirror/view';\n\nimport * as automerge from '@dxos/automerge/automerge';\nimport { type Heads, type Prop } from '@dxos/automerge/automerge';\n\nimport { PatchSemaphore } from './PatchSemaphore';\nimport { type IDocHandle } from './handle';\n\nexport type Value = {\n lastHeads: Heads;\n path: Prop[];\n unreconciledTransactions: Transaction[];\n};\n\ntype UpdateHeads = {\n newHeads: Heads;\n};\n\nexport const effectType = StateEffect.define<UpdateHeads>({});\n\nexport const updateHeads = (newHeads: Heads): StateEffect<UpdateHeads> => effectType.of({ newHeads });\n\nexport const getLastHeads = (state: EditorState, field: Field): Heads => state.field(field).lastHeads;\n\nexport const getPath = (state: EditorState, field: Field): Prop[] => state.field(field).path;\n\nexport type Field = StateField<Value>;\n\nconst semaphoreFacet = Facet.define<PatchSemaphore, PatchSemaphore>({\n combine: (values) => values.at(-1)!, // Take last.\n});\n\nexport type AutomergePlugin = {\n extension: Extension;\n};\n\nexport const automergePlugin = (handle: IDocHandle, path: Prop[]): AutomergePlugin => {\n const stateField: StateField<Value> = StateField.define({\n create: () => ({\n lastHeads: automerge.getHeads(handle.docSync()!),\n unreconciledTransactions: [],\n path: path.slice(),\n }),\n update: (value: Value, tr: Transaction) => {\n const result: Value = {\n lastHeads: value.lastHeads,\n unreconciledTransactions: value.unreconciledTransactions.slice(),\n path: path.slice(),\n };\n let clearUnreconciled = false;\n for (const effect of tr.effects) {\n if (effect.is(effectType)) {\n result.lastHeads = effect.value.newHeads;\n clearUnreconciled = true;\n }\n }\n if (clearUnreconciled) {\n result.unreconciledTransactions = [];\n } else {\n if (!isReconcileTx(tr)) {\n result.unreconciledTransactions.push(tr);\n }\n }\n return result;\n },\n });\n const semaphore = new PatchSemaphore(stateField);\n\n const viewPlugin = ViewPlugin.fromClass(\n class AutomergeCodemirrorViewPlugin implements PluginValue {\n private _view: EditorView;\n\n constructor(view: EditorView) {\n this._view = view;\n handle.addListener('change', this._handleChange);\n }\n\n update(update: ViewUpdate) {\n if (update.transactions.length > 0 && update.transactions.some((t) => !isReconcileTx(t))) {\n queueMicrotask(() => {\n this._view.state.facet(semaphoreFacet).reconcile(handle, this._view);\n });\n }\n }\n\n destroy() {\n handle.addListener('change', this._handleChange);\n }\n\n private _handleChange = () => {\n this._view.state.facet(semaphoreFacet).reconcile(handle, this._view);\n };\n },\n );\n\n return {\n extension: [stateField, semaphoreFacet.of(semaphore), viewPlugin],\n };\n};\n\nexport const reconcileAnnotationType = Annotation.define<unknown>();\n\nexport const isReconcileTx = (tr: Transaction): boolean => !!tr.annotation(reconcileAnnotationType);\n\nexport const makeReconcile = (tr: TransactionSpec) => {\n if (tr.annotations != null) {\n if (tr.annotations instanceof Array) {\n tr.annotations = [...tr.annotations, reconcileAnnotationType.of({})];\n } else {\n tr.annotations = [tr.annotations, reconcileAnnotationType.of({})];\n }\n } else {\n tr.annotations = [reconcileAnnotationType.of({})];\n }\n // return {\n // ...tr,\n // annotations: reconcileAnnotationType.of({})\n // }\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\n\nimport { next as automerge } from '@dxos/automerge/automerge';\n\nimport amToCodemirror from './amToCodemirror';\nimport codeMirrorToAm from './codeMirrorToAm';\nimport { type IDocHandle } from './handle';\nimport { type Field, isReconcileTx, getPath, reconcileAnnotationType, updateHeads, getLastHeads } from './plugin';\n\ntype Doc<T> = automerge.Doc<T>;\ntype Heads = automerge.Heads;\n\ntype ChangeFn = (atHeads: Heads, change: (doc: Doc<unknown>) => void) => Heads | undefined;\n\nexport class PatchSemaphore {\n _field!: Field;\n _inReconcile = false;\n _queue: Array<ChangeFn> = [];\n\n constructor(field?: Field) {\n if (field !== undefined) {\n this._field = field;\n }\n }\n\n reconcile = (handle: IDocHandle, view: EditorView) => {\n if (this._inReconcile) {\n return;\n }\n this._inReconcile = true;\n\n const path = getPath(view.state, this._field);\n const oldHeads = getLastHeads(view.state, this._field);\n let selection = view.state.selection;\n\n const transactions = view.state.field(this._field).unreconciledTransactions.filter((tx) => !isReconcileTx(tx));\n\n // First undo all the unreconciled transactions\n const toInvert = transactions.slice().reverse();\n for (const tx of toInvert) {\n const inverted = tx.changes.invert(tx.startState.doc);\n selection = selection.map(inverted);\n view.dispatch({\n changes: inverted,\n annotations: reconcileAnnotationType.of(true),\n });\n }\n\n // now apply the unreconciled transactions to the document\n let newHeads = codeMirrorToAm(this._field, handle, transactions, view.state);\n\n // NOTE: null and undefined each come from automerge and repo respectively\n if (newHeads === null || newHeads === undefined) {\n // TODO: @alexjg this is the call that's resetting the editor state on click\n newHeads = automerge.getHeads(handle.docSync()!);\n }\n\n // now get the diff between the updated state of the document and the heads\n // and apply that to the codemirror doc\n const diff = automerge.equals(oldHeads, newHeads) ? [] : automerge.diff(handle.docSync()!, oldHeads, newHeads);\n amToCodemirror(view, selection, path, diff);\n\n view.dispatch({\n effects: updateHeads(newHeads),\n annotations: reconcileAnnotationType.of({}),\n });\n\n this._inReconcile = false;\n };\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { ChangeSet, type ChangeSpec, type EditorSelection, type EditorState } from '@codemirror/state';\nimport { type EditorView } from '@codemirror/view';\n\nimport {\n type DelPatch,\n type InsertPatch,\n type Patch,\n type Prop,\n type PutPatch,\n type SpliceTextPatch,\n} from '@dxos/automerge/automerge';\n\nimport { reconcileAnnotationType } from './plugin';\n\nexport default (view: EditorView, selection: EditorSelection, target: Prop[], patches: Patch[]) => {\n for (const patch of patches) {\n const changeSpec = handlePatch(patch, target, view.state);\n if (changeSpec != null) {\n const changeSet = ChangeSet.of(changeSpec, view.state.doc.length, '\\n');\n selection = selection.map(changeSet, 1);\n view.dispatch({\n changes: changeSet,\n annotations: reconcileAnnotationType.of({}),\n });\n }\n }\n view.dispatch({\n selection,\n annotations: reconcileAnnotationType.of({}),\n });\n};\n\nconst handlePatch = (patch: Patch, target: Prop[], state: EditorState): ChangeSpec | null => {\n if (patch.action === 'insert') {\n return handleInsert(target, patch);\n } else if (patch.action === 'splice') {\n return handleSplice(target, patch);\n } else if (patch.action === 'del') {\n return handleDel(target, patch);\n } else if (patch.action === 'put') {\n return handlePut(target, patch, state);\n } else {\n return null;\n }\n};\n\nconst handleInsert = (target: Prop[], patch: InsertPatch): Array<ChangeSpec> => {\n const index = charPath(target, patch.path);\n if (index == null) {\n return [];\n }\n const text = patch.values.map((v) => (v ? v.toString() : '')).join('');\n return [{ from: index, to: index, insert: text }];\n};\n\nconst handleSplice = (target: Prop[], patch: SpliceTextPatch): Array<ChangeSpec> => {\n const index = charPath(target, patch.path);\n if (index == null) {\n return [];\n }\n return [{ from: index, insert: patch.value }];\n};\n\nconst handleDel = (target: Prop[], patch: DelPatch): Array<ChangeSpec> => {\n const index = charPath(target, patch.path);\n if (index == null) {\n return [];\n }\n const length = patch.length || 1;\n return [{ from: index, to: index + length }];\n};\n\nconst handlePut = (target: Prop[], patch: PutPatch, state: EditorState): Array<ChangeSpec> => {\n const index = charPath(target, [...patch.path, 0]);\n if (index == null) {\n return [];\n }\n const length = state.doc.length;\n if (typeof patch.value !== 'string') {\n return []; // TODO(dmaretskyi): How to handle non string values?\n }\n return [{ from: 0, to: length, insert: patch.value as any }];\n};\n\n// If the path of the patch is of the form [path, <index>] then we know this is\n// a path to a character within the sequence given by path\nconst charPath = (textPath: Prop[], candidatePath: Prop[]): number | null => {\n if (candidatePath.length !== textPath.length + 1) {\n return null;\n }\n for (let i = 0; i < textPath.length; i++) {\n if (textPath[i] !== candidatePath[i]) {\n return null;\n }\n }\n const index = candidatePath[candidatePath.length - 1];\n if (typeof index === 'number') {\n return index;\n }\n return null;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type EditorState, type Text, type Transaction } from '@codemirror/state';\n\nimport { next as am, type Heads } from '@dxos/automerge/automerge';\n\nimport { type IDocHandle } from './handle';\nimport { type Field } from './plugin';\n\nexport default (\n field: Field,\n handle: IDocHandle,\n transactions: Transaction[],\n state: EditorState,\n): Heads | undefined => {\n const { lastHeads, path } = state.field(field);\n\n // We don't want to call `automerge.updateAt` if there are no changes.\n // Otherwise later on `automerge.diff` will return empty patches that result in a no-op but still mess up the selection.\n let hasChanges = false;\n for (const tr of transactions) {\n tr.changes.iterChanges(() => {\n hasChanges = true;\n });\n }\n\n if (!hasChanges) {\n return undefined;\n }\n\n const newHeads = handle.changeAt(lastHeads, (doc: am.Doc<unknown>) => {\n for (const tr of transactions) {\n tr.changes.iterChanges((fromA: number, toA: number, _fromB: number, _toB: number, inserted: Text) => {\n am.splice(doc, path, fromA, toA - fromA, inserted.toString());\n });\n }\n });\n return newHeads ?? undefined;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { useMemo } from 'react';\nimport type * as awarenessProtocol from 'y-protocols/awareness';\n\nimport {\n type DocAccessor,\n type Space,\n type TextObject,\n type AutomergeTextCompat,\n getRawDoc,\n isActualAutomergeObject,\n} from '@dxos/react-client/echo';\nimport { type Identity } from '@dxos/react-client/halo';\nimport type { YText, YXmlFragment } from '@dxos/text-model';\n\nimport { SpaceAwarenessProvider } from './yjs';\n\n// TODO(burdon): Move.\ntype Awareness = awarenessProtocol.Awareness;\ntype Provider = { awareness: Awareness };\n\n// TODO(wittjosiah): Factor out to common package? @dxos/react-client?\nexport type EditorModel = {\n id: string;\n content: string | YText | YXmlFragment | DocAccessor;\n provider?: Provider;\n peer?: {\n id: string;\n name?: string;\n };\n};\n\nexport type UseTextModelOptions = {\n identity?: Identity | null;\n space?: Space;\n text?: TextObject;\n};\n\n// TODO(burdon): Don't support returning undefined (and remove checks from calling code).\n// TODO(burdon): Decouple space (make Editor less dependent on entire stack)?\n// TODO(wittjosiah): Factor out to common package? @dxos/react-client?\nexport const useTextModel = ({ identity, space, text }: UseTextModelOptions): EditorModel | undefined => {\n const provider = useMemo(() => {\n if (isActualAutomergeObject(text)) {\n return undefined;\n }\n\n if (!space || !text?.doc) {\n return undefined;\n }\n\n return new SpaceAwarenessProvider({ space, doc: text.doc, channel: `yjs.awareness.${text.id}` });\n }, [identity, space, text, text?.doc]);\n\n const content = useMemo(() => {\n if (isActualAutomergeObject(text)) {\n const obj = text as any as AutomergeTextCompat;\n return getRawDoc(obj, [obj.field]);\n } else {\n return text?.content;\n }\n }, [text]);\n\n if (isActualAutomergeObject(text)) {\n const obj = text as any as AutomergeTextCompat;\n return {\n id: obj.id,\n content: content!,\n provider: undefined,\n peer: identity\n ? {\n id: identity.identityKey.toHex(),\n name: identity.profile?.displayName,\n }\n : undefined,\n };\n }\n\n if (!text?.doc || !text?.content) {\n return undefined;\n }\n\n return {\n id: text.doc.guid,\n content: text.content,\n provider,\n peer: identity\n ? {\n id: identity.identityKey.toHex(),\n name: identity.profile?.displayName,\n }\n : undefined,\n };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\n// Copied from https://github.com/yjs/y-codemirror.next#example.\n\nimport * as random from 'lib0/random';\n\nconst cursorColors = [\n { color: '#30bced', light: '#30bced33' },\n { color: '#6eeb83', light: '#6eeb8333' },\n { color: '#ffbc42', light: '#ffbc4233' },\n { color: '#ecd444', light: '#ecd44433' },\n { color: '#ee6352', light: '#ee635233' },\n { color: '#9ac2c9', light: '#9ac2c933' },\n { color: '#8acb88', light: '#8acb8833' },\n { color: '#1be7ff', light: '#1be7ff33' },\n];\n\n// Select a random color for this user.\nexport const cursorColor = cursorColors[random.uint32() % cursorColors.length];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport * as decoding from 'lib0/decoding';\nimport * as encoding from 'lib0/encoding';\nimport { Observable } from 'lib0/observable';\nimport * as awarenessProtocol from 'y-protocols/awareness';\nimport { type Doc } from 'yjs';\n\nimport { log } from '@dxos/log';\nimport { type Space } from '@dxos/react-client/echo';\nimport { type GossipMessage } from '@dxos/react-client/mesh';\n\ntype Awareness = awarenessProtocol.Awareness;\n\n// Based on https://github.com/yjs/y-webrtc/blob/88baab2/src/y-webrtc.js.\n\nconst messageAwareness = 1;\nconst messageQueryAwareness = 3;\n\n/**\n * Yjs awareness provider on top of a DXOS space.\n */\nexport class SpaceAwarenessProvider extends Observable<any> {\n private readonly _space: Space;\n private readonly _awareness: Awareness;\n private readonly _clientId: number;\n private readonly _channel: string;\n\n constructor({ space, doc, channel, awareness }: { space: Space; doc: Doc; channel: string; awareness?: Awareness }) {\n super();\n this._space = space;\n this._awareness = awareness ?? new awarenessProtocol.Awareness(doc);\n this._channel = channel;\n this._clientId = doc.clientID;\n\n this._awareness.on('update', this._handleAwarenessUpdate.bind(this));\n this._space.listen(this._channel, this._handleSpaceMessage.bind(this));\n\n if (typeof window !== 'undefined') {\n window.addEventListener('beforeunload', this._handleBeforeUnload.bind(this));\n } else if (typeof process !== 'undefined') {\n process.on('exit', this._handleBeforeUnload.bind(this));\n }\n\n // Post queryAwareness.\n const encoderAwarenessQuery = encoding.createEncoder();\n encoding.writeVarUint(encoderAwarenessQuery, messageQueryAwareness);\n void this._space.postMessage(this._channel, encoding.toUint8Array(encoderAwarenessQuery));\n\n // Post local awareness state.\n const encoderAwarenessState = encoding.createEncoder();\n encoding.writeVarUint(encoderAwarenessState, messageAwareness);\n encoding.writeVarUint8Array(\n encoderAwarenessState,\n awarenessProtocol.encodeAwarenessUpdate(this.awareness, [this._clientId]),\n );\n void this._space.postMessage(this._channel, encoding.toUint8Array(encoderAwarenessState));\n }\n\n get awareness(): Awareness {\n return this._awareness;\n }\n\n private _handleAwarenessUpdate({ added, updated, removed }: any, origin: any) {\n log('awareness update', { added, updated, removed, origin });\n const changedClients = added.concat(updated).concat(removed);\n const encoderAwareness = encoding.createEncoder();\n encoding.writeVarUint(encoderAwareness, messageAwareness);\n encoding.writeVarUint8Array(\n encoderAwareness,\n awarenessProtocol.encodeAwarenessUpdate(this._awareness, changedClients),\n );\n void this._space.postMessage(this._channel, encoding.toUint8Array(encoderAwareness));\n }\n\n private _handleSpaceMessage({ payload }: GossipMessage) {\n log('space message', payload);\n const data = new Uint8Array(Array.from(Object.values(payload)));\n const encoder = this._readMessage(data);\n if (encoder) {\n void this._space.postMessage(this._channel, encoding.toUint8Array(encoder));\n }\n }\n\n private _readMessage(message: Uint8Array) {\n const decoder = decoding.createDecoder(message);\n const encoder = encoding.createEncoder();\n const messageType = decoding.readVarUint(decoder);\n\n let sendReply = false;\n switch (messageType) {\n case messageAwareness: {\n awarenessProtocol.applyAwarenessUpdate(this._awareness, decoding.readVarUint8Array(decoder), this);\n break;\n }\n\n case messageQueryAwareness: {\n encoding.writeVarUint(encoder, messageAwareness);\n encoding.writeVarUint8Array(\n encoder,\n awarenessProtocol.encodeAwarenessUpdate(this._awareness, Array.from(this._awareness.getStates().keys())),\n );\n sendReply = true;\n break;\n }\n\n default: {\n console.error('Invalid message:', messageType);\n return encoder;\n }\n }\n\n if (!sendReply) {\n // Nothing has been written, no answer created.\n return null;\n }\n\n return encoder;\n }\n\n private _handleBeforeUnload() {\n awarenessProtocol.removeAwarenessStates(this._awareness, [this._clientId], 'window unload');\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["TextKind", "Doc", "YText", "YXmlFragment", "tags", "closeBrackets", "bracketMatching", "defaultHighlightStyle", "syntaxHighlighting", "oneDarkHighlightStyle", "EditorView", "placeholder", "basicBundle", "themeMode", "placeholder", "_placeholder", "bracketMatching", "closeBrackets", "EditorView", "lineWrapping", "syntaxHighlighting", "oneDarkHighlightStyle", "defaultHighlightStyle", "filter", "Boolean", "get", "mx", "heading", "bold", "code", "codeWithoutMarks", "mx", "code", "italic", "strikethrough", "mark", "tailwindConfig", "tokens", "tailwindConfig", "theme", "basicTheme", "outline", "paddingInline", "lineHeight", "minBlockSize", "fontFamily", "get", "tokens", "join", "overflow", "padding", "caretColor", "backgroundColor", "border", "color", "textDecoration", "StateField", "onChangeExtension", "onChange", "StateField", "define", "create", "update", "_value", "transaction", "docChanged", "newDoc", "toString", "syntaxTree", "RangeSetBuilder", "StateField", "Decoration", "EditorView", "WidgetType", "Link", "WidgetType", "constructor", "_anchor", "_text", "_url", "eq", "other", "text", "url", "toDOM", "view", "link", "document", "createElement", "setAttribute", "textContent", "href", "onclick", "dispatch", "selection", "anchor", "hyperlinkDecoration", "StateField", "define", "create", "state", "update", "_", "tr", "provide", "field", "EditorView", "decorations", "from", "builder", "RangeSetBuilder", "cursor", "main", "head", "syntaxTree", "iterate", "enter", "node", "to", "name", "marks", "getChildren", "length", "sliceDoc", "urlNode", "getChild", "add", "Decoration", "replace", "widget", "undefined", "finish", "hoverTooltip", "tooltipContent", "markdownLinkRegexp", "createHyperlinkTooltip", "onHover", "regexp", "hoverTooltip", "view", "pos", "from", "text", "state", "doc", "lineAt", "p", "idx", "match", "substring", "undefined", "indexOf", "length", "url", "end", "above", "create", "el", "document", "createElement", "innerText", "className", "tooltipContent", "setAttribute", "dom", "Decoration", "EditorView", "MatchDecorator", "ViewPlugin", "markdownLinkRegexp", "linkDecorator", "MatchDecorator", "regexp", "decorate", "add", "from", "to", "match", "view", "_", "label", "url", "p0", "start", "end", "p1", "length", "p2", "p3", "Decoration", "mark", "class", "_attributes", "style", "hyperLinkExtension", "ViewPlugin", "fromClass", "HyperLinkView", "constructor", "decorator", "decorations", "createDeco", "update", "docChanged", "viewportChanged", "updateDeco", "eventHandlers", "mousedown", "event", "pos", "posAtDOM", "target", "console", "log", "keydown", "hyperlinkStyle", "EditorView", "baseTheme", "cursor", "textDecoration", "opacity", "fontFamily", "hyperlinkWidget", "closeBrackets", "closeBracketsKeymap", "defaultKeymap", "history", "historyKeymap", "indentWithTab", "markdownLanguage", "markdown", "bracketMatching", "defaultHighlightStyle", "foldKeymap", "indentOnInput", "syntaxHighlighting", "languages", "lintKeymap", "highlightSelectionMatches", "searchKeymap", "EditorState", "oneDarkHighlightStyle", "crosshairCursor", "drawSelection", "dropCursor", "EditorView", "highlightActiveLine", "highlightActiveLineGutter", "highlightSpecialChars", "keymap", "placeholder", "rectangularSelection", "styleTags", "Tag", "markdownTags", "headingMark", "Tag", "define", "quoteMark", "listMark", "linkMark", "emphasisMark", "codeMark", "codeText", "inlineCode", "url", "linkReference", "linkLabel", "markdownTagsExtension", "props", "styleTags", "HeaderMark", "QuoteMark", "ListMark", "LinkMark", "EmphasisMark", "CodeMark", "CodeText", "InlineCode", "URL", "LinkReference", "LinkLabel", "markdownLanguage", "HighlightStyle", "tags", "get", "chalky", "coral", "cyan", "invalid", "ivory", "stone", "malibu", "sage", "whiskey", "violet", "highlightBackground", "tooltipBackground", "monospace", "get", "tokens", "join", "markdownTheme", "backgroundColor", "border", "outline", "paddingInline", "lineHeight", "minBlockSize", "background", "padding", "caretColor", "borderLeftColor", "fontFamily", "overflow", "marginBlockStart", "paddingBlockStart", "paddingBlockEnd", "mixBlendMode", "display", "insetBlockStart", "blockSize", "verticalAlign", "margin", "color", "textDecorationLine", "textDecorationThickness", "textUnderlineOffset", "borderRadius", "Object", "keys", "reduce", "acc", "fontSize", "height", "markdownHighlightStyle", "HighlightStyle", "define", "tag", "tags", "keyword", "name", "deleted", "character", "propertyName", "macroName", "constant", "standard", "definition", "separator", "typeName", "className", "number", "changed", "annotation", "modifier", "self", "namespace", "operator", "operatorKeyword", "escape", "regexp", "special", "string", "meta", "comment", "atom", "bool", "variableName", "processingInstruction", "inserted", "invalid", "link", "url", "textDecoration", "function", "labelName", "malibu", "markdownTags", "codeMark", "emphasisMark", "headingMark", "linkLabel", "linkReference", "listMark", "quoteMark", "class", "mark", "codeText", "inlineCode", "emphasis", "italic", "heading1", "heading", "heading2", "heading3", "heading4", "heading5", "heading6", "strikethrough", "strong", "bold", "scope", "markdownLanguage", "all", "markdownBundle", "themeMode", "placeholder", "_placeholder", "bracketMatching", "closeBrackets", "EditorState", "allowMultipleSelections", "of", "EditorView", "lineWrapping", "crosshairCursor", "dropCursor", "drawSelection", "highlightActiveLine", "highlightActiveLineGutter", "highlightSelectionMatches", "highlightSpecialChars", "history", "indentOnInput", "rectangularSelection", "keymap", "closeBracketsKeymap", "defaultKeymap", "foldKeymap", "historyKeymap", "lintKeymap", "searchKeymap", "indentWithTab", "markdown", "base", "markdownLanguage", "codeLanguages", "languages", "extensions", "markdownTagsExtension", "syntaxHighlighting", "markdownHighlightStyle", "oneDarkHighlightStyle", "defaultHighlightStyle", "filter", "Boolean", "EditorState", "EditorView", "useFocusableGroup", "vim", "defaultsDeep", "get", "React", "forwardRef", "useCallback", "useEffect", "useImperativeHandle", "useState", "isDocAccessor", "useThemeContext", "useEffect", "useMemo", "yCollab", "generateName", "isDocAccessor", "getColorForValue", "YText", "Annotation", "Facet", "StateEffect", "StateField", "ViewPlugin", "automerge", "next", "automerge", "ChangeSet", "view", "selection", "target", "patches", "patch", "changeSpec", "handlePatch", "state", "changeSet", "ChangeSet", "of", "doc", "length", "map", "dispatch", "changes", "annotations", "reconcileAnnotationType", "action", "handleInsert", "handleSplice", "handleDel", "handlePut", "index", "charPath", "path", "text", "values", "v", "toString", "join", "from", "to", "insert", "value", "textPath", "candidatePath", "i", "next", "am", "field", "handle", "transactions", "state", "lastHeads", "path", "hasChanges", "tr", "changes", "iterChanges", "undefined", "newHeads", "changeAt", "doc", "fromA", "toA", "_fromB", "_toB", "inserted", "am", "splice", "toString", "PatchSemaphore", "constructor", "field", "_inReconcile", "_queue", "reconcile", "handle", "view", "path", "getPath", "state", "_field", "oldHeads", "getLastHeads", "selection", "transactions", "unreconciledTransactions", "filter", "tx", "isReconcileTx", "toInvert", "slice", "reverse", "inverted", "changes", "invert", "startState", "doc", "map", "dispatch", "annotations", "reconcileAnnotationType", "of", "newHeads", "codeMirrorToAm", "undefined", "automerge", "getHeads", "docSync", "diff", "equals", "amToCodemirror", "effects", "updateHeads", "effectType", "StateEffect", "define", "updateHeads", "newHeads", "of", "getLastHeads", "state", "field", "lastHeads", "getPath", "path", "semaphoreFacet", "Facet", "combine", "values", "at", "automergePlugin", "handle", "stateField", "StateField", "create", "getHeads", "docSync", "unreconciledTransactions", "slice", "update", "value", "tr", "result", "clearUnreconciled", "effect", "effects", "is", "isReconcileTx", "push", "semaphore", "PatchSemaphore", "viewPlugin", "ViewPlugin", "fromClass", "AutomergeCodemirrorViewPlugin", "constructor", "view", "_handleChange", "_view", "facet", "reconcile", "addListener", "transactions", "length", "some", "t", "queueMicrotask", "destroy", "extension", "reconcileAnnotationType", "Annotation", "annotation", "useCollaboration", "model", "themeMode", "provider", "peer", "content", "extension", "useMemo", "YText", "yCollab", "awareness", "isDocAccessor", "automergePlugin", "handle", "path", "undefined", "useEffect", "setLocalStateField", "name", "generateName", "id", "color", "getColorForValue", "value", "type", "colorLight", "useMemo", "getRawDoc", "isActualAutomergeObject", "random", "cursorColors", "color", "light", "cursorColor", "uint32", "length", "decoding", "encoding", "Observable", "awarenessProtocol", "log", "messageAwareness", "messageQueryAwareness", "SpaceAwarenessProvider", "constructor", "space", "doc", "channel", "awareness", "_space", "_awareness", "Awareness", "_channel", "_clientId", "clientID", "on", "_handleAwarenessUpdate", "bind", "listen", "_handleSpaceMessage", "window", "addEventListener", "_handleBeforeUnload", "process", "encoderAwarenessQuery", "createEncoder", "writeVarUint", "postMessage", "toUint8Array", "encoderAwarenessState", "writeVarUint8Array", "encodeAwarenessUpdate", "added", "updated", "removed", "origin", "changedClients", "concat", "encoderAwareness", "payload", "data", "Uint8Array", "Array", "from", "Object", "values", "encoder", "_readMessage", "message", "decoder", "createDecoder", "messageType", "readVarUint", "sendReply", "applyAwarenessUpdate", "readVarUint8Array", "getStates", "keys", "console", "error", "removeAwarenessStates", "useTextModel", "identity", "space", "text", "provider", "useMemo", "isActualAutomergeObject", "undefined", "doc", "SpaceAwarenessProvider", "channel", "id", "content", "obj", "getRawDoc", "field", "peer", "identityKey", "toHex", "name", "profile", "displayName", "guid", "EditorModes", "BaseTextEditor", "forwardRef", "model", "extensions", "slots", "editorMode", "forwardedRef", "themeMode", "useThemeContext", "tabsterDOMAttribute", "useFocusableGroup", "tabBehavior", "parent", "setParent", "useState", "state", "setState", "view", "setView", "useImperativeHandle", "editor", "collaboration", "useCollaboration", "useEffect", "initialText", "isDocAccessor", "content", "get", "handle", "docSync", "path", "toString", "EditorState", "create", "doc", "vim", "theme", "EditorView", "filter", "Boolean", "destroy", "undefined", "handleKeyUp", "useCallback", "event", "key", "altKey", "shiftKey", "metaKey", "ctrlKey", "contentDOM", "focus", "div", "id", "ref", "tabIndex", "root", "onKeyUp", "TextEditor", "_extensions", "props", "basicBundle", "placeholder", "defaultsDeep", "basicTheme", "MarkdownEditor", "markdownBundle", "markdownTheme"]
|
|
3
|
+
"sources": ["../../../src/index.ts", "../../../src/components/TextEditor/index.ts", "../../../src/components/TextEditor/extensions/autocomplete.ts", "../../../src/components/TextEditor/extensions/basic.ts", "../../../src/components/TextEditor/extensions/demo.ts", "../../../src/components/TextEditor/extensions/comments.ts", "../../../src/components/TextEditor/extensions/link.ts", "../../../src/components/TextEditor/extensions/listener.ts", "../../../src/components/TextEditor/extensions/markdown/bundle.ts", "../../../src/components/TextEditor/extensions/markdown/highlight.ts", "../../../src/styles/markdown.ts", "../../../src/styles/tokens.ts", "../../../src/components/TextEditor/extensions/tasklist.ts", "../../../src/components/TextEditor/extensions/tooltip.tsx", "../../../src/components/TextEditor/themes/default.ts", "../../../src/components/TextEditor/TextEditor.tsx", "../../../src/hooks/useTextModel.ts", "../../../src/hooks/automerge/plugin.ts", "../../../src/hooks/automerge/PatchSemaphore.ts", "../../../src/hooks/automerge/amToCodemirror.ts", "../../../src/hooks/automerge/codeMirrorToAm.ts", "../../../src/hooks/yjs/cursors.ts", "../../../src/hooks/yjs/space-provider.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nexport { TextKind } from '@dxos/protocols/proto/dxos/echo/model/text';\nexport { Doc, YText, YXmlFragment } from '@dxos/text-model';\n\nexport * from './components';\nexport * from './hooks';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nexport { tags } from '@lezer/highlight';\nexport { type Extension } from '@codemirror/state';\n\nexport * from './extensions';\nexport * from './themes';\n\nexport * from './TextEditor';\n", "//\n// Copyright 2023 DXOS.org\n//\n\n// TODO(burdon): Automcomplete: https://codemirror.net/5/doc/manual.html#addon_runmode\n// TODO(burdon): Modes: parallel parsing and decoration (e.g., associated with language).\n// TODO(burdon): Add-on: runmode: run lexer over content (with rendering codemirror).\n// https://codemirror.net/5/doc/manual.html#addon_runmode\n// TODO(burdon): Add-on: dialog.\n// TODO(burdon): Comments: https://codemirror.net/5/doc/manual.html#setBookmark\n// TODO(burdon): Split view: https://codemirror.net/examples/split\n\n// https://codemirror.net/examples/autocompletion\n// https://codemirror.net/docs/ref/#autocomplete.autocompletion\n// https://codemirror.net/docs/ref/#autocomplete.Completion\n\nimport {\n autocompletion,\n type Completion,\n type CompletionContext,\n completionKeymap,\n type CompletionResult,\n} from '@codemirror/autocomplete';\nimport { keymap } from '@codemirror/view';\n\nexport type AutocompleteResult = Completion;\n\nexport type AutocompleteOptions = {\n onSearch: (text: string) => Completion[];\n};\n\n/**\n * Autocomplete extension.\n */\nexport const autocomplete = ({ onSearch }: AutocompleteOptions) => {\n return [\n // https://codemirror.net/docs/ref/#view.keymap\n // https://discuss.codemirror.net/t/how-can-i-replace-the-default-autocompletion-keymap-v6/3322\n keymap.of(completionKeymap),\n\n // https://codemirror.net/examples/autocompletion\n // https://codemirror.net/docs/ref/#autocomplete.autocompletion\n autocompletion({\n // TODO(burdon): Set custom keymap.\n // defaultKeymap: false,\n\n // Don't start unless key press.\n activateOnTyping: false,\n\n // TODO(burdon): Option to create new page?\n // TODO(burdon): Optional decoration via addToOptions\n override: [\n (context: CompletionContext): CompletionResult | null => {\n const word = context.matchBefore(/\\w*/);\n if (!word || (word.from === word.to && !context.explicit)) {\n return null;\n }\n\n // TODO(burdon): Option to convert to links?\n return {\n from: word.from,\n options: onSearch(word.text.toLowerCase()),\n // options: [\n // { label: 'apple', type: 'keyword' },\n // { label: 'amazon', type: 'keyword' },\n // { label: 'hello', type: 'variable', info: '(World)' },\n // { label: 'magic', type: 'text', apply: '⠁⭒*.✩.*⭒⠁', detail: 'macro' },\n // ],\n };\n },\n ],\n }),\n ];\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { closeBrackets } from '@codemirror/autocomplete';\nimport { bracketMatching, defaultHighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { type Extension } from '@codemirror/state';\nimport { oneDarkHighlightStyle } from '@codemirror/theme-one-dark';\nimport { EditorView, placeholder } from '@codemirror/view';\n\nimport type { ThemeMode } from '@dxos/react-ui';\n\nexport type BasicBundleOptions = {\n themeMode?: ThemeMode;\n placeholder?: string;\n};\n\nexport const basicBundle = ({ themeMode, placeholder: _placeholder }: BasicBundleOptions): Extension[] =>\n [\n // TODO(burdon): Compare with minimalSetup.\n // https://codemirror.net/docs/ref/#codemirror.minimalSetup\n bracketMatching(),\n closeBrackets(),\n EditorView.lineWrapping,\n\n _placeholder && placeholder(_placeholder),\n\n // TODO(burdon): Is this required?\n themeMode === 'dark' ? syntaxHighlighting(oneDarkHighlightStyle) : syntaxHighlighting(defaultHighlightStyle),\n ].filter(Boolean) as Extension[];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { keymap } from '@codemirror/view';\n\nexport type DemoOptions = {\n delay?: number;\n items?: string[];\n};\n\nconst defaultItems = ['hello world!', 'this is a test.', 'this is [DXOS](https://dxos.org)'];\n\n/**\n * Demo script.\n * Configurable plugin that let's user cycle through pre-configured input script.\n */\nexport const demo = ({ delay = 75, items = defaultItems }: DemoOptions = {}) => {\n let t: any;\n let idx = 0;\n\n return [\n keymap.of([\n {\n // Reset.\n key: \"alt-meta-'\",\n run: (view) => {\n clearTimeout(t);\n idx = 0;\n return true;\n },\n },\n {\n // Next prompt.\n // TODO(burdon): Press 1-9 to select prompt?\n key: \"shift-meta-'\",\n run: (view) => {\n clearTimeout(t);\n // TODO(burdon): Add space if needed.\n const text = items[idx++];\n if (idx === items?.length) {\n idx = 0;\n }\n\n let i = 0;\n const insert = (d = 0) => {\n t = setTimeout(() => {\n const pos = view.state.selection.main.head;\n view.dispatch({\n changes: { from: pos, insert: text[i++] },\n selection: { anchor: pos + 1 },\n });\n\n if (i < text.length) {\n insert(Math.random() * delay * (text[i] === ' ' ? 2 : 1));\n }\n }, d);\n };\n\n insert();\n return true;\n },\n },\n ]),\n ];\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport {\n keymap,\n type DecorationSet,\n type Rect,\n type ViewUpdate,\n Decoration,\n EditorView,\n MatchDecorator,\n ViewPlugin,\n WidgetType,\n} from '@codemirror/view';\n\nimport { debounce } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\n\n// 1. TODO(burdon): Make atomic (for tasklist also).\n// - https://discuss.codemirror.net/t/easily-track-remove-content-with-decorations/4606\n// - https://discuss.codemirror.net/t/creating-atomic-replace-decorations/2961\n// - https://codemirror.net/docs/ref/#state.EditorState%5EtransactionFilter (transaction filter: move, delete).\n// 2. TODO(burdon): Create/track threads in composer (change global state). Select/follow. Scroll with page.\n// - Separate from chat/search.\n// 3. TODO(burdon): Support multiple threads in sidebar?\n// 4. TODO(burdon): Anchor AI thread when creating section.\n// 5. TODO(burdon): Button to resolve thread to close comments.\n\n// 6. TODO(burdon): Perf: Update existing rangeset.\n// https://discuss.codemirror.net/t/rangeset-with-metadata-and-different-decorations/3874\n\n// TODO(burdon): Import note (performance):\n// Easily track & remove content with decorations\n// https://discuss.codemirror.net/t/easily-track-remove-content-with-decorations/4606\n\nclass BookmarkWidget extends WidgetType {\n constructor(private readonly _pos: number, private readonly _id: string) {\n super();\n invariant(this._id);\n }\n\n override eq(other: BookmarkWidget) {\n return this._id === other._id;\n }\n\n override toDOM() {\n const span = document.createElement('span');\n span.className = 'cm-bookmark';\n // TODO(burdon): Call out to react?\n // https://emojifinder.com/comment\n span.textContent = '💬';\n return span;\n }\n}\n\n// TODO(burdon): Reconcile with theme.\nconst styles = EditorView.baseTheme({\n '& .cm-bookmark': {\n cursor: 'pointer',\n margin: '4px',\n padding: '4px',\n backgroundColor: 'yellow',\n },\n '& .cm-bookmark-selected': {\n backgroundColor: 'orange',\n },\n});\n\ntype CommentsInfo = {\n active?: string;\n items: { id: string; pos: number; location: Rect | null }[];\n};\n\nexport type CommentsOptions = {\n key?: string;\n onCreate?: () => string | void;\n onUpdate?: (info: CommentsInfo) => void;\n};\n\n// https://www.markdownguide.org/extended-syntax/#footnotes\n// TODO(burdon): Record span in automerge model?\n// TODO(burdon): Extended markdown: https://www.markdownguide.org/extended-syntax\nexport const comments = (options: CommentsOptions = {}): Extension => {\n let active: string | undefined;\n\n const bookmarkMatcher = new MatchDecorator({\n regexp: /\\[\\^(\\w+)\\]/g,\n decoration: (match, view, pos) => {\n const id = match[1];\n return Decoration.replace({\n id,\n widget: new BookmarkWidget(pos, id),\n });\n },\n });\n\n const bookmarks = ViewPlugin.fromClass(\n class {\n bookmarks: DecorationSet;\n constructor(view: EditorView) {\n this.bookmarks = bookmarkMatcher.createDeco(view);\n }\n\n update(update: ViewUpdate) {\n this.bookmarks = bookmarkMatcher.updateDeco(update, this.bookmarks);\n }\n },\n {\n decorations: (instance) => instance.bookmarks,\n provide: (plugin) =>\n EditorView.atomicRanges.of((view) => {\n return view.plugin(plugin)?.bookmarks || Decoration.none;\n }),\n },\n );\n\n const doUpdate = debounce((data: CommentsInfo) => {\n options.onUpdate?.(data);\n }, 200);\n\n return [\n keymap.of([\n {\n key: options?.key ?? 'shift-meta-c',\n run: (view) => {\n // Insert footnote.\n const id = options.onCreate?.();\n if (id) {\n const pos = view.state.selection.main.head;\n const tag = `[^${id}]`;\n view.dispatch({\n changes: { from: pos, insert: tag },\n selection: { anchor: pos + tag.length },\n });\n\n return true;\n }\n\n return false;\n },\n },\n ]),\n\n bookmarks,\n\n // Monitor cursor movement.\n EditorView.updateListener.of((update) => {\n active = undefined;\n if (!options.onUpdate) {\n return;\n }\n\n const view = update.view;\n const pos = view.state.selection.main.head;\n\n const decorations: { from: number; to: number; value: Decoration }[] = [];\n const rangeSet = view.plugin(bookmarks)?.bookmarks;\n let closest = Infinity;\n // TODO(burdon): Always shows entire document?\n const { from, to } = view.visibleRanges?.[0] ?? { from: 0, to: view.state.doc.length };\n rangeSet?.between(from, to, (from, to, value) => {\n decorations.push({ from, to, value });\n const d = Math.min(Math.abs(pos - from), Math.abs(pos - to));\n if (d < closest) {\n // TODO(burdon): Update class of selected.\n active = value.spec.id;\n closest = d;\n }\n });\n\n if (decorations.length) {\n doUpdate({\n active,\n items: decorations.map(\n ({\n from,\n value: {\n spec: { id },\n },\n }) => ({ id: id as string, pos: from, location: view.coordsAtPos(from) }),\n ),\n });\n }\n }),\n\n styles,\n ];\n};\n", "//\n// Copyright 2023 DXOS.org\n// Copyright CodeMirror\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport {\n type EditorState,\n type Extension,\n type RangeSet,\n RangeSetBuilder,\n StateField,\n type Transaction,\n} from '@codemirror/state';\nimport { Decoration, EditorView, WidgetType } from '@codemirror/view';\n\n// Adapted from:\n// https://codemirror.net/try/?c=aW1wb3J0IHsgYmFzaWNTZXR1cCwgRWRpdG9yVmlldyB9IGZyb20gImNvZGVtaXJyb3IiCmltcG9ydCB7IG1hcmtkb3duIH0gZnJvbSAiQGNvZGVtaXJyb3IvbGFuZy1tYXJrZG93biIKaW1wb3J0IHsgc3ludGF4VHJlZSB9IGZyb20gIkBjb2RlbWlycm9yL2xhbmd1YWdlIjsKaW1wb3J0IHsgRWRpdG9yU3RhdGUsIFJhbmdlU2V0QnVpbGRlciwgU3RhdGVGaWVsZCB9IGZyb20gIkBjb2RlbWlycm9yL3N0YXRlIjsKaW1wb3J0IHsgRGVjb3JhdGlvbiwgV2lkZ2V0VHlwZSB9IGZyb20gIkBjb2RlbWlycm9yL3ZpZXciOwoKY2xhc3MgTGluayBleHRlbmRzIFdpZGdldFR5cGUgewogIGNvbnN0cnVjdG9yKHRleHQsIHVybCkgewogICAgc3VwZXIoKQogICAgdGhpcy50ZXh0ID0gdGV4dAogICAgdGhpcy51cmwgPSB1cmwKICB9CiAgZXEob3RoZXIpIHsgcmV0dXJuIHRoaXMudGV4dCA9PSBvdGhlci50ZXh0ICYmIHRoaXMudXJsID09IG90aGVyLnVybCB9CiAgdG9ET00oKSB7CiAgICBsZXQgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgbGluay50ZXh0Q29udGVudCA9IHRoaXMudGV4dAogICAgbGluay5ocmVmID0gdGhpcy51cmwKICAgIHJldHVybiBsaW5rOwogIH0KfQoKbGV0IGRlY29yYXRpb25zRmllbGQgPSBTdGF0ZUZpZWxkLmRlZmluZSh7CiAgY3JlYXRlKCkgewogICAgcmV0dXJuIERlY29yYXRpb24ubm9uZTsKICB9LAogIHVwZGF0ZShfLCB0cikgewogICAgY29uc3QgYnVpbGRlciA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKTsKICAgIGxldCBjdXJzb3IgPSB0ci5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5oZWFkOwogICAgc3ludGF4VHJlZSh0ci5zdGF0ZSkuaXRlcmF0ZSh7CiAgICAgIGVudGVyOiAobm9kZSkgPT4gewogICAgICAgIGlmICgoY3Vyc29yIDwgbm9kZS5mcm9tIHx8IGN1cnNvciA+IG5vZGUudG8pICYmIG5vZGUubmFtZSA9PSAiTGluayIpIHsKICAgICAgICAgIGxldCBtYXJrcyA9IG5vZGUubm9kZS5nZXRDaGlsZHJlbigiTGlua01hcmsiKTsKICAgICAgICAgIGxldCB0ZXh0ID0gbWFya3MubGVuZ3RoID49IDIgPyB0ci5zdGF0ZS5zbGljZURvYyhtYXJrc1swXS50bywgbWFya3NbMV0uZnJvbSkgOiAiIgoKICAgICAgICAgIGxldCB1cmxOb2RlID0gbm9kZS5ub2RlLmdldENoaWxkKCJVUkwiKTsKICAgICAgICAgIGxldCB1cmwgPSB1cmxOb2RlID8gdHIuc3RhdGUuc2xpY2VEb2ModXJsTm9kZS5mcm9tLCB1cmxOb2RlLnRvKSA6ICIiCiAgICAgICAgICBidWlsZGVyLmFkZChub2RlLmZyb20sIG5vZGUudG8sIERlY29yYXRpb24ucmVwbGFjZSh7CiAgICAgICAgICAgIHdpZGdldDogbmV3IExpbmsodGV4dCwgdXJsKSwKICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSwKICAgIH0pOwogICAgcmV0dXJuIGJ1aWxkZXIuZmluaXNoKCk7CiAgfSwKICBwcm92aWRlOiAoZikgPT4gRWRpdG9yVmlldy5kZWNvcmF0aW9ucy5mcm9tKGYpLAp9KTsKCmxldCB2aWV3ID0gbmV3IEVkaXRvclZpZXcoewogIGRvYzogIiMgSGVsbG8gV29ybGRcblxuW1Rlc3RdKGh0dHBzOi8vZXhhbXBsZS5jb20pXG5cblxuIiwKICBleHRlbnNpb25zOiBbZGVjb3JhdGlvbnNGaWVsZCwgbWFya2Rvd24oKV0sCiAgcGFyZW50OiBkb2N1bWVudC5ib2R5LAp9KTsKCnZpZXcuZm9jdXMoKTs=\n// https://discuss.codemirror.net/t/link-widget-is-clicked-only-if-editor-is-out-of-focus/7433\n\n// TODO(burdon): Adapt to make all markdown editable?\n\n// TODO(burdon): Research overlays.\n// https://stackoverflow.com/questions/26933344/codemirror-detect-and-create-links-inside-editor\n// https://codemirror.net/5/doc/manual.html#addOverlay\n// https://codemirror.net/5/demo/simplemode.html\n// https://codemirror.net/5/demo/search.html (Search dialog).\n\nclass LinkButton extends WidgetType {\n constructor(\n private readonly _pos: number,\n private readonly _url: string,\n private readonly _onAttach: LinkOptions['onRender'],\n ) {\n super();\n }\n\n override eq(other: LinkButton) {\n return this._pos === other._pos && this._url === other._url;\n }\n\n toDOM(view: EditorView) {\n const el = document.createElement('span');\n this._onAttach!(el, this._url);\n return el;\n }\n}\n\nclass LinkText extends WidgetType {\n constructor(private readonly _pos: number, private readonly _text: string, private readonly _url?: string) {\n super();\n }\n\n override eq(other: LinkText) {\n return this._pos === other._pos && this._url === other._url;\n }\n\n toDOM(view: EditorView) {\n const link = document.createElement('a');\n link.setAttribute('class', 'cm-link');\n link.textContent = this._text;\n if (this._url) {\n link.setAttribute('rel', 'noreferrer');\n link.setAttribute('target', '_blank');\n link.href = this._url;\n } else {\n link.onclick = () => {\n view.dispatch({\n selection: {\n anchor: this._pos,\n },\n });\n };\n }\n\n return link;\n }\n}\n\n/**\n * Range sets provide a data structure that can hold a collection of tagged,\n * possibly overlapping ranges in such a way that they can efficiently be mapped though document changes.\n * https://codemirror.net/docs/ref/#state\n */\nconst update = (state: EditorState, options: LinkOptions) => {\n const builder = new RangeSetBuilder();\n const cursor = state.selection.main.head;\n syntaxTree(state).iterate({\n enter: (node) => {\n // Check if cursor is inside text.\n if (node.name === 'Link') {\n const marks = node.node.getChildren('LinkMark');\n const text = marks.length >= 2 ? state.sliceDoc(marks[0].to, marks[1].from) : '';\n\n const urlNode = node.node.getChild('URL');\n const url = urlNode ? state.sliceDoc(urlNode.from, urlNode.to) : '';\n if (!url) {\n return false;\n }\n\n if (cursor < node.from || cursor > node.to) {\n builder.add(\n node.from,\n node.to,\n Decoration.replace({\n widget: new LinkText(node.from, text, options.link ? url : undefined),\n }),\n );\n }\n\n if (options.onRender) {\n builder.add(\n node.to,\n node.to,\n Decoration.replace({\n widget: new LinkButton(node.from, url, options.onRender),\n }),\n );\n }\n\n return false;\n }\n },\n });\n\n return builder.finish();\n};\n\nexport type LinkOptions = {\n link?: boolean;\n onRender?: (el: Element, url: string) => void;\n};\n\n/**\n * Creates a state field to replace AST elements with a hyperlink widget.\n * https://codemirror.net/docs/ref/#state.StateField\n */\nexport const link = (options: LinkOptions = {}): Extension => {\n return StateField.define<RangeSet<any>>({\n create: (state) => update(state, options),\n update: (_: RangeSet<any>, tr: Transaction) => update(tr.state, options),\n provide: (field) => EditorView.decorations.from(field),\n });\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { StateField } from '@codemirror/state';\n\nexport type ListenerOptions = { onChange: (text: string) => void };\n\n/**\n * Based on https://github.com/codemirror/dev/issues/44#issuecomment-789093799\n */\n// TODO(burdon): Expose options.\nexport const listener = ({ onChange }: ListenerOptions) =>\n StateField.define({\n create: () => null,\n update: (_value, transaction) => {\n if (transaction.docChanged && onChange) {\n onChange(transaction.newDoc.toString());\n }\n\n return null;\n },\n });\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { closeBrackets, closeBracketsKeymap } from '@codemirror/autocomplete';\nimport { defaultKeymap, history, indentWithTab } from '@codemirror/commands';\nimport { markdownLanguage, markdown } from '@codemirror/lang-markdown';\nimport { bracketMatching, defaultHighlightStyle, indentOnInput, syntaxHighlighting } from '@codemirror/language';\nimport { languages } from '@codemirror/language-data';\nimport { highlightSelectionMatches, searchKeymap } from '@codemirror/search';\nimport { EditorState, type Extension } from '@codemirror/state';\nimport { oneDarkHighlightStyle } from '@codemirror/theme-one-dark';\nimport {\n crosshairCursor,\n drawSelection,\n dropCursor,\n EditorView,\n highlightActiveLine,\n highlightActiveLineGutter,\n highlightSpecialChars,\n keymap,\n placeholder,\n rectangularSelection,\n} from '@codemirror/view';\n\nimport type { ThemeMode } from '@dxos/react-ui';\n\nimport { markdownHighlightStyle, markdownTagsExtension } from './highlight';\n\nexport type MarkdownBundleOptions = {\n themeMode?: ThemeMode;\n placeholder?: string;\n};\n\nexport const markdownBundle = ({ themeMode, placeholder: _placeholder }: MarkdownBundleOptions): Extension[] => {\n // All of https://github.com/codemirror/basic-setup minus line numbers and fold gutter.\n // https://codemirror.net/docs/ref/#codemirror.basicSetup\n return [\n bracketMatching(),\n closeBrackets(),\n _placeholder && placeholder(_placeholder),\n\n EditorState.allowMultipleSelections.of(true),\n EditorView.lineWrapping,\n\n crosshairCursor(),\n dropCursor(),\n drawSelection(),\n highlightActiveLine(),\n highlightActiveLineGutter(),\n highlightSelectionMatches(),\n highlightSpecialChars(),\n history(),\n indentOnInput(),\n rectangularSelection(),\n\n // TODO(burdon): Review.\n keymap.of([\n ...closeBracketsKeymap,\n ...defaultKeymap,\n // ...foldKeymap,\n // ...historyKeymap,\n // ...lintKeymap,\n ...searchKeymap,\n indentWithTab,\n ]),\n\n // Main extension.\n // https://github.com/codemirror/lang-markdown\n // https://codemirror.net/5/mode/markdown/index.html (demo).\n markdown({\n // GRM by default (vs strict CommonMark):\n // Table, TaskList, Strikethrough, and Autolink.\n // NOTE: This extends the parser; it doesn't affect rendering.\n // https://github.github.com/gfm\n // https://github.com/lezer-parser/markdown?tab=readme-ov-file#github-flavored-markdown\n base: markdownLanguage,\n\n // Languages for syntax highlighting fenced code blocks.\n codeLanguages: languages,\n\n // Parser extensions.\n extensions: [\n // GFM, // TODO(burdon): Provided by default?\n markdownTagsExtension,\n ],\n }),\n\n // Custom styles.\n syntaxHighlighting(markdownHighlightStyle),\n\n // TODO(thure): All but one rule here apply to both themes; rename or refactor.\n themeMode === 'dark' ? syntaxHighlighting(oneDarkHighlightStyle) : syntaxHighlighting(defaultHighlightStyle),\n ].filter(Boolean) as Extension[];\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { markdownLanguage } from '@codemirror/lang-markdown';\nimport { HighlightStyle } from '@codemirror/language';\nimport { tags, styleTags, Tag } from '@lezer/highlight';\nimport { type MarkdownConfig } from '@lezer/markdown';\nimport get from 'lodash.get';\n\nimport {\n blockquote,\n bold,\n code,\n codeMark,\n heading,\n horizontalRule,\n inlineUrl,\n italic,\n mark,\n strikethrough,\n tokens,\n} from '../../../../styles';\n\n/**\n * Custom tags defined and processed by the GFM lezer extension.\n * https://github.com/lezer-parser/markdown\n * https://github.com/lezer-parser/markdown/blob/main/src/markdown.ts\n */\nexport const markdownTags = {\n Blockquote: Tag.define(),\n CodeMark: Tag.define(),\n CodeText: Tag.define(),\n EmphasisMark: Tag.define(),\n HeaderMark: Tag.define(),\n HorizontalRule: Tag.define(),\n InlineCode: Tag.define(),\n LinkLabel: Tag.define(),\n LinkReference: Tag.define(),\n ListMark: Tag.define(),\n QuoteMark: Tag.define(),\n URL: Tag.define(),\n};\n\nexport const markdownTagsExtension: MarkdownConfig = {\n props: [styleTags(markdownTags)],\n};\n\n/**\n * Styling based on `lezer` parser tags.\n * https://codemirror.net/examples/styling\n * https://github.com/lezer-parser/highlight\n * https://lezer.codemirror.net/docs/ref/#highlight (list of tags)\n */\nexport const markdownHighlightStyle = HighlightStyle.define(\n [\n {\n tag: [\n tags.keyword,\n tags.name,\n tags.deleted,\n tags.character,\n tags.propertyName,\n tags.macroName,\n tags.color,\n tags.constant(tags.name),\n tags.standard(tags.name),\n tags.definition(tags.name),\n tags.separator,\n tags.typeName,\n tags.className,\n tags.number,\n tags.changed,\n tags.annotation,\n tags.modifier,\n tags.self,\n tags.namespace,\n tags.operator,\n tags.operatorKeyword,\n tags.escape,\n tags.regexp,\n tags.special(tags.string),\n tags.meta,\n tags.comment,\n tags.atom,\n tags.bool,\n tags.special(tags.variableName),\n tags.processingInstruction,\n tags.string,\n tags.inserted,\n tags.invalid,\n ],\n color: 'inherit !important',\n },\n\n // Markdown marks.\n {\n tag: [\n tags.meta,\n tags.processingInstruction,\n markdownTags.CodeMark,\n markdownTags.EmphasisMark,\n markdownTags.HeaderMark,\n markdownTags.LinkLabel,\n markdownTags.LinkReference,\n markdownTags.ListMark,\n markdownTags.QuoteMark,\n ],\n class: mark,\n },\n\n // Headings.\n { tag: tags.heading1, class: heading[1] },\n { tag: tags.heading2, class: heading[2] },\n { tag: tags.heading3, class: heading[3] },\n { tag: tags.heading4, class: heading[4] },\n { tag: tags.heading5, class: heading[5] },\n { tag: tags.heading6, class: heading[6] },\n\n // Emphasis.\n { tag: tags.emphasis, class: italic },\n { tag: tags.strong, class: bold },\n { tag: tags.strikethrough, class: strikethrough },\n\n // Naked URLs.\n {\n tag: [markdownTags.URL],\n class: inlineUrl,\n },\n\n // E.g., code block language (after ```).\n {\n tag: [tags.function(tags.variableName), tags.labelName],\n class: codeMark,\n },\n\n // NOTE: The `markdown` extension configures extensions for `lezer` to parse markdown tokens (incl. below).\n // However, since `codeLanguages` is also defined, the `lezer` will not parse fenced code blocks,\n // when a language is specified. In this case, the syntax highlighting extensions will colorize\n // the code, but all other CSS properties will be inherited.\n // IMPORTANT: Therefore, the fenced code block will use the base editor font.\n {\n tag: [markdownTags.CodeText, markdownTags.InlineCode],\n class: code,\n },\n\n {\n tag: [markdownTags.QuoteMark],\n class: blockquote,\n },\n\n {\n tag: [markdownTags.HorizontalRule],\n class: horizontalRule,\n },\n\n // Main content, paragraphs, etc.\n // {\n // tag: [tags.content],\n // fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n // },\n ],\n {\n scope: markdownLanguage,\n all: { fontFamily: get(tokens, 'fontFamily.body', []).join(',') },\n },\n);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { mx } from '@dxos/react-ui-theme';\n\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\n// https://tailwindcss.com/docs/font-weight\nexport const heading: Record<HeadingLevel, string> = {\n 1: 'mbs-4 mbe-2 font-medium text-inherit no-underline text-4xl',\n 2: 'mbs-4 mbe-2 font-medium text-inherit no-underline text-3xl',\n 3: 'mbs-4 mbe-2 font-medium text-inherit no-underline text-2xl',\n 4: 'mbs-4 mbe-2 font-medium text-inherit no-underline text-xl',\n 5: 'mbs-4 mbe-2 font-medium text-inherit no-underline text-lg',\n 6: 'mbs-4 mbe-2 font-medium text-inherit no-underline',\n};\n\nexport const text = 'text-neutral-800 dark:text-neutral-200';\nexport const light = 'text-neutral-200 dark:text-neutral-800';\n\nexport const mark = mx('!font-normal !no-underline !text-inherit opacity-40', light);\n\nexport const paragraph = 'mlb-1';\n\nexport const bold = 'font-bold';\nexport const italic = 'italic';\nexport const strikethrough = 'line-through';\n\nexport const code = 'font-mono !no-underline text-neutral-700 dark:text-neutral-300';\nexport const codeMark = 'font-mono text-primary-500';\nexport const codeBlock = 'mlb-2 font-mono bg-neutral-500/10 p-3 rounded';\n\nexport const inlineUrl = mx(code, 'px-1');\n\n// TODO(burdon): Replace with widget.\nexport const blockquote = mx('pl-1 mr-1 border-is-4 border-primary-500/70 dark:border-primary-500/30', light);\n\n// TODO(burdon): Replace with widget.\nexport const horizontalRule = 'flex mlb-4 border-b text-neutral-100 dark:text-neutral-900 border-neutral-500/50';\n\n// TODO(thure): Tailwind was not seeing `[&>li:before]:content-[\"•\"]` as a utility class, but it would work if instead of `\"•\"` it was `\"X\"`… why?\nexport const unorderedList =\n 'mlb-2 grid grid-cols-[min-content_1fr] [&>li:before]:content-[attr(marker)] [&>li:before]:mlb-1 [&>li:before]:mie-2';\nexport const orderedList =\n 'mlb-2 grid grid-cols-[min-content_1fr] [&>li:before]:content-[counters(section,_\".\")_\"._\"] [counter-reset:section] [&>li:before]:mlb-1';\n\nexport const listItem = 'contents before:[counter-increment:section]';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport type { StyleSpec } from 'style-mod';\n\nimport { tailwindConfig, type TailwindConfig } from '@dxos/react-ui-theme';\n\nexport type ThemeStyles = {\n [selector: string]: StyleSpec;\n};\n\n// TODO(thure): Why export the whole theme? Can this be done differently?\nexport const tokens: TailwindConfig['theme'] = tailwindConfig({}).theme;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport {\n EditorView,\n Decoration,\n WidgetType,\n MatchDecorator,\n ViewPlugin,\n type DecorationSet,\n type ViewUpdate,\n} from '@codemirror/view';\n\nclass CheckboxWidget extends WidgetType {\n constructor(\n private readonly _pos: number,\n private _checked: boolean,\n private readonly _indent: number,\n private readonly _onCheck: (check: boolean) => void,\n ) {\n super();\n }\n\n override eq(other: CheckboxWidget) {\n return this._pos === other._pos && this._checked === other._checked && this._indent === other._indent;\n }\n\n toDOM(view: EditorView) {\n const wrap = document.createElement('span');\n wrap.className = 'cm-task-item';\n wrap.setAttribute('aria-hidden', 'true');\n wrap.style.setProperty('margin-left', this._indent * 24 + 'px');\n\n const input = wrap.appendChild(document.createElement('input'));\n input.type = 'checkbox';\n input.checked = this._checked;\n input.onchange = (event: Event) => {\n this._onCheck((event.target as any).checked);\n return true;\n };\n\n return wrap;\n }\n\n override ignoreEvent() {\n return false;\n }\n}\n\n// TODO(burdon): Reconcile with theme.\nconst styles = EditorView.baseTheme({\n '& .cm-task-item': {\n paddingLeft: '4px',\n paddingRight: '8px',\n },\n});\n\nexport const tasklist = () => {\n // TODO(burdon): Matcher isn't as precise as syntax tree.\n // Allows for indents to be greater than AST would allow.\n const taskMatcher = new MatchDecorator({\n regexp: /^(\\s*)- \\[([ xX])\\]\\s/g,\n decoration: (match, view, pos) => {\n const indent = Math.floor(match[1].length / 2);\n const checked = match[2] === 'x' || match[2] === 'X';\n return Decoration.replace({\n widget: new CheckboxWidget(pos, checked, indent, (checked) => {\n const idx = pos + match[0].indexOf('[') + 1;\n view.dispatch({\n changes: {\n from: idx,\n to: idx + 1,\n insert: checked ? 'x' : ' ',\n },\n // TODO(burdon): Restore cursor position? More useful to move to end of line (can indent).\n selection: {\n anchor: idx + 3,\n },\n });\n }),\n });\n },\n });\n\n const tasks = ViewPlugin.fromClass(\n class {\n tasks: DecorationSet;\n constructor(view: EditorView) {\n this.tasks = taskMatcher.createDeco(view);\n }\n\n update(update: ViewUpdate) {\n this.tasks = taskMatcher.updateDeco(update, this.tasks);\n }\n },\n {\n decorations: (instance) => instance.tasks,\n provide: (plugin) =>\n EditorView.atomicRanges.of((view) => {\n return view.plugin(plugin)?.tasks || Decoration.none;\n }),\n },\n );\n\n return [tasks, styles];\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport { hoverTooltip } from '@codemirror/view';\n\nimport { tooltipContent } from '@dxos/react-ui-theme';\n\nconst markdownLinkRegexp = /\\[([^\\]]+)]\\(([^)]+)\\)/;\n\nexport type TooltipOptions = {\n onHover: (el: Element, url: string) => void;\n regexp?: RegExp;\n};\n\n/**\n * https://codemirror.net/examples/tooltip\n * https://codemirror.net/docs/ref/#view.hoverTooltip\n * https://github.com/codemirror/view/blob/main/src/tooltip.ts\n */\nexport const tooltip = ({ onHover, regexp = markdownLinkRegexp }: TooltipOptions): Extension =>\n hoverTooltip((view, pos) => {\n const { from, text } = view.state.doc.lineAt(pos);\n const p = pos - from;\n\n let idx = 0;\n let match;\n do {\n match = text.substring(idx).match(regexp);\n if (!match) {\n match = undefined;\n break;\n }\n\n idx = text.indexOf(match[0]);\n if (p >= idx && p < idx + match[0].length) {\n break;\n }\n\n idx += match[0].length;\n } while (true);\n\n if (!match) {\n return null;\n }\n\n const [, , url] = match ?? [];\n\n return {\n pos: idx + from,\n end: idx + from + match[0].length,\n above: true,\n create: () => {\n const el = document.createElement('div');\n el.className = tooltipContent({}, 'pli-2 plb-1');\n onHover(el, url);\n return { dom: el, offset: { x: 0, y: 12 } };\n },\n };\n });\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport get from 'lodash.get';\nimport { type StyleSpec } from 'style-mod';\n\nimport { tokens } from '../../../styles';\n\n/**\n * Minimal styles.\n * https://codemirror.net/examples/styling\n * NOTE: Use one of '&', '&light', and '&dark' prefix to scope instance.\n * NOTE: `light` and `dark` selectors are preprocessed by CodeMirror and can only be in the base theme.\n */\nexport const defaultTheme: {\n [selector: string]: StyleSpec;\n} = {\n //\n // Main layout:\n // <div class=\".cm-editor .cm-focused\">\n // <div class=\".cm-scroller\">\n // <div class=\".cm-content\" role=\"textbox\" contenteditable=\"true\">\n // <div class=\".cm-line\" />\n // </div>\n // </div>\n // </div>\n //\n '&': {},\n '&.cm-focused': {\n outline: 'none',\n },\n '& .cm-scroller': {\n overflow: 'visible',\n },\n '& .cm-content': {\n padding: 0,\n // Base font size (otherwise defined by HTML tag, which might be different for storybook).\n fontSize: '16px',\n },\n '&light .cm-content': {\n color: get(tokens, 'extend.colors.neutral.900', 'black'),\n caretColor: 'black',\n },\n '&dark .cm-content': {\n color: get(tokens, 'extend.colors.neutral.100', 'white'),\n caretColor: 'white',\n },\n\n //\n // Cursor\n //\n '&light .cm-cursor': {\n borderLeft: '2px solid black',\n },\n '&dark .cm-cursor': {\n borderLeft: '2px solid white',\n },\n '& .cm-placeholder': {\n fontWeight: 100,\n },\n\n //\n // line\n //\n '& .cm-line': {\n paddingInline: 0,\n },\n '& .cm-line *': {},\n '& .cm-activeLine': {\n backgroundColor: 'transparent',\n },\n\n //\n // selection\n //\n\n '&light .cm-selectionBackground, &light.cm-focused .cm-selectionBackground': {\n background: get(tokens, 'extend.colors.primary.150', '#00ffff'),\n },\n '&dark .cm-selectionBackground, &dark.cm-focused .cm-selectionBackground': {\n background: get(tokens, 'extend.colors.primary.850', '#00ffff'),\n },\n '&light .cm-selectionMatch': {\n background: get(tokens, 'extend.colors.primary.250', '#00ffff') + '44',\n },\n '&dark .cm-selectionMatch': {\n background: get(tokens, 'extend.colors.primary.600', '#00ffff') + '44',\n },\n\n //\n // collaboration\n // TODO(burdon): Review classnames (YJS dependent?)\n //\n\n '&light .cm-ySelection, &light .cm-yLineSelection': {\n mixBlendMode: 'multiply',\n },\n '&dark .cm-ySelection, &dark .cm-yLineSelection': {\n mixBlendMode: 'screen',\n },\n\n '& .cm-ySelectionInfo': {\n padding: '2px 4px',\n marginBlockStart: '-4px',\n },\n '& .cm-ySelection, & .cm-selectionMatch': {\n paddingBlockStart: '.15em',\n paddingBlockEnd: '.15em',\n },\n '& .cm-ySelectionCaret': {\n display: 'inline-block',\n insetBlockStart: '.1em',\n blockSize: '1.4em',\n verticalAlign: 'top',\n },\n '& .cm-yLineSelection': {\n margin: 0,\n },\n\n //\n // link\n //\n '& .cm-link': {\n color: get(tokens, 'extend.colors.primary.500'),\n textDecorationLine: 'underline',\n textDecorationThickness: '1px',\n textUnderlineOffset: '2px',\n borderRadius: '.125rem',\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n },\n\n //\n // tooltip\n //\n '& .cm-tooltip': {\n border: 'none',\n },\n // '& .cm-tooltip-below': {},\n // '& .cm-tooltip-autocomplete': {},\n\n //\n // font size\n // TODO(thure): This appears to be the best or only way to set selection caret heights, but it's far more verbose than it needs to be.\n //\n ...Object.keys(get(tokens, 'extend.fontSize', {})).reduce((acc: Record<string, any>, fontSize) => {\n const height = get(tokens, ['extend', 'fontSize', fontSize, 1, 'lineHeight']);\n\n acc[`& .text-${fontSize} + .cm-ySelectionCaret`] = { height };\n acc[`& .text-${fontSize} + .cm-ySelection + .cm-ySelectionCaret`] = { height };\n acc[`& .text-${fontSize} + .cm-widgetBuffer + .cm-ySelectionCaret`] = { height };\n return acc;\n }, {}),\n};\n\nexport const textTheme: {\n [selector: string]: StyleSpec;\n} = {\n '& .cm-scroller': {\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n },\n '& .cm-placeholder': {\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n },\n};\n\nexport const markdownTheme: {\n [selector: string]: StyleSpec;\n} = {\n // NOTE: Must leave base font family as is (i.e., monospace) due to fenced code blocks.\n '& .cm-placeholder': {\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n },\n};\n\nexport const codeTheme: {\n [selector: string]: StyleSpec;\n} = {\n '& .cm-scroller': {\n fontFamily: get(tokens, 'fontFamily.mono', []).join(','),\n },\n '& .cm-placeholder': {\n fontFamily: get(tokens, 'fontFamily.mono', []).join(','),\n },\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { EditorState, type Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport { useFocusableGroup } from '@fluentui/react-tabster';\nimport { vim } from '@replit/codemirror-vim';\nimport defaultsDeep from 'lodash.defaultsdeep';\nimport React, {\n type ComponentProps,\n type KeyboardEvent,\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useState,\n} from 'react';\n\nimport { generateName } from '@dxos/display-name';\nimport { useThemeContext } from '@dxos/react-ui';\nimport { getColorForValue, inputSurface, mx } from '@dxos/react-ui-theme';\n\nimport { basicBundle, demo, markdownBundle } from './extensions';\nimport { defaultTheme, markdownTheme, textTheme } from './themes';\nimport { type EditorModel } from '../../hooks';\nimport { type ThemeStyles } from '../../styles';\n\nexport const EditorModes = ['default', 'vim'] as const;\nexport type EditorMode = (typeof EditorModes)[number];\n\nexport type CursorInfo = {\n from: number;\n to: number;\n line: number;\n lines: number;\n after?: string;\n};\n\nexport type TextEditorRef = {\n root: HTMLDivElement | null;\n state?: EditorState;\n view?: EditorView;\n};\n\nexport type TextEditorSlots = {\n root?: Omit<ComponentProps<'div'>, 'ref'>;\n editor?: {\n className?: string;\n placeholder?: string;\n spellCheck?: boolean;\n tabIndex?: number;\n theme?: ThemeStyles;\n };\n};\n\nexport type TextEditorProps = {\n model: EditorModel;\n extensions?: Extension[];\n slots?: TextEditorSlots;\n editorMode?: EditorMode;\n};\n\n/**\n * Base text editor.\n * NOTE: Rather than adding properties, try to create extensions that can be reused.\n */\nexport const BaseTextEditor = forwardRef<TextEditorRef, TextEditorProps>(\n ({ model, extensions = [], slots = defaultSlots, editorMode }, forwardedRef) => {\n const { themeMode } = useThemeContext();\n const tabsterDOMAttribute = useFocusableGroup({ tabBehavior: 'limited' });\n\n const [root, setRoot] = useState<HTMLDivElement | null>(null);\n const [state, setState] = useState<EditorState>();\n const [view, setView] = useState<EditorView>();\n useImperativeHandle(forwardedRef, () => ({ root, state, view }), [view, state, root]);\n\n // TODO(burdon): Factor out?\n const { awareness, peer } = model;\n useEffect(() => {\n if (awareness && peer) {\n awareness.setLocalStateField('user', {\n name: peer.name ?? generateName(peer.id),\n color: getColorForValue({ value: peer.id, type: 'color' }),\n colorLight: getColorForValue({ value: peer.id, themeMode, type: 'highlight' }),\n });\n }\n }, [awareness, peer, themeMode]);\n\n useEffect(() => {\n if (!root) {\n return;\n }\n\n const state = EditorState.create({\n doc: model.text(),\n extensions: [\n // TODO(burdon): Factor out VIM mode?\n editorMode === 'vim' && vim(),\n\n // Theme.\n EditorView.baseTheme(defaultTheme),\n EditorView.theme(slots?.editor?.theme ?? {}),\n // TODO(burdon): themeMode doesn't change in storybooks.\n EditorView.darkTheme.of(themeMode === 'dark'),\n\n // Storage and replication.\n model.extension,\n\n // Custom.\n ...extensions,\n ].filter(Boolean) as Extension[],\n });\n\n // NOTE: This repaints the editor.\n // If the new state is derived from the old state, it will likely not be visible other than the cursor resetting.\n // Ideally this should not be hit except when changing between text objects.\n view?.destroy();\n setView(new EditorView({ state, parent: root }));\n setState(state);\n\n return () => {\n view?.destroy();\n setView(undefined);\n setState(undefined);\n };\n }, [root, model, themeMode, editorMode]);\n\n const handleKeyUp = useCallback(\n (event: KeyboardEvent) => {\n const { key, altKey, shiftKey, metaKey, ctrlKey } = event;\n switch (key) {\n case 'Enter': {\n view?.contentDOM.focus();\n break;\n }\n\n case 'Escape': {\n editorMode === 'vim' && (altKey || shiftKey || metaKey || ctrlKey) && root?.focus();\n break;\n }\n }\n },\n [view, editorMode],\n );\n\n return (\n <div\n key={model.id}\n ref={setRoot}\n tabIndex={0}\n {...slots?.root}\n {...(editorMode !== 'vim' && tabsterDOMAttribute)}\n onKeyUp={handleKeyUp}\n />\n );\n },\n);\n\n// TODO(burdon): Allow plugins to set extensions (factory).\nconst maybeDebug = (): Extension => {\n // TODO(burdon): Parse JSON script format (with key bindings?)\n const items = localStorage.getItem('dxos.composer.demo');\n if (items) {\n return demo({ items: items.split(',') });\n }\n\n return [];\n};\n\nexport const TextEditor = forwardRef<TextEditorRef, TextEditorProps>(\n ({ extensions = [], slots: _slots, ...props }, forwardedRef) => {\n const { themeMode } = useThemeContext();\n const slots = defaultsDeep({}, _slots, defaultTextSlots);\n return (\n <BaseTextEditor\n ref={forwardedRef}\n extensions={[basicBundle({ themeMode, placeholder: slots?.editor?.placeholder }), maybeDebug(), ...extensions]}\n slots={slots}\n {...props}\n />\n );\n },\n);\n\nexport const MarkdownEditor = forwardRef<TextEditorRef, TextEditorProps>(\n ({ extensions = [], slots: _slots, ...props }, forwardedRef) => {\n const { themeMode } = useThemeContext();\n const slots = defaultsDeep({}, _slots, defaultMarkdownSlots);\n return (\n <BaseTextEditor\n ref={forwardedRef}\n extensions={[\n markdownBundle({ themeMode, placeholder: slots?.editor?.placeholder }),\n maybeDebug(),\n ...extensions,\n ]}\n slots={slots}\n {...props}\n />\n );\n },\n);\n\nexport const defaultSlots: TextEditorSlots = {\n root: {\n className: mx('p-2', inputSurface),\n },\n};\n\nexport const defaultTextSlots: TextEditorSlots = {\n ...defaultSlots,\n editor: {\n theme: textTheme,\n },\n};\n\nexport const defaultMarkdownSlots: TextEditorSlots = {\n ...defaultSlots,\n editor: {\n theme: markdownTheme,\n },\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport get from 'lodash.get';\nimport { useEffect, useState } from 'react';\nimport { yCollab } from 'y-codemirror.next';\nimport type * as awarenessProtocol from 'y-protocols/awareness';\n\nimport { invariant } from '@dxos/invariant';\nimport {\n type DocAccessor,\n type Space,\n type TextObject,\n type AutomergeTextCompat,\n getRawDoc,\n isActualAutomergeObject,\n} from '@dxos/react-client/echo';\nimport { type Identity } from '@dxos/react-client/halo';\nimport type { YText, YXmlFragment } from '@dxos/text-model';\n\nimport { automergePlugin } from './automerge';\nimport { SpaceAwarenessProvider } from './yjs';\n\n// TODO(burdon): Move.\ntype Awareness = awarenessProtocol.Awareness;\n\n// TODO(wittjosiah): Factor out to common package? @dxos/react-client?\nexport type EditorModel = {\n id: string;\n // TODO(burdon): Remove.\n content: string | YText | YXmlFragment | DocAccessor;\n text: () => string;\n extension?: Extension;\n awareness?: Awareness;\n peer?: {\n id: string;\n name?: string;\n };\n};\n\n// TODO(burdon): Remove space/identity dependency. Define interface for the framework re content and presence.\nexport type UseTextModelOptions = {\n identity?: Identity | null;\n space?: Space;\n text?: TextObject;\n};\n\n// TODO(burdon): Remove YJS/Automerge deps (from UI component -- create abstraction; incl. all ECHO/Space deps).\n// TODO(wittjosiah): Factor out to common package? @dxos/react-client?\nexport const useTextModel = ({ identity, space, text }: UseTextModelOptions): EditorModel | undefined => {\n const [model, setModel] = useState<EditorModel | undefined>(() => createModel({ identity, space, text }));\n useEffect(() => {\n setModel(createModel({ identity, space, text }));\n }, [identity, space, text]);\n return model;\n};\n\nconst createModel = (options: UseTextModelOptions) => {\n const { text } = options;\n if (isActualAutomergeObject(text)) {\n return createAutomergeModel(options);\n } else {\n if (!text?.doc) {\n return undefined;\n }\n\n return createYjsModel(options);\n }\n};\n\nconst createYjsModel = ({ identity, space, text }: UseTextModelOptions): EditorModel => {\n invariant(text?.doc && text?.content);\n const provider = space\n ? new SpaceAwarenessProvider({ space, doc: text.doc, channel: `yjs.awareness.${text.id}` })\n : undefined;\n\n return {\n id: text.doc.guid,\n content: text.content,\n text: () => text.content!.toString(),\n extension: yCollab(text.content as YText, provider?.awareness),\n awareness: provider?.awareness,\n peer: identity\n ? {\n id: identity.identityKey.toHex(),\n name: identity.profile?.displayName,\n }\n : undefined,\n };\n};\n\nconst createAutomergeModel = ({ identity, text }: UseTextModelOptions): EditorModel => {\n const obj = text as any as AutomergeTextCompat;\n const doc = getRawDoc(obj, [obj.field]);\n\n return {\n id: obj.id,\n content: doc,\n text: () => get(doc.handle.docSync(), doc.path),\n extension: automergePlugin(doc.handle, doc.path),\n peer: identity\n ? {\n id: identity.identityKey.toHex(),\n name: identity.profile?.displayName,\n }\n : undefined,\n };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport {\n Annotation,\n type EditorState,\n type Extension,\n Facet,\n StateEffect,\n StateField,\n type Transaction,\n type TransactionSpec,\n} from '@codemirror/state';\nimport { ViewPlugin, type EditorView, type PluginValue, type ViewUpdate } from '@codemirror/view';\n\nimport * as automerge from '@dxos/automerge/automerge';\nimport { type Heads, type Prop } from '@dxos/automerge/automerge';\n\nimport { PatchSemaphore } from './PatchSemaphore';\nimport { type IDocHandle } from './handle';\n\nexport type Value = {\n lastHeads: Heads;\n path: Prop[];\n unreconciledTransactions: Transaction[];\n};\n\ntype UpdateHeads = {\n newHeads: Heads;\n};\n\nexport const effectType = StateEffect.define<UpdateHeads>({});\n\nexport const updateHeads = (newHeads: Heads): StateEffect<UpdateHeads> => effectType.of({ newHeads });\n\nexport const getLastHeads = (state: EditorState, field: Field): Heads => state.field(field).lastHeads;\n\nexport const getPath = (state: EditorState, field: Field): Prop[] => state.field(field).path;\n\nexport type Field = StateField<Value>;\n\nconst semaphoreFacet = Facet.define<PatchSemaphore, PatchSemaphore>({\n combine: (values) => values.at(-1)!, // Take last.\n});\n\nexport type AutomergePlugin = {\n extension: Extension;\n};\n\nexport const automergePlugin = (handle: IDocHandle, path: Prop[]): AutomergePlugin => {\n const stateField: StateField<Value> = StateField.define({\n create: () => ({\n lastHeads: automerge.getHeads(handle.docSync()!),\n unreconciledTransactions: [],\n path: path.slice(),\n }),\n update: (value: Value, tr: Transaction) => {\n const result: Value = {\n lastHeads: value.lastHeads,\n unreconciledTransactions: value.unreconciledTransactions.slice(),\n path: path.slice(),\n };\n let clearUnreconciled = false;\n for (const effect of tr.effects) {\n if (effect.is(effectType)) {\n result.lastHeads = effect.value.newHeads;\n clearUnreconciled = true;\n }\n }\n if (clearUnreconciled) {\n result.unreconciledTransactions = [];\n } else {\n if (!isReconcileTx(tr)) {\n result.unreconciledTransactions.push(tr);\n }\n }\n return result;\n },\n });\n const semaphore = new PatchSemaphore(stateField);\n\n const viewPlugin = ViewPlugin.fromClass(\n class AutomergeCodemirrorViewPlugin implements PluginValue {\n private _view: EditorView;\n\n constructor(view: EditorView) {\n this._view = view;\n handle.addListener('change', this._handleChange);\n }\n\n update(update: ViewUpdate) {\n if (update.transactions.length > 0 && update.transactions.some((t) => !isReconcileTx(t))) {\n queueMicrotask(() => {\n this._view.state.facet(semaphoreFacet).reconcile(handle, this._view);\n });\n }\n }\n\n destroy() {\n handle.addListener('change', this._handleChange);\n }\n\n private _handleChange = () => {\n this._view.state.facet(semaphoreFacet).reconcile(handle, this._view);\n };\n },\n );\n\n return {\n extension: [stateField, semaphoreFacet.of(semaphore), viewPlugin],\n };\n};\n\nexport const reconcileAnnotationType = Annotation.define<unknown>();\n\nexport const isReconcileTx = (tr: Transaction): boolean => !!tr.annotation(reconcileAnnotationType);\n\nexport const makeReconcile = (tr: TransactionSpec) => {\n if (tr.annotations != null) {\n if (tr.annotations instanceof Array) {\n tr.annotations = [...tr.annotations, reconcileAnnotationType.of({})];\n } else {\n tr.annotations = [tr.annotations, reconcileAnnotationType.of({})];\n }\n } else {\n tr.annotations = [reconcileAnnotationType.of({})];\n }\n // return {\n // ...tr,\n // annotations: reconcileAnnotationType.of({})\n // }\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\n\nimport { next as automerge } from '@dxos/automerge/automerge';\n\nimport amToCodemirror from './amToCodemirror';\nimport codeMirrorToAm from './codeMirrorToAm';\nimport { type IDocHandle } from './handle';\nimport { type Field, isReconcileTx, getPath, reconcileAnnotationType, updateHeads, getLastHeads } from './plugin';\n\ntype Doc<T> = automerge.Doc<T>;\ntype Heads = automerge.Heads;\n\ntype ChangeFn = (atHeads: Heads, change: (doc: Doc<unknown>) => void) => Heads | undefined;\n\nexport class PatchSemaphore {\n _field!: Field;\n _inReconcile = false;\n _queue: Array<ChangeFn> = [];\n\n constructor(field?: Field) {\n if (field !== undefined) {\n this._field = field;\n }\n }\n\n reconcile = (handle: IDocHandle, view: EditorView) => {\n if (this._inReconcile) {\n return;\n }\n this._inReconcile = true;\n\n const path = getPath(view.state, this._field);\n const oldHeads = getLastHeads(view.state, this._field);\n let selection = view.state.selection;\n\n const transactions = view.state.field(this._field).unreconciledTransactions.filter((tx) => !isReconcileTx(tx));\n\n // First undo all the unreconciled transactions\n const toInvert = transactions.slice().reverse();\n for (const tx of toInvert) {\n const inverted = tx.changes.invert(tx.startState.doc);\n selection = selection.map(inverted);\n view.dispatch({\n changes: inverted,\n annotations: reconcileAnnotationType.of(true),\n });\n }\n\n // now apply the unreconciled transactions to the document\n let newHeads = codeMirrorToAm(this._field, handle, transactions, view.state);\n\n // NOTE: null and undefined each come from automerge and repo respectively\n if (newHeads === null || newHeads === undefined) {\n // TODO: @alexjg this is the call that's resetting the editor state on click\n newHeads = automerge.getHeads(handle.docSync()!);\n }\n\n // now get the diff between the updated state of the document and the heads\n // and apply that to the codemirror doc\n const diff = automerge.equals(oldHeads, newHeads) ? [] : automerge.diff(handle.docSync()!, oldHeads, newHeads);\n amToCodemirror(view, selection, path, diff);\n\n view.dispatch({\n effects: updateHeads(newHeads),\n annotations: reconcileAnnotationType.of({}),\n });\n\n this._inReconcile = false;\n };\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { ChangeSet, type ChangeSpec, type EditorSelection, type EditorState } from '@codemirror/state';\nimport { type EditorView } from '@codemirror/view';\n\nimport {\n type DelPatch,\n type InsertPatch,\n type Patch,\n type Prop,\n type PutPatch,\n type SpliceTextPatch,\n} from '@dxos/automerge/automerge';\n\nimport { reconcileAnnotationType } from './plugin';\n\nexport default (view: EditorView, selection: EditorSelection, target: Prop[], patches: Patch[]) => {\n for (const patch of patches) {\n const changeSpec = handlePatch(patch, target, view.state);\n if (changeSpec != null) {\n const changeSet = ChangeSet.of(changeSpec, view.state.doc.length, '\\n');\n selection = selection.map(changeSet, 1);\n view.dispatch({\n changes: changeSet,\n annotations: reconcileAnnotationType.of({}),\n });\n }\n }\n view.dispatch({\n selection,\n annotations: reconcileAnnotationType.of({}),\n });\n};\n\nconst handlePatch = (patch: Patch, target: Prop[], state: EditorState): ChangeSpec | null => {\n if (patch.action === 'insert') {\n return handleInsert(target, patch);\n } else if (patch.action === 'splice') {\n return handleSplice(target, patch);\n } else if (patch.action === 'del') {\n return handleDel(target, patch);\n } else if (patch.action === 'put') {\n return handlePut(target, patch, state);\n } else {\n return null;\n }\n};\n\nconst handleInsert = (target: Prop[], patch: InsertPatch): Array<ChangeSpec> => {\n const index = charPath(target, patch.path);\n if (index == null) {\n return [];\n }\n const text = patch.values.map((v) => (v ? v.toString() : '')).join('');\n return [{ from: index, to: index, insert: text }];\n};\n\nconst handleSplice = (target: Prop[], patch: SpliceTextPatch): Array<ChangeSpec> => {\n const index = charPath(target, patch.path);\n if (index == null) {\n return [];\n }\n return [{ from: index, insert: patch.value }];\n};\n\nconst handleDel = (target: Prop[], patch: DelPatch): Array<ChangeSpec> => {\n const index = charPath(target, patch.path);\n if (index == null) {\n return [];\n }\n const length = patch.length || 1;\n return [{ from: index, to: index + length }];\n};\n\nconst handlePut = (target: Prop[], patch: PutPatch, state: EditorState): Array<ChangeSpec> => {\n const index = charPath(target, [...patch.path, 0]);\n if (index == null) {\n return [];\n }\n const length = state.doc.length;\n if (typeof patch.value !== 'string') {\n return []; // TODO(dmaretskyi): How to handle non string values?\n }\n return [{ from: 0, to: length, insert: patch.value as any }];\n};\n\n// If the path of the patch is of the form [path, <index>] then we know this is\n// a path to a character within the sequence given by path\nconst charPath = (textPath: Prop[], candidatePath: Prop[]): number | null => {\n if (candidatePath.length !== textPath.length + 1) {\n return null;\n }\n for (let i = 0; i < textPath.length; i++) {\n if (textPath[i] !== candidatePath[i]) {\n return null;\n }\n }\n const index = candidatePath[candidatePath.length - 1];\n if (typeof index === 'number') {\n return index;\n }\n return null;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type EditorState, type Text, type Transaction } from '@codemirror/state';\n\nimport { next as am, type Heads } from '@dxos/automerge/automerge';\n\nimport { type IDocHandle } from './handle';\nimport { type Field } from './plugin';\n\nexport default (\n field: Field,\n handle: IDocHandle,\n transactions: Transaction[],\n state: EditorState,\n): Heads | undefined => {\n const { lastHeads, path } = state.field(field);\n\n // We don't want to call `automerge.updateAt` if there are no changes.\n // Otherwise later on `automerge.diff` will return empty patches that result in a no-op but still mess up the selection.\n let hasChanges = false;\n for (const tr of transactions) {\n tr.changes.iterChanges(() => {\n hasChanges = true;\n });\n }\n\n if (!hasChanges) {\n return undefined;\n }\n\n const newHeads = handle.changeAt(lastHeads, (doc: am.Doc<unknown>) => {\n for (const tr of transactions) {\n tr.changes.iterChanges((fromA: number, toA: number, _fromB: number, _toB: number, inserted: Text) => {\n am.splice(doc, path, fromA, toA - fromA, inserted.toString());\n });\n }\n });\n return newHeads ?? undefined;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\n// Copied from https://github.com/yjs/y-codemirror.next#example.\n\nimport * as random from 'lib0/random';\n\nconst cursorColors = [\n { color: '#30bced', light: '#30bced33' },\n { color: '#6eeb83', light: '#6eeb8333' },\n { color: '#ffbc42', light: '#ffbc4233' },\n { color: '#ecd444', light: '#ecd44433' },\n { color: '#ee6352', light: '#ee635233' },\n { color: '#9ac2c9', light: '#9ac2c933' },\n { color: '#8acb88', light: '#8acb8833' },\n { color: '#1be7ff', light: '#1be7ff33' },\n];\n\n// Select a random color for this user.\nexport const cursorColor = cursorColors[random.uint32() % cursorColors.length];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport * as decoding from 'lib0/decoding';\nimport * as encoding from 'lib0/encoding';\nimport { Observable } from 'lib0/observable';\nimport * as awarenessProtocol from 'y-protocols/awareness';\nimport { type Doc } from 'yjs';\n\nimport { log } from '@dxos/log';\nimport { type Space } from '@dxos/react-client/echo';\nimport { type GossipMessage } from '@dxos/react-client/mesh';\n\ntype Awareness = awarenessProtocol.Awareness;\n\n// Based on https://github.com/yjs/y-webrtc/blob/88baab2/src/y-webrtc.js.\n\nconst messageAwareness = 1;\nconst messageQueryAwareness = 3;\n\n/**\n * Yjs awareness provider on top of a DXOS space.\n */\nexport class SpaceAwarenessProvider extends Observable<any> {\n private readonly _space: Space;\n private readonly _awareness: Awareness;\n private readonly _clientId: number;\n private readonly _channel: string;\n\n constructor({ space, doc, channel, awareness }: { space: Space; doc: Doc; channel: string; awareness?: Awareness }) {\n super();\n this._space = space;\n this._awareness = awareness ?? new awarenessProtocol.Awareness(doc);\n this._channel = channel;\n this._clientId = doc.clientID;\n\n this._awareness.on('update', this._handleAwarenessUpdate.bind(this));\n this._space.listen(this._channel, this._handleSpaceMessage.bind(this));\n\n if (typeof window !== 'undefined') {\n window.addEventListener('beforeunload', this._handleBeforeUnload.bind(this));\n } else if (typeof process !== 'undefined') {\n process.on('exit', this._handleBeforeUnload.bind(this));\n }\n\n // Post queryAwareness.\n const encoderAwarenessQuery = encoding.createEncoder();\n encoding.writeVarUint(encoderAwarenessQuery, messageQueryAwareness);\n void this._space.postMessage(this._channel, encoding.toUint8Array(encoderAwarenessQuery));\n\n // Post local awareness state.\n const encoderAwarenessState = encoding.createEncoder();\n encoding.writeVarUint(encoderAwarenessState, messageAwareness);\n encoding.writeVarUint8Array(\n encoderAwarenessState,\n awarenessProtocol.encodeAwarenessUpdate(this.awareness, [this._clientId]),\n );\n void this._space.postMessage(this._channel, encoding.toUint8Array(encoderAwarenessState));\n }\n\n get awareness(): Awareness {\n return this._awareness;\n }\n\n private _handleAwarenessUpdate({ added, updated, removed }: any, origin: any) {\n log('awareness update', { added, updated, removed, origin });\n const changedClients = added.concat(updated).concat(removed);\n const encoderAwareness = encoding.createEncoder();\n encoding.writeVarUint(encoderAwareness, messageAwareness);\n encoding.writeVarUint8Array(\n encoderAwareness,\n awarenessProtocol.encodeAwarenessUpdate(this._awareness, changedClients),\n );\n void this._space.postMessage(this._channel, encoding.toUint8Array(encoderAwareness));\n }\n\n private _handleSpaceMessage({ payload }: GossipMessage) {\n log('space message', payload);\n const data = new Uint8Array(Array.from(Object.values(payload)));\n const encoder = this._readMessage(data);\n if (encoder) {\n void this._space.postMessage(this._channel, encoding.toUint8Array(encoder));\n }\n }\n\n private _readMessage(message: Uint8Array) {\n const decoder = decoding.createDecoder(message);\n const encoder = encoding.createEncoder();\n const messageType = decoding.readVarUint(decoder);\n\n let sendReply = false;\n switch (messageType) {\n case messageAwareness: {\n awarenessProtocol.applyAwarenessUpdate(this._awareness, decoding.readVarUint8Array(decoder), this);\n break;\n }\n\n case messageQueryAwareness: {\n encoding.writeVarUint(encoder, messageAwareness);\n encoding.writeVarUint8Array(\n encoder,\n awarenessProtocol.encodeAwarenessUpdate(this._awareness, Array.from(this._awareness.getStates().keys())),\n );\n sendReply = true;\n break;\n }\n\n default: {\n console.error('Invalid message:', messageType);\n return encoder;\n }\n }\n\n if (!sendReply) {\n // Nothing has been written, no answer created.\n return null;\n }\n\n return encoder;\n }\n\n private _handleBeforeUnload() {\n awarenessProtocol.removeAwarenessStates(this._awareness, [this._clientId], 'window unload');\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["TextKind", "Doc", "YText", "YXmlFragment", "tags", "autocompletion", "completionKeymap", "keymap", "autocomplete", "onSearch", "keymap", "of", "completionKeymap", "autocompletion", "activateOnTyping", "override", "context", "word", "matchBefore", "from", "to", "explicit", "options", "text", "toLowerCase", "closeBrackets", "bracketMatching", "defaultHighlightStyle", "syntaxHighlighting", "oneDarkHighlightStyle", "EditorView", "placeholder", "basicBundle", "themeMode", "placeholder", "_placeholder", "bracketMatching", "closeBrackets", "EditorView", "lineWrapping", "syntaxHighlighting", "oneDarkHighlightStyle", "defaultHighlightStyle", "filter", "Boolean", "keymap", "defaultItems", "demo", "delay", "items", "t", "idx", "keymap", "of", "key", "run", "view", "clearTimeout", "text", "length", "i", "insert", "d", "setTimeout", "pos", "state", "selection", "main", "head", "dispatch", "changes", "from", "anchor", "Math", "random", "keymap", "Decoration", "EditorView", "MatchDecorator", "ViewPlugin", "WidgetType", "debounce", "invariant", "BookmarkWidget", "constructor", "_pos", "_id", "eq", "other", "toDOM", "span", "document", "createElement", "className", "textContent", "styles", "baseTheme", "cursor", "margin", "padding", "backgroundColor", "comments", "options", "active", "bookmarkMatcher", "regexp", "decoration", "match", "view", "pos", "id", "replace", "widget", "bookmarks", "fromClass", "createDeco", "update", "updateDeco", "decorations", "instance", "provide", "plugin", "atomicRanges", "of", "none", "doUpdate", "data", "onUpdate", "key", "run", "onCreate", "state", "selection", "main", "head", "tag", "dispatch", "changes", "from", "insert", "anchor", "length", "updateListener", "undefined", "rangeSet", "closest", "Infinity", "to", "visibleRanges", "doc", "between", "value", "push", "d", "Math", "min", "abs", "spec", "items", "map", "location", "coordsAtPos", "syntaxTree", "RangeSetBuilder", "StateField", "Decoration", "EditorView", "WidgetType", "LinkButton", "WidgetType", "constructor", "_pos", "_url", "_onAttach", "eq", "other", "toDOM", "view", "el", "document", "createElement", "LinkText", "_text", "link", "setAttribute", "textContent", "href", "onclick", "dispatch", "selection", "anchor", "update", "state", "options", "builder", "RangeSetBuilder", "cursor", "main", "head", "syntaxTree", "iterate", "enter", "node", "name", "marks", "getChildren", "text", "length", "sliceDoc", "to", "from", "urlNode", "getChild", "url", "add", "Decoration", "replace", "widget", "undefined", "onRender", "finish", "StateField", "define", "create", "_", "tr", "provide", "field", "EditorView", "decorations", "StateField", "listener", "onChange", "StateField", "define", "create", "update", "_value", "transaction", "docChanged", "newDoc", "toString", "closeBrackets", "closeBracketsKeymap", "defaultKeymap", "history", "indentWithTab", "markdownLanguage", "markdown", "bracketMatching", "defaultHighlightStyle", "indentOnInput", "syntaxHighlighting", "languages", "highlightSelectionMatches", "searchKeymap", "EditorState", "oneDarkHighlightStyle", "crosshairCursor", "drawSelection", "dropCursor", "EditorView", "highlightActiveLine", "highlightActiveLineGutter", "highlightSpecialChars", "keymap", "placeholder", "rectangularSelection", "markdownLanguage", "HighlightStyle", "tags", "styleTags", "Tag", "get", "mx", "heading", "light", "mark", "mx", "bold", "italic", "strikethrough", "code", "codeMark", "inlineUrl", "mx", "code", "blockquote", "light", "horizontalRule", "tailwindConfig", "tokens", "tailwindConfig", "theme", "markdownTags", "Blockquote", "Tag", "define", "CodeMark", "CodeText", "EmphasisMark", "HeaderMark", "HorizontalRule", "InlineCode", "LinkLabel", "LinkReference", "ListMark", "QuoteMark", "URL", "markdownTagsExtension", "props", "styleTags", "markdownHighlightStyle", "HighlightStyle", "tag", "tags", "keyword", "name", "deleted", "character", "propertyName", "macroName", "color", "constant", "standard", "definition", "separator", "typeName", "className", "number", "changed", "annotation", "modifier", "self", "namespace", "operator", "operatorKeyword", "escape", "regexp", "special", "string", "meta", "comment", "atom", "bool", "variableName", "processingInstruction", "inserted", "invalid", "class", "mark", "heading1", "heading", "heading2", "heading3", "heading4", "heading5", "heading6", "emphasis", "italic", "strong", "bold", "strikethrough", "inlineUrl", "function", "labelName", "codeMark", "code", "blockquote", "horizontalRule", "scope", "markdownLanguage", "all", "fontFamily", "get", "tokens", "join", "markdownBundle", "themeMode", "placeholder", "_placeholder", "bracketMatching", "closeBrackets", "EditorState", "allowMultipleSelections", "of", "EditorView", "lineWrapping", "crosshairCursor", "dropCursor", "drawSelection", "highlightActiveLine", "highlightActiveLineGutter", "highlightSelectionMatches", "highlightSpecialChars", "history", "indentOnInput", "rectangularSelection", "keymap", "closeBracketsKeymap", "defaultKeymap", "searchKeymap", "indentWithTab", "markdown", "base", "markdownLanguage", "codeLanguages", "languages", "extensions", "markdownTagsExtension", "syntaxHighlighting", "markdownHighlightStyle", "oneDarkHighlightStyle", "defaultHighlightStyle", "filter", "Boolean", "EditorView", "Decoration", "WidgetType", "MatchDecorator", "ViewPlugin", "CheckboxWidget", "WidgetType", "constructor", "_pos", "_checked", "_indent", "_onCheck", "eq", "other", "toDOM", "view", "wrap", "document", "createElement", "className", "setAttribute", "style", "setProperty", "input", "appendChild", "type", "checked", "onchange", "event", "target", "ignoreEvent", "styles", "EditorView", "baseTheme", "paddingLeft", "paddingRight", "tasklist", "taskMatcher", "MatchDecorator", "regexp", "decoration", "match", "pos", "indent", "Math", "floor", "length", "Decoration", "replace", "widget", "idx", "indexOf", "dispatch", "changes", "from", "to", "insert", "selection", "anchor", "tasks", "ViewPlugin", "fromClass", "createDeco", "update", "updateDeco", "decorations", "instance", "provide", "plugin", "atomicRanges", "of", "none", "hoverTooltip", "tooltipContent", "markdownLinkRegexp", "tooltip", "onHover", "regexp", "hoverTooltip", "view", "pos", "from", "text", "state", "doc", "lineAt", "p", "idx", "match", "substring", "undefined", "indexOf", "length", "url", "end", "above", "create", "el", "document", "createElement", "className", "tooltipContent", "dom", "offset", "x", "y", "get", "defaultTheme", "outline", "overflow", "padding", "fontSize", "color", "get", "tokens", "caretColor", "borderLeft", "fontWeight", "paddingInline", "backgroundColor", "background", "mixBlendMode", "marginBlockStart", "paddingBlockStart", "paddingBlockEnd", "display", "insetBlockStart", "blockSize", "verticalAlign", "margin", "textDecorationLine", "textDecorationThickness", "textUnderlineOffset", "borderRadius", "fontFamily", "join", "border", "Object", "keys", "reduce", "acc", "height", "textTheme", "markdownTheme", "codeTheme", "EditorState", "EditorView", "useFocusableGroup", "vim", "defaultsDeep", "React", "forwardRef", "useCallback", "useEffect", "useImperativeHandle", "useState", "generateName", "useThemeContext", "getColorForValue", "inputSurface", "mx", "EditorModes", "BaseTextEditor", "forwardRef", "model", "extensions", "slots", "defaultSlots", "editorMode", "forwardedRef", "themeMode", "useThemeContext", "tabsterDOMAttribute", "useFocusableGroup", "tabBehavior", "root", "setRoot", "useState", "state", "setState", "view", "setView", "useImperativeHandle", "awareness", "peer", "useEffect", "setLocalStateField", "name", "generateName", "id", "color", "getColorForValue", "value", "type", "colorLight", "EditorState", "create", "doc", "text", "vim", "EditorView", "baseTheme", "defaultTheme", "theme", "editor", "darkTheme", "of", "extension", "filter", "Boolean", "destroy", "parent", "undefined", "handleKeyUp", "useCallback", "event", "key", "altKey", "shiftKey", "metaKey", "ctrlKey", "contentDOM", "focus", "div", "ref", "tabIndex", "onKeyUp", "maybeDebug", "items", "localStorage", "getItem", "demo", "split", "TextEditor", "_slots", "props", "defaultsDeep", "defaultTextSlots", "basicBundle", "placeholder", "MarkdownEditor", "defaultMarkdownSlots", "markdownBundle", "className", "mx", "inputSurface", "textTheme", "markdownTheme", "get", "useEffect", "useState", "yCollab", "invariant", "getRawDoc", "isActualAutomergeObject", "Annotation", "Facet", "StateEffect", "StateField", "ViewPlugin", "automerge", "next", "automerge", "ChangeSet", "view", "selection", "target", "patches", "patch", "changeSpec", "handlePatch", "state", "changeSet", "ChangeSet", "of", "doc", "length", "map", "dispatch", "changes", "annotations", "reconcileAnnotationType", "action", "handleInsert", "handleSplice", "handleDel", "handlePut", "index", "charPath", "path", "text", "values", "v", "toString", "join", "from", "to", "insert", "value", "textPath", "candidatePath", "i", "next", "am", "field", "handle", "transactions", "state", "lastHeads", "path", "hasChanges", "tr", "changes", "iterChanges", "undefined", "newHeads", "changeAt", "doc", "fromA", "toA", "_fromB", "_toB", "inserted", "am", "splice", "toString", "PatchSemaphore", "constructor", "field", "_inReconcile", "_queue", "reconcile", "handle", "view", "path", "getPath", "state", "_field", "oldHeads", "getLastHeads", "selection", "transactions", "unreconciledTransactions", "filter", "tx", "isReconcileTx", "toInvert", "slice", "reverse", "inverted", "changes", "invert", "startState", "doc", "map", "dispatch", "annotations", "reconcileAnnotationType", "of", "newHeads", "codeMirrorToAm", "undefined", "automerge", "getHeads", "docSync", "diff", "equals", "amToCodemirror", "effects", "updateHeads", "effectType", "StateEffect", "define", "updateHeads", "newHeads", "of", "getLastHeads", "state", "field", "lastHeads", "getPath", "path", "semaphoreFacet", "Facet", "combine", "values", "at", "automergePlugin", "handle", "stateField", "StateField", "create", "getHeads", "docSync", "unreconciledTransactions", "slice", "update", "value", "tr", "result", "clearUnreconciled", "effect", "effects", "is", "isReconcileTx", "push", "semaphore", "PatchSemaphore", "viewPlugin", "ViewPlugin", "fromClass", "AutomergeCodemirrorViewPlugin", "constructor", "view", "_handleChange", "_view", "facet", "reconcile", "addListener", "transactions", "length", "some", "t", "queueMicrotask", "destroy", "extension", "reconcileAnnotationType", "Annotation", "annotation", "random", "cursorColors", "color", "light", "cursorColor", "uint32", "length", "decoding", "encoding", "Observable", "awarenessProtocol", "log", "messageAwareness", "messageQueryAwareness", "SpaceAwarenessProvider", "constructor", "space", "doc", "channel", "awareness", "_space", "_awareness", "Awareness", "_channel", "_clientId", "clientID", "on", "_handleAwarenessUpdate", "bind", "listen", "_handleSpaceMessage", "window", "addEventListener", "_handleBeforeUnload", "process", "encoderAwarenessQuery", "createEncoder", "writeVarUint", "postMessage", "toUint8Array", "encoderAwarenessState", "writeVarUint8Array", "encodeAwarenessUpdate", "added", "updated", "removed", "origin", "changedClients", "concat", "encoderAwareness", "payload", "data", "Uint8Array", "Array", "from", "Object", "values", "encoder", "_readMessage", "message", "decoder", "createDecoder", "messageType", "readVarUint", "sendReply", "applyAwarenessUpdate", "readVarUint8Array", "getStates", "keys", "console", "error", "removeAwarenessStates", "useTextModel", "identity", "space", "text", "model", "setModel", "useState", "createModel", "useEffect", "options", "isActualAutomergeObject", "createAutomergeModel", "doc", "undefined", "createYjsModel", "invariant", "content", "provider", "SpaceAwarenessProvider", "channel", "id", "guid", "toString", "extension", "yCollab", "awareness", "peer", "identityKey", "toHex", "name", "profile", "displayName", "obj", "getRawDoc", "field", "get", "handle", "docSync", "path", "automergePlugin"]
|
|
7
7
|
}
|