@dxos/react-ui-editor 0.3.10-main.463b538 → 0.3.10-main.4cae50a
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.
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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/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 fontFamily: get(tokens, 'fontFamily.mono', []).join(','),\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", "fontFamily", "get", "tokens", "join", "padding", "fontSize", "color", "caretColor", "borderLeft", "fontWeight", "paddingInline", "backgroundColor", "background", "mixBlendMode", "marginBlockStart", "paddingBlockStart", "paddingBlockEnd", "display", "insetBlockStart", "blockSize", "verticalAlign", "margin", "textDecorationLine", "textDecorationThickness", "textUnderlineOffset", "borderRadius", "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"]
|
|
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
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"packages/ui/react-ui-editor/src/components/TextEditor/extensions/autocomplete.ts":{"bytes":5211,"imports":[{"path":"@codemirror/autocomplete","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/basic.ts":{"bytes":3587,"imports":[{"path":"@codemirror/autocomplete","kind":"import-statement","external":true},{"path":"@codemirror/language","kind":"import-statement","external":true},{"path":"@codemirror/theme-one-dark","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/blast.ts":{"bytes":39530,"imports":[{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/styles/markdown.ts":{"bytes":7656,"imports":[{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/styles/tokens.ts":{"bytes":1192,"imports":[{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/styles/index.ts":{"bytes":560,"imports":[{"path":"packages/ui/react-ui-editor/src/styles/markdown.ts","kind":"import-statement","original":"./markdown"},{"path":"packages/ui/react-ui-editor/src/styles/tokens.ts","kind":"import-statement","original":"./tokens"}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/code.ts":{"bytes":9376,"imports":[{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"lodash.get","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-editor/src/styles/index.ts","kind":"import-statement","original":"../../../styles"}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/demo.ts":{"bytes":6217,"imports":[{"path":"@codemirror/view","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/comments.ts":{"bytes":16593,"imports":[{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/highlight.ts":{"bytes":12652,"imports":[{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"lodash.sortby","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/image.ts":{"bytes":6530,"imports":[{"path":"@codemirror/language","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/link.ts":{"bytes":15867,"imports":[{"path":"@codemirror/language","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/listener.ts":{"bytes":2057,"imports":[{"path":"@codemirror/state","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/markdown/highlight.ts":{"bytes":20587,"imports":[{"path":"@codemirror/lang-markdown","kind":"import-statement","external":true},{"path":"@codemirror/language","kind":"import-statement","external":true},{"path":"@lezer/highlight","kind":"import-statement","external":true},{"path":"@lezer/markdown","kind":"import-statement","external":true},{"path":"lodash.get","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-editor/src/styles/index.ts","kind":"import-statement","original":"../../../../styles"}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/markdown/bundle.ts":{"bytes":10788,"imports":[{"path":"@codemirror/autocomplete","kind":"import-statement","external":true},{"path":"@codemirror/commands","kind":"import-statement","external":true},{"path":"@codemirror/lang-markdown","kind":"import-statement","external":true},{"path":"@codemirror/language","kind":"import-statement","external":true},{"path":"@codemirror/language-data","kind":"import-statement","external":true},{"path":"@codemirror/search","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/theme-one-dark","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/markdown/highlight.ts","kind":"import-statement","original":"./highlight"}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/markdown/index.ts":{"bytes":596,"imports":[{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/markdown/bundle.ts","kind":"import-statement","original":"./bundle"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/markdown/highlight.ts","kind":"import-statement","original":"./highlight"}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/mention.ts":{"bytes":3175,"imports":[{"path":"@codemirror/autocomplete","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/table.ts":{"bytes":12599,"imports":[{"path":"@codemirror/language","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/tasklist.ts":{"bytes":11540,"imports":[{"path":"@codemirror/view","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/tooltip.tsx":{"bytes":5580,"imports":[{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/index.ts":{"bytes":1687,"imports":[{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/autocomplete.ts","kind":"import-statement","original":"./autocomplete"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/basic.ts","kind":"import-statement","original":"./basic"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/blast.ts","kind":"import-statement","original":"./blast"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/code.ts","kind":"import-statement","original":"./code"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/demo.ts","kind":"import-statement","original":"./demo"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/comments.ts","kind":"import-statement","original":"./comments"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/highlight.ts","kind":"import-statement","original":"./highlight"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/image.ts","kind":"import-statement","original":"./image"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/link.ts","kind":"import-statement","original":"./link"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/listener.ts","kind":"import-statement","original":"./listener"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/markdown/index.ts","kind":"import-statement","original":"./markdown"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/mention.ts","kind":"import-statement","original":"./mention"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/table.ts","kind":"import-statement","original":"./table"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/tasklist.ts","kind":"import-statement","original":"./tasklist"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/tooltip.tsx","kind":"import-statement","original":"./tooltip"}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/themes/default.ts":{"bytes":22853,"imports":[{"path":"lodash.get","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-editor/src/styles/index.ts","kind":"import-statement","original":"../../../styles"}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/themes/index.ts":{"bytes":495,"imports":[{"path":"packages/ui/react-ui-editor/src/components/TextEditor/themes/default.ts","kind":"import-statement","original":"./default"}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/TextEditor.tsx":{"bytes":21029,"imports":[{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@fluentui/react-tabster","kind":"import-statement","external":true},{"path":"@replit/codemirror-vim","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/display-name","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/index.ts","kind":"import-statement","original":"./extensions"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/themes/index.ts","kind":"import-statement","original":"./themes"}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/index.ts":{"bytes":892,"imports":[{"path":"@lezer/highlight","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/index.ts","kind":"import-statement","original":"./extensions"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/themes/index.ts","kind":"import-statement","original":"./themes"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/TextEditor.tsx","kind":"import-statement","original":"./TextEditor"}],"format":"esm"},"packages/ui/react-ui-editor/src/components/index.ts":{"bytes":484,"imports":[{"path":"packages/ui/react-ui-editor/src/components/TextEditor/index.ts","kind":"import-statement","original":"./TextEditor"}],"format":"esm"},"packages/ui/react-ui-editor/src/hooks/automerge/translation/automerge-to-codemirror.ts":{"bytes":11313,"imports":[{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-editor/src/hooks/automerge/plugin.ts","kind":"import-statement","original":"../plugin"}],"format":"esm"},"packages/ui/react-ui-editor/src/hooks/automerge/translation/codemirror-to-automerge.ts":{"bytes":4153,"imports":[{"path":"@dxos/automerge/automerge","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/hooks/automerge/translation/index.ts":{"bytes":661,"imports":[{"path":"packages/ui/react-ui-editor/src/hooks/automerge/translation/automerge-to-codemirror.ts","kind":"import-statement","original":"./automerge-to-codemirror"},{"path":"packages/ui/react-ui-editor/src/hooks/automerge/translation/codemirror-to-automerge.ts","kind":"import-statement","original":"./codemirror-to-automerge"}],"format":"esm"},"packages/ui/react-ui-editor/src/hooks/automerge/PatchSemaphore.ts":{"bytes":8662,"imports":[{"path":"@dxos/automerge/automerge","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-editor/src/hooks/automerge/plugin.ts","kind":"import-statement","original":"./plugin"},{"path":"packages/ui/react-ui-editor/src/hooks/automerge/translation/index.ts","kind":"import-statement","original":"./translation"}],"format":"esm"},"packages/ui/react-ui-editor/src/hooks/automerge/plugin.ts":{"bytes":13086,"imports":[{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@dxos/automerge/automerge","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-editor/src/hooks/automerge/PatchSemaphore.ts","kind":"import-statement","original":"./PatchSemaphore"}],"format":"esm"},"packages/ui/react-ui-editor/src/hooks/automerge/index.ts":{"bytes":651,"imports":[{"path":"packages/ui/react-ui-editor/src/hooks/automerge/plugin.ts","kind":"import-statement","original":"./plugin"}],"format":"esm"},"packages/ui/react-ui-editor/src/hooks/yjs/cursors.ts":{"bytes":2636,"imports":[{"path":"lib0/random","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/hooks/yjs/space-provider.ts":{"bytes":15639,"imports":[{"path":"lib0/decoding","kind":"import-statement","external":true},{"path":"lib0/encoding","kind":"import-statement","external":true},{"path":"lib0/observable","kind":"import-statement","external":true},{"path":"y-protocols/awareness","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/hooks/yjs/index.ts":{"bytes":582,"imports":[{"path":"packages/ui/react-ui-editor/src/hooks/yjs/cursors.ts","kind":"import-statement","original":"./cursors"},{"path":"packages/ui/react-ui-editor/src/hooks/yjs/space-provider.ts","kind":"import-statement","original":"./space-provider"}],"format":"esm"},"packages/ui/react-ui-editor/src/hooks/useTextModel.ts":{"bytes":10229,"imports":[{"path":"lodash.get","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"y-codemirror.next","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/react-client/echo","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-editor/src/hooks/automerge/index.ts","kind":"import-statement","original":"./automerge"},{"path":"packages/ui/react-ui-editor/src/hooks/yjs/index.ts","kind":"import-statement","original":"./yjs"}],"format":"esm"},"packages/ui/react-ui-editor/src/hooks/index.ts":{"bytes":564,"imports":[{"path":"packages/ui/react-ui-editor/src/hooks/useTextModel.ts","kind":"import-statement","original":"./useTextModel"},{"path":"packages/ui/react-ui-editor/src/hooks/yjs/index.ts","kind":"import-statement","original":"./yjs"}],"format":"esm"},"packages/ui/react-ui-editor/src/index.ts":{"bytes":1026,"imports":[{"path":"@dxos/protocols/proto/dxos/echo/model/text","kind":"import-statement","external":true},{"path":"@dxos/text-model","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-editor/src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"packages/ui/react-ui-editor/src/hooks/index.ts","kind":"import-statement","original":"./hooks"}],"format":"esm"}},"outputs":{"packages/ui/react-ui-editor/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":151309},"packages/ui/react-ui-editor/dist/lib/browser/index.mjs":{"imports":[{"path":"@dxos/protocols/proto/dxos/echo/model/text","kind":"import-statement","external":true},{"path":"@dxos/text-model","kind":"import-statement","external":true},{"path":"@lezer/highlight","kind":"import-statement","external":true},{"path":"@codemirror/autocomplete","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@codemirror/autocomplete","kind":"import-statement","external":true},{"path":"@codemirror/language","kind":"import-statement","external":true},{"path":"@codemirror/theme-one-dark","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"lodash.get","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"lodash.sortby","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@codemirror/language","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@codemirror/language","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/autocomplete","kind":"import-statement","external":true},{"path":"@codemirror/commands","kind":"import-statement","external":true},{"path":"@codemirror/lang-markdown","kind":"import-statement","external":true},{"path":"@codemirror/language","kind":"import-statement","external":true},{"path":"@codemirror/language-data","kind":"import-statement","external":true},{"path":"@codemirror/search","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/theme-one-dark","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@codemirror/lang-markdown","kind":"import-statement","external":true},{"path":"@codemirror/language","kind":"import-statement","external":true},{"path":"@lezer/highlight","kind":"import-statement","external":true},{"path":"@lezer/markdown","kind":"import-statement","external":true},{"path":"lodash.get","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@codemirror/autocomplete","kind":"import-statement","external":true},{"path":"@codemirror/language","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"lodash.get","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@fluentui/react-tabster","kind":"import-statement","external":true},{"path":"@replit/codemirror-vim","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/display-name","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"lodash.get","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"y-codemirror.next","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/react-client/echo","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@dxos/automerge/automerge","kind":"import-statement","external":true},{"path":"@dxos/automerge/automerge","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@dxos/automerge/automerge","kind":"import-statement","external":true},{"path":"lib0/random","kind":"import-statement","external":true},{"path":"lib0/decoding","kind":"import-statement","external":true},{"path":"lib0/encoding","kind":"import-statement","external":true},{"path":"lib0/observable","kind":"import-statement","external":true},{"path":"y-protocols/awareness","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"exports":["BaseTextEditor","Doc","EditorModes","MarkdownEditor","SpaceAwarenessProvider","TextEditor","TextKind","YText","YXmlFragment","autocomplete","basicBundle","blast","code","codeTheme","comments","cursorColor","defaultMarkdownSlots","defaultOptions","defaultSlots","defaultTextSlots","defaultTheme","demo","highlight","highlightDecorations","highlightStateField","image","link","listener","markdownBundle","markdownHighlightStyle","markdownTags","markdownTagsExtensions","markdownTheme","mention","table","tags","tasklist","textTheme","tooltip","useHighlights","useTextModel"],"entryPoint":"packages/ui/react-ui-editor/src/index.ts","inputs":{"packages/ui/react-ui-editor/src/index.ts":{"bytesInOutput":132},"packages/ui/react-ui-editor/src/components/TextEditor/index.ts":{"bytesInOutput":50},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/autocomplete.ts":{"bytesInOutput":1104},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/basic.ts":{"bytesInOutput":782},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/blast.ts":{"bytesInOutput":8826},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/code.ts":{"bytesInOutput":2097},"packages/ui/react-ui-editor/src/styles/markdown.ts":{"bytesInOutput":1337},"packages/ui/react-ui-editor/src/styles/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-editor/src/styles/tokens.ts":{"bytesInOutput":94},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/demo.ts":{"bytesInOutput":1335},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/comments.ts":{"bytesInOutput":3834},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/highlight.ts":{"bytesInOutput":2550},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/image.ts":{"bytesInOutput":1431},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/link.ts":{"bytesInOutput":2651},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/listener.ts":{"bytesInOutput":331},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/markdown/bundle.ts":{"bytesInOutput":2797},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/markdown/highlight.ts":{"bytesInOutput":4507},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/markdown/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/mention.ts":{"bytesInOutput":590},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/table.ts":{"bytesInOutput":2911},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/tasklist.ts":{"bytesInOutput":2575},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/tooltip.tsx":{"bytesInOutput":1033},"packages/ui/react-ui-editor/src/components/TextEditor/themes/default.ts":{"bytesInOutput":6272},"packages/ui/react-ui-editor/src/components/TextEditor/themes/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-editor/src/components/TextEditor/TextEditor.tsx":{"bytesInOutput":4504},"packages/ui/react-ui-editor/src/components/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-editor/src/hooks/useTextModel.ts":{"bytesInOutput":2071},"packages/ui/react-ui-editor/src/hooks/automerge/plugin.ts":{"bytesInOutput":2357},"packages/ui/react-ui-editor/src/hooks/automerge/PatchSemaphore.ts":{"bytesInOutput":1517},"packages/ui/react-ui-editor/src/hooks/automerge/translation/automerge-to-codemirror.ts":{"bytesInOutput":2411},"packages/ui/react-ui-editor/src/hooks/automerge/translation/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-editor/src/hooks/automerge/translation/codemirror-to-automerge.ts":{"bytesInOutput":643},"packages/ui/react-ui-editor/src/hooks/automerge/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-editor/src/hooks/yjs/cursors.ts":{"bytesInOutput":567},"packages/ui/react-ui-editor/src/hooks/yjs/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-editor/src/hooks/yjs/space-provider.ts":{"bytesInOutput":3769},"packages/ui/react-ui-editor/src/hooks/index.ts":{"bytesInOutput":0}},"bytes":68278}}}
|
|
1
|
+
{"inputs":{"packages/ui/react-ui-editor/src/components/TextEditor/extensions/autocomplete.ts":{"bytes":5211,"imports":[{"path":"@codemirror/autocomplete","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/basic.ts":{"bytes":3587,"imports":[{"path":"@codemirror/autocomplete","kind":"import-statement","external":true},{"path":"@codemirror/language","kind":"import-statement","external":true},{"path":"@codemirror/theme-one-dark","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/blast.ts":{"bytes":39530,"imports":[{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/styles/markdown.ts":{"bytes":7656,"imports":[{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/styles/tokens.ts":{"bytes":1192,"imports":[{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/styles/index.ts":{"bytes":560,"imports":[{"path":"packages/ui/react-ui-editor/src/styles/markdown.ts","kind":"import-statement","original":"./markdown"},{"path":"packages/ui/react-ui-editor/src/styles/tokens.ts","kind":"import-statement","original":"./tokens"}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/code.ts":{"bytes":9376,"imports":[{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"lodash.get","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-editor/src/styles/index.ts","kind":"import-statement","original":"../../../styles"}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/demo.ts":{"bytes":6217,"imports":[{"path":"@codemirror/view","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/comments.ts":{"bytes":16593,"imports":[{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/highlight.ts":{"bytes":12652,"imports":[{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"lodash.sortby","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/image.ts":{"bytes":6530,"imports":[{"path":"@codemirror/language","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/link.ts":{"bytes":15867,"imports":[{"path":"@codemirror/language","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/listener.ts":{"bytes":2057,"imports":[{"path":"@codemirror/state","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/markdown/highlight.ts":{"bytes":20587,"imports":[{"path":"@codemirror/lang-markdown","kind":"import-statement","external":true},{"path":"@codemirror/language","kind":"import-statement","external":true},{"path":"@lezer/highlight","kind":"import-statement","external":true},{"path":"@lezer/markdown","kind":"import-statement","external":true},{"path":"lodash.get","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-editor/src/styles/index.ts","kind":"import-statement","original":"../../../../styles"}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/markdown/bundle.ts":{"bytes":10788,"imports":[{"path":"@codemirror/autocomplete","kind":"import-statement","external":true},{"path":"@codemirror/commands","kind":"import-statement","external":true},{"path":"@codemirror/lang-markdown","kind":"import-statement","external":true},{"path":"@codemirror/language","kind":"import-statement","external":true},{"path":"@codemirror/language-data","kind":"import-statement","external":true},{"path":"@codemirror/search","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/theme-one-dark","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/markdown/highlight.ts","kind":"import-statement","original":"./highlight"}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/markdown/index.ts":{"bytes":596,"imports":[{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/markdown/bundle.ts","kind":"import-statement","original":"./bundle"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/markdown/highlight.ts","kind":"import-statement","original":"./highlight"}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/mention.ts":{"bytes":3175,"imports":[{"path":"@codemirror/autocomplete","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/table.ts":{"bytes":12599,"imports":[{"path":"@codemirror/language","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/tasklist.ts":{"bytes":11540,"imports":[{"path":"@codemirror/view","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/tooltip.tsx":{"bytes":5580,"imports":[{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/index.ts":{"bytes":1687,"imports":[{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/autocomplete.ts","kind":"import-statement","original":"./autocomplete"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/basic.ts","kind":"import-statement","original":"./basic"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/blast.ts","kind":"import-statement","original":"./blast"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/code.ts","kind":"import-statement","original":"./code"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/demo.ts","kind":"import-statement","original":"./demo"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/comments.ts","kind":"import-statement","original":"./comments"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/highlight.ts","kind":"import-statement","original":"./highlight"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/image.ts","kind":"import-statement","original":"./image"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/link.ts","kind":"import-statement","original":"./link"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/listener.ts","kind":"import-statement","original":"./listener"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/markdown/index.ts","kind":"import-statement","original":"./markdown"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/mention.ts","kind":"import-statement","original":"./mention"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/table.ts","kind":"import-statement","original":"./table"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/tasklist.ts","kind":"import-statement","original":"./tasklist"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/tooltip.tsx","kind":"import-statement","original":"./tooltip"}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/themes/default.ts":{"bytes":22647,"imports":[{"path":"lodash.get","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-editor/src/styles/index.ts","kind":"import-statement","original":"../../../styles"}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/themes/index.ts":{"bytes":495,"imports":[{"path":"packages/ui/react-ui-editor/src/components/TextEditor/themes/default.ts","kind":"import-statement","original":"./default"}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/TextEditor.tsx":{"bytes":21029,"imports":[{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@fluentui/react-tabster","kind":"import-statement","external":true},{"path":"@replit/codemirror-vim","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/display-name","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/index.ts","kind":"import-statement","original":"./extensions"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/themes/index.ts","kind":"import-statement","original":"./themes"}],"format":"esm"},"packages/ui/react-ui-editor/src/components/TextEditor/index.ts":{"bytes":892,"imports":[{"path":"@lezer/highlight","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/extensions/index.ts","kind":"import-statement","original":"./extensions"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/themes/index.ts","kind":"import-statement","original":"./themes"},{"path":"packages/ui/react-ui-editor/src/components/TextEditor/TextEditor.tsx","kind":"import-statement","original":"./TextEditor"}],"format":"esm"},"packages/ui/react-ui-editor/src/components/index.ts":{"bytes":484,"imports":[{"path":"packages/ui/react-ui-editor/src/components/TextEditor/index.ts","kind":"import-statement","original":"./TextEditor"}],"format":"esm"},"packages/ui/react-ui-editor/src/hooks/automerge/translation/automerge-to-codemirror.ts":{"bytes":11313,"imports":[{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-editor/src/hooks/automerge/plugin.ts","kind":"import-statement","original":"../plugin"}],"format":"esm"},"packages/ui/react-ui-editor/src/hooks/automerge/translation/codemirror-to-automerge.ts":{"bytes":4153,"imports":[{"path":"@dxos/automerge/automerge","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/hooks/automerge/translation/index.ts":{"bytes":661,"imports":[{"path":"packages/ui/react-ui-editor/src/hooks/automerge/translation/automerge-to-codemirror.ts","kind":"import-statement","original":"./automerge-to-codemirror"},{"path":"packages/ui/react-ui-editor/src/hooks/automerge/translation/codemirror-to-automerge.ts","kind":"import-statement","original":"./codemirror-to-automerge"}],"format":"esm"},"packages/ui/react-ui-editor/src/hooks/automerge/PatchSemaphore.ts":{"bytes":8662,"imports":[{"path":"@dxos/automerge/automerge","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-editor/src/hooks/automerge/plugin.ts","kind":"import-statement","original":"./plugin"},{"path":"packages/ui/react-ui-editor/src/hooks/automerge/translation/index.ts","kind":"import-statement","original":"./translation"}],"format":"esm"},"packages/ui/react-ui-editor/src/hooks/automerge/plugin.ts":{"bytes":13086,"imports":[{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@dxos/automerge/automerge","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-editor/src/hooks/automerge/PatchSemaphore.ts","kind":"import-statement","original":"./PatchSemaphore"}],"format":"esm"},"packages/ui/react-ui-editor/src/hooks/automerge/index.ts":{"bytes":651,"imports":[{"path":"packages/ui/react-ui-editor/src/hooks/automerge/plugin.ts","kind":"import-statement","original":"./plugin"}],"format":"esm"},"packages/ui/react-ui-editor/src/hooks/yjs/cursors.ts":{"bytes":2636,"imports":[{"path":"lib0/random","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/hooks/yjs/space-provider.ts":{"bytes":15639,"imports":[{"path":"lib0/decoding","kind":"import-statement","external":true},{"path":"lib0/encoding","kind":"import-statement","external":true},{"path":"lib0/observable","kind":"import-statement","external":true},{"path":"y-protocols/awareness","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-editor/src/hooks/yjs/index.ts":{"bytes":582,"imports":[{"path":"packages/ui/react-ui-editor/src/hooks/yjs/cursors.ts","kind":"import-statement","original":"./cursors"},{"path":"packages/ui/react-ui-editor/src/hooks/yjs/space-provider.ts","kind":"import-statement","original":"./space-provider"}],"format":"esm"},"packages/ui/react-ui-editor/src/hooks/useTextModel.ts":{"bytes":10229,"imports":[{"path":"lodash.get","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"y-codemirror.next","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/react-client/echo","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-editor/src/hooks/automerge/index.ts","kind":"import-statement","original":"./automerge"},{"path":"packages/ui/react-ui-editor/src/hooks/yjs/index.ts","kind":"import-statement","original":"./yjs"}],"format":"esm"},"packages/ui/react-ui-editor/src/hooks/index.ts":{"bytes":564,"imports":[{"path":"packages/ui/react-ui-editor/src/hooks/useTextModel.ts","kind":"import-statement","original":"./useTextModel"},{"path":"packages/ui/react-ui-editor/src/hooks/yjs/index.ts","kind":"import-statement","original":"./yjs"}],"format":"esm"},"packages/ui/react-ui-editor/src/index.ts":{"bytes":1026,"imports":[{"path":"@dxos/protocols/proto/dxos/echo/model/text","kind":"import-statement","external":true},{"path":"@dxos/text-model","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-editor/src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"packages/ui/react-ui-editor/src/hooks/index.ts","kind":"import-statement","original":"./hooks"}],"format":"esm"}},"outputs":{"packages/ui/react-ui-editor/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":151198},"packages/ui/react-ui-editor/dist/lib/browser/index.mjs":{"imports":[{"path":"@dxos/protocols/proto/dxos/echo/model/text","kind":"import-statement","external":true},{"path":"@dxos/text-model","kind":"import-statement","external":true},{"path":"@lezer/highlight","kind":"import-statement","external":true},{"path":"@codemirror/autocomplete","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@codemirror/autocomplete","kind":"import-statement","external":true},{"path":"@codemirror/language","kind":"import-statement","external":true},{"path":"@codemirror/theme-one-dark","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"lodash.get","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"lodash.sortby","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@codemirror/language","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@codemirror/language","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/autocomplete","kind":"import-statement","external":true},{"path":"@codemirror/commands","kind":"import-statement","external":true},{"path":"@codemirror/lang-markdown","kind":"import-statement","external":true},{"path":"@codemirror/language","kind":"import-statement","external":true},{"path":"@codemirror/language-data","kind":"import-statement","external":true},{"path":"@codemirror/search","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/theme-one-dark","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@codemirror/lang-markdown","kind":"import-statement","external":true},{"path":"@codemirror/language","kind":"import-statement","external":true},{"path":"@lezer/highlight","kind":"import-statement","external":true},{"path":"@lezer/markdown","kind":"import-statement","external":true},{"path":"lodash.get","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@codemirror/autocomplete","kind":"import-statement","external":true},{"path":"@codemirror/language","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"lodash.get","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@fluentui/react-tabster","kind":"import-statement","external":true},{"path":"@replit/codemirror-vim","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/display-name","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"lodash.get","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"y-codemirror.next","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/react-client/echo","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"@dxos/automerge/automerge","kind":"import-statement","external":true},{"path":"@dxos/automerge/automerge","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@dxos/automerge/automerge","kind":"import-statement","external":true},{"path":"lib0/random","kind":"import-statement","external":true},{"path":"lib0/decoding","kind":"import-statement","external":true},{"path":"lib0/encoding","kind":"import-statement","external":true},{"path":"lib0/observable","kind":"import-statement","external":true},{"path":"y-protocols/awareness","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"exports":["BaseTextEditor","Doc","EditorModes","MarkdownEditor","SpaceAwarenessProvider","TextEditor","TextKind","YText","YXmlFragment","autocomplete","basicBundle","blast","code","codeTheme","comments","cursorColor","defaultMarkdownSlots","defaultOptions","defaultSlots","defaultTextSlots","defaultTheme","demo","highlight","highlightDecorations","highlightStateField","image","link","listener","markdownBundle","markdownHighlightStyle","markdownTags","markdownTagsExtensions","markdownTheme","mention","table","tags","tasklist","textTheme","tooltip","useHighlights","useTextModel"],"entryPoint":"packages/ui/react-ui-editor/src/index.ts","inputs":{"packages/ui/react-ui-editor/src/index.ts":{"bytesInOutput":132},"packages/ui/react-ui-editor/src/components/TextEditor/index.ts":{"bytesInOutput":50},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/autocomplete.ts":{"bytesInOutput":1104},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/basic.ts":{"bytesInOutput":782},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/blast.ts":{"bytesInOutput":8826},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/code.ts":{"bytesInOutput":2097},"packages/ui/react-ui-editor/src/styles/markdown.ts":{"bytesInOutput":1337},"packages/ui/react-ui-editor/src/styles/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-editor/src/styles/tokens.ts":{"bytesInOutput":94},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/demo.ts":{"bytesInOutput":1335},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/comments.ts":{"bytesInOutput":3834},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/highlight.ts":{"bytesInOutput":2550},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/image.ts":{"bytesInOutput":1431},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/link.ts":{"bytesInOutput":2651},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/listener.ts":{"bytesInOutput":331},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/markdown/bundle.ts":{"bytesInOutput":2797},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/markdown/highlight.ts":{"bytesInOutput":4507},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/markdown/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/mention.ts":{"bytesInOutput":590},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/table.ts":{"bytesInOutput":2911},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/tasklist.ts":{"bytesInOutput":2575},"packages/ui/react-ui-editor/src/components/TextEditor/extensions/tooltip.tsx":{"bytesInOutput":1033},"packages/ui/react-ui-editor/src/components/TextEditor/themes/default.ts":{"bytesInOutput":6209},"packages/ui/react-ui-editor/src/components/TextEditor/themes/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-editor/src/components/TextEditor/TextEditor.tsx":{"bytesInOutput":4504},"packages/ui/react-ui-editor/src/components/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-editor/src/hooks/useTextModel.ts":{"bytesInOutput":2071},"packages/ui/react-ui-editor/src/hooks/automerge/plugin.ts":{"bytesInOutput":2357},"packages/ui/react-ui-editor/src/hooks/automerge/PatchSemaphore.ts":{"bytesInOutput":1517},"packages/ui/react-ui-editor/src/hooks/automerge/translation/automerge-to-codemirror.ts":{"bytesInOutput":2411},"packages/ui/react-ui-editor/src/hooks/automerge/translation/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-editor/src/hooks/automerge/translation/codemirror-to-automerge.ts":{"bytesInOutput":643},"packages/ui/react-ui-editor/src/hooks/automerge/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-editor/src/hooks/yjs/cursors.ts":{"bytesInOutput":567},"packages/ui/react-ui-editor/src/hooks/yjs/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-editor/src/hooks/yjs/space-provider.ts":{"bytesInOutput":3769},"packages/ui/react-ui-editor/src/hooks/index.ts":{"bytesInOutput":0}},"bytes":68215}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TextEditor/themes/default.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAI3C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,EAAE;IACzB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"default.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TextEditor/themes/default.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAI3C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,EAAE;IACzB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAiO/B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE;IACtB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAQ/B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE;IAC1B,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAM/B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE;IACtB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAQ/B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/react-ui-editor",
|
|
3
|
-
"version": "0.3.10-main.
|
|
3
|
+
"version": "0.3.10-main.4cae50a",
|
|
4
4
|
"description": "Document editing experience within a DXOS shell.",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -37,19 +37,19 @@
|
|
|
37
37
|
"y-codemirror.next": "^0.3.2",
|
|
38
38
|
"y-protocols": "^1.0.5",
|
|
39
39
|
"yjs": "^13.6.10",
|
|
40
|
-
"@dxos/async": "0.3.10-main.
|
|
41
|
-
"@dxos/debug": "0.3.10-main.
|
|
42
|
-
"@dxos/
|
|
43
|
-
"@dxos/
|
|
44
|
-
"@dxos/
|
|
45
|
-
"@dxos/log": "0.3.10-main.
|
|
46
|
-
"@dxos/
|
|
47
|
-
"@dxos/
|
|
48
|
-
"@dxos/react-
|
|
49
|
-
"@dxos/react-ui
|
|
50
|
-
"@dxos/
|
|
51
|
-
"@dxos/
|
|
52
|
-
"@dxos/
|
|
40
|
+
"@dxos/async": "0.3.10-main.4cae50a",
|
|
41
|
+
"@dxos/debug": "0.3.10-main.4cae50a",
|
|
42
|
+
"@dxos/automerge": "0.3.10-main.4cae50a",
|
|
43
|
+
"@dxos/display-name": "0.3.10-main.4cae50a",
|
|
44
|
+
"@dxos/echo-schema": "0.3.10-main.4cae50a",
|
|
45
|
+
"@dxos/log": "0.3.10-main.4cae50a",
|
|
46
|
+
"@dxos/protocols": "0.3.10-main.4cae50a",
|
|
47
|
+
"@dxos/invariant": "0.3.10-main.4cae50a",
|
|
48
|
+
"@dxos/react-async": "0.3.10-main.4cae50a",
|
|
49
|
+
"@dxos/react-ui": "0.3.10-main.4cae50a",
|
|
50
|
+
"@dxos/react-ui-theme": "0.3.10-main.4cae50a",
|
|
51
|
+
"@dxos/text-model": "0.3.10-main.4cae50a",
|
|
52
|
+
"@dxos/util": "0.3.10-main.4cae50a"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
55
|
"@automerge/automerge-repo-network-broadcastchannel": "^1.0.19",
|
|
@@ -63,17 +63,17 @@
|
|
|
63
63
|
"@types/react-dom": "^18.0.6",
|
|
64
64
|
"react": "^18.2.0",
|
|
65
65
|
"react-dom": "^18.2.0",
|
|
66
|
-
"@dxos/config": "0.3.10-main.
|
|
67
|
-
"@dxos/echo-typegen": "0.3.10-main.
|
|
68
|
-
"@dxos/react-
|
|
69
|
-
"@dxos/react-
|
|
70
|
-
"@dxos/storybook-utils": "0.3.10-main.
|
|
66
|
+
"@dxos/config": "0.3.10-main.4cae50a",
|
|
67
|
+
"@dxos/echo-typegen": "0.3.10-main.4cae50a",
|
|
68
|
+
"@dxos/react-client": "0.3.10-main.4cae50a",
|
|
69
|
+
"@dxos/react-ui": "0.3.10-main.4cae50a",
|
|
70
|
+
"@dxos/storybook-utils": "0.3.10-main.4cae50a"
|
|
71
71
|
},
|
|
72
72
|
"peerDependencies": {
|
|
73
73
|
"@phosphor-icons/react": "^2.0.5",
|
|
74
74
|
"react": "^18.2.0",
|
|
75
75
|
"react-dom": "^18.2.0",
|
|
76
|
-
"@dxos/react-client": "0.3.10-main.
|
|
76
|
+
"@dxos/react-client": "0.3.10-main.4cae50a"
|
|
77
77
|
},
|
|
78
78
|
"publishConfig": {
|
|
79
79
|
"access": "public"
|