@dxos/react-ui-editor 0.3.10-main.3645708 → 0.3.10-main.396fa89
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 +1495 -489
- 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 +26 -2
- package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/TextEditor.d.ts +3 -1
- package/dist/types/src/components/TextEditor/TextEditor.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts +3 -0
- package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/extensions/autocomplete.d.ts +3 -2
- package/dist/types/src/components/TextEditor/extensions/autocomplete.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/extensions/basic.d.ts +2 -1
- package/dist/types/src/components/TextEditor/extensions/basic.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/extensions/blast.d.ts +25 -0
- package/dist/types/src/components/TextEditor/extensions/blast.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/extensions/code.d.ts +2 -0
- package/dist/types/src/components/TextEditor/extensions/code.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 +11 -0
- package/dist/types/src/components/TextEditor/extensions/demo.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/extensions/experimental.d.ts +1 -1
- package/dist/types/src/components/TextEditor/extensions/experimental.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/extensions/highlight.d.ts +24 -0
- package/dist/types/src/components/TextEditor/extensions/highlight.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/extensions/image.d.ts +4 -0
- package/dist/types/src/components/TextEditor/extensions/image.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/extensions/index.d.ts +8 -0
- package/dist/types/src/components/TextEditor/extensions/index.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/extensions/link.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/extensions/listener.d.ts +4 -2
- package/dist/types/src/components/TextEditor/extensions/listener.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/extensions/markdown/bundle.d.ts +10 -1
- 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 +9 -3
- package/dist/types/src/components/TextEditor/extensions/markdown/highlight.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/extensions/mention.d.ts +6 -0
- package/dist/types/src/components/TextEditor/extensions/mention.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/extensions/table.d.ts +8 -0
- package/dist/types/src/components/TextEditor/extensions/table.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/extensions/tasklist.d.ts +2 -4
- package/dist/types/src/components/TextEditor/extensions/tasklist.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/themes/default.d.ts +8 -0
- package/dist/types/src/components/TextEditor/themes/default.d.ts.map +1 -1
- package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/PatchSemaphore.d.ts +3 -0
- package/dist/types/src/hooks/automerge/PatchSemaphore.d.ts.map +1 -0
- package/dist/types/src/hooks/automerge/automerge.stories.d.ts +16 -0
- package/dist/types/src/hooks/automerge/automerge.stories.d.ts.map +1 -0
- package/dist/types/src/hooks/automerge/handle.d.ts.map +1 -0
- package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/index.d.ts +1 -1
- 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/automerge/translation/automerge-to-codemirror.d.ts +5 -0
- package/dist/types/src/hooks/automerge/translation/automerge-to-codemirror.d.ts.map +1 -0
- package/dist/types/src/hooks/automerge/translation/codemirror-to-automerge.d.ts +6 -0
- package/dist/types/src/hooks/automerge/translation/codemirror-to-automerge.d.ts.map +1 -0
- package/dist/types/src/hooks/automerge/translation/index.d.ts +3 -0
- package/dist/types/src/hooks/automerge/translation/index.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 +8 -3
- package/dist/types/src/hooks/useTextModel.d.ts.map +1 -1
- package/dist/types/src/{components/TextEditor → hooks/yjs}/yjs.stories.d.ts +2 -2
- package/dist/types/src/hooks/yjs/yjs.stories.d.ts.map +1 -0
- package/dist/types/src/styles/markdown.d.ts +3 -2
- 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 -19
- package/src/components/TextEditor/MarkdownEditor.stories.tsx +161 -36
- package/src/components/TextEditor/TextEditor.stories.tsx +12 -1
- package/src/components/TextEditor/TextEditor.tsx +49 -24
- package/src/components/TextEditor/extensions/autocomplete.ts +9 -22
- package/src/components/TextEditor/extensions/basic.ts +6 -4
- package/src/components/TextEditor/extensions/blast.ts +373 -0
- package/src/components/TextEditor/extensions/code.ts +99 -0
- package/src/components/TextEditor/extensions/comments.ts +173 -0
- package/src/components/TextEditor/extensions/demo.ts +69 -0
- package/src/components/TextEditor/extensions/experimental.tsx +15 -35
- package/src/components/TextEditor/extensions/highlight.ts +128 -0
- package/src/components/TextEditor/extensions/image.ts +67 -0
- package/src/components/TextEditor/extensions/index.ts +8 -0
- package/src/components/TextEditor/extensions/link.ts +27 -27
- package/src/components/TextEditor/extensions/listener.ts +4 -3
- package/src/components/TextEditor/extensions/markdown/bundle.ts +46 -43
- package/src/components/TextEditor/extensions/markdown/highlight.ts +148 -107
- package/src/components/TextEditor/extensions/mention.ts +31 -0
- package/src/components/TextEditor/extensions/table.ts +119 -0
- package/src/components/TextEditor/extensions/tasklist.ts +89 -81
- package/src/components/TextEditor/themes/default.ts +112 -4
- package/src/{automerge/automerge-plugin → hooks/automerge}/PatchSemaphore.ts +12 -9
- package/src/{automerge → hooks/automerge}/automerge.stories.tsx +6 -3
- package/src/{automerge/automerge-plugin → hooks/automerge}/plugin.ts +1 -0
- package/src/{automerge/automerge-plugin/amToCodemirror.ts → hooks/automerge/translation/automerge-to-codemirror.ts} +10 -2
- package/src/{automerge/automerge-plugin/codeMirrorToAm.ts → hooks/automerge/translation/codemirror-to-automerge.ts} +7 -4
- package/src/hooks/automerge/translation/index.ts +6 -0
- package/src/hooks/index.ts +0 -1
- package/src/hooks/useTextModel.ts +58 -41
- package/src/{components/TextEditor → hooks/yjs}/yjs.stories.tsx +2 -2
- package/src/styles/markdown.ts +15 -8
- package/src/testing/replicator.ts +7 -7
- package/dist/types/src/automerge/automerge-plugin/PatchSemaphore.d.ts.map +0 -1
- package/dist/types/src/automerge/automerge-plugin/amToCodemirror.d.ts +0 -6
- package/dist/types/src/automerge/automerge-plugin/amToCodemirror.d.ts.map +0 -1
- package/dist/types/src/automerge/automerge-plugin/codeMirrorToAm.d.ts +0 -7
- 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 +0 -9
- package/dist/types/src/automerge/automerge.stories.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/yjs.stories.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/hooks/useCollaboration.ts +0 -45
- package/dist/types/src/{automerge/automerge-plugin → hooks/automerge}/handle.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}/handle.ts +0 -0
- package/src/{automerge/automerge-plugin → hooks/automerge}/index.ts +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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/link.ts", "../../../src/components/TextEditor/extensions/listener.ts", "../../../src/components/TextEditor/extensions/markdown/bundle.ts", "../../../src/components/TextEditor/extensions/markdown/highlight.ts", "../../../src/
|
|
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 AutocompleteOptions = {\n getOptions: (text: string) => Completion[];\n};\n\n/**\n * Autocomplete extension.\n */\nexport const autocomplete = ({ getOptions }: 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: getOptions(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// 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\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\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\n return true;\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 TextListener = (text: string) => void;\n\n/**\n * Based on https://github.com/codemirror/dev/issues/44#issuecomment-789093799\n */\nexport const listener = (onChange: TextListener) =>\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, 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\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 // 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 // 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 // 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 {\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 { 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 { EditorView, Decoration, WidgetType } from '@codemirror/view';\n\nclass CheckboxWidget extends WidgetType {\n constructor(private readonly _pos: number, private readonly _getCursor: () => number, private _checked: boolean) {\n super();\n }\n\n override eq(other: CheckboxWidget) {\n // Uniqueness based on position; also checks state.\n // TODO(burdon): Is this efficient? Check life-cycle.\n return this._pos === other._pos && this._checked === other._checked;\n }\n\n toDOM(view: EditorView) {\n // console.log('toDom', this._pos);\n const wrap = document.createElement('span');\n wrap.setAttribute('aria-hidden', 'true');\n wrap.className = 'cm-task-item';\n\n const box = wrap.appendChild(document.createElement('input'));\n box.type = 'checkbox';\n box.checked = this._checked;\n box.onclick = (event) => {\n this._checked = !isChecked(view.state, this._pos);\n view.dispatch({\n changes: {\n from: this._pos + 1,\n to: this._pos + 2,\n insert: this._checked ? 'x' : ' ',\n },\n // TODO(burdon): Restore cursor position? More useful to move to end of line (can indent).\n selection: {\n anchor: this._pos + 4,\n // anchor: this._getCursor(),\n },\n });\n return true;\n };\n\n return wrap;\n }\n\n // TODO(burdon): Remove listener?\n // override destroy() {\n // console.log('destroy', this._pos);\n // }\n\n override ignoreEvent() {\n return false;\n }\n}\n\nconst isChecked = (state: EditorState, pos: number) => {\n return state.sliceDoc(pos, pos + 3).toLowerCase() === '[x]';\n};\n\nexport const statefield = (): Extension => {\n let lastPosition: number = 0;\n const listener = EditorView.updateListener.of((update) => {\n lastPosition = update.startState.selection.main.head;\n });\n\n const checkbox = (state: EditorState) => {\n const builder = new RangeSetBuilder();\n syntaxTree(state).iterate({\n enter: (node) => {\n // console.log(node.name, node.from, node.to);\n if (node.name === 'TaskMarker') {\n builder.add(\n node.from,\n node.to,\n Decoration.replace({\n widget: new CheckboxWidget(node.from, () => lastPosition, isChecked(state, node.from)),\n }),\n );\n }\n },\n });\n\n return builder.finish();\n };\n\n return [\n listener,\n StateField.define<RangeSet<any>>({\n create: (state) => checkbox(state),\n update: (_: RangeSet<any>, tr: Transaction) => checkbox(tr.state),\n provide: (field) => EditorView.decorations.from(field),\n }),\n ];\n};\n\n// TODO(burdon): Reconcile with theme.\nexport const styles = EditorView.baseTheme({\n '& .cm-task-item': {\n padding: '0 4px',\n },\n});\n\nexport const tasklist = () => [statefield(), styles];\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};\n\nexport const codeTheme: {\n [selector: string]: StyleSpec;\n} = {\n '& .cm-scroller': {\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';\nimport { yCollab } from 'y-codemirror.next';\n\nimport { generateName } from '@dxos/display-name';\nimport { useThemeContext } from '@dxos/react-ui';\nimport { getColorForValue, inputSurface, mx } from '@dxos/react-ui-theme';\nimport { type YText } from '@dxos/text-model';\n\nimport { basicBundle, markdownBundle } from './extensions';\nimport { defaultTheme, 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 // TODO(burdon): Factor out extension (remove logic from react-ui-editor).\n // const collaboration = useCollaboration(model, themeMode);\n const { provider, peer } = model;\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 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 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 yCollab(model.content as YText, model.provider?.awareness),\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.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) && 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): Set default text theme?\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 }), ...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, defaultSlots);\n return (\n <BaseTextEditor\n ref={forwardedRef}\n extensions={[markdownBundle({ themeMode, placeholder: slots?.editor?.placeholder }), ...extensions]}\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", "//\n// Copyright 2023 DXOS.org\n//\n\nimport type { Extension } from '@codemirror/state';\nimport { useEffect, useState } 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 { content, provider, peer } = model;\n const [extension] = useState(() => {\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 text: () => string;\n provider?: Provider;\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): 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 // TODO(burdon): Remove?\n // eslint-disable-next-line unused-imports/no-unused-vars\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 (!text?.doc || !text?.content) {\n return undefined;\n }\n\n if (isActualAutomergeObject(text)) {\n const obj = text as any as AutomergeTextCompat;\n return {\n id: obj.id,\n content: content!,\n text: () => content!.toString(),\n provider: undefined,\n peer: identity\n ? {\n id: identity.identityKey.toHex(),\n name: identity.profile?.displayName,\n }\n : undefined,\n };\n }\n\n return {\n id: text.doc.guid,\n content: text.content,\n text: () => text.content!.toString(),\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", "autocompletion", "completionKeymap", "keymap", "autocomplete", "getOptions", "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", "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", "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", "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", "foldKeymap", "historyKeymap", "lintKeymap", "searchKeymap", "indentWithTab", "markdown", "base", "markdownLanguage", "codeLanguages", "languages", "extensions", "markdownTagsExtension", "syntaxHighlighting", "markdownHighlightStyle", "oneDarkHighlightStyle", "defaultHighlightStyle", "filter", "Boolean", "syntaxTree", "RangeSetBuilder", "StateField", "EditorView", "Decoration", "WidgetType", "CheckboxWidget", "WidgetType", "constructor", "_pos", "_getCursor", "_checked", "eq", "other", "toDOM", "view", "wrap", "document", "createElement", "setAttribute", "className", "box", "appendChild", "type", "checked", "onclick", "event", "isChecked", "state", "dispatch", "changes", "from", "to", "insert", "selection", "anchor", "ignoreEvent", "pos", "sliceDoc", "toLowerCase", "statefield", "lastPosition", "listener", "EditorView", "updateListener", "of", "update", "startState", "main", "head", "checkbox", "builder", "RangeSetBuilder", "syntaxTree", "iterate", "enter", "node", "name", "add", "Decoration", "replace", "widget", "finish", "StateField", "define", "create", "_", "tr", "provide", "field", "decorations", "styles", "baseTheme", "padding", "tasklist", "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", "codeTheme", "EditorState", "EditorView", "useFocusableGroup", "vim", "defaultsDeep", "React", "forwardRef", "useCallback", "useEffect", "useImperativeHandle", "useState", "yCollab", "generateName", "useThemeContext", "getColorForValue", "inputSurface", "mx", "EditorModes", "BaseTextEditor", "forwardRef", "model", "extensions", "slots", "defaultSlots", "editorMode", "forwardedRef", "themeMode", "useThemeContext", "tabsterDOMAttribute", "useFocusableGroup", "tabBehavior", "provider", "peer", "useEffect", "awareness", "setLocalStateField", "name", "generateName", "id", "color", "getColorForValue", "value", "type", "colorLight", "root", "setRoot", "useState", "state", "setState", "view", "setView", "useImperativeHandle", "EditorState", "create", "doc", "text", "vim", "EditorView", "baseTheme", "defaultTheme", "theme", "editor", "darkTheme", "of", "yCollab", "content", "filter", "Boolean", "destroy", "parent", "undefined", "handleKeyUp", "useCallback", "event", "key", "altKey", "shiftKey", "metaKey", "ctrlKey", "contentDOM", "focus", "div", "ref", "tabIndex", "onKeyUp", "TextEditor", "_slots", "props", "defaultsDeep", "defaultTextSlots", "basicBundle", "placeholder", "MarkdownEditor", "markdownBundle", "className", "mx", "inputSurface", "textTheme", "useEffect", "useState", "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", "content", "provider", "peer", "extension", "useState", "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", "toString", "peer", "identityKey", "toHex", "name", "profile", "displayName", "guid"]
|
|
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/blast.ts", "../../../src/components/TextEditor/extensions/code.ts", "../../../src/styles/markdown.ts", "../../../src/styles/tokens.ts", "../../../src/components/TextEditor/extensions/demo.ts", "../../../src/components/TextEditor/extensions/comments.ts", "../../../src/components/TextEditor/extensions/highlight.ts", "../../../src/components/TextEditor/extensions/image.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/components/TextEditor/extensions/mention.ts", "../../../src/components/TextEditor/extensions/table.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/translation/automerge-to-codemirror.ts", "../../../src/hooks/automerge/translation/codemirror-to-automerge.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// 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 completionKeymap,\n type Completion,\n type CompletionContext,\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 match = context.matchBefore(/\\w*/);\n if (!match || (match.from === match.to && !context.explicit)) {\n return null;\n }\n\n return {\n from: match.from,\n options: onSearch(match.text.toLowerCase()),\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 { drawSelection, EditorView, placeholder } from '@codemirror/view';\n\nimport type { ThemeMode } from '@dxos/react-ui';\n\nexport type BasicBundleOptions = {\n readonly?: boolean;\n themeMode?: ThemeMode;\n placeholder?: string;\n};\n\nexport const basicBundle = ({ readonly, themeMode, placeholder: _placeholder }: BasicBundleOptions): Extension[] =>\n [\n EditorView.lineWrapping,\n\n // TODO(burdon): Compare with minimalSetup.\n // https://codemirror.net/docs/ref/#codemirror.minimalSetup\n bracketMatching(),\n closeBrackets(),\n drawSelection(),\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// Based on a demo by Joel Besada and Kushagra Gour.\n// https://twitter.com/JoelBesada/status/670343885655293952\n// https://github.com/chinchang/code-blast-codemirror/blob/master/code-blast.js\n//\n\nimport { type Extension } from '@codemirror/state';\nimport { EditorView, keymap } from '@codemirror/view';\nimport defaultsDeep from 'lodash.defaultsdeep';\n\nimport { invariant } from '@dxos/invariant';\n\nexport type BlastOptions = {\n effect?: number;\n maxParticles: number;\n particleGravity: number;\n particleAlphaFadeout: number;\n particleSize: { min: number; max: number };\n particleNumRange: { min: number; max: number };\n particleVelocityRange: { x: [number, number]; y: [number, number] };\n particleShrinkRate: number;\n shakeIntensity: number;\n color?: () => number[];\n};\n\nexport const defaultOptions: BlastOptions = {\n effect: 2,\n maxParticles: 200,\n particleGravity: 0.08,\n particleAlphaFadeout: 0.996,\n particleSize: { min: 2, max: 8 },\n particleNumRange: { min: 5, max: 10 },\n particleVelocityRange: { x: [-1, 1], y: [-3.5, -1.5] },\n particleShrinkRate: 0.95,\n shakeIntensity: 5,\n};\n\nexport const blast = (options: Partial<BlastOptions> = defaultOptions): Extension => {\n let blaster: Blaster | undefined;\n let last = 0;\n\n const getPoint = (view: EditorView, pos: number) => {\n const { left: x = 0, top: y = 0 } = view.coordsForChar(pos) ?? {};\n const element = document.elementFromPoint(x, y);\n\n const { offsetLeft: left = 0, offsetTop: top = 0 } = view.scrollDOM.parentElement ?? {};\n const point = { x: x - left, y: y - top };\n\n return { element, point };\n };\n\n return [\n // Cursor moved.\n EditorView.updateListener.of((update) => {\n // NOTE: The MarkdownEditor may recreated the EditorView.\n if (blaster?.node !== update.view.scrollDOM) {\n if (blaster) {\n blaster.destroy();\n }\n\n blaster = new Blaster(\n update.view.scrollDOM,\n defaultsDeep(\n {\n particleGravity: 0.2,\n particleShrinkRate: 0.995,\n color: () => [100 + Math.random() * 100, 0, 0],\n },\n options,\n defaultOptions,\n ),\n );\n blaster.initialize();\n blaster.start(); // TODO(burdon): Stop/clean-up.\n } else {\n blaster.resize();\n }\n\n const current = update.state.selection.main.head;\n if (current !== last) {\n last = current;\n // TODO(burdon): Null if end of line.\n const { element, point } = getPoint(update.view, current - 1);\n if (element && point) {\n blaster.spawn({ element, point });\n }\n }\n }),\n\n keymap.of([\n {\n any: (_, event) => {\n if (blaster) {\n if (event.key === 'Enter' && event.shiftKey) {\n blaster.shake({ time: 0.8 });\n return true;\n }\n }\n\n return false;\n },\n },\n ]),\n ];\n};\n\n//\n// Blaster (no CM deps).\n//\n\nclass Blaster {\n private readonly _effect: Effect;\n\n _canvas: HTMLCanvasElement | undefined;\n _ctx: CanvasRenderingContext2D | undefined | null;\n\n _running = false;\n _lastTime: number | undefined;\n _shakeTime = 0;\n _shakeTimeMax = 0;\n\n _particles: Particle[] = [];\n _particlePointer = 0;\n\n _lastPoint = { x: 0, y: 0 };\n\n constructor(private readonly _node: HTMLElement, private readonly _options: BlastOptions) {\n this._effect = this._options.effect === 1 ? new Effect1(_options) : new Effect2(_options);\n }\n\n get node() {\n return this._node;\n }\n\n initialize() {\n // console.log('initialize');\n invariant(!this._canvas && !this._ctx);\n\n this._canvas = document.createElement('canvas');\n this._canvas.id = 'code-blast-canvas';\n this._canvas.style.position = 'absolute';\n this._canvas.style.zIndex = '0';\n this._canvas.style.pointerEvents = 'none';\n // this._canvas.style.border = '2px dashed red';\n\n this._ctx = this._canvas.getContext('2d');\n\n const parent = this._node.parentElement?.parentElement;\n parent?.appendChild(this._canvas);\n\n this.resize();\n }\n\n destroy() {\n this.stop();\n // console.log('destroy');\n if (this._canvas) {\n this._canvas.remove();\n this._canvas = undefined;\n this._ctx = undefined;\n }\n }\n\n resize() {\n if (this._node.parentElement && this._canvas) {\n const { offsetLeft: x, offsetTop: y, offsetWidth: width, offsetHeight: height } = this._node.parentElement;\n this._canvas.style.top = `${y}px`;\n this._canvas.style.left = `${x}px`;\n this._canvas.width = width;\n this._canvas.height = height;\n }\n }\n\n start() {\n // console.log('start');\n invariant(this._canvas && this._ctx);\n this._running = true;\n this.loop();\n }\n\n stop() {\n // console.log('stop');\n this._running = false;\n this._node.style.transform = 'translate(0px, 0px)';\n }\n\n loop() {\n if (!this._running || !this._canvas || !this._ctx) {\n return;\n }\n\n this._ctx.clearRect(0, 0, this._canvas.width ?? 0, this._canvas.height ?? 0);\n\n // Calculate the delta from the previous frame.\n const now = new Date().getTime();\n this._lastTime ??= now;\n const dt = (now - this._lastTime) / 1000;\n this._lastTime = now;\n\n if (this._shakeTime > 0) {\n this._shakeTime -= dt;\n const magnitude = (this._shakeTime / this._shakeTimeMax) * this._options.shakeIntensity;\n const shakeX = random(-magnitude, magnitude);\n const shakeY = random(-magnitude, magnitude);\n this._node!.style.transform = `translate(${shakeX}px,${shakeY}px)`;\n }\n\n this.drawParticles();\n\n requestAnimationFrame(this.loop.bind(this));\n }\n\n shake = throttle<{ time: number }>(({ time }) => {\n this._shakeTime = this._shakeTimeMax || time;\n this._shakeTimeMax = time;\n }, 100);\n\n spawn = throttle<{ element: Element; point: { x: number; y: number } }>(({ element, point }) => {\n const color = getRGBComponents(element, this._options.color);\n const numParticles = random(this._options.particleNumRange.min, this._options.particleNumRange.max);\n const dir = this._lastPoint.x === point.x ? 0 : this._lastPoint.x < point.x ? 1 : -1;\n this._lastPoint = point;\n for (let i = numParticles; i--; i > 0) {\n this._particles[this._particlePointer] = this._effect.create(point.x - dir * 16, point.y, color);\n this._particlePointer = (this._particlePointer + 1) % this._options.maxParticles;\n }\n }, 100);\n\n drawParticles() {\n for (let i = this._particles.length; i--; i > 0) {\n const particle = this._particles[i];\n if (!particle) {\n continue;\n }\n\n if (particle.alpha < 0.01 || particle.size <= 0.5) {\n continue;\n }\n\n this._effect.update(this._ctx!, particle);\n }\n }\n}\n\n//\n// Effects\n//\n\ntype Particle = {\n x: number;\n y: number;\n vx: number;\n vy: number;\n size: number;\n color: (string | number)[];\n alpha: number;\n theta?: number;\n drag?: number;\n wander?: number;\n};\n\nabstract class Effect {\n constructor(protected readonly _options: BlastOptions) {}\n abstract create(x: number, y: number, color: Particle['color']): Particle;\n abstract update(ctx: CanvasRenderingContext2D, particle: Particle): void;\n}\n\nclass Effect1 extends Effect {\n create(x: number, y: number, color: Particle['color']) {\n return {\n x,\n y: y + 10,\n vx: random(this._options.particleVelocityRange.x[0], this._options.particleVelocityRange.x[1]),\n vy: random(this._options.particleVelocityRange.y[0], this._options.particleVelocityRange.y[1]),\n size: random(this._options.particleSize.min, this._options.particleSize.max),\n color,\n alpha: 1,\n };\n }\n\n update(ctx: CanvasRenderingContext2D, particle: Particle) {\n particle.vy += this._options.particleGravity;\n particle.x += particle.vx;\n particle.y += particle.vy;\n particle.alpha *= this._options.particleAlphaFadeout;\n\n ctx.fillStyle = `rgba(${particle.color[0]},${particle.color[1]},${particle.color[2]},${particle.alpha})`;\n ctx.fillRect(Math.round(particle.x - 1), Math.round(particle.y - 1), particle.size, particle.size);\n }\n}\n\n/**\n * Based on Soulwire's demo.\n * http://codepen.io/soulwire/pen/foktm\n */\nclass Effect2 extends Effect {\n create(x: number, y: number, color: Particle['color']) {\n return {\n x,\n y: y + 10,\n vx: random(this._options.particleVelocityRange.x[0], this._options.particleVelocityRange.x[1]),\n vy: random(this._options.particleVelocityRange.y[0], this._options.particleVelocityRange.y[1]),\n size: random(this._options.particleSize.min, this._options.particleSize.max),\n color,\n alpha: 1,\n theta: (random(0, 360) * Math.PI) / 180,\n drag: 0.92,\n wander: 0.15,\n };\n }\n\n update(ctx: CanvasRenderingContext2D, particle: Particle) {\n particle.vy += this._options.particleGravity;\n particle.x += particle.vx;\n particle.y += particle.vy;\n particle.vx *= particle.drag!;\n particle.vy *= particle.drag!;\n particle.theta! += random(-0.5, 0.5);\n particle.vx += Math.sin(particle.theta!) * 0.1;\n particle.vy += Math.cos(particle.theta!) * 0.1;\n particle.size *= this._options.particleShrinkRate;\n particle.alpha *= this._options.particleAlphaFadeout;\n\n ctx.fillStyle = `rgba(${particle.color[0]},${particle.color[1]},${particle.color[2]},${particle.alpha})`;\n ctx.beginPath();\n ctx.arc(Math.round(particle.x - 1), Math.round(particle.y - 1), particle.size, 0, 2 * Math.PI);\n ctx.fill();\n }\n}\n\n//\n// Utils\n//\n\nfunction throttle<T>(callback: (arg: T) => void, limit: number): (arg: T) => void {\n let wait = false;\n return function (...args: any[]) {\n if (!wait) {\n // @ts-ignore\n callback.apply(this, args);\n wait = true;\n setTimeout(() => {\n wait = false;\n }, limit);\n }\n };\n}\n\nconst getRGBComponents = (node: Element, color: BlastOptions['color']): Particle['color'] => {\n if (typeof color === 'function') {\n return color();\n }\n\n const bgColor = getComputedStyle(node).color;\n if (bgColor) {\n const x = bgColor.match(/(\\d+), (\\d+), (\\d+)/)?.slice(1);\n if (x) {\n return x;\n }\n }\n\n return [50, 50, 50];\n};\n\nconst random = (min: number, max: number) => {\n if (!max) {\n max = min;\n min = 0;\n }\n\n return min + ~~(Math.random() * (max - min + 1));\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Range } from '@codemirror/state';\nimport {\n ViewPlugin,\n type DecorationSet,\n EditorView,\n type ViewUpdate,\n Decoration,\n type BlockInfo,\n} from '@codemirror/view';\nimport get from 'lodash.get';\n\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { tokens } from '../../../styles';\n\nconst CODE_REGEX = /```[\\s\\S]*?```/gs;\n\n// TODO(burdon): Reconcile with theme.\nconst styles = EditorView.baseTheme({\n '& .cm-code-block': {\n display: 'block',\n paddingInline: '4px !important',\n },\n '&light .cm-code-block': {\n background: get(tokens, 'extend.colors.neutral.50'),\n },\n '&dark .cm-code-block': {\n background: get(tokens, 'extend.colors.neutral.850'),\n },\n '& .cm-code-block-first': {\n paddingTop: '4px !important',\n borderTopLeftRadius: '4px',\n borderTopRightRadius: '4px',\n },\n '& .cm-code-block-last': {\n paddingBottom: '4px !important',\n borderBottomLeftRadius: '4px',\n borderBottomRightRadius: '4px',\n },\n});\n\nconst getLineRange = (lines: BlockInfo[], from: number, to: number) => {\n const start = lines.findIndex((line) => line.from >= from);\n const end = lines.findIndex((line) => line.to >= to);\n return [start, end];\n};\n\nexport const code = () => {\n const getDecorations = (view: EditorView) => {\n const decorations: Range<Decoration>[] = [];\n if (view.state.readOnly) {\n const text = view.state.doc.sliceString(0);\n const matches = text.matchAll(CODE_REGEX);\n const blocks = view.viewportLineBlocks;\n for (const match of matches) {\n const range = getLineRange(blocks, match.index!, match.index! + match[0].length);\n for (let i = range[0]; i <= range[1]; i++) {\n const block = blocks[i];\n decorations.push(\n Decoration.line({\n class: mx(\n 'cm-code-block',\n i === range[0] && 'cm-code-block-first',\n i === range[1] && 'cm-code-block-last',\n ),\n }).range(block.from),\n );\n }\n }\n }\n\n return Decoration.set(decorations);\n };\n\n return [\n ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n constructor(view: EditorView) {\n this.decorations = getDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = getDecorations(update.view);\n }\n }\n },\n {\n decorations: (value) => value.decorations,\n },\n ),\n styles,\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// TODO(burdon): Better way to align vertically than negative margin? Font-specific?\n// https://tailwindcss.com/docs/font-weight\nexport const headings: Record<HeadingLevel, string[]> = {\n 1: ['mbs-4 mbe-2 font-medium text-inherit no-underline text-4xl', '-ml-[10px]'],\n 2: ['mbs-4 mbe-2 font-medium text-inherit no-underline text-3xl', '-ml-[8px]'],\n 3: ['mbs-4 mbe-2 font-medium text-inherit no-underline text-2xl', '-ml-[7px]'],\n 4: ['mbs-4 mbe-2 font-medium text-inherit no-underline text-xl', '-ml-[6px]'],\n 5: ['mbs-4 mbe-2 font-medium text-inherit no-underline text-lg', '-ml-[5px]'],\n 6: ['mbs-4 mbe-2 font-medium text-inherit no-underline', '-ml-[4px]'],\n};\n\nexport const heading = (level: HeadingLevel, readonly?: boolean) => {\n const [style, offset] = headings[level];\n return mx(style, readonly && offset);\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 =\n 'flex mlb-4 border-b text-neutral-100 dark:text-neutral-900 border-neutral-200 dark:border-neutral-800';\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 { type Extension } from '@codemirror/state';\nimport { keymap } from '@codemirror/view';\n\n// TODO(burdon): Review https://github.com/sergeche/codemirror-movie?tab=readme-ov-file\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 = {}): Extension => {\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// 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\nclass BookmarkWidget extends WidgetType {\n constructor(private readonly _pos: number, private readonly _id: string, private readonly _handleClick: () => void) {\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 span.textContent = '§';\n span.onclick = () => this._handleClick();\n return span;\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?: (from: number, to: number) => 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, () => handleUpdate({ active: 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 handleUpdate = 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 { from, to, head } = view.state.selection.main;\n const id = options.onCreate?.(from, to);\n if (id) {\n const tag = `[^${id}]`;\n // TODO(burdon): Add selection.\n view.dispatch({\n changes: { from: head, insert: tag },\n selection: { anchor: head + 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, state } = update;\n const pos = 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): Handle multiple visible ranges in large documents.\n const { from, to } = /* view.visibleRanges?.[0] ?? */ { from: 0, to: 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 handleUpdate({\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//\n\nimport { type Extension, StateEffect, StateField } from '@codemirror/state';\nimport { Decoration, EditorView } from '@codemirror/view';\nimport sortBy from 'lodash.sortby';\nimport { useEffect } from 'react';\n\nimport { type DocumentRange } from '../../../hooks';\n\n// TODO(burdon): Detect click, or cursor proximity.\n\n// TODO(burdon): Reconcile with theme.\nconst styles = EditorView.baseTheme({\n '& .cm-highlight': {\n backgroundColor: 'yellow', // TODO(burdon): Reconcile with tailwind theme.\n },\n '& .cm-highlight::before': {\n content: ']',\n },\n '& .cm-highlight-active': {\n backgroundColor: 'lime',\n },\n});\n\nconst marks = {\n highlight: Decoration.mark({ class: 'cm-highlight' }),\n HighlightActive: Decoration.mark({ class: 'cm-highlight-active' }),\n};\n\ntype HighlightRange = DocumentRange & { active?: boolean };\n\n// TODO(burdon): Make configurable to support multiple layers.\nconst setHighlights = StateEffect.define<HighlightRange[]>();\n\n/**\n * Update field set.\n */\n// TODO(burdon): Reconcile range from data model, vs. in-markdown characters.\nexport const useHighlights = (view: EditorView | undefined, ranges: HighlightRange[] = []) => {\n useEffect(() => {\n view?.dispatch({\n effects: setHighlights.of(ranges),\n });\n }, [view, ranges]);\n};\n\n/**\n * State field that tracks highlight ranges.\n */\nexport const highlightStateField = StateField.define<HighlightRange[]>({\n create: () => [],\n update: (threads, tr) => {\n for (const effect of tr.effects) {\n if (effect.is(setHighlights)) {\n return effect.value;\n }\n }\n\n return threads;\n },\n});\n\n/**\n * Decorate ranges.\n */\n// TODO(burdon): Pass in field to make reusable (e.g., comments, search).\nexport const highlightDecorations = EditorView.decorations.compute([highlightStateField], (state) => {\n const selectionRanges = state.field(highlightStateField);\n const decorations =\n sortBy(selectionRanges ?? [], (selection) => selection.from)?.flatMap((selection) => {\n const range = { from: selection.from, to: selection.to + 1 };\n if (selection.to > selection.from) {\n if (selection.active) {\n return marks.HighlightActive.range(range.from, range.to);\n } else {\n return marks.highlight.range(range.from, range.to);\n }\n } else {\n return [];\n }\n }) ?? [];\n\n return Decoration.set(decorations);\n});\n\n// TODO(burdon): Use current range to create comment.\n// TODO(burdon): Allow/prevent overlapping?\n\n/**\n * Track cursor entering and existing ranges.\n */\nconst listener = (options: HighlightOptions) => {\n return EditorView.updateListener.of((update) => {\n const { view, state } = update;\n const { /* from, to, */ head } = state.selection.main;\n const ranges = state.field(highlightStateField);\n\n // TODO(burdon): Modify range if editing.\n // console.log('::::', update);\n\n // Set active.\n let mod = false;\n const newRanges = ranges.map((range) => {\n const active = head >= range.from && head <= range.to;\n if (active !== range.active) {\n mod = true;\n return { ...range, active };\n } else {\n return range;\n }\n });\n\n if (mod) {\n view.dispatch({ effects: setHighlights.of(newRanges) });\n options?.onChange?.(newRanges.find((range) => range.active)?.id);\n }\n });\n};\n\nexport type HighlightOptions = {\n onChange?: (active?: string) => {};\n};\n\nexport const highlight = (options: HighlightOptions = {}): Extension => {\n return [highlightStateField, highlightDecorations, listener(options), styles];\n};\n", "//\n// Copyright 2023 DXOS.org\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\nexport type ImageOptions = {};\n\nexport const image = (options: ImageOptions = {}): 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\nconst update = (state: EditorState, options: ImageOptions) => {\n const builder = new RangeSetBuilder();\n const cursor = state.selection.main.head;\n\n syntaxTree(state).iterate({\n enter: (node) => {\n if (node.name === 'Image') {\n const urlNode = node.node.getChild('URL');\n if (urlNode) {\n const hide = state.readOnly || cursor < node.from || cursor > node.to;\n const url = state.sliceDoc(urlNode.from, urlNode.to);\n builder.add(\n hide ? node.from : node.to,\n node.to,\n Decoration.replace({\n widget: new ImageWidget(url),\n }),\n );\n }\n }\n },\n });\n\n return builder.finish();\n};\n\nclass ImageWidget extends WidgetType {\n constructor(readonly _url: string) {\n super();\n }\n\n override eq(other: WidgetType) {\n return this._url === (other as any as ImageWidget)?._url;\n }\n\n toDOM(view: EditorView) {\n const img = document.createElement('img');\n img.setAttribute('src', this._url);\n img.setAttribute('class', 'cm-image');\n return img;\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\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\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\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 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 (state.readOnly || 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", "//\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 */\nexport const listener = ({ onChange }: ListenerOptions) => {\n return 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", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { closeBrackets, closeBracketsKeymap } from '@codemirror/autocomplete';\nimport { history, historyKeymap, indentWithTab, standardKeymap } 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 { 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 keymap,\n placeholder,\n} from '@codemirror/view';\n\nimport type { ThemeMode } from '@dxos/react-ui';\n\nimport { markdownHighlightStyle, markdownTagsExtensions } from './highlight';\n\nexport type MarkdownBundleOptions = {\n readonly?: boolean;\n themeMode?: ThemeMode;\n placeholder?: string;\n};\n\n/**\n * Markdown bundle.\n * Refs:\n * https://github.com/codemirror/basic-setup\n * https://github.com/codemirror/basic-setup/blob/main/src/codemirror.ts#L50\n * https://codemirror.net/docs/community\n * https://codemirror.net/docs/ref/#codemirror.basicSetup\n */\n// TODO(burdon): Add Composer here: https://codemirror.net/docs/community\nexport const markdownBundle = ({\n readonly,\n themeMode,\n placeholder: _placeholder,\n}: MarkdownBundleOptions): Extension[] => {\n return [\n EditorState.allowMultipleSelections.of(true),\n EditorState.tabSize.of(2),\n EditorView.lineWrapping,\n\n customKeymap(),\n\n bracketMatching(),\n closeBrackets(),\n crosshairCursor(),\n dropCursor(),\n drawSelection(),\n highlightActiveLine(),\n history(),\n indentOnInput(),\n _placeholder && placeholder(_placeholder),\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 provided by default.\n markdownTagsExtensions,\n ],\n }),\n\n // https://github.com/codemirror/theme-one-dark\n themeMode === 'dark' ? syntaxHighlighting(oneDarkHighlightStyle) : syntaxHighlighting(defaultHighlightStyle),\n\n // Custom styles.\n syntaxHighlighting(markdownHighlightStyle(readonly)),\n ].filter(Boolean) as Extension[];\n};\n\n// https://codemirror.net/docs/ref/#view.keymap\nconst customKeymap = () =>\n keymap.of([\n // https://codemirror.net/docs/ref/#commands.indentWithTab\n indentWithTab,\n // https://codemirror.net/docs/ref/#commands.standardKeymap\n ...standardKeymap,\n // https://codemirror.net/docs/ref/#commands.historyKeymap\n ...historyKeymap,\n // https://codemirror.net/docs/ref/#autocomplete.closeBracketsKeymap\n ...closeBracketsKeymap,\n // https://codemirror.net/docs/ref/#search.searchKeymap\n ...searchKeymap,\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, Table } from '@lezer/markdown';\nimport get from 'lodash.get';\n\nimport { mx } from '@dxos/react-ui-theme';\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 // Custom.\n TableCell: Tag.define(),\n};\n\n// TODO(burdon): Customize table parser (make all content monospace).\n// https://github.com/lezer-parser/markdown/blob/main/src/extension.ts\nTable.defineNodes?.forEach((node: any) => {\n switch (node?.name) {\n case 'TableCell': {\n node.style = markdownTags.TableCell;\n break;\n }\n }\n});\n\nexport const markdownTagsExtensions: MarkdownConfig[] = [\n Table,\n {\n props: [styleTags(markdownTags)],\n },\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://github.com/lezer-parser/highlight/blob/main/src/highlight.ts#L427\n * https://lezer.codemirror.net/docs/ref/#highlight.tags (list of tags)\n *\n * Examples:\n * - https://github.com/codemirror/language/blob/main/src/highlight.ts#L194\n * - https://github.com/codemirror/theme-one-dark/blob/main/src/one-dark.ts#L115\n */\nexport const markdownHighlightStyle = (readonly?: boolean) => {\n return 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.LinkLabel,\n markdownTags.LinkReference,\n markdownTags.ListMark,\n ],\n class: mark,\n },\n\n // Markdown marks.\n {\n tag: [markdownTags.CodeMark, markdownTags.HeaderMark, markdownTags.QuoteMark, markdownTags.EmphasisMark],\n class: readonly ? 'hidden' : mark,\n },\n\n // E.g., code block language (after ```).\n {\n tag: [tags.function(tags.variableName), tags.labelName],\n class: readonly ? 'hidden' : codeMark,\n },\n\n {\n tag: [tags.monospace],\n class: 'font-mono',\n },\n\n // Headings.\n { tag: tags.heading1, class: heading(1, readonly) },\n { tag: tags.heading2, class: heading(2, readonly) },\n { tag: tags.heading3, class: heading(3, readonly) },\n { tag: tags.heading4, class: heading(4, readonly) },\n { tag: tags.heading5, class: heading(5, readonly) },\n { tag: tags.heading6, class: heading(6, readonly) },\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 // 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 // TODO(burdon): Replace with extension.\n {\n tag: [markdownTags.HorizontalRule],\n class: mx(horizontalRule, readonly && '-indent-[100rem]'),\n },\n\n // TODO(burdon): Only if being edited.\n {\n tag: [markdownTags.TableCell],\n class: 'font-mono',\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", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { autocompletion, type CompletionContext, type CompletionResult } from '@codemirror/autocomplete';\nimport type { Extension } from '@codemirror/state';\n\nexport type MentionOptions = {\n onSearch: (text: string) => string[];\n};\n\nexport const mention = ({ onSearch }: MentionOptions): Extension => {\n return autocompletion({\n closeOnBlur: false, // For debugging.\n override: [\n (context: CompletionContext): CompletionResult | null => {\n const match = context.matchBefore(/@(\\w+)?/);\n if (!match || (match.from === match.to && !context.explicit)) {\n return null;\n }\n\n console.log(match);\n\n return {\n from: match.from,\n options: onSearch(match.text.slice(1).toLowerCase()).map((value) => ({ label: `@${value}` })),\n };\n },\n ],\n });\n};\n", "//\n// Copyright 2023 DXOS.org\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// TODO(burdon): Snippet to create basic table.\n// https://codemirror.net/docs/ref/#autocomplete.snippet\n\nexport type TableOptions = {};\n\n/**\n * GFM tables.\n * https://github.github.com/gfm/#tables-extension\n */\nexport const table = (options: TableOptions = {}) => {\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\ntype Table = {\n from: number;\n to: number;\n header?: string[];\n rows?: string[][];\n};\n\nconst update = (state: EditorState, options: TableOptions) => {\n const builder = new RangeSetBuilder();\n const cursor = state.selection.main.head;\n\n const tables: Table[] = [];\n const getTable = () => tables[tables.length - 1];\n const getRow = () => {\n const table = getTable();\n return table.rows?.[table.rows.length - 1];\n };\n\n // Parse table.\n syntaxTree(state).iterate({\n enter: (node) => {\n // Check if cursor is inside text.\n switch (node.name) {\n case 'Table': {\n tables.push({ from: node.from, to: node.to });\n break;\n }\n case 'TableHeader': {\n getTable().header = [];\n break;\n }\n case 'TableRow': {\n (getTable().rows ??= []).push([]);\n break;\n }\n case 'TableCell': {\n const row = getRow();\n if (row) {\n row.push(state.sliceDoc(node.from, node.to));\n } else {\n getTable().header?.push(state.sliceDoc(node.from, node.to));\n }\n break;\n }\n }\n },\n });\n\n tables.forEach((table) => {\n const hide = state.readOnly || cursor < table.from || cursor > table.to;\n hide && builder.add(table.from, table.to, Decoration.replace({ widget: new TableWidget(table) }));\n builder.add(table.from, table.to, Decoration.mark({ class: 'cm-table' }));\n });\n\n return builder.finish();\n};\n\nclass TableWidget extends WidgetType {\n constructor(readonly _table: Table) {\n super();\n }\n\n override eq(other: WidgetType) {\n return this._table.from === (other as any as TableWidget)?._table?.from;\n }\n\n toDOM(view: EditorView) {\n const table = document.createElement('table');\n\n {\n const header = table.appendChild(document.createElement('thead'));\n const tr = header.appendChild(document.createElement('tr'));\n this._table.header?.forEach((cell) => {\n const th = document.createElement('th');\n th.setAttribute('class', 'cm-table-head');\n tr.appendChild(th).textContent = cell;\n });\n }\n\n {\n const body = table.appendChild(document.createElement('tbody'));\n this._table.rows?.forEach((row) => {\n const tr = body.appendChild(document.createElement('tr'));\n row.forEach((cell) => {\n const td = document.createElement('td');\n td.setAttribute('class', 'cm-table-cell');\n tr.appendChild(td).textContent = cell;\n });\n });\n }\n\n return table;\n }\n}\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\n// TODO(burdon): Reconcile with theme.\nconst styles = EditorView.baseTheme({\n '& .cm-task-item': {\n paddingLeft: '4px',\n paddingRight: '8px',\n },\n});\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 if (!this._onCheck) {\n input.setAttribute('disabled', 'true');\n }\n if (this._onCheck) {\n input.onchange = (event: Event) => {\n this._onCheck?.((event.target as any).checked);\n return true;\n };\n }\n\n return wrap;\n }\n\n override ignoreEvent() {\n return false;\n }\n}\n\nexport type TasklistOptions = {};\n\nexport const tasklist = (options: TasklistOptions = {}) => {\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(\n pos,\n checked,\n indent,\n view.state.readOnly\n ? undefined\n : (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\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: (value) => value.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 *\n * Examples:\n * - https://github.com/codemirror/view/blob/main/src/theme.ts\n * - https://github.com/codemirror/theme-one-dark/blob/main/src/one-dark.ts\n *\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, &light .cm-dropCursor': {\n borderLeft: '2px solid black',\n },\n '&dark .cm-cursor, &dark .cm-dropCursor': {\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\n //\n // autocomplete\n //\n '& .cm-tooltip-autocomplete': {\n marginTop: '4px',\n marginLeft: '-3px',\n },\n '& .cm-tooltip-autocomplete ul li': {},\n '& .cm-tooltip-autocomplete ul li[aria-selected]': {},\n '& .cm-completionIcon': {\n display: 'none',\n },\n '& .cm-completionLabel': {\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n },\n '& .cm-completionMatchedText': {\n textDecoration: 'none',\n },\n\n //\n // widgets\n //\n '& .cm-widgetBuffer': {\n display: 'none',\n height: 0,\n },\n\n //\n // table\n //\n '& .cm-table *': {\n fontFamily: `${get(tokens, 'fontFamily.mono', []).join(',')} !important`,\n textDecoration: 'none !important',\n },\n '& .cm-table-head': {\n padding: '2px 16px 2px 0px',\n borderBottom: `1px solid ${get(tokens, 'extend.colors.neutral.500')}`,\n fontWeight: 100,\n textAlign: 'left',\n color: get(tokens, 'extend.colors.neutral.500'),\n },\n '& .cm-table-cell': {\n padding: '2px 16px 2px 0px',\n },\n\n //\n // image\n //\n '& .cm-image': {\n margin: '0.5rem 0',\n },\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 /**\n * Panels\n * https://github.com/codemirror/search/blob/main/src/search.ts#L745\n *\n * Find/replace panel.\n * <div class=\"cm-announced\">...</div>\n * <div class=\"cm-scroller\">...</div>\n * <div class=\"cm-panels cm-panels-bottom\">\n * <div class=\"cm-search cm-panel\">\n * <input class=\"cm-textfield\" />\n * <button class=\"cm-button\">...</button>\n * <label><input type=\"checkbox\" />...</label>\n * </div>\n * </div\n */\n '& .cm-panels': {\n border: `1px solid ${get(tokens, 'extend.colors.neutral.200')}`,\n borderBottom: 'none',\n },\n '& .cm-panel': {\n background: get(tokens, 'extend.colors.neutral.50'),\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n },\n '& .cm-button': {\n margin: '4px',\n fontFamily: get(tokens, 'fontFamily.body', []).join(','),\n background: get(tokens, 'extend.colors.neutral.100'),\n border: 'none',\n },\n\n '& .cm-searchMatch': {\n backgroundColor: get(tokens, 'extend.colors.yellow.100'),\n },\n '& .cm-searchMatch.cm-searchMatch-selected': {\n backgroundColor: get(tokens, 'extend.colors.primary.100'),\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, 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 readonly?: boolean;\n editorMode?: EditorMode;\n extensions?: Extension[];\n slots?: TextEditorSlots;\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, readonly, editorMode, extensions = [], slots = defaultSlots }, 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 // TODO(burdon): Get from model.\n // useHighlights(view, [\n // { id: 'c-1', from: 0, to: 20 },\n // { id: 'c-2', from: 100, to: 120 },\n // ]);\n\n useEffect(() => {\n if (!root) {\n return;\n }\n\n const state = EditorState.create({\n doc: model.text(),\n extensions: [\n readonly && EditorState.readOnly.of(readonly),\n\n // TODO(burdon): Factor out VIM mode?\n editorMode === 'vim' && vim(),\n\n // Theme.\n // TODO(burdon): Make optional.\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(\n new EditorView({\n state,\n parent: root,\n // NOTE: Uncomment to spy on all transactions.\n // https://codemirror.net/docs/ref/#view.EditorView.dispatch\n // dispatch: (transaction, view) => {\n // view.update([transaction]);\n // },\n }),\n );\n setState(state);\n\n return () => {\n view?.destroy();\n setView(undefined);\n setState(undefined);\n };\n }, [root, model, themeMode, readonly, 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\nexport const TextEditor = forwardRef<TextEditorRef, TextEditorProps>(\n ({ readonly, extensions = [], slots: _slots, ...props }, forwardedRef) => {\n const { themeMode } = useThemeContext();\n const slots = defaultsDeep({}, _slots, defaultTextSlots);\n return (\n <BaseTextEditor\n ref={forwardedRef}\n readonly={readonly}\n extensions={[basicBundle({ readonly, themeMode, placeholder: slots?.editor?.placeholder }), ...extensions]}\n slots={slots}\n {...props}\n />\n );\n },\n);\n\nexport const MarkdownEditor = forwardRef<TextEditorRef, TextEditorProps>(\n ({ readonly, extensions = [], slots: _slots, ...props }, forwardedRef) => {\n const { themeMode } = useThemeContext();\n const slots = defaultsDeep({}, _slots, defaultMarkdownSlots);\n return (\n <BaseTextEditor\n ref={forwardedRef}\n readonly={readonly}\n extensions={[markdownBundle({ readonly, themeMode, placeholder: slots?.editor?.placeholder }), ...extensions]}\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\nexport type DocumentRange = {\n id: string;\n from: number;\n to: number;\n};\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 ranges: DocumentRange[];\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 ranges: [],\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 ranges: [],\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\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\n// TODO(burdon): Additional copyright?\n\nimport { type EditorView } from '@codemirror/view';\n\nimport { next as automerge } from '@dxos/automerge/automerge';\n\nimport { type IDocHandle } from './handle';\nimport { type Field, isReconcileTx, getPath, reconcileAnnotationType, updateHeads, getLastHeads } from './plugin';\nimport { automergeToCodemirror, codemirrorToAutomerge } from './translation';\n\ntype Doc<T> = automerge.Doc<T>;\ntype Heads = automerge.Heads;\n\ntype ChangeFn = (atHeads: Heads, change: (doc: Doc<unknown>) => void) => Heads | undefined;\n\n/**\n * TODO(burdon): Comment.\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 // Apply the unreconciled transactions to the document.\n let newHeads = codemirrorToAutomerge(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 and apply that to the codemirror doc.\n const diff = automerge.equals(oldHeads, newHeads) ? [] : automerge.diff(handle.docSync()!, oldHeads, newHeads);\n automergeToCodemirror(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\n// TODO(burdon): Additional copyright?\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 const automergeToCodemirror = (\n view: EditorView,\n selection: EditorSelection,\n target: Prop[],\n patches: Patch[],\n) => {\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\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\n// TODO(burdon): Additional copyright?\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 const codemirrorToAutomerge = (\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\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", "match", "matchBefore", "from", "to", "explicit", "options", "text", "toLowerCase", "closeBrackets", "bracketMatching", "defaultHighlightStyle", "syntaxHighlighting", "oneDarkHighlightStyle", "drawSelection", "EditorView", "placeholder", "basicBundle", "readonly", "themeMode", "placeholder", "_placeholder", "EditorView", "lineWrapping", "bracketMatching", "closeBrackets", "drawSelection", "syntaxHighlighting", "oneDarkHighlightStyle", "defaultHighlightStyle", "filter", "Boolean", "EditorView", "keymap", "defaultsDeep", "invariant", "defaultOptions", "effect", "maxParticles", "particleGravity", "particleAlphaFadeout", "particleSize", "min", "max", "particleNumRange", "particleVelocityRange", "x", "y", "particleShrinkRate", "shakeIntensity", "blast", "options", "blaster", "last", "getPoint", "view", "pos", "left", "top", "coordsForChar", "element", "document", "elementFromPoint", "offsetLeft", "offsetTop", "scrollDOM", "parentElement", "point", "updateListener", "of", "update", "node", "destroy", "Blaster", "color", "Math", "random", "initialize", "start", "resize", "current", "state", "selection", "main", "head", "spawn", "any", "_", "event", "key", "shiftKey", "shake", "time", "constructor", "_node", "_options", "_running", "_shakeTime", "_shakeTimeMax", "_particles", "_particlePointer", "_lastPoint", "throttle", "getRGBComponents", "numParticles", "dir", "i", "_effect", "create", "Effect1", "Effect2", "_canvas", "_ctx", "createElement", "id", "style", "position", "zIndex", "pointerEvents", "getContext", "parent", "appendChild", "stop", "remove", "undefined", "offsetWidth", "width", "offsetHeight", "height", "loop", "transform", "clearRect", "now", "Date", "getTime", "_lastTime", "dt", "magnitude", "shakeX", "shakeY", "drawParticles", "requestAnimationFrame", "bind", "length", "particle", "alpha", "size", "Effect", "vx", "vy", "ctx", "fillStyle", "fillRect", "round", "theta", "PI", "drag", "wander", "sin", "cos", "beginPath", "arc", "fill", "callback", "limit", "wait", "args", "apply", "setTimeout", "bgColor", "getComputedStyle", "match", "slice", "ViewPlugin", "EditorView", "Decoration", "get", "mx", "mx", "headings", "heading", "level", "readonly", "style", "offset", "mx", "light", "mark", "mx", "bold", "italic", "strikethrough", "code", "codeMark", "inlineUrl", "mx", "code", "blockquote", "light", "horizontalRule", "tailwindConfig", "tokens", "tailwindConfig", "theme", "CODE_REGEX", "styles", "EditorView", "baseTheme", "display", "paddingInline", "background", "get", "tokens", "paddingTop", "borderTopLeftRadius", "borderTopRightRadius", "paddingBottom", "borderBottomLeftRadius", "borderBottomRightRadius", "getLineRange", "lines", "from", "to", "start", "findIndex", "line", "end", "code", "getDecorations", "view", "decorations", "state", "readOnly", "text", "doc", "sliceString", "matches", "matchAll", "blocks", "viewportLineBlocks", "match", "range", "index", "length", "i", "block", "push", "Decoration", "class", "mx", "set", "ViewPlugin", "fromClass", "constructor", "update", "docChanged", "viewportChanged", "value", "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", "styles", "baseTheme", "cursor", "margin", "padding", "backgroundColor", "BookmarkWidget", "constructor", "_pos", "_id", "_handleClick", "eq", "other", "toDOM", "span", "document", "createElement", "className", "textContent", "onclick", "comments", "options", "active", "bookmarkMatcher", "regexp", "decoration", "match", "view", "pos", "id", "replace", "widget", "handleUpdate", "bookmarks", "fromClass", "createDeco", "update", "updateDeco", "decorations", "instance", "provide", "plugin", "atomicRanges", "of", "none", "data", "onUpdate", "key", "run", "from", "to", "head", "state", "selection", "main", "onCreate", "tag", "dispatch", "changes", "insert", "anchor", "length", "updateListener", "undefined", "rangeSet", "closest", "Infinity", "doc", "between", "value", "push", "d", "Math", "min", "abs", "spec", "items", "map", "location", "coordsAtPos", "StateEffect", "StateField", "Decoration", "EditorView", "sortBy", "useEffect", "styles", "EditorView", "baseTheme", "backgroundColor", "content", "marks", "highlight", "Decoration", "mark", "class", "HighlightActive", "setHighlights", "StateEffect", "define", "useHighlights", "view", "ranges", "useEffect", "dispatch", "effects", "of", "highlightStateField", "StateField", "create", "update", "threads", "tr", "effect", "is", "value", "highlightDecorations", "decorations", "compute", "state", "selectionRanges", "field", "sortBy", "selection", "from", "flatMap", "range", "to", "active", "set", "listener", "options", "updateListener", "head", "main", "mod", "newRanges", "map", "onChange", "find", "id", "syntaxTree", "RangeSetBuilder", "StateField", "Decoration", "EditorView", "WidgetType", "image", "options", "StateField", "define", "create", "state", "update", "_", "tr", "provide", "field", "EditorView", "decorations", "from", "builder", "RangeSetBuilder", "cursor", "selection", "main", "head", "syntaxTree", "iterate", "enter", "node", "name", "urlNode", "getChild", "hide", "readOnly", "to", "url", "sliceDoc", "add", "Decoration", "replace", "widget", "ImageWidget", "finish", "WidgetType", "constructor", "_url", "eq", "other", "toDOM", "view", "img", "document", "createElement", "setAttribute", "syntaxTree", "RangeSetBuilder", "StateField", "Decoration", "EditorView", "WidgetType", "link", "options", "StateField", "define", "create", "state", "update", "_", "tr", "provide", "field", "EditorView", "decorations", "from", "LinkButton", "WidgetType", "constructor", "_pos", "_url", "_onAttach", "eq", "other", "toDOM", "view", "el", "document", "createElement", "LinkText", "_text", "setAttribute", "textContent", "href", "onclick", "dispatch", "selection", "anchor", "builder", "RangeSetBuilder", "cursor", "main", "head", "syntaxTree", "iterate", "enter", "node", "name", "marks", "getChildren", "text", "length", "sliceDoc", "to", "urlNode", "getChild", "url", "readOnly", "add", "Decoration", "replace", "widget", "undefined", "onRender", "finish", "StateField", "listener", "onChange", "StateField", "define", "create", "update", "_value", "transaction", "docChanged", "newDoc", "toString", "closeBrackets", "closeBracketsKeymap", "history", "historyKeymap", "indentWithTab", "standardKeymap", "markdownLanguage", "markdown", "bracketMatching", "defaultHighlightStyle", "indentOnInput", "syntaxHighlighting", "languages", "searchKeymap", "EditorState", "oneDarkHighlightStyle", "crosshairCursor", "drawSelection", "dropCursor", "EditorView", "highlightActiveLine", "keymap", "placeholder", "markdownLanguage", "HighlightStyle", "tags", "styleTags", "Tag", "Table", "get", "mx", "markdownTags", "Blockquote", "Tag", "define", "CodeMark", "CodeText", "EmphasisMark", "HeaderMark", "HorizontalRule", "InlineCode", "LinkLabel", "LinkReference", "ListMark", "QuoteMark", "URL", "TableCell", "Table", "defineNodes", "forEach", "node", "name", "style", "markdownTagsExtensions", "props", "styleTags", "markdownHighlightStyle", "readonly", "HighlightStyle", "tag", "tags", "keyword", "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", "function", "labelName", "codeMark", "monospace", "heading1", "heading", "heading2", "heading3", "heading4", "heading5", "heading6", "emphasis", "italic", "strong", "bold", "strikethrough", "inlineUrl", "code", "blockquote", "mx", "horizontalRule", "scope", "markdownLanguage", "all", "fontFamily", "get", "tokens", "join", "markdownBundle", "readonly", "themeMode", "placeholder", "_placeholder", "EditorState", "allowMultipleSelections", "of", "tabSize", "EditorView", "lineWrapping", "customKeymap", "bracketMatching", "closeBrackets", "crosshairCursor", "dropCursor", "drawSelection", "highlightActiveLine", "history", "indentOnInput", "markdown", "base", "markdownLanguage", "codeLanguages", "languages", "extensions", "markdownTagsExtensions", "syntaxHighlighting", "oneDarkHighlightStyle", "defaultHighlightStyle", "markdownHighlightStyle", "filter", "Boolean", "keymap", "indentWithTab", "standardKeymap", "historyKeymap", "closeBracketsKeymap", "searchKeymap", "autocompletion", "mention", "onSearch", "autocompletion", "closeOnBlur", "override", "context", "match", "matchBefore", "from", "to", "explicit", "console", "log", "options", "text", "slice", "toLowerCase", "map", "value", "label", "syntaxTree", "RangeSetBuilder", "StateField", "Decoration", "EditorView", "WidgetType", "table", "options", "StateField", "define", "create", "state", "update", "_", "tr", "provide", "field", "EditorView", "decorations", "from", "builder", "RangeSetBuilder", "cursor", "selection", "main", "head", "tables", "getTable", "length", "getRow", "rows", "syntaxTree", "iterate", "enter", "node", "name", "push", "to", "header", "row", "sliceDoc", "forEach", "hide", "readOnly", "add", "Decoration", "replace", "widget", "TableWidget", "mark", "class", "finish", "WidgetType", "constructor", "_table", "eq", "other", "toDOM", "view", "document", "createElement", "appendChild", "cell", "th", "setAttribute", "textContent", "body", "td", "EditorView", "Decoration", "WidgetType", "MatchDecorator", "ViewPlugin", "styles", "EditorView", "baseTheme", "paddingLeft", "paddingRight", "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", "tasklist", "options", "taskMatcher", "MatchDecorator", "regexp", "decoration", "match", "pos", "indent", "Math", "floor", "length", "Decoration", "replace", "widget", "state", "readOnly", "undefined", "idx", "indexOf", "dispatch", "changes", "from", "to", "insert", "selection", "anchor", "tasks", "ViewPlugin", "fromClass", "createDeco", "update", "updateDeco", "decorations", "value", "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", "marginTop", "marginLeft", "textDecoration", "height", "borderBottom", "textAlign", "Object", "keys", "reduce", "acc", "textTheme", "markdownTheme", "codeTheme", "EditorState", "EditorView", "useFocusableGroup", "vim", "defaultsDeep", "React", "forwardRef", "useCallback", "useEffect", "useImperativeHandle", "useState", "generateName", "useThemeContext", "getColorForValue", "inputSurface", "mx", "EditorModes", "BaseTextEditor", "forwardRef", "model", "readonly", "editorMode", "extensions", "slots", "defaultSlots", "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", "readOnly", "of", "vim", "EditorView", "baseTheme", "defaultTheme", "theme", "editor", "darkTheme", "extension", "filter", "Boolean", "destroy", "parent", "undefined", "handleKeyUp", "useCallback", "event", "key", "altKey", "shiftKey", "metaKey", "ctrlKey", "contentDOM", "focus", "div", "ref", "tabIndex", "onKeyUp", "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", "automergeToCodemirror", "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", "codemirrorToAutomerge", "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", "codemirrorToAutomerge", "undefined", "automerge", "getHeads", "docSync", "diff", "equals", "automergeToCodemirror", "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", "ranges", "extension", "yCollab", "awareness", "peer", "identityKey", "toHex", "name", "profile", "displayName", "obj", "getRawDoc", "field", "get", "handle", "docSync", "path", "automergePlugin"]
|
|
7
7
|
}
|