@dxos/react-ui-editor 0.4.1 → 0.4.2-main.16babdb

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
- "sources": ["../../../src/index.ts", "../../../src/components/TextEditor/index.ts", "../../../src/components/TextEditor/TextEditor.tsx", "../../../src/extensions/autocomplete.ts", "../../../src/extensions/automerge/automerge.ts", "../../../src/extensions/automerge/cursor.ts", "../../../src/extensions/automerge/defs.ts", "../../../src/extensions/automerge/semaphore.ts", "../../../src/extensions/automerge/update-automerge.ts", "../../../src/extensions/automerge/update-codemirror.ts", "../../../src/extensions/cursor.ts", "../../../src/extensions/awareness.ts", "../../../src/extensions/basic.ts", "../../../src/extensions/blast.ts", "../../../src/extensions/comments.ts", "../../../src/styles/cursors.ts", "../../../src/styles/markdown.ts", "../../../src/styles/tokens.ts", "../../../src/util.ts", "../../../src/extensions/listener.ts", "../../../src/extensions/markdown/bundle.ts", "../../../src/extensions/markdown/highlight.ts", "../../../src/extensions/markdown/code.ts", "../../../src/extensions/markdown/formatting.ts", "../../../src/extensions/markdown/heading.ts", "../../../src/extensions/markdown/hr.ts", "../../../src/extensions/markdown/image.ts", "../../../src/extensions/markdown/link.ts", "../../../src/extensions/markdown/table.ts", "../../../src/extensions/markdown/tasklist.ts", "../../../src/extensions/mention.ts", "../../../src/extensions/outliner.ts", "../../../src/extensions/typewriter.ts", "../../../src/themes/default.ts", "../../../src/components/Toolbar/Toolbar.tsx", "../../../src/hooks/awareness-provider.ts", "../../../src/hooks/defs.ts", "../../../src/hooks/useActionHandler.ts", "../../../src/hooks/useEditorView.ts", "../../../src/hooks/useTextEditor.ts", "../../../src/hooks/useTextModel.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';\nexport { type Extension } from '@codemirror/state';\nexport { type EditorView, keymap } from '@codemirror/view';\n\nexport * from './components';\nexport * from './extensions';\nexport * from './hooks';\nexport { getToken } from './styles';\nexport * from './themes';\nexport * from './util';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nexport { tags } from '@lezer/highlight';\nexport { type Extension } from '@codemirror/state';\n\nexport * from './TextEditor';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { EditorState, type Extension, type StateEffect } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\n// import { 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 useRef,\n useState,\n} from 'react';\n\nimport { log } from '@dxos/log';\nimport { useThemeContext } from '@dxos/react-ui';\nimport { focusRing, mx } from '@dxos/react-ui-theme';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { createBasicBundle, createMarkdownExtensions } from '../../extensions';\nimport { type EditorModel } from '../../hooks';\nimport { type ThemeStyles } from '../../styles';\nimport { defaultTheme, markdownTheme, textTheme } from '../../themes';\nimport { logChanges } from '../../util';\n\n// TODO(burdon): Change to enum?\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 length: number;\n after?: string;\n};\n\nexport type TextEditorSlots = {\n root?: Omit<ComponentProps<'div'>, 'ref'>;\n editor?: {\n className?: string;\n };\n content?: {\n className?: string;\n };\n};\n\n// TODO(burdon): Spellcheck?\nexport type TextEditorProps = {\n model: EditorModel; // TODO(burdon): Optional (e.g., just provide content if readonly).\n readonly?: boolean; // TODO(burdon): Move into model.\n autoFocus?: boolean;\n lineWrapping?: boolean;\n scrollTo?: StateEffect<any>; // TODO(burdon): Restore scroll position: scrollTo EditorView.scrollSnapshot().\n selection?: { anchor: number; head?: number };\n editorMode?: EditorMode; // TODO(burdon): Factor out.\n placeholder?: string;\n theme?: ThemeStyles;\n slots?: TextEditorSlots;\n extensions?: Extension[];\n debug?: boolean;\n};\n\n/**\n * Base text editor.\n */\nexport const BaseTextEditor = forwardRef<EditorView, TextEditorProps>(\n (\n {\n model,\n readonly,\n autoFocus,\n scrollTo,\n selection,\n editorMode,\n theme,\n slots = defaultSlots,\n extensions = [],\n debug,\n },\n forwardedRef,\n ) => {\n // TODO(burdon): Hook causes error even if properties are not spread into div.\n // Uncaught TypeError: Cannot read properties of undefined (reading 'relatedTarget')\n // Uses event.detail, which is deprecated (not event.details). At runtime the event has a property `details`.\n // https://github.com/microsoft/tabster/blob/master/src/State/FocusedElement.ts#L348 (e.detail.relatedTarget)\n // https://github.com/microsoft/keyborg/blob/49e49b2c3ba0a5f6cc518ac46825d7551def8109/src/FocusEvent.ts#L58\n // const tabsterDOMAttribute = useFocusableGroup({ tabBehavior: 'limited' });\n const { themeMode } = useThemeContext();\n\n const rootRef = useRef<HTMLDivElement>(null);\n const [view, setView] = useState<EditorView | null>(null);\n\n // The view ref can be used to focus the editor.\n // NOTE: This does not cause the parent to re-render, so the ref is not available immediately.\n useImperativeHandle<EditorView | null, EditorView | null>(forwardedRef, () => view, [view]);\n\n // Set focus.\n useEffect(() => {\n if (autoFocus && !view?.hasFocus) {\n if (view?.state.selection.main?.from === 0) {\n // Start at end of line.\n const { to } = view.state.doc.lineAt(0);\n view?.dispatch({ selection: { anchor: to } });\n }\n view?.focus();\n }\n }, [view, autoFocus]);\n\n // Create editor state and view.\n // The view is recreated if the model or extensions are changed.\n useEffect(() => {\n if (!model || !rootRef.current) {\n return;\n }\n\n //\n // EditorState\n // https://codemirror.net/docs/ref/#state.EditorStateConfig\n //\n const state = EditorState.create({\n doc: model.text(),\n selection,\n extensions: [\n // TODO(burdon): Doesn't catch errors in keymap functions.\n EditorView.exceptionSink.of((err) => {\n log.catch(err);\n }),\n\n // Theme.\n // TODO(burdon): Make configurable.\n EditorView.baseTheme(defaultTheme),\n EditorView.theme(theme ?? {}),\n EditorView.darkTheme.of(themeMode === 'dark'),\n EditorView.editorAttributes.of({ class: slots.editor?.className ?? '' }),\n EditorView.contentAttributes.of({ class: slots.content?.className ?? '' }),\n\n // State.\n EditorView.editable.of(!readonly),\n EditorState.readOnly.of(!!readonly),\n\n // Storage and replication.\n // NOTE: This must come before user extensions.\n model.extension,\n\n // TODO(burdon): Factor out? (Requires special handling for Escape/Enter below).\n editorMode === 'vim' && vim(),\n\n // Custom.\n ...extensions,\n ].filter(isNotFalsy),\n });\n\n //\n // EditorView\n // https://codemirror.net/docs/ref/#view.EditorViewConfig\n //\n const newView = new EditorView({\n state,\n parent: rootRef.current,\n scrollTo,\n // NOTE: Uncomment to debug/monitor all transactions.\n // https://codemirror.net/docs/ref/#view.EditorView.dispatch\n dispatchTransactions: (trs, view) => {\n if (debug) {\n logChanges(trs);\n }\n view.update(trs);\n },\n });\n\n view?.destroy();\n setView(newView);\n\n return () => {\n newView?.destroy();\n setView(null);\n };\n }, [rootRef, model, readonly, editorMode, themeMode]);\n\n // Handles tab/focus.\n // Pressing Escape focuses the outer div (to support tab navigation); pressing Enter refocuses the editor.\n // TODO(burdon): Convert to keymap?\n const handleKeyUp = useCallback(\n (event: KeyboardEvent) => {\n const { key, altKey, shiftKey, metaKey, ctrlKey } = event;\n switch (key) {\n case 'Enter': {\n view?.focus();\n break;\n }\n\n case 'Escape': {\n if (editorMode === 'vim' && (altKey || shiftKey || metaKey || ctrlKey)) {\n view?.focus();\n }\n break;\n }\n }\n },\n [view, editorMode],\n );\n\n return (\n <div\n key={model.id}\n role='none'\n tabIndex={0}\n {...slots.root}\n // {...(editorMode !== 'vim' && tabsterDOMAttribute)}\n onKeyUp={handleKeyUp}\n ref={rootRef}\n />\n );\n },\n);\n\nexport const TextEditor = forwardRef<EditorView, TextEditorProps>(\n ({ readonly, placeholder, lineWrapping, theme = textTheme, slots, extensions = [], ...props }, forwardedRef) => {\n const { themeMode } = useThemeContext();\n const updatedSlots = defaultsDeep({}, slots, defaultTextSlots);\n return (\n <BaseTextEditor\n ref={forwardedRef}\n readonly={readonly}\n extensions={[createBasicBundle({ themeMode, placeholder, lineWrapping }), ...extensions]}\n theme={theme}\n slots={updatedSlots}\n {...props}\n />\n );\n },\n);\n\nexport const MarkdownEditor = forwardRef<EditorView, TextEditorProps>(\n ({ readonly, placeholder, theme = markdownTheme, slots, extensions = [], ...props }, forwardedRef) => {\n const { themeMode } = useThemeContext();\n const updatedSlots = defaultsDeep({}, slots, defaultMarkdownSlots);\n return (\n <BaseTextEditor\n ref={forwardedRef}\n readonly={readonly}\n extensions={[createMarkdownExtensions({ themeMode, placeholder }), ...extensions]}\n theme={theme}\n slots={updatedSlots}\n {...props}\n />\n );\n },\n);\n\nexport const defaultSlots: TextEditorSlots = {\n root: {\n className: mx('grow', focusRing),\n },\n editor: {\n className: 'bs-full',\n },\n};\n\nexport const defaultTextSlots: TextEditorSlots = {\n ...defaultSlots,\n};\n\nexport const defaultMarkdownSlots: TextEditorSlots = {\n ...defaultSlots,\n};\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 { markdownLanguage } from '@codemirror/lang-markdown';\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 // TODO(burdon): Set custom keymap.\n keymap.of(completionKeymap),\n\n // https://codemirror.net/examples/autocompletion\n // https://codemirror.net/docs/ref/#autocomplete.autocompletion\n autocompletion({\n activateOnTyping: true,\n\n // closeOnBlur: false,\n // defaultKeymap: false,\n\n // TODO(burdon): Styles/fragments.\n tooltipClass: () => 'shadow rounded',\n }),\n\n // TODO(burdon): Option to create new page?\n // TODO(burdon): Optional decoration via addToOptions\n markdownLanguage.data.of({\n autocomplete: (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// Copyright 2023 DXOS.org\n// Copyright 2024 Automerge\n// Ref: https://github.com/automerge/automerge-codemirror\n//\n\nimport { invertedEffects } from '@codemirror/commands';\nimport { StateField, type Extension, type StateEffect } from '@codemirror/state';\nimport { EditorView, ViewPlugin } from '@codemirror/view';\n\nimport { next as A, type Prop } from '@dxos/automerge/automerge';\n\nimport { cursorConverter } from './cursor';\nimport { updateHeadsEffect, type IDocHandle, isReconcile, type State } from './defs';\nimport { PatchSemaphore } from './semaphore';\nimport { Cursor } from '../cursor';\n\nexport type AutomergeOptions = {\n handle: IDocHandle;\n path: Prop[];\n};\n\nexport const automerge = ({ handle, path }: AutomergeOptions): Extension => {\n const syncState = StateField.define<State>({\n create: () => ({\n path: path.slice(),\n lastHeads: A.getHeads(handle.docSync()!),\n unreconciledTransactions: [],\n }),\n\n update: (value, tr) => {\n const result: State = {\n path: path.slice(),\n lastHeads: value.lastHeads,\n unreconciledTransactions: value.unreconciledTransactions.slice(),\n };\n\n let clearUnreconciled = false;\n for (const effect of tr.effects) {\n if (effect.is(updateHeadsEffect)) {\n result.lastHeads = effect.value.newHeads;\n clearUnreconciled = true;\n }\n }\n\n if (clearUnreconciled) {\n result.unreconciledTransactions = [];\n } else {\n if (!isReconcile(tr)) {\n result.unreconciledTransactions.push(tr);\n }\n }\n\n return result;\n },\n });\n\n const semaphore = new PatchSemaphore(handle, syncState);\n\n return [\n Cursor.converter.of(cursorConverter(handle, path)),\n syncState,\n\n // Reconcile external updates.\n ViewPlugin.fromClass(\n class {\n constructor(private readonly _view: EditorView) {\n handle.addListener('change', this._handleChange.bind(this));\n }\n\n destroy() {\n handle.removeListener('change', this._handleChange.bind(this));\n }\n\n _handleChange() {\n semaphore.reconcile(this._view);\n }\n },\n ),\n\n // Reconcile local updates.\n EditorView.updateListener.of(({ view, changes }) => {\n if (!changes.empty) {\n semaphore.reconcile(view);\n }\n }),\n\n // TODO(burdon): Record undo transactions.\n // See https://github.com/yjs/y-codemirror.next/tree/main\n // https://codemirror.net/examples/inverted-effect\n invertedEffects.of((tr) => {\n // Each change results it three transactions: insert, delete, insert.\n const effects: StateEffect<any>[] = [];\n if (!tr.changes.empty) {\n tr.changes.iterChanges((fromA, toA, fromB, toB, inserted) => {\n // effects.push(effectType.of({});\n });\n }\n\n return effects;\n }),\n ];\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport get from 'lodash.get';\n\nimport type { Prop } from '@dxos/automerge/automerge';\nimport { next as A } from '@dxos/automerge/automerge';\n\nimport { type IDocHandle } from './defs';\nimport { type CursorConverter } from '../cursor';\n\nexport const cursorConverter = (handle: IDocHandle, path: Prop[]): CursorConverter => ({\n // TODO(burdon): Handle assoc to associate with a previous character.\n toCursor: (pos) => {\n const doc = handle.docSync();\n if (!doc) {\n return '';\n }\n\n const value = get(doc, path);\n if (typeof value === 'string' && value.length <= pos) {\n return 'end';\n }\n\n // NOTE: Slice is needed because getCursor mutates the array.\n return A.getCursor(doc, path.slice(), pos);\n },\n\n fromCursor: (cursor) => {\n if (cursor === '') {\n return 0;\n }\n\n const doc = handle.docSync();\n if (!doc) {\n return 0;\n }\n\n if (cursor === 'end') {\n const value = get(doc, path);\n if (typeof value === 'string') {\n return value.length;\n } else {\n return 0;\n }\n }\n\n // NOTE: Slice is needed because getCursor mutates the array.\n return A.getCursorPosition(doc, path.slice(), cursor);\n },\n});\n", "//\n// Copyright 2023 DXOS.org\n// Copyright 2024 Automerge\n// Ref: https://github.com/automerge/automerge-codemirror\n//\n\nimport { Annotation, StateEffect, type StateField, type EditorState, type Transaction } from '@codemirror/state';\n\nimport { type ChangeFn, type ChangeOptions, type Doc, type Heads, type Prop } from '@dxos/automerge/automerge';\n\nexport type State = {\n path: Prop[];\n lastHeads: Heads;\n unreconciledTransactions: Transaction[];\n};\n\nexport const getPath = (state: EditorState, field: StateField<State>): Prop[] => state.field(field).path;\nexport const getLastHeads = (state: EditorState, field: StateField<State>): Heads => state.field(field).lastHeads;\n\nexport type UpdateHeads = {\n newHeads: Heads;\n};\n\nexport const updateHeadsEffect = StateEffect.define<UpdateHeads>({});\n\nexport const updateHeads = (newHeads: Heads): StateEffect<UpdateHeads> => updateHeadsEffect.of({ newHeads });\n\nexport const reconcileAnnotation = Annotation.define<boolean>();\n\nexport const isReconcile = (tr: Transaction): boolean => {\n return !!tr.annotation(reconcileAnnotation);\n};\n\nexport type IDocHandle<T = any> = {\n docSync(): Doc<T> | undefined;\n change(callback: ChangeFn<T>, options?: ChangeOptions<T>): void;\n changeAt(heads: Heads, callback: ChangeFn<T>, options?: ChangeOptions<T>): string[] | undefined;\n\n addListener(event: 'change', listener: () => void): void;\n removeListener(event: 'change', listener: () => void): void;\n};\n", "//\n// Copyright 2023 DXOS.org\n// Copyright 2024 Automerge\n// Ref: https://github.com/automerge/automerge-codemirror\n//\n\nimport { type StateField } from '@codemirror/state';\nimport { type EditorView } from '@codemirror/view';\n\nimport { next as A } from '@dxos/automerge/automerge';\n\nimport {\n getLastHeads,\n getPath,\n isReconcile,\n reconcileAnnotation,\n updateHeads,\n type IDocHandle,\n type State,\n} from './defs';\nimport { updateAutomerge } from './update-automerge';\nimport { updateCodeMirror } from './update-codemirror';\n\n/**\n * Implements three-way merge (on each mutation).\n */\nexport class PatchSemaphore {\n private _inReconcile = false;\n\n // prettier-ignore\n constructor(\n private readonly _handle: IDocHandle,\n private readonly _state: StateField<State>\n ) {}\n\n reconcile(view: EditorView) {\n if (!this._inReconcile) {\n this._inReconcile = true;\n this.doReconcile(view);\n this._inReconcile = false;\n }\n }\n\n private doReconcile(view: EditorView) {\n const path = getPath(view.state, this._state);\n\n // Get the heads before the unreconciled transactions are applied.\n const oldHeads = getLastHeads(view.state, this._state);\n let selection = view.state.selection;\n\n // First undo all the unreconciled transactions.\n const transactions = view.state.field(this._state).unreconciledTransactions.filter((tx) => !isReconcile(tx));\n const toInvert = transactions.slice().reverse();\n for (const tr of toInvert) {\n const inverted = tr.changes.invert(tr.startState.doc);\n selection = selection.map(inverted);\n view.dispatch({\n changes: inverted,\n annotations: reconcileAnnotation.of(true),\n });\n }\n\n // Apply the unreconciled transactions to the document.\n // NOTE: null and undefined each come from automerge and repo respectively.\n let newHeads = updateAutomerge(this._state, this._handle, transactions, view.state);\n if (newHeads === null || newHeads === undefined) {\n // TODO(alexjg): this is the call that's resetting the editor state on click.\n newHeads = A.getHeads(this._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 = A.equals(oldHeads, newHeads) ? [] : A.diff(this._handle.docSync()!, oldHeads, newHeads);\n updateCodeMirror(view, selection, path, diff);\n\n // Update automerge state.\n view.dispatch({\n effects: updateHeads(newHeads),\n annotations: reconcileAnnotation.of(false),\n });\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n// Copyright 2024 Automerge\n// Ref: https://github.com/automerge/automerge-codemirror\n//\n\nimport { type EditorState, type StateField, type Transaction, type Text } from '@codemirror/state';\n\nimport { next as A, type Heads } from '@dxos/automerge/automerge';\n\nimport { type IDocHandle, type State } from './defs';\n\nexport const updateAutomerge = (\n field: StateField<State>,\n handle: IDocHandle,\n transactions: Transaction[],\n state: EditorState, // TODO(burdon): Just pass in the state field value?\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: A.Doc<unknown>) => {\n const invertedTransactions: { from: number; del: number; insert: Text }[] = [];\n for (const tr of transactions) {\n tr.changes.iterChanges((fromA, toA, _fromB, _toB, insert) => {\n invertedTransactions.push({ from: fromA, del: toA - fromA, insert });\n });\n }\n\n // TODO(burdon): Hack to apply in reverse order to properly apply range.\n invertedTransactions.reverse().forEach(({ from, del, insert }) => {\n A.splice(doc, path.slice(), from, del, insert.toString());\n });\n });\n\n return newHeads ?? undefined;\n};\n", "//\n// Copyright 2023 DXOS.org\n// Copyright 2024 Automerge\n// Ref: https://github.com/automerge/automerge-codemirror\n//\n\nimport { ChangeSet, type ChangeSpec, type EditorSelection, type EditorState } from '@codemirror/state';\nimport { type EditorView } from '@codemirror/view';\n\nimport {\n type DelPatch,\n type InsertPatch,\n type Patch,\n type Prop,\n type PutPatch,\n type SpliceTextPatch,\n} from '@dxos/automerge/automerge';\n\nimport { reconcileAnnotation } from './defs';\n\nexport const updateCodeMirror = (view: EditorView, selection: EditorSelection, target: Prop[], patches: Patch[]) => {\n for (const patch of patches) {\n const changeSpec = handlePatch(patch, target, view.state);\n if (changeSpec != null) {\n const changeSet = ChangeSet.of(changeSpec, view.state.doc.length, '\\n');\n selection = selection.map(changeSet, 1);\n view.dispatch({\n changes: changeSet,\n annotations: reconcileAnnotation.of(false),\n });\n }\n }\n\n view.dispatch({\n selection,\n annotations: reconcileAnnotation.of(false),\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\n const text = patch.values.map((value) => (value ? value.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\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\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\n const length = state.doc.length;\n if (typeof patch.value !== 'string') {\n return []; // TODO(dmaretskyi): How to handle non-string values?\n }\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 a path to a character\n// 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\n for (let i = 0; i < textPath.length; i++) {\n if (textPath[i] !== candidatePath[i]) {\n return null;\n }\n }\n\n const index = candidatePath[candidatePath.length - 1];\n if (typeof index === 'number') {\n return index;\n }\n\n return null;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type EditorState, Facet } from '@codemirror/state';\n\nimport type { Range } from '../hooks';\n\n/**\n * Converts indexes into the text document into stable peer-independent cursors.\n *\n * See:\n * - https://automerge.org/automerge/api-docs/js/functions/next.getCursor.html\n * - https://github.com/yjs/yjs?tab=readme-ov-file#relative-positions\n *\n * @param {assoc} number Negative values will associate the cursor with the previous character\n * while positive - with the next one.\n */\nexport interface CursorConverter {\n toCursor(position: number, assoc?: -1 | 1 | undefined): string;\n fromCursor(cursor: string): number;\n}\n\nconst defaultCursorConverter: CursorConverter = {\n toCursor: (position) => position.toString(),\n fromCursor: (cursor) => parseInt(cursor),\n};\n\nexport class Cursor {\n static readonly converter = Facet.define<CursorConverter, CursorConverter>({\n combine: (providers) => providers[0] ?? defaultCursorConverter,\n });\n\n static readonly getCursorFromRange = (state: EditorState, range: Range) => {\n const cursorConverter = state.facet(Cursor.converter);\n\n const from = cursorConverter.toCursor(range.from);\n const to = cursorConverter.toCursor(range.to, -1);\n return [from, to].join(':');\n };\n\n static readonly getRangeFromCursor = (state: EditorState, cursor: string) => {\n const cursorConverter = state.facet(Cursor.converter);\n\n const parts = cursor.split(':');\n const from = cursorConverter.fromCursor(parts[0]);\n const to = cursorConverter.fromCursor(parts[1]);\n return from !== undefined && to !== undefined ? { from, to } : undefined;\n };\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Annotation, Facet, type Extension, RangeSet, type Range } from '@codemirror/state';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n type PluginValue,\n ViewPlugin,\n type ViewUpdate,\n WidgetType,\n} from '@codemirror/view';\n\nimport { Event } from '@dxos/async';\nimport { Context } from '@dxos/context';\n\nimport { Cursor, type CursorConverter } from './cursor';\n\nexport interface AwarenessProvider {\n remoteStateChange: Event<void>;\n\n open(): void;\n close(): void;\n\n getRemoteStates(): AwarenessState[];\n update(position: AwarenessPosition | undefined): void;\n}\n\nconst dummyProvider: AwarenessProvider = {\n remoteStateChange: new Event(),\n\n open: () => {},\n close: () => {},\n\n getRemoteStates: () => [],\n update: () => {},\n};\n\nexport const awarenessProvider = Facet.define<AwarenessProvider, AwarenessProvider>({\n combine: (providers) => providers[0] ?? dummyProvider,\n});\n\n// TODO(dmaretskyi): Specify the users that actually changed. Currently, we recalculate positions for every user.\nconst RemoteSelectionChangedAnnotation = Annotation.define();\n\nexport type AwarenessPosition = {\n anchor?: string;\n head?: string;\n};\n\nexport type AwarenessInfo = {\n displayName?: string;\n // TODO(burdon): Rename light/dark.\n color?: string;\n lightColor?: string;\n};\n\nexport type AwarenessState = {\n position?: AwarenessPosition;\n peerId: string;\n info: AwarenessInfo;\n};\n\n/**\n * Extension provides presence information about other peers.\n */\nexport const awareness = (provider = dummyProvider): Extension => {\n return [\n awarenessProvider.of(provider),\n ViewPlugin.fromClass(RemoteSelectionsDecorator, {\n decorations: (value) => value.decorations,\n }),\n styles,\n ];\n};\n\n/**\n * Generates selection decorations from remote peers.\n */\nexport class RemoteSelectionsDecorator implements PluginValue {\n public decorations: DecorationSet = RangeSet.of([]);\n\n private readonly _ctx = new Context();\n\n private _cursorConverter: CursorConverter;\n private _provider: AwarenessProvider;\n private _lastAnchor?: number = undefined;\n private _lastHead?: number = undefined;\n\n constructor(view: EditorView) {\n this._cursorConverter = view.state.facet(Cursor.converter);\n this._provider = view.state.facet(awarenessProvider);\n this._provider.open();\n this._provider.remoteStateChange.on(this._ctx, () => {\n view.dispatch({ annotations: [RemoteSelectionChangedAnnotation.of([])] });\n });\n }\n\n destroy() {\n void this._ctx.dispose();\n this._provider.close();\n }\n\n update(update: ViewUpdate) {\n this._updateLocalSelection(update);\n this._updateRemoteSelections(update);\n }\n\n private _updateLocalSelection(update: ViewUpdate) {\n const hasFocus = update.view.hasFocus && update.view.dom.ownerDocument.hasFocus();\n const { anchor = undefined, head = undefined } = hasFocus ? update.state.selection.main : {};\n if (this._lastAnchor === anchor && this._lastHead === head) {\n return;\n }\n\n this._lastAnchor = anchor;\n this._lastHead = head;\n\n this._provider.update(\n anchor !== undefined && head !== undefined\n ? {\n anchor: this._cursorConverter.toCursor(anchor),\n head: this._cursorConverter.toCursor(head),\n }\n : undefined,\n );\n }\n\n private _updateRemoteSelections(update: ViewUpdate) {\n const decorations: Range<Decoration>[] = [];\n const awarenessStates = this._provider.getRemoteStates();\n for (const state of awarenessStates) {\n const anchor = state.position?.anchor ? this._cursorConverter.fromCursor(state.position.anchor) : null;\n const head = state.position?.head ? this._cursorConverter.fromCursor(state.position.head) : null;\n if (anchor == null || head == null) {\n continue;\n }\n\n const start = Math.min(Math.min(anchor, head), update.view.state.doc.length);\n const end = Math.min(Math.max(anchor, head), update.view.state.doc.length);\n\n const startLine = update.view.state.doc.lineAt(start);\n const endLine = update.view.state.doc.lineAt(end);\n\n // TODO(burdon): Factor out styles.\n const color = state.info.color ?? '#30bced';\n const lightColor = state.info.lightColor ?? color + '33';\n\n if (startLine.number === endLine.number) {\n // Selected content in a single line.\n decorations.push({\n from: start,\n to: end,\n value: Decoration.mark({\n attributes: { style: `background-color: ${lightColor}` },\n class: 'cm-collab-selection',\n }),\n });\n } else {\n // Selected content in multiple lines; first, render text-selection in the first line.\n decorations.push({\n from: start,\n to: startLine.from + startLine.length,\n value: Decoration.mark({\n attributes: { style: `background-color: ${color}` },\n class: 'cm-collab-selection',\n }),\n });\n\n // Render text-selection in the last line.\n decorations.push({\n from: endLine.from,\n to: end,\n value: Decoration.mark({\n attributes: { style: `background-color: ${color}` },\n class: 'cm-collab-selection',\n }),\n });\n\n for (let i = startLine.number + 1; i < endLine.number; i++) {\n const linePos = update.view.state.doc.line(i).from;\n decorations.push({\n from: linePos,\n to: linePos,\n value: Decoration.line({\n attributes: { style: `background-color: ${color}`, class: 'cm-collab-selectionLine' },\n }),\n });\n }\n }\n\n decorations.push({\n from: head,\n to: head,\n value: Decoration.widget({\n side: head - anchor > 0 ? -1 : 1, // The local cursor should be rendered outside the remote selection.\n block: false,\n widget: new RemoteCaretWidget(state.info.displayName ?? 'Anonymous', color),\n }),\n });\n }\n\n this.decorations = Decoration.set(decorations, true);\n }\n}\n\nclass RemoteCaretWidget extends WidgetType {\n constructor(\n private readonly _name: string,\n private readonly _color: string,\n ) {\n super();\n }\n\n override toDOM(): HTMLElement {\n const span = document.createElement('span');\n span.className = 'cm-collab-selectionCaret';\n span.style.backgroundColor = this._color;\n span.style.borderColor = this._color;\n\n const dot = document.createElement('div');\n dot.className = 'cm-collab-selectionCaretDot';\n\n const info = document.createElement('div');\n info.className = 'cm-collab-selectionInfo';\n info.innerText = this._name;\n\n span.appendChild(document.createTextNode('\\u2060'));\n span.appendChild(dot);\n span.appendChild(document.createTextNode('\\u2060'));\n span.appendChild(info);\n span.appendChild(document.createTextNode('\\u2060'));\n\n return span;\n }\n\n override updateDOM() {\n return false;\n }\n\n override eq(widget: this) {\n return widget._color === this._color;\n }\n\n override get estimatedHeight() {\n return -1;\n }\n\n override ignoreEvent() {\n return true;\n }\n}\n\nconst styles = EditorView.baseTheme({\n '.cm-collab-selection': {},\n '.cm-collab-selectionLine': {\n padding: 0,\n margin: '0px 2px 0px 4px',\n },\n '.cm-collab-selectionCaret': {\n position: 'relative',\n borderLeft: '1px solid black',\n borderRight: '1px solid black',\n marginLeft: '-1px',\n marginRight: '-1px',\n boxSizing: 'border-box',\n display: 'inline',\n cursor: 'pointer',\n },\n '.cm-collab-selectionCaretDot': {\n borderRadius: '50%',\n position: 'absolute',\n width: '.5em',\n height: '.5em',\n top: '-.25em',\n left: '-.25em',\n backgroundColor: 'inherit',\n transition: 'transform .3s ease-in-out',\n boxSizing: 'border-box',\n },\n '.cm-collab-selectionCaret:hover > .cm-collab-selectionCaretDot': {\n transform: 'scale(0)',\n transformOrigin: 'center',\n },\n '.cm-collab-selectionInfo': {\n position: 'absolute',\n transform: 'translate(-50%, 0)',\n top: '-20px',\n left: 0,\n fontSize: '.75em',\n fontFamily: 'sans-serif',\n fontStyle: 'normal',\n fontWeight: 'normal',\n lineHeight: 'normal',\n userSelect: 'none',\n color: 'white',\n padding: '2px',\n zIndex: 101,\n transition: 'opacity .3s ease-in-out',\n backgroundColor: 'inherit',\n borderRadius: '2px',\n // These should be separate.\n opacity: 0,\n transitionDelay: '0s',\n whiteSpace: 'nowrap',\n },\n '.cm-collab-selectionCaret:hover > .cm-collab-selectionInfo': {\n opacity: 1,\n transitionDelay: '0s',\n },\n});\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { closeBrackets } from '@codemirror/autocomplete';\nimport { history } from '@codemirror/commands';\nimport { bracketMatching, defaultHighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { type Extension } from '@codemirror/state';\nimport { oneDarkHighlightStyle } from '@codemirror/theme-one-dark';\nimport { drawSelection, EditorView, highlightActiveLine, placeholder } from '@codemirror/view';\n\nimport { type ThemeMode } from '@dxos/react-ui';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { type TextEditorProps } from '../components';\n\nexport type BasicBundleOptions = {\n themeMode?: ThemeMode;\n} & Pick<TextEditorProps, 'placeholder' | 'lineWrapping'>;\n\nexport const createBasicBundle = ({\n themeMode,\n placeholder: _placeholder,\n lineWrapping = true,\n}: BasicBundleOptions = {}): Extension[] =>\n [\n lineWrapping && EditorView.lineWrapping,\n\n // https://codemirror.net/docs/ref/#codemirror.minimalSetup\n bracketMatching(),\n closeBrackets(),\n drawSelection(),\n highlightActiveLine(),\n history(),\n _placeholder && placeholder(_placeholder),\n\n // https://github.com/codemirror/theme-one-dark\n themeMode === 'dark' ? syntaxHighlighting(oneDarkHighlightStyle) : syntaxHighlighting(defaultHighlightStyle),\n ].filter(isNotFalsy);\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(\n private readonly _node: HTMLElement,\n private readonly _options: BlastOptions,\n ) {\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 { invertedEffects } from '@codemirror/commands';\nimport { type Extension, Facet, StateEffect, StateField, type Text, type ChangeDesc } from '@codemirror/state';\nimport { hoverTooltip, keymap, type Command, Decoration, EditorView, type Rect } from '@codemirror/view';\nimport sortBy from 'lodash.sortby';\nimport { useEffect } from 'react';\n\nimport { debounce } from '@dxos/async';\nimport { nonNullable } from '@dxos/util';\n\nimport { Cursor } from './cursor';\nimport { type Comment, type Range } from '../hooks';\nimport { getToken } from '../styles';\nimport { callbackWrapper } from '../util';\n\n// TODO(burdon): Reconcile with theme.\nconst styles = EditorView.baseTheme({\n '&light .cm-comment, &light .cm-comment-current': { mixBlendMode: 'darken' },\n '&dark .cm-comment, &dark .cm-comment-current': { mixBlendMode: 'plus-lighter' },\n '&light .cm-comment': {\n backgroundColor: getToken('extend.colors.yellow.50'),\n },\n '&light .cm-comment-current': {\n backgroundColor: getToken('extend.colors.yellow.100'),\n },\n '&dark .cm-comment': {\n color: getToken('extend.colors.yellow.50'),\n backgroundColor: getToken('extend.colors.yellow.900'),\n },\n '&dark .cm-comment-current': {\n color: getToken('extend.colors.yellow.100'),\n backgroundColor: getToken('extend.colors.yellow.950'),\n },\n});\n\nconst commentMark = Decoration.mark({ class: 'cm-comment' });\nconst commentCurrentMark = Decoration.mark({ class: 'cm-comment-current' });\n\ntype CommentState = {\n comment: Comment;\n range: Range;\n location?: Rect | null;\n};\n\ntype SelectionState = {\n current?: string;\n closest?: string;\n};\n\nexport type CommentsState = {\n comments: CommentState[];\n selection: SelectionState;\n};\n\nexport const focusComment = (view: EditorView, id: string, center = true) => {\n const comment = view.state.field(commentsState).comments.find((range) => range.comment.id === id);\n if (!comment?.comment.cursor) {\n return;\n }\n\n const range = Cursor.getRangeFromCursor(view.state, comment.comment.cursor);\n if (range) {\n view.dispatch({\n selection: { anchor: range.from },\n effects: [\n //\n EditorView.scrollIntoView(range.from, center ? { y: 'center' } : undefined),\n setSelection.of({ current: id }),\n ],\n });\n }\n};\n\nexport const setComments = StateEffect.define<Comment[]>();\n\nexport const setSelection = StateEffect.define<SelectionState>();\n\nconst setCommentState = StateEffect.define<CommentsState>();\n\n/**\n * State field (reducer) that tracks comment ranges.\n * The ranges are tracked as Automerge cursors from which the absolute indexed ranges can be computed.\n */\nconst commentsState = StateField.define<CommentsState>({\n create: () => ({ comments: [], selection: {} }),\n update: (value, tr) => {\n for (const effect of tr.effects) {\n // Update selection.\n if (effect.is(setSelection)) {\n return { ...value, selection: effect.value };\n }\n\n // Update range from store.\n if (effect.is(setComments)) {\n const comments: CommentState[] = effect.value\n .map((comment) => {\n // Skip cut/deleted comments.\n if (!comment.cursor) {\n return undefined;\n }\n\n const range = Cursor.getRangeFromCursor(tr.state, comment.cursor);\n return range && { comment, range };\n })\n .filter(nonNullable);\n\n return { ...value, comments };\n }\n\n // Update entire state.\n if (effect.is(setCommentState)) {\n return effect.value;\n }\n }\n\n return value;\n },\n});\n\n/**\n * Decorate ranges.\n */\nconst commentsDecorations = EditorView.decorations.compute([commentsState], (state) => {\n const {\n selection: { current },\n comments,\n } = state.field(commentsState);\n\n const decorations = sortBy(comments ?? [], (range) => range.range.from)\n ?.flatMap((comment) => {\n const range = comment.range;\n if (!range || range.from === range.to) {\n console.warn('Invalid range:', range);\n return undefined;\n }\n\n if (comment.comment.id === current) {\n return commentCurrentMark.range(range.from, range.to);\n } else {\n return commentMark.range(range.from, range.to);\n }\n })\n .filter(nonNullable);\n\n return Decoration.set(decorations);\n});\n\nexport type CommentsOptions = {\n /**\n * Key shortcut to create a new thread.\n */\n key?: string;\n /**\n * Called to create a new thread and return the thread id.\n */\n onCreate?: (params: { cursor: string; from: number; location?: Rect | null }) => string | undefined;\n /**\n * Selection cut/deleted.\n */\n onDelete?: (params: { id: string }) => void;\n /**\n * Called when a comment is moved.\n */\n onUpdate?: (params: { id: string; cursor: string }) => void;\n /**\n * Called to notify which thread is currently closest to the cursor.\n */\n onSelect?: (state: CommentsState) => void;\n /**\n * Called to render tooltip.\n */\n onHover?: (el: Element, shortcut: string) => void;\n};\n\ntype TrackedComment = { id: string; from: number; to: number };\n\nconst trackPastedComments = (onUpdate: NonNullable<CommentsOptions['onUpdate']>) => {\n // Tracks indexed selections within text.\n let tracked: { text: Text; comments: TrackedComment[] } | null = null;\n\n // Track cut or copy (enables cut-and-paste and copy-delete-paste to restore comment selection).\n const handleTrack = (event: Event, view: EditorView) => {\n const comments = view.state.field(commentsState);\n const { main } = view.state.selection;\n const selectedRanges = comments.comments.filter(\n ({ range }) => range.from >= main.from && range.to <= main.to && range.from < range.to,\n );\n\n if (!selectedRanges.length) {\n tracked = null;\n } else {\n tracked = {\n text: view.state.doc.slice(main.from, main.to),\n comments: selectedRanges.map(({ comment, range }) => ({\n id: comment.id,\n from: range.from - main.from,\n to: range.to - main.from,\n })),\n };\n }\n };\n\n return [\n EditorView.domEventHandlers({\n cut: handleTrack,\n copy: handleTrack,\n }),\n\n // Track deleted comments.\n invertedEffects.of((tr) => {\n const { comments } = tr.startState.field(commentsState);\n const effects: StateEffect<any>[] = [];\n tr.changes.iterChangedRanges((fromA, toA) => {\n for (const {\n comment: { id },\n range: { from, to },\n } of comments) {\n if (from < to && from >= fromA && to <= toA) {\n effects.push(restoreCommentEffect.of({ id, from, to }));\n }\n }\n });\n\n return effects;\n }),\n\n // Handle paste or the undo of comment deletion.\n EditorView.updateListener.of((update) => {\n const restore: TrackedComment[] = [];\n\n for (let i = 0; i < update.transactions.length; i++) {\n const tr = update.transactions[i];\n for (let j = 0; j < restore.length; j++) {\n restore[j] = mapTrackedComment(restore[j], tr.changes);\n }\n for (const effect of tr.effects) {\n if (effect.is(restoreCommentEffect)) {\n restore.push(effect.value);\n }\n }\n }\n\n if (tracked) {\n const paste = update.transactions.find((tr) => tr.isUserEvent('input.paste'));\n if (paste) {\n let found = -1;\n paste.changes.iterChanges((fromA, toA, fromB, toB, text) => {\n if (text.eq(tracked!.text)) {\n for (let i = update.transactions.indexOf(paste!) + 1; i < update.transactions.length; i++) {\n fromB = update.transactions[i].changes.mapPos(fromB);\n }\n\n found = fromB;\n }\n });\n\n if (found > -1) {\n for (const moved of tracked.comments) {\n restore.push({ id: moved.id, from: found + moved.from, to: found + moved.to });\n }\n }\n\n tracked = null;\n }\n }\n\n for (const comment of restore) {\n const { comments } = update.startState.field(commentsState);\n const exists = comments.some((c) => c.comment.id === comment.id && c.range.from < c.range.to);\n if (!exists) {\n const cursor = Cursor.getCursorFromRange(update.state, comment);\n onUpdate({ id: comment.id, cursor });\n }\n }\n }),\n ];\n};\n\nconst mapTrackedComment = (comment: TrackedComment, changes: ChangeDesc) => ({\n id: comment.id,\n from: changes.mapPos(comment.from, 1),\n to: changes.mapPos(comment.to, 1),\n});\n\n// These are attached to undone/redone transactions in the editor for the purpose of restoring comments\n// that were deleted by the original changes.\nconst restoreCommentEffect = StateEffect.define<TrackedComment>({ map: mapTrackedComment });\n\nconst optionsFacet = Facet.define<CommentsOptions, CommentsOptions>({\n combine: (providers) => providers[0],\n});\n\n/**\n * Create comment thread action.\n */\nexport const createComment: Command = (view) => {\n const options = view.state.facet(optionsFacet);\n const { from, to } = view.state.selection.main;\n if (from === to) {\n return false;\n }\n\n // Don't allow selection at end of document.\n if (to === view.state.doc.length) {\n view.dispatch({\n changes: {\n from: to,\n insert: '\\n',\n },\n });\n }\n\n const cursor = Cursor.getCursorFromRange(view.state, { from, to });\n if (cursor) {\n // Create thread via callback.\n const id = options.onCreate?.({ cursor, from, location: view.coordsAtPos(from) });\n if (id) {\n // Update range.\n view.dispatch({\n effects: setSelection.of({ current: id }),\n selection: { anchor: to },\n });\n\n return true;\n }\n }\n\n return false;\n};\n\n/**\n * Comment threads.\n * 1). Updates the EditorModel to store relative selections for a set of comments threads.\n * Since the selections are relative, they do not need to be updated when the document is edited.\n * 2). Implements a StateField to track absolute selections corresponding to the comments (i.e., when the document is edited).\n * 3). Creates decoration marks to apply classes to each selection.\n * 4). Tracks the current cursor position to:\n * a). Update the decoration to show if the cursor is within a current selection.\n * b). Calls a handler to indicate which is the closest selection (e.g., to update the thread sidebar).\n * 5). Optionally, implements a hoverTooltip to show hints when creating a selection range.\n */\nexport const comments = (options: CommentsOptions = {}): Extension => {\n const { key: shortcut = \"meta-'\" } = options;\n\n const handleSelect = debounce((state: CommentsState) => options.onSelect?.(state), 200);\n\n return [\n optionsFacet.of(options),\n commentsState,\n commentsDecorations,\n styles,\n\n //\n // Keymap.\n //\n options.onCreate\n ? keymap.of([\n {\n key: shortcut,\n run: callbackWrapper(createComment),\n },\n ])\n : [],\n\n //\n // Hover tooltip (for key shortcut hints, etc.)\n // TODO(burdon): Factor out to generic hints extension for current selection/line.\n //\n options.onHover\n ? hoverTooltip(\n (view, pos) => {\n const selection = view.state.selection.main;\n if (selection && pos >= selection.from && pos <= selection.to) {\n return {\n pos: selection.from,\n end: selection.to,\n above: true,\n create: () => {\n const el = document.createElement('div');\n options.onHover!(el, shortcut);\n return { dom: el, offset: { x: 0, y: 8 } };\n },\n };\n }\n\n return null;\n },\n {\n // TODO(burdon): Hide on change triggered immediately?\n // hideOnChange: true,\n hoverTime: 1_000,\n },\n )\n : [],\n\n //\n // Track deleted ranges and update ranges for decorations.\n //\n EditorView.updateListener.of(({ view, state, changes }) => {\n let mod = false;\n const { comments, ...value } = state.field(commentsState);\n changes.iterChanges((from, to, from2, to2) => {\n comments.forEach(({ comment, range }) => {\n // Test if range deleted.\n if (from2 === to2) {\n const newRange = Cursor.getRangeFromCursor(view.state, comment.cursor!);\n if (!newRange || newRange.to - newRange.from === 0) {\n options.onDelete?.({ id: comment.id });\n }\n }\n\n // Update range.\n if (from <= range.to) {\n const newRange = Cursor.getRangeFromCursor(view.state, comment.cursor!);\n Object.assign(range, newRange);\n mod = true;\n }\n });\n });\n\n if (mod) {\n view.dispatch({ effects: setCommentState.of({ comments, ...value }) });\n }\n }),\n\n //\n // Track selection/proximity.\n //\n EditorView.updateListener.of(({ view, state }) => {\n let min = Infinity;\n const {\n selection: { current, closest },\n comments,\n } = state.field(commentsState);\n\n const { head } = state.selection.main;\n const selection: SelectionState = {};\n comments.forEach(({ comment, range }) => {\n if (head >= range.from && head <= range.to) {\n selection.current = comment.id;\n selection.closest = undefined;\n }\n\n if (!selection.current) {\n const d = Math.min(Math.abs(head - range.from), Math.abs(head - range.to));\n if (d < min) {\n selection.closest = comment.id;\n min = d;\n }\n }\n });\n\n if (selection.current !== current || selection.closest !== closest) {\n view.dispatch({ effects: setSelection.of(selection) });\n\n // Update callback.\n handleSelect({\n selection,\n comments: comments.map(({ comment, range }) => ({\n comment,\n range,\n location: view.coordsAtPos(range.from),\n })),\n });\n }\n }),\n\n options.onUpdate ? trackPastedComments(options.onUpdate) : [],\n ];\n};\n\n/**\n * Update comments state field.\n */\nexport const useComments = (view: EditorView | null, comments: Comment[] = []) => {\n useEffect(() => {\n if (view) {\n view.dispatch({\n effects: setComments.of(comments),\n });\n }\n }, [view, comments]);\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 { 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',\n 2: 'mbs-4 mbe-2 font-medium text-inherit no-underline text-3xl',\n 3: 'mbs-4 mbe-2 font-medium text-inherit no-underline text-2xl',\n 4: 'mbs-4 mbe-2 font-medium text-inherit no-underline text-xl',\n 5: 'mbs-4 mbe-2 font-medium text-inherit no-underline text-lg',\n 6: 'mbs-4 mbe-2 font-medium text-inherit no-underline',\n};\n\nexport const heading = (level: HeadingLevel) => {\n return headings[level];\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\nexport const blockquote = mx('pl-1 mr-1 border-is-4 border-primary-500/70 dark:border-primary-500/30', light);\n\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 get from 'lodash.get';\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\nexport const getToken = (path: string, defaultValue: any = undefined) => get(tokens, path, defaultValue);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport type { Transaction } from '@codemirror/state';\n\nimport { log } from '@dxos/log';\n\n/**\n * CodeMirror callbacks swallow errors so wrap handlers.\n */\n// TODO(burdon): EditorView.exceptionSink should catch errors.\nexport const callbackWrapper = <T extends Function>(fn: T): T =>\n ((...args: any[]) => {\n try {\n return fn(...args);\n } catch (err) {\n log.catch(err);\n }\n }) as unknown as T;\n\nexport const logChanges = (trs: readonly Transaction[]) => {\n const changes = trs\n .flatMap((tr) => {\n if (tr.changes.empty) {\n return undefined;\n }\n\n const changes: any[] = [];\n tr.changes.iterChanges((fromA, toA, fromB, toB, inserted) =>\n changes.push(JSON.stringify({ fromA, toA, fromB, toB, inserted: inserted.toString() })),\n );\n\n return changes;\n })\n .filter(Boolean);\n\n if (changes.length) {\n console.log('changes', changes);\n }\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\n\nexport type ListenerOptions = {\n onFocus?: (focused: boolean) => void;\n onChange?: (text: string) => void;\n};\n\n/**\n * Event listener.\n */\nexport const listener = ({ onFocus, onChange }: ListenerOptions): Extension => {\n const extensions: Extension[] = [];\n\n onFocus &&\n extensions.push(\n EditorView.focusChangeEffect.of((_, focused) => {\n onFocus(focused);\n return null;\n }),\n );\n\n onChange &&\n extensions.push(\n EditorView.updateListener.of((update) => {\n onChange(update.state.doc.toString());\n }),\n );\n\n return extensions;\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';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { markdownHighlightStyle, markdownTagsExtensions } from './highlight';\nimport { type TextEditorProps } from '../../components';\n\nexport type MarkdownBundleOptions = {\n themeMode?: ThemeMode;\n} & Pick<TextEditorProps, 'placeholder' | 'lineWrapping'>;\n\n/**\n * Markdown bundle.\n * Refs:\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 createMarkdownExtensions = ({\n themeMode,\n placeholder: _placeholder,\n lineWrapping = true,\n}: MarkdownBundleOptions = {}): Extension[] => {\n return [\n lineWrapping && EditorView.lineWrapping,\n EditorState.allowMultipleSelections.of(true),\n EditorState.tabSize.of(2),\n\n // https://github.com/codemirror/basic-setup\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()),\n\n keymap.of([\n // https://codemirror.net/docs/ref/#commands.indentWithTab\n indentWithTab,\n // https://codemirror.net/docs/ref/#autocomplete.closeBracketsKeymap\n ...closeBracketsKeymap,\n // https://codemirror.net/docs/ref/#commands.historyKeymap\n ...historyKeymap,\n // https://codemirror.net/docs/ref/#search.searchKeymap\n ...searchKeymap,\n // https://codemirror.net/docs/ref/#commands.standardKeymap\n ...standardKeymap,\n ]),\n ].filter(isNotFalsy);\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';\n\nimport {\n blockquote,\n bold,\n code,\n codeMark,\n getToken,\n heading,\n inlineUrl,\n italic,\n mark,\n strikethrough,\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 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: mark,\n },\n\n // E.g., code block language (after ```).\n {\n tag: [tags.function(tags.variableName), tags.labelName],\n class: codeMark,\n },\n\n {\n tag: [tags.monospace],\n class: 'font-mono',\n },\n\n // Headings.\n { tag: tags.heading1, class: heading(1) },\n { tag: tags.heading2, class: heading(2) },\n { tag: tags.heading3, class: heading(3) },\n { tag: tags.heading4, class: heading(4) },\n { tag: tags.heading5, class: heading(5) },\n { tag: tags.heading6, class: heading(6) },\n\n // Emphasis.\n { tag: tags.emphasis, class: italic },\n { tag: tags.strong, class: bold },\n { tag: tags.strikethrough, class: strikethrough },\n\n // Naked URLs.\n {\n tag: [markdownTags.URL],\n class: inlineUrl,\n },\n\n // 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 unless changed by an extension.\n {\n tag: [markdownTags.CodeText, markdownTags.InlineCode],\n class: code,\n },\n\n {\n tag: [markdownTags.QuoteMark],\n class: blockquote,\n },\n\n {\n tag: [markdownTags.TableCell],\n class: 'font-mono',\n },\n ],\n {\n scope: markdownLanguage,\n all: { fontFamily: getToken('fontFamily.body', []).join(',') },\n },\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport { RangeSetBuilder } from '@codemirror/state';\nimport {\n ViewPlugin,\n type DecorationSet,\n EditorView,\n type ViewUpdate,\n Decoration,\n type BlockInfo,\n WidgetType,\n} from '@codemirror/view';\n\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { getToken } from '../../styles';\n\n// TODO(burdon): Reconcile with theme.\nconst styles = EditorView.baseTheme({\n '& .cm-code': {\n fontFamily: getToken('fontFamily.mono', []).join(','),\n },\n '& .cm-codeblock': {\n width: '100%',\n paddingInline: '1rem !important',\n position: 'relative',\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n inset: 0,\n },\n },\n '&light .cm-codeblock': {\n '&::after': {\n background: getToken('extend.semanticColors.input.light'),\n mixBlendMode: 'darken',\n },\n },\n '&dark .cm-codeblock': {\n '&::after': {\n background: getToken('extend.semanticColors.input.dark'),\n mixBlendMode: 'lighten',\n },\n },\n '& .cm-codeblock-first': {\n display: 'inline-block',\n '&::after': {\n borderTopLeftRadius: '.5rem',\n borderTopRightRadius: '.5rem',\n },\n },\n '& .cm-codeblock-last': {\n display: 'inline-block',\n '&::after': {\n borderBottomLeftRadius: '.5rem',\n borderBottomRightRadius: '.5rem',\n },\n },\n});\n\n// TODO(burdon): Start from EditorView.lineBlockAt(pos).\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\n// TODO(burdon): Add copy to clipboard widget.\nclass LineWidget extends WidgetType {\n constructor(private readonly _className: string) {\n super();\n }\n\n override toDOM() {\n const el = document.createElement('span');\n el.innerHTML = '&nbsp;';\n el.className = mx('cm-code cm-codeblock', this._className);\n return el;\n }\n}\n\nconst top = new LineWidget('cm-codeblock-first');\nconst bottom = new LineWidget('cm-codeblock-last');\n\n// TODO(burdon): Selection isn't visible unless multiline (e.g., can't highlight word).\n\nconst buildDecorations = (view: EditorView): DecorationSet => {\n const builder = new RangeSetBuilder<Decoration>();\n const { state } = view;\n const blocks = view.viewportLineBlocks;\n const cursor = state.selection.main.head;\n\n for (const { from, to } of view.visibleRanges) {\n syntaxTree(state).iterate({\n enter: (node) => {\n if (node.name === 'FencedCode') {\n // FencedCode > CodeMark > [CodeInfo] > CodeText > CodeMark\n const edit = !view.state.readOnly && cursor >= node.from && cursor <= node.to;\n const range = getLineRange(blocks, node.from, node.to);\n for (let i = range[0]; i <= range[1]; i++) {\n const block = blocks[i];\n if (!edit && (i === range[0] || i === range[1])) {\n builder.add(block.from, block.to, Decoration.replace({ widget: i === range[0] ? top : bottom }));\n } else {\n builder.add(\n block.from,\n block.from,\n Decoration.line({\n class: mx(\n 'cm-code cm-codeblock',\n i === range[0] && 'cm-codeblock-first',\n i === range[1] && 'cm-codeblock-last',\n ),\n }),\n );\n }\n }\n }\n },\n from,\n to,\n });\n }\n\n return builder.finish();\n};\n\nexport const code = () => {\n return [\n ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n constructor(view: EditorView) {\n this.decorations = buildDecorations(view);\n }\n\n update(update: ViewUpdate) {\n this.decorations = buildDecorations(update.view);\n }\n },\n {\n decorations: (value) => value.decorations,\n },\n ),\n styles,\n ];\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { snippet } from '@codemirror/autocomplete';\nimport { syntaxTree } from '@codemirror/language';\nimport {\n type Extension,\n type StateCommand,\n RangeSetBuilder,\n type EditorState,\n type ChangeSpec,\n type Text,\n EditorSelection,\n type Line,\n} from '@codemirror/state';\nimport { Decoration, type DecorationSet, EditorView, keymap, ViewPlugin, type ViewUpdate } from '@codemirror/view';\nimport { type SyntaxNodeRef, type SyntaxNode } from '@lezer/common';\nimport { useState, useMemo } from 'react';\n\n// Markdown refs:\n// https://github.github.com/gfm\n// https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax\n\n// Describes the formatting situation of the selection in an editor state.\n// For inline styles `strong`, `emphasis`, `strikethrough`, and `code`,\n// the field only holds true when *all* selected text has the style,\n// or when the selection is a cursor inside such a style.\nexport type Formatting = {\n blankLine: boolean;\n // The type of the block at the selection.\n // If multiple different block types are selected, this will hold null.\n blockType:\n | 'codeblock'\n | 'heading1'\n | 'heading2'\n | 'heading3'\n | 'heading4'\n | 'heading5'\n | 'heading6'\n | 'paragraph'\n | 'tablecell'\n | null;\n // Whether all selected text is wrapped in a blockquote.\n blockQuote: boolean;\n // Whether the selected text is strong.\n strong: boolean;\n // Whether the selected text is emphasized.\n emphasis: boolean;\n // Whether the selected text is stricken through.\n strikethrough: boolean;\n // Whether the selected text is inline code.\n code: boolean;\n // Whether there are links in the selected text.\n link: boolean;\n // If all selected blocks have the same (innermost) list style, that is indicated here.\n listStyle: null | 'ordered' | 'bullet' | 'task';\n};\n\nexport const compareFormatting = (a: Formatting, b: Formatting) =>\n a.blockType === b.blockType &&\n a.strong === b.strong &&\n a.emphasis === b.emphasis &&\n a.strikethrough === b.strikethrough &&\n a.code === b.code &&\n a.link === b.link &&\n a.listStyle === b.listStyle &&\n a.blockQuote === b.blockQuote;\n\nexport enum Inline {\n Strong = 0,\n Emphasis = 1,\n Strikethrough = 2,\n Code = 3,\n}\n\nexport enum List {\n Ordered,\n Bullet,\n Task,\n}\n\n//\n// Headings\n//\n\nexport const setHeading =\n (level: number): StateCommand =>\n ({ state, dispatch }) => {\n const {\n selection: { ranges },\n doc,\n } = state;\n const changes: ChangeSpec[] = [];\n let prevBlock = -1;\n for (const range of ranges) {\n syntaxTree(state).iterate({\n from: range.from,\n to: range.to,\n enter: (node) => {\n if (!Object.hasOwn(Textblocks, node.name) || prevBlock === node.from) {\n return;\n }\n prevBlock = node.from;\n const blockType = Textblocks[node.name];\n const isHeading = /heading(\\d)/.exec(blockType);\n const curLevel = isHeading ? +isHeading[1] : node.name === 'Paragraph' ? 0 : -1;\n if (curLevel < 0 || curLevel === level) {\n return;\n }\n if (curLevel === 0) {\n changes.push({ from: node.from, insert: '#'.repeat(level) + ' ' });\n } else if (node.name === 'SetextHeading1' || node.name === 'SetextHeading2') {\n // Change Setext heading to regular one.\n const nextLine = doc.lineAt(node.to);\n if (level) {\n changes.push({ from: node.from, insert: '#'.repeat(level) + ' ' });\n }\n changes.push({ from: nextLine.from - 1, to: nextLine.to });\n } else {\n // Adjust the level of an ATX heading.\n if (level === 0) {\n changes.push({ from: node.from, to: Math.min(node.to, node.from + curLevel + 1) });\n } else if (level < curLevel) {\n changes.push({ from: node.from, to: node.from + (curLevel - level) });\n } else {\n changes.push({ from: node.from, insert: '#'.repeat(level - curLevel) });\n }\n }\n },\n });\n }\n\n if (!changes.length) {\n return false;\n }\n\n dispatch(state.update({ changes, userEvent: 'format.setHeading', scrollIntoView: true }));\n return true;\n };\n\n//\n// Styles\n//\n\nexport const setStyle =\n (type: Inline, enable: boolean): StateCommand =>\n ({ state, dispatch }) => {\n const marker = inlineMarkerText(type);\n const changes = state.changeByRange((range) => {\n // Special case for markers directly around the cursor, which will often not be parsed as valid styling\n if (!enable && range.empty) {\n const after = state.doc.sliceString(range.head, range.head + 6);\n const found = after.indexOf(marker);\n if (found >= 0 && /^[*~`]*$/.test(after.slice(0, found))) {\n const before = state.doc.sliceString(range.head - 6, range.head);\n if (\n before.slice(before.length - found - marker.length, before.length - found) === marker &&\n [...before.slice(before.length - found)].reverse().join('') === after.slice(0, found)\n ) {\n return {\n changes: [\n { from: range.head - marker.length - found, to: range.head - found },\n { from: range.head + found, to: range.head + found + marker.length },\n ],\n range: EditorSelection.cursor(range.from - marker.length),\n };\n }\n }\n }\n\n const changes: ChangeSpec[] = [];\n // Used to add insertions that should happen *after* any other insertions at the same position.\n const changesAtEnd: ChangeSpec[] = [];\n let blockStart = -1;\n let blockEnd = -1;\n let startCovered: boolean | 'adjacent' = false;\n let endCovered: boolean | 'adjacent' = false;\n let { from, to } = range;\n // Iterate the selected range. For each textblock, determine a\n // start and end position, the overlap of the selected range and\n // the block's extent, that should be styled/unstyled.\n syntaxTree(state).iterate({\n from,\n to,\n enter: (node) => {\n const { name } = node;\n if (Object.hasOwn(Textblocks, name) && Textblocks[name] !== 'codeblock') {\n // Set up for this textblock\n blockStart = blockContentStart(node);\n blockEnd = blockContentEnd(node, state.doc);\n startCovered = endCovered = false;\n } else if (name === 'Link' || (name === 'Image' && enable)) {\n // If the range partially overlaps a link or image, expand it to cover it.\n if (from < node.from && to > node.from && to <= node.to) {\n to = node.to;\n } else if (to > node.to && from >= node.from && from < node.to) {\n from = node.from;\n }\n } else if (IgnoreInline.has(name) && enable) {\n // Move endpoints out of markers.\n if (node.from < from && node.to > from) {\n if (to === from) {\n to = node.to;\n }\n from = node.to;\n }\n if (node.from < to && node.to > to) {\n to = node.from;\n }\n } else if (Object.hasOwn(InlineMarker, name)) {\n // This is an inline marker node.\n const markType = InlineMarker[name];\n const size = inlineMarkerText(markType).length;\n const openEnd = node.from + size;\n const closeStart = node.to - size;\n // Determine whether the start/end of the range is covered\n // by this.\n if (markType === type) {\n if (openEnd <= from && closeStart >= from) {\n startCovered = openEnd === from ? 'adjacent' : true;\n }\n if (openEnd <= to && closeStart >= to) {\n endCovered = closeStart === to ? 'adjacent' : true;\n }\n }\n // Marks of the same type in range, or any mark if we're\n // adding code style, need to be removed.\n if (markType === type || (type === Inline.Code && enable)) {\n if (node.from >= from && openEnd <= to) {\n changes.push({ from: node.from, to: openEnd });\n if (markType !== type && closeStart >= to) {\n // End marker outside, move start\n changesAtEnd.push({\n from: skipSpaces(Math.min(to, blockEnd), state.doc, 1, blockEnd),\n insert: inlineMarkerText(markType),\n });\n }\n }\n if (closeStart >= from && node.to <= to) {\n changes.push({ from: closeStart, to: node.to });\n if (markType !== type && openEnd <= from) {\n // Start marker outside, move end\n changes.push({\n from: skipSpaces(Math.max(from, blockStart), state.doc, -1, blockStart),\n insert: inlineMarkerText(markType),\n });\n }\n }\n }\n }\n },\n leave: (node) => {\n if (Object.hasOwn(Textblocks, node.name) && Textblocks[node.name] !== 'codeblock') {\n // Finish opening/closing the marks for this textblock\n const rangeStart = Math.max(from, blockStart);\n const rangeEnd = Math.min(to, blockEnd);\n if (enable) {\n if (!startCovered) {\n changes.push({ from: rangeStart, insert: marker });\n }\n if (!endCovered) {\n changes.push({ from: rangeEnd, insert: marker });\n }\n } else {\n if (startCovered === 'adjacent') {\n changes.push({ from: from - marker.length, to: from });\n } else if (startCovered) {\n changes.push({ from: skipSpaces(rangeStart, state.doc, -1, blockStart), insert: marker });\n }\n if (endCovered === 'adjacent') {\n changes.push({ from: to, to: to + marker.length });\n } else if (endCovered) {\n changes.push({ from: skipSpaces(rangeEnd, state.doc, 1, blockEnd), insert: marker });\n }\n }\n }\n },\n });\n const changeSet = state.changes(changes.concat(changesAtEnd));\n return {\n changes: changeSet,\n range:\n range.empty && !changeSet.empty\n ? EditorSelection.cursor(range.head + marker.length)\n : EditorSelection.range(changeSet.mapPos(range.from, 1), changeSet.mapPos(range.to, -1)),\n };\n });\n\n dispatch(\n state.update(changes, { userEvent: enable ? 'format.style.add' : 'format.style.remove', scrollIntoView: true }),\n );\n return true;\n };\n\nexport const addStyle = (style: Inline): StateCommand => setStyle(style, true);\n\nexport const removeStyle = (style: Inline): StateCommand => setStyle(style, false);\n\nexport const toggleStyle =\n (style: Inline): StateCommand =>\n (arg) => {\n const form = getFormatting(arg.state);\n return setStyle(\n style,\n style === Inline.Strong\n ? !form.strong\n : style === Inline.Emphasis\n ? !form.emphasis\n : style === Inline.Strikethrough\n ? !form.strikethrough\n : !form.code,\n )(arg);\n };\n\nexport const toggleStrong = toggleStyle(Inline.Strong);\nexport const toggleEmphasis = toggleStyle(Inline.Emphasis);\nexport const toggleStrikethrough = toggleStyle(Inline.Strikethrough);\nexport const toggleInlineCode = toggleStyle(Inline.Code);\n\nconst inlineMarkerText = (type: Inline) =>\n type === Inline.Strong ? '**' : type === Inline.Strikethrough ? '~~' : type === Inline.Emphasis ? '*' : '`';\n\n//\n// Utils\n//\n\nconst blockContentStart = (node: SyntaxNodeRef) => {\n const atx = /^ATXHeading(\\d)/.exec(node.name);\n if (atx) {\n return Math.min(node.to, node.from + +atx[1] + 1);\n }\n return node.from;\n};\n\nconst blockContentEnd = (node: SyntaxNodeRef, doc: Text) => {\n const setext = /^SetextHeading(\\d)/.exec(node.name);\n const lastLine = doc.lineAt(node.to);\n if (setext || /^[\\s>]*$/.exec(lastLine.text)) {\n return lastLine.from - 1;\n }\n return node.to;\n};\n\nconst skipSpaces = (pos: number, doc: Text, dir: -1 | 1, limit?: number) => {\n const line = doc.lineAt(pos);\n while (pos !== limit && line.text[pos - line.from - (dir < 0 ? 1 : 0)] === ' ') {\n pos += dir;\n }\n return pos;\n};\n\n// TODO(burdon): Define and trigger snippets for codeblock, table, etc.\nconst snippets = {\n codeblock: snippet(\n [\n //\n '```#{}',\n '#{}',\n '```',\n ].join('\\n'),\n ),\n table: snippet(\n [\n //\n '| #{col1} | #{col2} |',\n '| ---- | ---- |',\n '| #{val1} | #{val2} |',\n '| #{val3} | #{val4} |',\n '',\n ].join('\\n'),\n ),\n};\n\n//\n// Table\n//\n\nexport const insertTable = (view: EditorView) => {\n const {\n selection: { main },\n doc,\n } = view.state;\n const { number } = doc.lineAt(main.anchor);\n const { from } = doc.line(number);\n\n snippets.table(view, null, from, from);\n};\n\n//\n// Links\n//\n\n// For each link in the given range, remove the link markup\nconst removeLinkInner = (from: number, to: number, changes: ChangeSpec[], state: EditorState) => {\n syntaxTree(state).iterate({\n from,\n to,\n enter: (node) => {\n if (node.name === 'Link' && node.from < to && node.to > from) {\n node.node.cursor().iterate((node) => {\n const { name } = node;\n if (name === 'LinkMark' || name === 'LinkLabel') {\n changes.push({ from: node.from, to: node.to });\n } else if (name === 'LinkTitle' || name === 'URL') {\n changes.push({ from: skipSpaces(node.from, state.doc, -1), to: skipSpaces(node.to, state.doc, 1) });\n }\n });\n return false;\n }\n },\n });\n};\n\n// Remove all links touching the selection\nexport const removeLink: StateCommand = ({ state, dispatch }) => {\n const changes: ChangeSpec[] = [];\n for (const { from, to } of state.selection.ranges) {\n removeLinkInner(from, to, changes, state);\n }\n if (!changes) {\n return false;\n }\n dispatch(state.update({ changes, userEvent: 'format.link.remove', scrollIntoView: true }));\n return true;\n};\n\n// Add link markup around the selection\nexport const addLink: StateCommand = ({ state, dispatch }) => {\n const changes = state.changeByRange((range) => {\n let { from, to } = range;\n const cutStyles: SyntaxNode[] = [];\n let okay: boolean | null = null;\n // Check whether this range is in a position where a link makes sense\n syntaxTree(state).iterate({\n from,\n to,\n enter: (node) => {\n if (Object.hasOwn(Textblocks, node.name)) {\n // If the selection spans multiple textblocks or is in a\n // code block, abort\n okay =\n Textblocks[node.name] !== 'codeblock' &&\n from >= blockContentStart(node) &&\n to <= blockContentEnd(node, state.doc);\n } else if (Object.hasOwn(InlineMarker, node.name)) {\n // Look for inline styles that partially overlap the range.\n // Expand the range over them if they start directly\n // outside, otherwise mark them for later\n const sNode = node.node;\n if (node.from < from && node.to <= to) {\n if (sNode.firstChild!.to === from) {\n from = node.from;\n } else {\n cutStyles.push(sNode);\n }\n } else if (node.from >= from && node.to > to) {\n if (sNode.lastChild!.from === to) {\n to = node.to;\n } else {\n cutStyles.push(sNode);\n }\n }\n }\n },\n });\n\n if (okay === null) {\n // No textblock found around selection. Check if the rest of the line is empty.\n const line = state.doc.lineAt(from);\n okay = to <= line.to && !/\\S/.test(line.text.slice(from - line.from));\n }\n if (!okay) {\n return { range };\n }\n\n const changes: ChangeSpec[] = [];\n // Some changes must be moved to end of change array so that they are applied in the right order\n const changesAfter: ChangeSpec[] = [];\n // Clear existing links.\n removeLinkInner(from, to, changesAfter, state);\n let cursorOffset = 1;\n // Close and reopen inline styles that partially overlap the range.\n for (const style of cutStyles) {\n const type = InlineMarker[style.name];\n const mark = inlineMarkerText(type);\n if (style.from < from) {\n // Extends before.\n changes.push({ from: skipSpaces(from, state.doc, -1), insert: mark });\n changesAfter.push({ from: skipSpaces(from, state.doc, 1, to), insert: mark });\n } else {\n changes.push({ from: skipSpaces(to, state.doc, -1, from), insert: mark });\n const after = skipSpaces(to, state.doc, 1);\n if (after === to) {\n cursorOffset += mark.length;\n }\n changesAfter.push({ from: after, insert: mark });\n }\n }\n // Add the link markup.\n changes.push({ from, insert: '[' }, { from: to, insert: ']()' });\n const changeSet = state.changes(changes.concat(changesAfter));\n // Put the cursor between the parenthesis.\n return { changes: changeSet, range: EditorSelection.cursor(changeSet.mapPos(to, 1) - cursorOffset) };\n });\n if (changes.changes.empty) {\n return false;\n }\n\n dispatch(state.update(changes, { userEvent: 'format.link.add', scrollIntoView: true }));\n return true;\n};\n\n//\n// Lists\n//\n\nexport const addList =\n (type: List): StateCommand =>\n ({ state, dispatch }) => {\n let lastBlock = -1;\n let counter = 1;\n let first = true;\n let parentColumn: number | null = null;\n const blocks: { node: SyntaxNode; counter: number; parentColumn: number | null }[] = [];\n\n // Scan the syntax tree to locate textblocks that can be wrapped.\n for (const { from, to } of state.selection.ranges) {\n syntaxTree(state).iterate({\n from,\n to,\n enter: (node) => {\n if ((Object.hasOwn(Textblocks, node.name) && node.name !== 'TableCell') || node.name === 'Table') {\n if (first) {\n // For the first block, see if it follows a list,\n // so we can take indentation and numbering information from that one.\n let before = node.node.prevSibling;\n while (before && /Mark$/.test(before.name)) {\n before = before.prevSibling;\n }\n if (before?.name === (type === List.Ordered ? 'OrderedList' : 'BulletList')) {\n const item = before.lastChild!;\n const itemLine = state.doc.lineAt(item.from);\n const itemText = itemLine.text.slice(item.from - itemLine.from);\n parentColumn = item.from - itemLine.from + /^\\s*/.exec(itemText)![0].length;\n if (type === List.Ordered) {\n const mark = /^\\s*(\\d+)[.)]/.exec(itemText);\n if (mark) {\n parentColumn += mark[1].length;\n counter = +mark[1] + 1;\n }\n }\n }\n first = false;\n }\n if (node.from === lastBlock) {\n return;\n }\n lastBlock = node.from;\n blocks.push({ node: node.node, counter, parentColumn });\n counter++;\n return false;\n }\n },\n leave: (node) => {\n // When exiting block-level markup, reset the indentation and counter.\n if (node.name === 'BulletList' || node.name === 'OrderedList' || node.name === 'Blockquote') {\n counter = 1;\n parentColumn = null;\n }\n },\n });\n }\n\n if (!blocks.length) {\n // Insert a new list item if the selection is empty.\n const { from, to } = state.doc.lineAt(state.selection.main.anchor);\n if (from === to) {\n dispatch(\n state.update({\n changes: [\n {\n from,\n insert: type === List.Bullet ? '- ' : type === List.Ordered ? '1. ' : '- [ ] ',\n },\n ],\n userEvent: 'format.list.add',\n scrollIntoView: true,\n }),\n );\n return true;\n }\n\n return false;\n }\n\n const changes: ChangeSpec[] = [];\n for (let i = 0; i < blocks.length; i++) {\n const { node, counter, parentColumn } = blocks[i];\n const nodeFrom = node.name === 'CodeBlock' ? node.from - 4 : node.from;\n // Compute a padding based on whether we are after whitespace.\n let padding = nodeFrom > 0 && !/\\s/.test(state.doc.sliceString(nodeFrom - 1, nodeFrom)) ? 1 : 0;\n // On ordered lists, the number is counted in the padding.\n if (type === List.Ordered) {\n padding += String(counter).length;\n }\n let line = state.doc.lineAt(nodeFrom);\n const column = nodeFrom - line.from;\n // Align to the list above if possible.\n if (parentColumn !== null && parentColumn > column) {\n padding = Math.max(padding, parentColumn - column);\n }\n\n let mark;\n if (type === List.Ordered) {\n // Scan ahead to find the max number we're adding, adjust padding for that.\n let max = counter;\n for (let j = i + 1; j < blocks.length; j++) {\n if (blocks[j].counter !== max + 1) {\n break;\n }\n max++;\n }\n const num = String(counter);\n padding = Math.max(String(max).length, padding);\n mark = ' '.repeat(Math.max(0, padding - num.length)) + num + '. ';\n } else {\n mark = ' '.repeat(padding) + '- ' + (type === List.Task ? '[ ] ' : '');\n }\n\n changes.push({ from: nodeFrom, insert: mark });\n // Add indentation for the other lines in this block\n while (line.to < node.to) {\n line = state.doc.lineAt(line.to + 1);\n const open = /^[\\s>]*/.exec(line.text)![0].length;\n changes.push({ from: line.from + Math.min(open, column), insert: ' '.repeat(mark.length) });\n }\n }\n\n // If we are inserting an ordered list and there is another one right after the last selected block,\n // renumber that one to match the new order.\n if (type === List.Ordered) {\n const last = blocks[blocks.length - 1];\n let next = last.node.nextSibling;\n while (next && /Mark$/.test(next.name)) {\n next = next.nextSibling;\n }\n if (next?.name === 'OrderedList') {\n renumberListItems(next.firstChild, last.counter + 1, changes, state.doc);\n }\n }\n\n dispatch(state.update({ changes, userEvent: 'format.list.add', scrollIntoView: true }));\n return true;\n };\n\nexport const removeList =\n (type: List): StateCommand =>\n ({ state, dispatch }) => {\n let lastBlock = -1;\n const changes: ChangeSpec[] = [];\n const stack: string[] = [];\n const targetNodeType = type === List.Ordered ? 'OrderedList' : type === List.Bullet ? 'BulletList' : 'TaskList';\n // Scan the syntax tree to locate list items that can be unwrapped.\n for (const { from, to } of state.selection.ranges) {\n syntaxTree(state).iterate({\n from,\n to,\n enter: (node) => {\n const { name } = node;\n if (name === 'BulletList' || name === 'OrderedList' || name === 'Blockquote') {\n // Maintain block context.\n stack.push(name);\n } else if (name === 'Task' && stack[stack.length - 1] === 'BulletList') {\n stack[stack.length - 1] = 'TaskList';\n }\n },\n leave: (node) => {\n const { name } = node;\n if (name === 'BulletList' || name === 'OrderedList' || name === 'Blockquote') {\n stack.pop();\n } else if (name === 'ListItem' && stack[stack.length - 1] === targetNodeType && node.from !== lastBlock) {\n lastBlock = node.from;\n let line = state.doc.lineAt(node.from);\n const mark = /^\\s*(\\d+[.)] |[-*+] (\\[[ x]\\] )?)/.exec(line.text.slice(node.from - line.from));\n if (!mark) {\n return false;\n }\n const column = node.from - line.from;\n // Delete the marker on the first line.\n changes.push({ from: node.from, to: node.from + mark[0].length });\n // and indentation on subsequent lines.\n while (line.to < node.to) {\n line = state.doc.lineAt(line.to + 1);\n const open = /^[\\s>]*/.exec(line.text)![0].length;\n if (open > column) {\n changes.push({ from: line.from + column, to: line.from + Math.min(column + mark[0].length, open) });\n }\n }\n if (node.to >= to) {\n renumberListItems(node.node.nextSibling, 1, changes, state.doc);\n }\n return false;\n }\n },\n });\n }\n if (!changes.length) {\n return false;\n }\n\n dispatch(state.update({ changes, userEvent: 'format.list.remove', scrollIntoView: true }));\n return true;\n };\n\nexport const toggleList =\n (type: List): StateCommand =>\n (target) => {\n const formatting = getFormatting(target.state);\n const active =\n formatting.listStyle === (type === List.Bullet ? 'bullet' : type === List.Ordered ? 'ordered' : 'task');\n return (active ? removeList(type) : addList(type))(target);\n };\n\nconst renumberListItems = (item: SyntaxNode | null, counter: number, changes: ChangeSpec[], doc: Text) => {\n for (; item; item = item.nextSibling) {\n if (item.name === 'ListItem') {\n const number = /(\\s*)(\\d+)[.)]/.exec(doc.sliceString(item.from, item.from + 10));\n if (!number || +number[2] === counter) {\n break;\n }\n const size = number[1].length + number[2].length;\n const newNum = String(counter);\n changes.push({ from: item.from + Math.max(0, size - newNum.length), to: item.from + size, insert: newNum });\n counter++;\n }\n }\n};\n\n//\n// Block quotes\n//\n\nexport const setBlockquote =\n (enable: boolean): StateCommand =>\n ({ state, dispatch }) => {\n const lines: Line[] = [];\n let lastBlock = -1;\n for (const { from, to } of state.selection.ranges) {\n syntaxTree(state).iterate({\n from,\n to,\n enter: (node) => {\n if (Object.hasOwn(Textblocks, node.name) || node.name === 'Table') {\n if (node.from === lastBlock) {\n return false;\n }\n lastBlock = node.from;\n let line = state.doc.lineAt(node.from);\n if (line.number > 1) {\n const prevLine = state.doc.line(line.number - 1);\n if (/^[>\\s]*$/.test(prevLine.text)) {\n if (!enable || (lines.length && lines[lines.length - 1].number === prevLine.number - 1)) {\n lines.push(prevLine);\n }\n }\n }\n for (;;) {\n lines.push(line);\n if (line.to >= node.to) {\n break;\n }\n line = state.doc.line(line.number + 1);\n }\n if (!enable && line.number < state.doc.lines) {\n const nextLine = state.doc.line(line.number + 1);\n if (/^[>\\s]*$/.test(nextLine.text)) {\n lines.push(nextLine);\n }\n }\n return false;\n }\n },\n });\n }\n\n const changes: ChangeSpec[] = [];\n for (const line of lines) {\n if (enable) {\n changes.push({ from: line.from, insert: /\\S/.test(line.text) ? '> ' : '>' });\n } else {\n const quote = /((?:[\\s>\\-+*]|\\d+[.)])*?)> ?/.exec(line.text);\n if (quote) {\n changes.push({ from: line.from + quote[1].length, to: line.from + quote[0].length });\n }\n }\n }\n if (!changes.length) {\n return false;\n }\n\n dispatch(\n state.update({\n changes,\n userEvent: enable ? 'format.blockquote.add' : 'format.blockquote.remove',\n scrollIntoView: true,\n }),\n );\n return true;\n };\n\nexport const addBlockquote = setBlockquote(true);\n\nexport const removeBlockquote = setBlockquote(false);\n\nexport const toggleBlockquote: StateCommand = (target) => {\n return (getFormatting(target.state).blockQuote ? removeBlockquote : addBlockquote)(target);\n};\n\n//\n// Code block\n//\n\nexport const addCodeblock: StateCommand = (target) => {\n const { state, dispatch } = target;\n const { selection } = state;\n // If on a blank line, use the code block snippet.\n if (selection.ranges.length === 1 && selection.main.empty) {\n const { head } = selection.main;\n const line = state.doc.lineAt(head);\n if (!/\\S/.test(line.text) && head === line.from) {\n snippets.codeblock(target, null, line.from, line.to);\n return true;\n }\n }\n\n // Otherwise, wrap any selected blocks in triple backticks.\n const ranges: { from: number; to: number }[] = [];\n for (const { from, to } of selection.ranges) {\n let blockFrom = from;\n let blockTo = to;\n syntaxTree(state).iterate({\n from,\n to,\n enter: (node) => {\n if (Object.hasOwn(Textblocks, node.name)) {\n if (from >= node.from && to <= node.to) {\n // Selection in a single block.\n blockFrom = node.from;\n blockTo = node.to;\n } else {\n // Expand to cover whole lines.\n blockFrom = Math.min(blockFrom, state.doc.lineAt(node.from).from);\n blockTo = Math.max(blockTo, state.doc.lineAt(node.to).to);\n }\n }\n },\n });\n if (ranges.length && ranges[ranges.length - 1].to >= blockFrom - 1) {\n ranges[ranges.length - 1].to = blockTo;\n } else {\n ranges.push({ from: blockFrom, to: blockTo });\n }\n }\n if (!ranges.length) {\n return false;\n }\n\n const changes: ChangeSpec[] = ranges.map(({ from, to }) => {\n const column = from - state.doc.lineAt(from).from;\n return [\n { from, insert: '```\\n' + ' '.repeat(column) },\n { from: to, insert: '\\n' + ' '.repeat(column) + '```' },\n ];\n });\n dispatch(state.update({ changes, userEvent: 'format.codeblock.add', scrollIntoView: true }));\n return true;\n};\n\nexport const removeCodeblock: StateCommand = ({ state, dispatch }) => {\n const changes: ChangeSpec[] = [];\n let lastBlock = -1;\n // Find all code blocks, remove their markup\n for (const { from, to } of state.selection.ranges) {\n syntaxTree(state).iterate({\n from,\n to,\n enter: (node) => {\n if (Textblocks[node.name] === 'codeblock' && lastBlock !== node.from) {\n lastBlock = node.from;\n const firstLine = state.doc.lineAt(node.from);\n if (node.name === 'FencedCode') {\n changes.push({ from: node.from, to: firstLine.to + 1 + node.from - firstLine.from });\n const lastLine = state.doc.lineAt(node.to);\n if (/^([\\s>]|[-*+] |\\d+[).])*`+$/.test(lastLine.text)) {\n changes.push({\n from: lastLine.from - (lastLine.number === firstLine.number + 1 ? 0 : 1),\n to: lastLine.to,\n });\n }\n } else {\n // Indented code block\n const column = node.from - firstLine.from;\n for (let line = firstLine; ; line = state.doc.line(line.number + 1)) {\n changes.push({ from: line.from + column - 4, to: line.from + column });\n if (line.to >= node.to) {\n break;\n }\n }\n }\n }\n },\n });\n }\n if (!changes.length) {\n return false;\n }\n\n dispatch(state.update({ changes, userEvent: 'format.codeblock.remove', scrollIntoView: true }));\n return true;\n};\n\nexport const toggleCodeblock: StateCommand = (target) => {\n return (getFormatting(target.state).blockType === 'codeblock' ? removeCodeblock : addCodeblock)(target);\n};\n\n//\n// Formatting extension.\n//\n\nexport type FormattingOptions = {};\n\nexport const formatting = (options: FormattingOptions = {}): Extension => {\n return [\n keymap.of([\n {\n key: 'meta-b',\n run: toggleStrong,\n },\n ]),\n styling(),\n ];\n};\n\nconst styling = (): Extension => {\n const buildDecorations = (view: EditorView): DecorationSet => {\n const builder = new RangeSetBuilder<Decoration>();\n const { state } = view;\n const cursor = state.selection.main.head;\n\n // TODO(burdon): Bug if '***foo***' (since StrongEmphasis is nested inside EmphasisMark).\n // Ranges must be added sorted by `from` position and `startSide`.\n const replace = (node: SyntaxNodeRef, marks: SyntaxNode[]) => {\n if (cursor <= node.from || cursor >= node.to) {\n for (const mark of marks) {\n builder.add(mark.from, mark.to, Decoration.replace({}));\n }\n }\n };\n\n for (const { from, to } of view.visibleRanges) {\n syntaxTree(state).iterate({\n enter: (node) => {\n switch (node.name) {\n case 'Emphasis':\n case 'StrongEmphasis': {\n const marks = node.node.getChildren('EmphasisMark');\n replace(node, marks);\n break;\n }\n\n case 'Strikethrough': {\n const marks = node.node.getChildren('StrikethroughMark');\n replace(node, marks);\n break;\n }\n }\n },\n from,\n to,\n });\n }\n\n return builder.finish();\n };\n\n return [\n ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n constructor(view: EditorView) {\n this.decorations = buildDecorations(view);\n }\n\n update(update: ViewUpdate) {\n this.decorations = buildDecorations(update.view);\n }\n },\n {\n decorations: (value) => value.decorations,\n },\n ),\n ];\n};\n\nconst InlineMarker: { [name: string]: number } = {\n Emphasis: Inline.Emphasis,\n StrongEmphasis: Inline.Strong,\n InlineCode: Inline.Code,\n Strikethrough: Inline.Strikethrough,\n};\n\nconst IgnoreInline = new Set([\n 'Autolink',\n 'CodeMark',\n 'CodeText',\n 'Comment',\n 'EmphasisMark',\n 'Hardbreak',\n 'HeaderMark',\n 'HTMLTag',\n 'LinkMark',\n 'ListMark',\n 'ProcessingInstruction',\n 'QuoteMark',\n 'StrikethroughMark',\n 'SubscriptMark',\n 'SuperscriptMark',\n 'TaskMarker',\n]);\n\nconst Textblocks: { [name: string]: NonNullable<Formatting['blockType']> } = {\n ATXHeading1: 'heading1',\n ATXHeading2: 'heading2',\n ATXHeading3: 'heading3',\n ATXHeading4: 'heading4',\n ATXHeading5: 'heading5',\n ATXHeading6: 'heading6',\n CodeBlock: 'codeblock',\n FencedCode: 'codeblock',\n Paragraph: 'paragraph',\n SetextHeading1: 'heading1',\n SetextHeading2: 'heading2',\n TableCell: 'tablecell',\n Task: 'paragraph',\n};\n\n/**\n * Query an editor state for the active formatting at the selection.\n */\nexport const getFormatting = (state: EditorState): Formatting => {\n // These will track the formatting we've seen so far.\n // False indicates mixed block types.\n let blockType: Formatting['blockType'] | false = null;\n // Indexed by the Inline enum, tracks inline markup.\n // null = no text seen, true = all text had the mark, false = saw text without it.\n const inline: (boolean | null)[] = [null, null, null, null];\n let link: boolean = false;\n let blockQuote: boolean | null = null;\n // False indicates mixed list styles\n let listStyle: Formatting['listStyle'] | null | false = null;\n\n // Track block context for list/blockquote handling.\n const stack: ('BulletList' | 'OrderedList' | 'Blockquote' | 'TaskList')[] = [];\n // This is set when entering a textblock (paragraph, heading, etc.)\n // and cleared when exiting again. It is used to track inline style.\n // `active` holds an array that indicates, for the various style (`Inline` enum) whether they are currently active.\n let currentBlock: { pos: number; end: number; active: boolean[] } | null = null;\n // Advance over regular inline text. Will update `inline` depending on what styles are active.\n const advanceInline = (upto: number) => {\n if (!currentBlock) {\n return;\n }\n upto = Math.min(upto, currentBlock.end);\n if (upto <= currentBlock.pos) {\n return;\n }\n for (let i = 0; i < currentBlock.active.length; i++) {\n if (inline[i] === false) {\n continue;\n } else if (currentBlock.active[i]) {\n inline[i] = true;\n } else if (/\\S/.test(state.doc.sliceString(currentBlock.pos, upto))) {\n inline[i] = false;\n }\n }\n currentBlock.pos = upto;\n };\n\n // Skip markup that shouldn't be treated as inline text for style-tracking purposes.\n const skipInline = (upto: number) => {\n if (currentBlock && upto > currentBlock.pos) {\n currentBlock.pos = Math.min(upto, currentBlock.end);\n }\n };\n\n const { selection } = state;\n for (const range of selection.ranges) {\n if (range.empty && inline.some((v) => v === null)) {\n // Check for markers directly around the cursor (which, not being valid Markdown, the syntax tree won't pick up).\n const contextSize = Math.min(range.head, 6);\n const contextBefore = state.doc.sliceString(range.head - contextSize, range.head);\n let contextAfter = state.doc.sliceString(range.head, range.head + contextSize);\n for (let i = 0; i < contextSize; i++) {\n const ch = contextAfter[i];\n if (ch !== contextBefore[contextBefore.length - 1 - i] || !/[~`*]/.test(ch)) {\n contextAfter = contextAfter.slice(0, i);\n break;\n }\n }\n for (let i = 0; i < inline.length; i++) {\n const mark = inlineMarkerText(i);\n const found = contextAfter.indexOf(mark);\n if (found > -1) {\n contextAfter = contextAfter.slice(0, found) + contextAfter.slice(found + mark.length);\n if (inline[i] === null) {\n inline[i] = true;\n }\n }\n }\n }\n\n syntaxTree(state).iterate({\n from: range.from,\n to: range.to,\n enter: (node) => {\n advanceInline(node.from);\n const { name } = node;\n if (name === 'BulletList' || name === 'OrderedList' || name === 'Blockquote') {\n // Maintain block context.\n stack.push(name);\n } else if (name === 'Link') {\n link = true;\n } else if (Object.hasOwn(Textblocks, name) && (range.empty || node.to > range.from || node.from < range.to)) {\n if (name === 'Task' && stack[stack.length - 1] === 'BulletList') {\n stack[stack.length - 1] = 'TaskList';\n }\n const blockCode = Textblocks[name];\n if (blockType === null) {\n blockType = blockCode;\n } else if (blockType !== blockCode) {\n blockType = false;\n }\n if (blockCode !== 'codeblock' && inline.some((i) => i !== false)) {\n // Set up inline content tracking for non-code textblocks.\n currentBlock = {\n pos: Math.max(range.from, node.from),\n end: Math.min(range.to, node.to),\n active: [false, false, false, false],\n };\n }\n } else if (Object.hasOwn(InlineMarker, name) && currentBlock) {\n const index = InlineMarker[name];\n // Cursors selections always count as active.\n if (range.empty && inline[index] === null) {\n inline[index] = true;\n }\n currentBlock.active[index] = true;\n } else if (IgnoreInline.has(name)) {\n skipInline(node.to);\n }\n },\n leave: (node) => {\n advanceInline(node.to);\n const { name } = node;\n if (name === 'BulletList' || name === 'OrderedList' || name === 'Blockquote') {\n // Track block context.\n stack.pop();\n } else if (Object.hasOwn(Textblocks, name)) {\n // Scan the stack for blockquote/list context.\n // Done at end of node because task lists aren't recognized until a task is seen\n let hasList: Formatting['listStyle'] | false = false;\n let hasQuote = false;\n for (let i = stack.length - 1; i >= 0; i--) {\n if (stack[i] === 'Blockquote') {\n hasQuote = true;\n } else if (!hasList) {\n hasList = stack[i] === 'TaskList' ? 'task' : stack[i] === 'BulletList' ? 'bullet' : 'ordered';\n }\n }\n if (blockQuote === null) {\n blockQuote = hasQuote;\n } else if (!hasQuote && blockQuote) {\n blockQuote = false;\n }\n if (listStyle === null) {\n listStyle = hasList;\n } else if (listStyle !== hasList) {\n listStyle = false;\n }\n\n // End textblock.\n currentBlock = null;\n } else if (Object.hasOwn(InlineMarker, name) && currentBlock) {\n // Track markup in textblock.\n currentBlock.active[InlineMarker[name]] = false;\n }\n },\n });\n }\n\n const { from, to } = state.doc.lineAt(selection.main.anchor);\n const blankLine = from === to;\n\n return {\n blankLine,\n blockType: blockType || null,\n blockQuote: blockQuote ?? false,\n code: inline[Inline.Code] ?? false,\n emphasis: inline[Inline.Emphasis] ?? false,\n strong: inline[Inline.Strong] ?? false,\n strikethrough: inline[Inline.Strikethrough] ?? false,\n link,\n listStyle: listStyle || null,\n };\n};\n\n/**\n * Hook computes the current formatting state.\n */\nexport const useFormattingState = (): [Formatting | null, Extension] => {\n const [state, setState] = useState<Formatting | null>(null);\n const observer = useMemo(\n () =>\n EditorView.updateListener.of((update) => {\n if (update.docChanged || update.selectionSet) {\n const newState = getFormatting(update.state);\n if (!state || !compareFormatting(state, newState)) {\n setState(newState);\n }\n }\n }),\n [],\n );\n\n return [state, observer];\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport { RangeSetBuilder } from '@codemirror/state';\nimport { Decoration, type DecorationSet, type EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';\n\nconst buildDecorations = (view: EditorView): DecorationSet => {\n const builder = new RangeSetBuilder<Decoration>();\n const { state } = view;\n const cursor = state.selection.main.head;\n\n for (const { from, to } of view.visibleRanges) {\n syntaxTree(state).iterate({\n enter: (node) => {\n switch (node.name) {\n case 'ATXHeading1':\n case 'ATXHeading2':\n case 'ATXHeading3':\n case 'ATXHeading4':\n case 'ATXHeading5':\n case 'ATXHeading6': {\n const mark = node.node.getChild('HeaderMark');\n if (mark) {\n if (!view.hasFocus || view.state.readOnly || cursor < node.from || cursor > node.to) {\n builder.add(mark.from, mark.to + 1, Decoration.replace({}));\n }\n }\n }\n }\n },\n from,\n to,\n });\n }\n\n return builder.finish();\n};\n\nexport const heading = () => {\n return [\n ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n constructor(view: EditorView) {\n this.decorations = buildDecorations(view);\n }\n\n update(update: ViewUpdate) {\n this.decorations = buildDecorations(update.view);\n }\n },\n {\n decorations: (value) => value.decorations,\n },\n ),\n ];\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport { RangeSetBuilder } from '@codemirror/state';\nimport { Decoration, type DecorationSet, EditorView, ViewPlugin, type ViewUpdate, WidgetType } from '@codemirror/view';\n\nimport { getToken } from '../../styles';\n\n// TODO(burdon): Reconcile with theme.\nconst styles = EditorView.baseTheme({\n '& .cm-hr': {\n // Note that block-level decorations should not have vertical margins,\n borderTop: `1px solid ${getToken('extend.colors.neutral.200')}`,\n },\n});\n\nclass HorizontalRuleWidget extends WidgetType {\n override toDOM() {\n const el = document.createElement('div');\n el.className = 'cm-hr';\n return el;\n }\n}\n\nconst decoration = Decoration.replace({ widget: new HorizontalRuleWidget() });\n\nconst buildDecorations = (view: EditorView): DecorationSet => {\n const builder = new RangeSetBuilder<Decoration>();\n const { state } = view;\n const cursor = state.selection.main.head;\n\n for (const { from, to } of view.visibleRanges) {\n syntaxTree(state).iterate({\n enter: (node) => {\n if (node.name === 'HorizontalRule') {\n // Check if cursor is inside text.\n if (cursor <= node.from || cursor >= node.to) {\n builder.add(node.from, node.to, decoration);\n }\n }\n },\n from,\n to,\n });\n }\n\n return builder.finish();\n};\n\nexport const hr = () => {\n return [\n ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n constructor(view: EditorView) {\n this.decorations = buildDecorations(view);\n }\n\n update(update: ViewUpdate) {\n this.decorations = buildDecorations(update.view);\n }\n },\n {\n decorations: (value) => value.decorations,\n },\n ),\n styles,\n ];\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport { type EditorState, type Extension, StateField, type Transaction, type Range } from '@codemirror/state';\nimport { Decoration, type DecorationSet, EditorView, WidgetType } from '@codemirror/view';\n\nexport type ImageOptions = {};\n\nexport const image = (options: ImageOptions = {}): Extension => {\n return StateField.define<DecorationSet>({\n create: (state) => {\n return Decoration.set(buildDecorations(0, state.doc.length, state));\n },\n update: (value: DecorationSet, tr: Transaction) => {\n if (!tr.docChanged && !tr.selection) {\n return value;\n }\n // Find range of changes and cursor changes.\n const cursor = tr.state.selection.main.head;\n const oldCursor = tr.changes.mapPos(tr.startState.selection.main.head);\n let from = Math.min(cursor, oldCursor);\n let to = Math.max(cursor, oldCursor);\n tr.changes.iterChangedRanges((fromA, toA, fromB, toB) => {\n from = Math.min(from, fromB);\n to = Math.max(to, toB);\n });\n // Expand to cover lines\n from = tr.state.doc.lineAt(from).from;\n to = tr.state.doc.lineAt(to).to;\n return value.map(tr.changes).update({\n filterFrom: from,\n filterTo: to,\n filter: () => false,\n add: buildDecorations(from, to, tr.state),\n });\n },\n provide: (field) => EditorView.decorations.from(field),\n });\n};\n\nconst buildDecorations = (from: number, to: number, state: EditorState) => {\n const decorations: Range<Decoration>[] = [];\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 decorations.push(\n Decoration.replace({\n block: true, // Prevent cursor from entering.\n widget: new ImageWidget(url),\n }).range(hide ? node.from : node.to, node.to),\n );\n }\n }\n },\n from,\n to,\n });\n\n return decorations;\n};\n\nclass ImageWidget extends WidgetType {\n constructor(readonly _url: string) {\n super();\n }\n\n override eq(other: this) {\n return this._url === (other as any as ImageWidget)._url;\n }\n\n override toDOM(view: EditorView) {\n const img = document.createElement('img');\n img.setAttribute('src', this._url);\n img.setAttribute('class', 'cm-image');\n // Images are hidden until successfully loaded to avoid flickering effects.\n img.onload = () => img.classList.add('cm-loaded-image');\n return img;\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n// Copyright CodeMirror\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport { type Extension, RangeSetBuilder } from '@codemirror/state';\nimport {\n hoverTooltip,\n Decoration,\n type DecorationSet,\n type EditorView,\n ViewPlugin,\n type ViewUpdate,\n WidgetType,\n} from '@codemirror/view';\nimport { type SyntaxNode } from '@lezer/common';\n\nimport { tooltipContent } from '@dxos/react-ui-theme';\n\n// Adapted from:\n// https://codemirror.net/try/?c=aW1wb3J0IHsgYmFzaWNTZXR1cCwgRWRpdG9yVmlldyB9IGZyb20gImNvZGVtaXJyb3IiCmltcG9ydCB7IG1hcmtkb3duIH0gZnJvbSAiQGNvZGVtaXJyb3IvbGFuZy1tYXJrZG93biIKaW1wb3J0IHsgc3ludGF4VHJlZSB9IGZyb20gIkBjb2RlbWlycm9yL2xhbmd1YWdlIjsKaW1wb3J0IHsgRWRpdG9yU3RhdGUsIFJhbmdlU2V0QnVpbGRlciwgU3RhdGVGaWVsZCB9IGZyb20gIkBjb2RlbWlycm9yL3N0YXRlIjsKaW1wb3J0IHsgRGVjb3JhdGlvbiwgV2lkZ2V0VHlwZSB9IGZyb20gIkBjb2RlbWlycm9yL3ZpZXciOwoKY2xhc3MgTGluayBleHRlbmRzIFdpZGdldFR5cGUgewogIGNvbnN0cnVjdG9yKHRleHQsIHVybCkgewogICAgc3VwZXIoKQogICAgdGhpcy50ZXh0ID0gdGV4dAogICAgdGhpcy51cmwgPSB1cmwKICB9CiAgZXEob3RoZXIpIHsgcmV0dXJuIHRoaXMudGV4dCA9PSBvdGhlci50ZXh0ICYmIHRoaXMudXJsID09IG90aGVyLnVybCB9CiAgdG9ET00oKSB7CiAgICBsZXQgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgbGluay50ZXh0Q29udGVudCA9IHRoaXMudGV4dAogICAgbGluay5ocmVmID0gdGhpcy51cmwKICAgIHJldHVybiBsaW5rOwogIH0KfQoKbGV0IGRlY29yYXRpb25zRmllbGQgPSBTdGF0ZUZpZWxkLmRlZmluZSh7CiAgY3JlYXRlKCkgewogICAgcmV0dXJuIERlY29yYXRpb24ubm9uZTsKICB9LAogIHVwZGF0ZShfLCB0cikgewogICAgY29uc3QgYnVpbGRlciA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKTsKICAgIGxldCBjdXJzb3IgPSB0ci5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5oZWFkOwogICAgc3ludGF4VHJlZSh0ci5zdGF0ZSkuaXRlcmF0ZSh7CiAgICAgIGVudGVyOiAobm9kZSkgPT4gewogICAgICAgIGlmICgoY3Vyc29yIDwgbm9kZS5mcm9tIHx8IGN1cnNvciA+IG5vZGUudG8pICYmIG5vZGUubmFtZSA9PSAiTGluayIpIHsKICAgICAgICAgIGxldCBtYXJrcyA9IG5vZGUubm9kZS5nZXRDaGlsZHJlbigiTGlua01hcmsiKTsKICAgICAgICAgIGxldCB0ZXh0ID0gbWFya3MubGVuZ3RoID49IDIgPyB0ci5zdGF0ZS5zbGljZURvYyhtYXJrc1swXS50bywgbWFya3NbMV0uZnJvbSkgOiAiIgoKICAgICAgICAgIGxldCB1cmxOb2RlID0gbm9kZS5ub2RlLmdldENoaWxkKCJVUkwiKTsKICAgICAgICAgIGxldCB1cmwgPSB1cmxOb2RlID8gdHIuc3RhdGUuc2xpY2VEb2ModXJsTm9kZS5mcm9tLCB1cmxOb2RlLnRvKSA6ICIiCiAgICAgICAgICBidWlsZGVyLmFkZChub2RlLmZyb20sIG5vZGUudG8sIERlY29yYXRpb24ucmVwbGFjZSh7CiAgICAgICAgICAgIHdpZGdldDogbmV3IExpbmsodGV4dCwgdXJsKSwKICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSwKICAgIH0pOwogICAgcmV0dXJuIGJ1aWxkZXIuZmluaXNoKCk7CiAgfSwKICBwcm92aWRlOiAoZikgPT4gRWRpdG9yVmlldy5kZWNvcmF0aW9ucy5mcm9tKGYpLAp9KTsKCmxldCB2aWV3ID0gbmV3IEVkaXRvclZpZXcoewogIGRvYzogIiMgSGVsbG8gV29ybGRcblxuW1Rlc3RdKGh0dHBzOi8vZXhhbXBsZS5jb20pXG5cblxuIiwKICBleHRlbnNpb25zOiBbZGVjb3JhdGlvbnNGaWVsZCwgbWFya2Rvd24oKV0sCiAgcGFyZW50OiBkb2N1bWVudC5ib2R5LAp9KTsKCnZpZXcuZm9jdXMoKTs=\n// https://discuss.codemirror.net/t/link-widget-is-clicked-only-if-editor-is-out-of-focus/7433\n\n// TODO(burdon): Callback to dynamically lookup title of linked pages.\nexport type LinkOptions = {\n link?: boolean;\n onHover?: (el: Element, url: string) => void;\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 const extensions: Extension[] = [\n ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n constructor(view: EditorView) {\n this.decorations = buildDecorations(view, options);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged || update.selectionSet) {\n this.decorations = buildDecorations(update.view, options);\n }\n }\n },\n {\n decorations: (value) => value.decorations,\n },\n ),\n ];\n\n if (options.onHover) {\n extensions.push(\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 hoverTooltip((view, pos, side) => {\n const syntax = syntaxTree(view.state).resolveInner(pos, side);\n let link = null;\n for (let i = 0, node: SyntaxNode | null = syntax; !link && node && i < 5; node = node.parent, i++) {\n link = node.name === 'Link' ? node : null;\n }\n\n const url = link && link.getChild('URL');\n if (!url || !link) {\n return null;\n }\n\n const urlText = view.state.sliceDoc(url.from, url.to);\n return {\n pos: link.from,\n end: link.to,\n above: true,\n create: () => {\n const el = document.createElement('div');\n el.className = tooltipContent({}, 'pli-2 plb-1');\n options.onHover!(el, urlText);\n return { dom: el, offset: { x: 0, y: 4 } };\n },\n };\n }),\n );\n }\n\n return extensions;\n};\n\nclass LinkButton extends WidgetType {\n constructor(\n private readonly _url: string,\n private readonly _onAttach: LinkOptions['onRender'],\n ) {\n super();\n }\n\n override eq(other: this) {\n return this._url === other._url;\n }\n\n override 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(\n private readonly _text: string,\n private readonly _url?: string,\n ) {\n super();\n }\n\n override eq(other: this) {\n return this._url === other._url;\n }\n\n override 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: view.posAtDOM(link),\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 buildDecorations = (view: EditorView, options: LinkOptions): DecorationSet => {\n const builder = new RangeSetBuilder<Decoration>();\n const { state } = view;\n const cursor = state.selection.main.head;\n\n for (const { from, to } of view.visibleRanges) {\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 // TODO(burdon): Don't expand if moving cursor up/down.\n if (!view.hasFocus || state.readOnly || cursor < node.from || cursor > node.to) {\n builder.add(\n node.from,\n node.to,\n Decoration.replace({\n widget: new LinkText(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(url, options.onRender),\n }),\n );\n }\n\n return false;\n }\n },\n from,\n to,\n });\n }\n\n return builder.finish();\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\n// TODO(burdon): Advanced formatting (left/right/center).\n// TODO(burdon): Editor to auto balance columns.\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 &&\n builder.add(\n table.from,\n table.to,\n Decoration.replace({\n widget: new TableWidget(table),\n }),\n );\n\n // Add class for styling.\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: this) {\n return (\n this._table.header?.join() === other._table.header?.join() &&\n this._table.rows?.join() === other._table.rows?.join()\n );\n }\n\n override 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 override ignoreEvent(e: Event) {\n return !/^mouse/.test(e.type);\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport { RangeSetBuilder } from '@codemirror/state';\nimport { EditorView, Decoration, WidgetType, ViewPlugin, type DecorationSet, type ViewUpdate } from '@codemirror/view';\n\nimport { getToken } from '../../styles';\n\n// TODO(burdon): Reconcile with theme.\nconst styles = EditorView.baseTheme({\n '& .cm-task': {\n color: getToken('extend.colors.blue.500'),\n },\n '& .cm-task-checkbox': {\n marginLeft: '4px',\n marginRight: '4px',\n },\n});\n\nclass CheckboxWidget extends WidgetType {\n constructor(private _checked: boolean) {\n super();\n }\n\n override eq(other: this) {\n return this._checked === other._checked;\n }\n\n override toDOM(view: EditorView) {\n const input = document.createElement('input');\n input.className = 'cm-task-checkbox';\n input.type = 'checkbox';\n input.checked = this._checked;\n if (view.state.readOnly) {\n input.setAttribute('disabled', 'true');\n } else {\n input.onmousedown = (event: Event) => {\n const pos = view.posAtDOM(input);\n const text = view.state.sliceDoc(pos, pos + 3);\n if (text === (this._checked ? '[x]' : '[ ]')) {\n view.dispatch({\n changes: { from: pos + 1, to: pos + 2, insert: this._checked ? ' ' : 'x' },\n });\n event.preventDefault();\n }\n };\n }\n\n return input;\n }\n\n override ignoreEvent() {\n return false;\n }\n}\n\nconst checkedDecoration = Decoration.replace({ widget: new CheckboxWidget(true) });\nconst uncheckedDecoration = Decoration.replace({ widget: new CheckboxWidget(false) });\n\nconst buildDecorations = (view: EditorView): DecorationSet => {\n const builder = new RangeSetBuilder<Decoration>();\n const { state } = view;\n const cursor = state.selection.main.head;\n\n for (const { from, to } of view.visibleRanges) {\n syntaxTree(state).iterate({\n enter: (node) => {\n if (node.name === 'TaskMarker') {\n // Check if cursor is inside text.\n if (cursor < node.from || cursor > node.to) {\n const checked = state.doc.sliceString(node.from + 1, node.to - 1) === 'x';\n builder.add(node.from - 2, node.from - 1, Decoration.mark({ class: 'cm-task' }));\n builder.add(node.from, node.to, checked ? checkedDecoration : uncheckedDecoration);\n }\n }\n },\n from,\n to,\n });\n }\n\n return builder.finish();\n};\n\nexport type TasklistOptions = {};\n\nexport const tasklist = (options: TasklistOptions = {}) => {\n return [\n ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n constructor(view: EditorView) {\n this.decorations = buildDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged || update.selectionSet) {\n this.decorations = buildDecorations(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 { 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\n// TODO(burdon): Can only have a single autocompletion. Merge configuration with autocomplete.\nexport const mention = ({ onSearch }: MentionOptions): Extension => {\n return autocompletion({\n // TODO(burdon): Not working.\n activateOnTyping: true,\n // activateOnTypingDelay: 100,\n // selectOnOpen: true,\n closeOnBlur: false, // For debugging.\n // defaultKeymap: false,\n icons: false,\n override: [\n (context: CompletionContext): CompletionResult | null => {\n console.log(context);\n\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.slice(1).toLowerCase()).map((value) => ({ label: `@${value}` })),\n };\n },\n ],\n });\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\n\nexport type OutlinerOptions = {};\n\n// TODO(burdon): Experimental component: multiple hierarchical draggable editor sections.\nexport const outliner = (options: OutlinerOptions = {}): Extension => {\n return [];\n};\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 * Configurable plugin that let's user cycle through pre-configured input script.\n */\nexport const typewriter = ({ delay = 75, items = defaultItems }: DemoOptions = {}): Extension => {\n let t: any;\n let idx = 0; // TODO(burdon): Make global.\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 get from 'lodash.get';\n\nimport { type ThemeStyles, tokens } from '../styles';\n\n// TODO(burdon): Can we use @apply and import css file?\n// https://tailwindcss.com/docs/reusing-styles#extracting-classes-with-apply?\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: ThemeStyles = {\n //\n // Main layout:\n // https://codemirror.net/examples/styling\n //\n // <div class=\"cm-editor [cm-focused] [generated classes]\">\n // <div class=\"cm-scroller\">\n // <div class=\"cm-gutters\">\n // <div class=\"cm-gutter [...]\">\n // <div class=\"cm-gutterElement\">...</div>\n // </div>\n // </div>\n // <div class=\"cm-content\" role=\"textbox\" contenteditable=\"true\">\n // <div class=\"cm-line\"></div>\n // </div>\n // <div class=\"cm-selectionLayer\">\n // <div class=\"cm-selectionBackground\"></div>\n // </div>\n // <div class=\"cm-cursorLayer\">\n // <div class=\"cm-cursor\"></div>\n // </div>\n // </div>\n // </div>\n //\n\n '&': {},\n '&.cm-focused': {\n outline: 'none',\n },\n\n '.cm-scroller': {\n // overflow: 'visible',\n fontFamily: get(tokens, 'fontFamily.mono', []).join(','),\n lineHeight: 1.4,\n },\n\n '.cm-content': {\n padding: 0,\n // NOTE: 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.semanticColors.base.fg.light', 'black'),\n caretColor: 'black',\n },\n '&dark .cm-content': {\n color: get(tokens, 'extend.semanticColors.base.fg.dark', '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 '&light .cm-placeholder': {\n color: get(tokens, 'extend.semanticColors.description.light', 'rgba(0,0,0,.2)'),\n },\n '&dark .cm-placeholder': {\n color: get(tokens, 'extend.semanticColors.description.dark', 'rgba(255,255,255,.2)'),\n },\n\n //\n // line\n //\n '.cm-line': {\n paddingInline: 0,\n },\n '.cm-activeLine': {\n background: 'transparent',\n },\n\n //\n // Selection\n //\n\n '&light .cm-selectionBackground': {\n background: get(tokens, 'extend.colors.primary.100'),\n },\n '&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground': {\n background: get(tokens, 'extend.colors.primary.200'),\n },\n '&dark .cm-selectionBackground': {\n background: get(tokens, 'extend.colors.primary.700'),\n },\n '&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground': {\n background: get(tokens, 'extend.colors.primary.600'),\n },\n\n //\n // Search\n //\n\n '&light .cm-searchMatch': {\n backgroundColor: get(tokens, 'extend.colors.yellow.100'),\n },\n '&dark .cm-searchMatch': {\n backgroundColor: get(tokens, 'extend.colors.yellow.700'),\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 // 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 display: 'block',\n height: '0',\n },\n '.cm-image.cm-loaded-image': {\n height: 'auto',\n borderTop: '0.5rem solid transparent',\n borderBottom: '0.5rem solid transparent',\n },\n\n //\n // font size\n // TODO(thure): This appears to be the best or only way to set selection caret heights,\n // 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 * TODO(burdon): Needs styling attention (esp. dark mode).\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 },\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 backgroundImage: 'none',\n border: 'none',\n '&:hover': {\n background: get(tokens, 'extend.colors.neutral.200'),\n },\n '&:active': {\n background: get(tokens, 'extend.colors.neutral.300'),\n backgroundImage: 'none',\n },\n },\n '.cm-panel input[type=checkbox]': {\n marginRight: '0.4rem !important',\n },\n};\n\nexport const textTheme: ThemeStyles = {\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: ThemeStyles = {\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 codeTheme: ThemeStyles = {\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 2024 DXOS.org\n//\n\nimport {\n type Icon,\n CaretRight,\n ChatText,\n Code,\n CodeBlock,\n Link,\n ListBullets,\n ListChecks,\n ListNumbers,\n Paragraph,\n TextStrikethrough,\n Table,\n TextB,\n TextHOne,\n TextHTwo,\n TextHThree,\n TextHFour,\n TextHFive,\n TextHSix,\n TextItalic,\n} from '@phosphor-icons/react';\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren } from 'react';\n\nimport { Button, type ButtonProps, DensityProvider, Select } from '@dxos/react-ui';\nimport { getSize, mx } from '@dxos/react-ui-theme';\n\nimport { type Formatting } from '../../extensions';\n\nconst HeadingIcons: { [key: string]: Icon } = {\n '0': Paragraph,\n '1': TextHOne,\n '2': TextHTwo,\n '3': TextHThree,\n '4': TextHFour,\n '5': TextHFive,\n '6': TextHSix,\n};\n\n// TODO(burdon): Revert to string to make extensible?\nexport type ActionType =\n | 'blockquote'\n | 'strong'\n | 'codeblock'\n | 'comment'\n | 'heading'\n | 'image'\n | 'emphasis'\n | 'code'\n | 'link'\n | 'list-bullet'\n | 'list-ordered'\n | 'list-tasks'\n | 'mention'\n | 'prompt'\n | 'strikethrough'\n | 'table';\n\nexport type Action = {\n type: ActionType;\n data?: any;\n};\n\nexport type ToolbarProps = PropsWithChildren<{\n state: Formatting | null;\n onAction?: (action: Action) => void;\n}>;\n\nconst [ToolbarContextProvider, useToolbarContext] = createContext<ToolbarProps>('Toolbar');\n\nconst ToolbarRoot = ({ children, onAction, state }: ToolbarProps) => {\n return (\n <ToolbarContextProvider onAction={onAction} state={state}>\n <DensityProvider density='fine'>\n <div role='toolbar' className='flex w-full shrink-0 p-1 gap-4 items-center whitespace-nowrap overflow-hidden'>\n {children}\n </div>\n </DensityProvider>\n </ToolbarContextProvider>\n );\n};\n\ntype ToolbarButtonProps = {\n Icon: Icon;\n disable?: (state: Formatting) => boolean;\n getState?: (state: Formatting) => boolean;\n onClick: (state: Formatting | null) => Action | undefined;\n} & NonNullable<Pick<ButtonProps, 'title'>>;\n\nconst ToolbarButton = ({ Icon, onClick, title, getState, disable }: ToolbarButtonProps) => {\n const { onAction, state } = useToolbarContext('ToolbarButton');\n const active = getState && state ? getState(state) : false;\n const disabled = disable && state ? disable(state) : false;\n\n const handleClick = (event: React.MouseEvent) => {\n const action = onClick(state);\n if (action) {\n onAction?.(action);\n event.preventDefault();\n }\n };\n\n return (\n <Button\n variant='ghost'\n classNames={mx('p-2', active && 'ring-[1px]')}\n onMouseDown={handleClick}\n title={title}\n disabled={disabled}\n >\n <Icon className={getSize(5)} />\n </Button>\n );\n};\n\nconst ToolbarSeparator = () => <div className='grow' />;\n\nconst MarkdownHeading = () => {\n const { onAction, state } = useToolbarContext('MarkdownFormatting');\n const blockType = state ? state.blockType : 'paragraph';\n const header = blockType && /heading(\\d)/.exec(blockType);\n const value = header ? header[1] : blockType === 'paragraph' || !blockType ? '0' : undefined;\n const HeadingIcon = HeadingIcons[value ?? '0'];\n return (\n <Select.Root\n disabled={value === null}\n value={value ?? '0'}\n onValueChange={(value) => onAction?.({ type: 'heading', data: parseInt(value) })}\n >\n <Select.TriggerButton>\n <HeadingIcon className={getSize(5)} />\n </Select.TriggerButton>\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n <Select.Option value='0'>Paragraph</Select.Option>\n {[1, 2, 3, 4, 5, 6].map((level) => (\n <Select.Option key={level} value={String(level)}>\n Heading {level}\n </Select.Option>\n ))}\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n );\n};\n\nconst MarkdownStyles = () => (\n <div role='none'>\n <ToolbarButton\n Icon={TextB}\n title='String'\n disable={(s) => s.blockType === 'codeblock'}\n getState={(s) => s.strong}\n onClick={(s) => ({ type: 'strong', data: s ? !s.strong : null })}\n />\n <ToolbarButton\n Icon={TextItalic}\n title='Emphasis'\n disable={(s) => s.blockType === 'codeblock'}\n getState={(s) => s.emphasis}\n onClick={(s) => ({ type: 'emphasis', data: s ? !s.emphasis : null })}\n />\n <ToolbarButton\n Icon={TextStrikethrough}\n title='Strike-through'\n disable={(s) => s.blockType === 'codeblock'}\n getState={(s) => s.strikethrough}\n onClick={(s) => ({ type: 'strikethrough', data: s ? !s.strikethrough : null })}\n />\n <ToolbarButton\n Icon={Code}\n title='Inline code'\n disable={(s) => s.blockType === 'codeblock'}\n getState={(s) => s.code}\n onClick={(s) => ({ type: 'code', data: s ? !s.code : null })}\n />\n </div>\n);\n\nconst MarkdownLists = () => (\n <div role='none'>\n <ToolbarButton\n Icon={ListBullets}\n title='Bullet list'\n getState={(s) => s.listStyle === 'bullet'}\n onClick={(s) => ({ type: 'list-bullet', data: s ? s.listStyle !== 'bullet' : null })}\n />\n <ToolbarButton\n Icon={ListNumbers}\n title='Numbered list'\n getState={(s) => s.listStyle === 'ordered'}\n onClick={(s) => ({ type: 'list-ordered', data: s ? s.listStyle !== 'ordered' : null })}\n />\n <ToolbarButton\n Icon={ListChecks}\n title='Task list'\n getState={(s) => s.listStyle === 'task'}\n onClick={(s) => ({ type: 'list-tasks', data: s ? s.listStyle !== 'task' : null })}\n />\n </div>\n);\n\nconst MarkdownBlocks = () => (\n <div role='none'>\n <ToolbarButton\n Icon={CaretRight}\n title='Block quote'\n getState={(s) => s.blockQuote}\n onClick={(s) => ({ type: 'blockquote', data: s ? !s.blockQuote : null })}\n />\n <ToolbarButton\n Icon={CodeBlock}\n title='Code block'\n disable={(s) => !s.blankLine}\n getState={(s) => s.blockType === 'codeblock'}\n onClick={(s) => ({ type: 'codeblock', data: s ? s.blockType !== 'codeblock' : null })}\n />\n <ToolbarButton Icon={Table} title='Table' disable={(s) => !s.blankLine} onClick={() => ({ type: 'table' })} />\n </div>\n);\n\nconst MarkdownLinks = () => (\n <div role='none'>\n <ToolbarButton\n Icon={Link}\n title='Link'\n getState={(s) => s.link}\n onClick={(s) => ({ type: 'link', data: s ? !s.link : null })}\n />\n {/* <ToolbarButton Icon={At} title='Mention' onClick={() => ({ type: 'mention' })} /> */}\n {/* <ToolbarButton Icon={Image} title='Image' onClick={() => ({ type: 'image' })} /> */}\n </div>\n);\n\nconst MarkdownStandard = () => (\n <>\n <MarkdownHeading />\n <MarkdownStyles />\n <MarkdownLists />\n <MarkdownBlocks />\n <MarkdownLinks />\n </>\n);\n\nconst MarkdownExtended = () => (\n <Toolbar.Button Icon={ChatText} title='Create comment' onClick={() => ({ type: 'comment' })} />\n);\n\nexport const Toolbar = {\n Root: ToolbarRoot,\n Button: ToolbarButton,\n Separator: ToolbarSeparator,\n Markdown: MarkdownStandard,\n Extended: MarkdownExtended,\n};\n\nexport { useToolbarContext };\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { DeferredTask, Event, sleep } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { type Space } from '@dxos/react-client/echo';\nimport { type GossipMessage } from '@dxos/react-client/mesh';\n\nimport { type AwarenessInfo, type AwarenessPosition, type AwarenessProvider, type AwarenessState } from '../extensions';\n\ntype ProtocolMessage =\n | {\n kind: 'query';\n }\n | {\n kind: 'post';\n state: AwarenessState;\n };\n\nconst DEBOUNCE_INTERVAL = 100; // ms\n\nexport type AwarenessProviderParams = {\n space: Space;\n channel: string;\n peerId: string;\n info: AwarenessInfo;\n};\n\n/**\n * Receives and broadcasts profile and cursor position.\n */\nexport class SpaceAwarenessProvider implements AwarenessProvider {\n private readonly _remoteStates = new Map<string, AwarenessState>();\n\n private readonly _space: Space;\n private readonly _channel: string;\n private readonly _peerId: string;\n private readonly _info: AwarenessInfo;\n\n private _ctx?: Context;\n private _postTask?: DeferredTask;\n private _localState?: AwarenessState;\n\n public readonly remoteStateChange = new Event<void>();\n\n constructor(params: AwarenessProviderParams) {\n this._space = params.space;\n this._channel = params.channel;\n this._peerId = params.peerId;\n this._info = params.info;\n }\n\n open() {\n this._ctx = new Context();\n this._postTask = new DeferredTask(this._ctx, async () => {\n if (this._localState) {\n await this._space.postMessage(this._channel, {\n kind: 'post',\n state: this._localState,\n } satisfies ProtocolMessage);\n\n await sleep(DEBOUNCE_INTERVAL);\n }\n });\n\n this._ctx.onDispose(\n this._space.listen(this._channel, (message: GossipMessage) => {\n switch (message.payload.kind) {\n case 'query': {\n this._handleQueryMessage();\n break;\n }\n case 'post': {\n this._handlePostMessage(message.payload);\n break;\n }\n }\n }),\n );\n\n void this._space\n .postMessage(this._channel, {\n kind: 'query',\n } satisfies ProtocolMessage)\n .catch((err) => {\n log.debug('failed to query awareness', { err });\n });\n }\n\n close() {\n void this._ctx?.dispose();\n this._ctx = undefined;\n this._postTask = undefined;\n }\n\n getRemoteStates(): AwarenessState[] {\n return Array.from(this._remoteStates.values());\n }\n\n update(position: AwarenessPosition | undefined): void {\n invariant(this._postTask);\n this._localState = {\n peerId: this._peerId,\n position,\n info: this._info,\n };\n\n this._postTask.schedule();\n }\n\n private _handleQueryMessage() {\n invariant(this._postTask);\n this._postTask.schedule();\n }\n\n private _handlePostMessage(message: ProtocolMessage) {\n invariant(message.kind === 'post');\n this._remoteStates.set(message.state.peerId, message.state);\n this.remoteStateChange.emit();\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Extension, StateField } from '@codemirror/state';\n\nimport { type DocAccessor } from '@dxos/echo-schema';\n\n// Runtime data structure.\nexport type Range = {\n from: number;\n to: number;\n};\n\n// Persistent data structure.\nexport type Comment = {\n id: string;\n cursor?: string;\n};\n\nexport type EditorModel = {\n id: string;\n text: () => string;\n extension?: Extension;\n\n // TODO(burdon): Remove.\n content: string | DocAccessor;\n\n // TODO(burdon): Remove.\n peer?: {\n id: string;\n name?: string;\n };\n};\n\n/**\n * State field makes the model available to other extensions.\n */\nexport const modelState = StateField.define<EditorModel | undefined>({\n create: () => undefined,\n update: (model) => model,\n});\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport type { EditorView } from '@codemirror/view';\n\nimport type { ToolbarProps } from '../components';\nimport {\n createComment,\n insertTable,\n setHeading,\n setStyle,\n toggleStyle,\n addLink,\n removeLink,\n Inline,\n List,\n addList,\n removeList,\n toggleList,\n addBlockquote,\n removeBlockquote,\n addCodeblock,\n removeCodeblock,\n toggleBlockquote,\n} from '../extensions';\n\nexport const useActionHandler = (view?: EditorView | null): ToolbarProps['onAction'] => {\n return (action) => {\n if (!view) {\n return;\n }\n\n let inlineType, listType;\n switch (action.type) {\n case 'heading':\n setHeading(parseInt(action.data))(view);\n break;\n\n case 'strong':\n case 'emphasis':\n case 'strikethrough':\n case 'code':\n inlineType =\n action.type === 'strong'\n ? Inline.Strong\n : action.type === 'emphasis'\n ? Inline.Emphasis\n : action.type === 'strikethrough'\n ? Inline.Strikethrough\n : Inline.Code;\n (typeof action.data === 'boolean' ? setStyle(inlineType, action.data) : toggleStyle(inlineType))(view);\n break;\n\n case 'list-ordered':\n case 'list-bullet':\n case 'list-tasks':\n listType =\n action.type === 'list-ordered' ? List.Ordered : action.type === 'list-bullet' ? List.Bullet : List.Task;\n (action.data === false\n ? removeList(listType)\n : action.data === true\n ? addList(listType)\n : toggleList(listType))(view);\n break;\n\n case 'blockquote':\n (action.data === false ? removeBlockquote : action.data === true ? addBlockquote : toggleBlockquote)(view);\n break;\n case 'codeblock':\n (action.data === false ? removeCodeblock : addCodeblock)(view);\n break;\n case 'table':\n insertTable(view);\n break;\n\n case 'link':\n (action.data === false ? removeLink : addLink)(view);\n break;\n\n case 'comment':\n createComment(view);\n break;\n }\n\n // TODO(burdon): Hack otherwise remains on heading selector.\n setTimeout(() => {\n if (!view.hasFocus) {\n view.focus();\n }\n });\n };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\nimport { type RefCallback, useState } from 'react';\n\n/**\n * Hook for accessing the editor view.\n *\n * ```tsx\n * const Test = () => {\n * const [editorRef, editorView] = useEditorView();\n * useEffect(() => {\n * editorView?.focus();\n * }, [editorView]);\n * return <TextEditor ref={editorRef} />;\n * };\n * ```\n */\nexport const useEditorView = (): [RefCallback<EditorView | null>, EditorView | null] => {\n const [view, setView] = useState<EditorView | null>(null);\n return [\n (ref: EditorView | null) => {\n setView(ref);\n },\n view,\n ];\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport {\n EditorSelection,\n EditorState,\n type EditorStateConfig,\n type Extension,\n type StateEffect,\n} from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport { type RefObject, useEffect, useRef, useState } from 'react';\n\nimport { log } from '@dxos/log';\nimport { type ThemeMode } from '@dxos/react-ui';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { type ThemeStyles } from '..//styles';\nimport { defaultTheme } from '../themes';\nimport { logChanges } from '../util';\n\nexport type UseTextEditorOptions = {\n autoFocus?: boolean;\n scrollTo?: StateEffect<any>;\n debug?: boolean;\n} & EditorStateConfig;\n\nexport type UseTextEditor = {\n parentRef: RefObject<HTMLDivElement>;\n view?: EditorView;\n};\n\n/**\n * Hook for creating editor.\n */\nexport const useTextEditor = ({\n autoFocus,\n scrollTo,\n debug,\n doc,\n selection,\n extensions,\n}: UseTextEditorOptions = {}): UseTextEditor => {\n const onUpdate = useRef<() => void>();\n const [view, setView] = useState<EditorView>();\n const parentRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (parentRef.current) {\n // https://codemirror.net/docs/ref/#state.EditorStateConfig\n const state = EditorState.create({\n doc,\n selection,\n extensions: [\n // TODO(burdon): Doesn't catch errors in keymap functions.\n EditorView.exceptionSink.of((err) => {\n log.catch(err);\n }),\n extensions,\n EditorView.updateListener.of(() => {\n onUpdate.current?.();\n }),\n ].filter(isNotFalsy),\n });\n\n // https://codemirror.net/docs/ref/#view.EditorViewConfig\n const view = new EditorView({\n parent: parentRef.current,\n scrollTo,\n state,\n // NOTE: Uncomment to debug/monitor all transactions.\n // https://codemirror.net/docs/ref/#view.EditorView.dispatch\n dispatchTransactions: (trs, view) => {\n if (debug) {\n logChanges(trs);\n }\n view.update(trs);\n },\n });\n\n setView(view);\n }\n\n return () => {\n view?.destroy();\n };\n }, [parentRef]);\n\n useEffect(() => {\n if (view) {\n // Select end of line if not specified.\n if (!selection && !view.state.selection.main.anchor) {\n selection = EditorSelection.single(view.state.doc.line(1).to);\n }\n\n // Set selection after first update (since content may rerender on focus).\n // TODO(burdon): BUG on first render may appear in middle of formatted heading.\n // TODO(burdon): Make invisible until first render?\n if (selection || scrollTo) {\n onUpdate.current = () => {\n onUpdate.current = undefined;\n view.dispatch({ selection, effects: scrollTo && [scrollTo], scrollIntoView: !scrollTo });\n };\n }\n\n if (autoFocus) {\n view.focus();\n }\n }\n }, [view, autoFocus, selection, scrollTo]);\n\n return { parentRef, view };\n};\n\n// TODO(burdon): Factor out extension factories.\n\nexport type DataExtensionsOptions = {\n readonly?: boolean;\n};\n\n// TODO(burdon): Pass in TextObject (remove model).\nexport const createDataExtensions = ({ readonly = false } = {}): Extension => {\n return [\n //\n EditorState.readOnly.of(readonly),\n EditorView.editable.of(!readonly),\n ];\n};\n\nexport type ThemeExtensionsOptions = {\n theme?: ThemeStyles;\n themeMode?: ThemeMode;\n lineWrap?: boolean;\n slots?: {\n editor?: {\n className?: string;\n };\n content?: {\n className?: string;\n };\n };\n};\n\nexport const createThemeExtensions = ({ theme, themeMode, slots }: ThemeExtensionsOptions = {}): Extension => {\n return [\n //\n EditorView.baseTheme(defaultTheme),\n theme && EditorView.theme(theme),\n EditorView.darkTheme.of(themeMode === 'dark'),\n EditorView.editorAttributes.of({ class: slots?.editor?.className ?? '' }),\n EditorView.contentAttributes.of({ class: slots?.content?.className ?? '' }),\n ].filter(isNotFalsy);\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport get from 'lodash.get';\nimport { type Dispatch, type SetStateAction, useEffect, useState } from 'react';\n\nimport { generateName } from '@dxos/display-name';\nimport { type AutomergeTextCompat, getRawDoc } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { isAutomergeObject, type Space, type TextObject } from '@dxos/react-client/echo';\nimport { type Identity } from '@dxos/react-client/halo';\n\nimport { SpaceAwarenessProvider } from './awareness-provider';\nimport { type EditorModel, modelState } from './defs';\nimport { automerge, awareness } from '../extensions';\nimport { cursorColor } from '../styles';\n\n// TODO(burdon): Remove space/identity dependency. Define interface for the framework re content and presence.\nexport type UseTextModelProps = {\n identity?: Identity | null;\n space?: Space;\n text?: TextObject;\n};\n\nexport const useTextModel = (props: UseTextModelProps): EditorModel | undefined => {\n const { identity, space, text } = props;\n const [model, setModel] = useState<EditorModel | undefined>();\n useEffect(() => setModel(createModel(props)), [identity, space, text]);\n return model;\n};\n\n/**\n * For use primarily in stories & tests so the dependence on TextObject can be avoided.\n * @param id\n * @param defaultContent\n */\nexport const useInMemoryTextModel = ({\n id,\n defaultContent,\n}: {\n id: string;\n defaultContent?: string;\n}): EditorModel & { setContent: Dispatch<SetStateAction<string>> } => {\n const [content, setContent] = useState(defaultContent ?? '');\n return { id, content, setContent, text: () => content };\n};\n\nconst createModel = ({ space, identity, text }: UseTextModelProps) => {\n invariant(isAutomergeObject(text));\n const obj = text as any as AutomergeTextCompat;\n const doc = getRawDoc(obj, [obj.field]);\n\n const awarenessProvider =\n space &&\n new SpaceAwarenessProvider({\n space,\n channel: `automerge.awareness.${obj.id}`,\n info: {\n displayName: identity ? identity.profile?.displayName ?? generateName(identity.identityKey.toHex()) : undefined,\n color: cursorColor.color,\n lightColor: cursorColor.light,\n },\n peerId: identity?.identityKey.toHex() ?? 'Anonymous',\n });\n\n const extensions = [\n //\n modelState.init(() => model),\n automerge({ handle: doc.handle, path: doc.path }),\n ];\n if (awarenessProvider) {\n extensions.push(awareness(awarenessProvider));\n }\n\n const model: EditorModel = {\n id: obj.id,\n content: doc,\n text: () => get(doc.handle.docSync(), doc.path),\n extension: extensions,\n peer: identity\n ? {\n id: identity.identityKey.toHex(),\n name: identity.profile?.displayName,\n }\n : undefined,\n };\n\n return model;\n};\n"],
5
- "mappings": "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",
6
- "names": ["TextKind", "Doc", "YText", "YXmlFragment", "keymap", "tags", "EditorState", "EditorView", "vim", "defaultsDeep", "React", "forwardRef", "useCallback", "useEffect", "useImperativeHandle", "useRef", "useState", "log", "useThemeContext", "focusRing", "mx", "isNotFalsy", "autocompletion", "completionKeymap", "markdownLanguage", "keymap", "autocomplete", "onSearch", "keymap", "of", "completionKeymap", "autocompletion", "activateOnTyping", "tooltipClass", "markdownLanguage", "data", "context", "match", "matchBefore", "from", "to", "explicit", "options", "text", "toLowerCase", "invertedEffects", "StateField", "EditorView", "ViewPlugin", "next", "A", "get", "next", "A", "cursorConverter", "handle", "path", "toCursor", "pos", "doc", "docSync", "value", "get", "length", "A", "getCursor", "slice", "fromCursor", "cursor", "getCursorPosition", "Annotation", "StateEffect", "getPath", "state", "field", "path", "getLastHeads", "lastHeads", "updateHeadsEffect", "StateEffect", "define", "updateHeads", "newHeads", "of", "reconcileAnnotation", "Annotation", "isReconcile", "tr", "annotation", "next", "A", "next", "A", "updateAutomerge", "field", "handle", "transactions", "state", "lastHeads", "path", "hasChanges", "tr", "changes", "iterChanges", "undefined", "newHeads", "changeAt", "doc", "invertedTransactions", "fromA", "toA", "_fromB", "_toB", "insert", "push", "from", "del", "reverse", "forEach", "A", "splice", "slice", "toString", "ChangeSet", "updateCodeMirror", "view", "selection", "target", "patches", "patch", "changeSpec", "handlePatch", "state", "changeSet", "ChangeSet", "of", "doc", "length", "map", "dispatch", "changes", "annotations", "reconcileAnnotation", "action", "handleInsert", "handleSplice", "handleDel", "handlePut", "index", "charPath", "path", "text", "values", "value", "toString", "join", "from", "to", "insert", "textPath", "candidatePath", "i", "PatchSemaphore", "constructor", "_handle", "_state", "_inReconcile", "reconcile", "view", "doReconcile", "path", "getPath", "state", "oldHeads", "getLastHeads", "selection", "transactions", "field", "unreconciledTransactions", "filter", "tx", "isReconcile", "toInvert", "slice", "reverse", "tr", "inverted", "changes", "invert", "startState", "doc", "map", "dispatch", "annotations", "reconcileAnnotation", "of", "newHeads", "updateAutomerge", "undefined", "A", "getHeads", "docSync", "diff", "equals", "updateCodeMirror", "effects", "updateHeads", "Facet", "defaultCursorConverter", "toCursor", "position", "toString", "fromCursor", "cursor", "parseInt", "Cursor", "converter", "Facet", "define", "combine", "providers", "getCursorFromRange", "state", "range", "cursorConverter", "facet", "from", "to", "join", "getRangeFromCursor", "parts", "split", "undefined", "automerge", "handle", "path", "syncState", "StateField", "define", "create", "slice", "lastHeads", "A", "getHeads", "docSync", "unreconciledTransactions", "update", "value", "tr", "result", "clearUnreconciled", "effect", "effects", "is", "updateHeadsEffect", "newHeads", "isReconcile", "push", "semaphore", "PatchSemaphore", "Cursor", "converter", "of", "cursorConverter", "ViewPlugin", "fromClass", "constructor", "_view", "addListener", "_handleChange", "bind", "destroy", "removeListener", "reconcile", "EditorView", "updateListener", "view", "changes", "empty", "invertedEffects", "iterChanges", "fromA", "toA", "fromB", "toB", "inserted", "Annotation", "Facet", "RangeSet", "Decoration", "EditorView", "ViewPlugin", "WidgetType", "Event", "Context", "dummyProvider", "remoteStateChange", "Event", "open", "close", "getRemoteStates", "update", "awarenessProvider", "Facet", "define", "combine", "providers", "RemoteSelectionChangedAnnotation", "Annotation", "awareness", "provider", "of", "ViewPlugin", "fromClass", "RemoteSelectionsDecorator", "decorations", "value", "styles", "constructor", "view", "RangeSet", "_ctx", "Context", "_lastAnchor", "undefined", "_lastHead", "_cursorConverter", "state", "facet", "Cursor", "converter", "_provider", "on", "dispatch", "annotations", "destroy", "dispose", "_updateLocalSelection", "_updateRemoteSelections", "hasFocus", "dom", "ownerDocument", "anchor", "head", "selection", "main", "toCursor", "awarenessStates", "position", "fromCursor", "start", "Math", "min", "doc", "length", "end", "max", "startLine", "lineAt", "endLine", "color", "info", "lightColor", "number", "push", "from", "to", "Decoration", "mark", "attributes", "style", "class", "i", "linePos", "line", "widget", "side", "block", "RemoteCaretWidget", "displayName", "set", "WidgetType", "_name", "_color", "toDOM", "span", "document", "createElement", "className", "backgroundColor", "borderColor", "dot", "innerText", "appendChild", "createTextNode", "updateDOM", "eq", "estimatedHeight", "ignoreEvent", "EditorView", "baseTheme", "padding", "margin", "borderLeft", "borderRight", "marginLeft", "marginRight", "boxSizing", "display", "cursor", "borderRadius", "width", "height", "top", "left", "transition", "transform", "transformOrigin", "fontSize", "fontFamily", "fontStyle", "fontWeight", "lineHeight", "userSelect", "zIndex", "opacity", "transitionDelay", "whiteSpace", "closeBrackets", "history", "bracketMatching", "defaultHighlightStyle", "syntaxHighlighting", "oneDarkHighlightStyle", "drawSelection", "EditorView", "highlightActiveLine", "placeholder", "isNotFalsy", "createBasicBundle", "themeMode", "placeholder", "_placeholder", "lineWrapping", "EditorView", "bracketMatching", "closeBrackets", "drawSelection", "highlightActiveLine", "history", "syntaxHighlighting", "oneDarkHighlightStyle", "defaultHighlightStyle", "filter", "isNotFalsy", "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", "invertedEffects", "Facet", "StateEffect", "StateField", "hoverTooltip", "keymap", "Decoration", "EditorView", "sortBy", "useEffect", "debounce", "nonNullable", "random", "cursorColors", "color", "light", "cursorColor", "uint32", "length", "mx", "headings", "heading", "level", "light", "mark", "mx", "bold", "italic", "strikethrough", "code", "codeMark", "inlineUrl", "mx", "code", "blockquote", "light", "get", "tailwindConfig", "tokens", "tailwindConfig", "theme", "getToken", "path", "defaultValue", "undefined", "get", "log", "callbackWrapper", "fn", "args", "err", "catch", "logChanges", "trs", "changes", "flatMap", "tr", "empty", "undefined", "iterChanges", "fromA", "toA", "fromB", "toB", "inserted", "push", "JSON", "stringify", "toString", "filter", "Boolean", "length", "console", "styles", "EditorView", "baseTheme", "mixBlendMode", "backgroundColor", "getToken", "color", "commentMark", "Decoration", "mark", "class", "commentCurrentMark", "focusComment", "view", "id", "center", "comment", "state", "field", "commentsState", "comments", "find", "range", "cursor", "Cursor", "getRangeFromCursor", "dispatch", "selection", "anchor", "from", "effects", "scrollIntoView", "y", "undefined", "setSelection", "of", "current", "setComments", "StateEffect", "define", "setCommentState", "StateField", "create", "update", "value", "tr", "effect", "is", "map", "filter", "nonNullable", "commentsDecorations", "decorations", "compute", "sortBy", "flatMap", "to", "console", "warn", "set", "trackPastedComments", "onUpdate", "tracked", "handleTrack", "event", "main", "selectedRanges", "length", "text", "doc", "slice", "domEventHandlers", "cut", "copy", "invertedEffects", "startState", "changes", "iterChangedRanges", "fromA", "toA", "push", "restoreCommentEffect", "updateListener", "restore", "i", "transactions", "j", "mapTrackedComment", "paste", "isUserEvent", "found", "iterChanges", "fromB", "toB", "eq", "indexOf", "mapPos", "moved", "exists", "some", "c", "getCursorFromRange", "optionsFacet", "Facet", "combine", "providers", "createComment", "options", "facet", "insert", "onCreate", "location", "coordsAtPos", "key", "shortcut", "handleSelect", "debounce", "onSelect", "keymap", "run", "callbackWrapper", "onHover", "hoverTooltip", "pos", "end", "above", "el", "document", "createElement", "dom", "offset", "x", "hoverTime", "mod", "from2", "to2", "forEach", "newRange", "onDelete", "Object", "assign", "min", "Infinity", "closest", "head", "d", "Math", "abs", "useComments", "useEffect", "EditorView", "listener", "onFocus", "onChange", "extensions", "push", "EditorView", "focusChangeEffect", "of", "_", "focused", "updateListener", "update", "state", "doc", "toString", "closeBrackets", "closeBracketsKeymap", "history", "historyKeymap", "indentWithTab", "standardKeymap", "markdownLanguage", "markdown", "bracketMatching", "defaultHighlightStyle", "indentOnInput", "syntaxHighlighting", "languages", "searchKeymap", "EditorState", "oneDarkHighlightStyle", "crosshairCursor", "drawSelection", "dropCursor", "EditorView", "highlightActiveLine", "keymap", "placeholder", "isNotFalsy", "markdownLanguage", "HighlightStyle", "tags", "styleTags", "Tag", "Table", "markdownTags", "Blockquote", "Tag", "define", "CodeMark", "CodeText", "EmphasisMark", "HeaderMark", "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", "scope", "markdownLanguage", "all", "fontFamily", "getToken", "join", "createMarkdownExtensions", "themeMode", "placeholder", "_placeholder", "lineWrapping", "EditorView", "EditorState", "allowMultipleSelections", "of", "tabSize", "bracketMatching", "closeBrackets", "crosshairCursor", "dropCursor", "drawSelection", "highlightActiveLine", "history", "indentOnInput", "markdown", "base", "markdownLanguage", "codeLanguages", "languages", "extensions", "markdownTagsExtensions", "syntaxHighlighting", "oneDarkHighlightStyle", "defaultHighlightStyle", "markdownHighlightStyle", "keymap", "indentWithTab", "closeBracketsKeymap", "historyKeymap", "searchKeymap", "standardKeymap", "filter", "isNotFalsy", "syntaxTree", "RangeSetBuilder", "ViewPlugin", "EditorView", "Decoration", "WidgetType", "mx", "styles", "EditorView", "baseTheme", "fontFamily", "getToken", "join", "width", "paddingInline", "position", "content", "inset", "background", "mixBlendMode", "display", "borderTopLeftRadius", "borderTopRightRadius", "borderBottomLeftRadius", "borderBottomRightRadius", "getLineRange", "lines", "from", "to", "start", "findIndex", "line", "end", "LineWidget", "WidgetType", "constructor", "_className", "toDOM", "el", "document", "createElement", "innerHTML", "className", "mx", "top", "bottom", "buildDecorations", "view", "builder", "RangeSetBuilder", "state", "blocks", "viewportLineBlocks", "cursor", "selection", "main", "head", "visibleRanges", "syntaxTree", "iterate", "enter", "node", "name", "edit", "readOnly", "range", "i", "block", "add", "Decoration", "replace", "widget", "class", "finish", "code", "ViewPlugin", "fromClass", "decorations", "update", "value", "snippet", "syntaxTree", "RangeSetBuilder", "EditorSelection", "Decoration", "EditorView", "keymap", "ViewPlugin", "useState", "useMemo", "compareFormatting", "a", "b", "blockType", "strong", "emphasis", "strikethrough", "code", "link", "listStyle", "blockQuote", "Inline", "List", "setHeading", "level", "state", "dispatch", "selection", "ranges", "doc", "changes", "prevBlock", "range", "syntaxTree", "iterate", "from", "to", "enter", "node", "Object", "hasOwn", "Textblocks", "name", "isHeading", "exec", "curLevel", "push", "insert", "repeat", "nextLine", "lineAt", "Math", "min", "length", "update", "userEvent", "scrollIntoView", "setStyle", "type", "enable", "marker", "inlineMarkerText", "changeByRange", "empty", "after", "sliceString", "head", "found", "indexOf", "test", "slice", "before", "reverse", "join", "EditorSelection", "cursor", "changesAtEnd", "blockStart", "blockEnd", "startCovered", "endCovered", "blockContentStart", "blockContentEnd", "IgnoreInline", "has", "InlineMarker", "markType", "size", "openEnd", "closeStart", "skipSpaces", "max", "leave", "rangeStart", "rangeEnd", "changeSet", "concat", "mapPos", "addStyle", "style", "removeStyle", "toggleStyle", "arg", "form", "getFormatting", "toggleStrong", "toggleEmphasis", "toggleStrikethrough", "toggleInlineCode", "atx", "setext", "lastLine", "text", "pos", "dir", "limit", "line", "snippets", "codeblock", "snippet", "table", "insertTable", "view", "main", "number", "anchor", "removeLinkInner", "removeLink", "addLink", "cutStyles", "okay", "sNode", "firstChild", "lastChild", "changesAfter", "cursorOffset", "mark", "addList", "lastBlock", "counter", "first", "parentColumn", "blocks", "prevSibling", "item", "itemLine", "itemText", "i", "nodeFrom", "padding", "String", "column", "j", "num", "open", "last", "next", "nextSibling", "renumberListItems", "removeList", "stack", "targetNodeType", "pop", "toggleList", "target", "formatting", "active", "newNum", "setBlockquote", "lines", "prevLine", "quote", "addBlockquote", "removeBlockquote", "toggleBlockquote", "addCodeblock", "blockFrom", "blockTo", "map", "removeCodeblock", "firstLine", "toggleCodeblock", "options", "keymap", "of", "key", "run", "styling", "buildDecorations", "builder", "RangeSetBuilder", "replace", "marks", "add", "Decoration", "visibleRanges", "getChildren", "finish", "ViewPlugin", "fromClass", "constructor", "decorations", "value", "Emphasis", "StrongEmphasis", "InlineCode", "Strikethrough", "Set", "ATXHeading1", "ATXHeading2", "ATXHeading3", "ATXHeading4", "ATXHeading5", "ATXHeading6", "CodeBlock", "FencedCode", "Paragraph", "SetextHeading1", "SetextHeading2", "TableCell", "Task", "inline", "currentBlock", "advanceInline", "upto", "end", "skipInline", "some", "v", "contextSize", "contextBefore", "contextAfter", "ch", "blockCode", "index", "hasList", "hasQuote", "blankLine", "useFormattingState", "setState", "useState", "observer", "useMemo", "EditorView", "updateListener", "docChanged", "selectionSet", "newState", "syntaxTree", "RangeSetBuilder", "Decoration", "ViewPlugin", "buildDecorations", "view", "builder", "RangeSetBuilder", "state", "cursor", "selection", "main", "head", "from", "to", "visibleRanges", "syntaxTree", "iterate", "enter", "node", "name", "mark", "getChild", "hasFocus", "readOnly", "add", "Decoration", "replace", "finish", "heading", "ViewPlugin", "fromClass", "constructor", "decorations", "update", "value", "syntaxTree", "RangeSetBuilder", "Decoration", "EditorView", "ViewPlugin", "WidgetType", "styles", "EditorView", "baseTheme", "borderTop", "getToken", "HorizontalRuleWidget", "WidgetType", "toDOM", "el", "document", "createElement", "className", "decoration", "Decoration", "replace", "widget", "buildDecorations", "view", "builder", "RangeSetBuilder", "state", "cursor", "selection", "main", "head", "from", "to", "visibleRanges", "syntaxTree", "iterate", "enter", "node", "name", "add", "finish", "hr", "ViewPlugin", "fromClass", "constructor", "decorations", "update", "value", "syntaxTree", "StateField", "Decoration", "EditorView", "WidgetType", "image", "options", "StateField", "define", "create", "state", "Decoration", "set", "buildDecorations", "doc", "length", "update", "value", "tr", "docChanged", "selection", "cursor", "main", "head", "oldCursor", "changes", "mapPos", "startState", "from", "Math", "min", "to", "max", "iterChangedRanges", "fromA", "toA", "fromB", "toB", "lineAt", "map", "filterFrom", "filterTo", "filter", "add", "provide", "field", "EditorView", "decorations", "syntaxTree", "iterate", "enter", "node", "name", "urlNode", "getChild", "hide", "readOnly", "url", "sliceDoc", "push", "replace", "block", "widget", "ImageWidget", "range", "WidgetType", "constructor", "_url", "eq", "other", "toDOM", "view", "img", "document", "createElement", "setAttribute", "onload", "classList", "syntaxTree", "RangeSetBuilder", "hoverTooltip", "Decoration", "ViewPlugin", "WidgetType", "tooltipContent", "link", "options", "extensions", "ViewPlugin", "fromClass", "constructor", "view", "decorations", "buildDecorations", "update", "docChanged", "viewportChanged", "selectionSet", "value", "onHover", "push", "hoverTooltip", "pos", "side", "syntax", "syntaxTree", "state", "resolveInner", "i", "node", "parent", "name", "url", "getChild", "urlText", "sliceDoc", "from", "to", "end", "above", "create", "el", "document", "createElement", "className", "tooltipContent", "dom", "offset", "x", "y", "LinkButton", "WidgetType", "_url", "_onAttach", "eq", "other", "toDOM", "LinkText", "_text", "setAttribute", "textContent", "href", "onclick", "dispatch", "selection", "anchor", "posAtDOM", "builder", "RangeSetBuilder", "cursor", "main", "head", "visibleRanges", "iterate", "enter", "marks", "getChildren", "text", "length", "urlNode", "hasFocus", "readOnly", "add", "Decoration", "replace", "widget", "undefined", "onRender", "finish", "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", "join", "toDOM", "view", "document", "createElement", "appendChild", "cell", "th", "setAttribute", "textContent", "body", "td", "ignoreEvent", "e", "test", "type", "syntaxTree", "RangeSetBuilder", "EditorView", "Decoration", "WidgetType", "ViewPlugin", "styles", "EditorView", "baseTheme", "color", "getToken", "marginLeft", "marginRight", "CheckboxWidget", "WidgetType", "constructor", "_checked", "eq", "other", "toDOM", "view", "input", "document", "createElement", "className", "type", "checked", "state", "readOnly", "setAttribute", "onmousedown", "event", "pos", "posAtDOM", "text", "sliceDoc", "dispatch", "changes", "from", "to", "insert", "preventDefault", "ignoreEvent", "checkedDecoration", "Decoration", "replace", "widget", "uncheckedDecoration", "buildDecorations", "builder", "RangeSetBuilder", "cursor", "selection", "main", "head", "visibleRanges", "syntaxTree", "iterate", "enter", "node", "name", "doc", "sliceString", "add", "mark", "class", "finish", "tasklist", "options", "ViewPlugin", "fromClass", "decorations", "update", "docChanged", "viewportChanged", "selectionSet", "value", "autocompletion", "mention", "onSearch", "autocompletion", "activateOnTyping", "closeOnBlur", "icons", "override", "context", "console", "log", "match", "matchBefore", "from", "to", "explicit", "options", "text", "slice", "toLowerCase", "map", "value", "label", "outliner", "options", "keymap", "defaultItems", "typewriter", "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", "get", "defaultTheme", "outline", "fontFamily", "get", "tokens", "join", "lineHeight", "padding", "fontSize", "color", "caretColor", "borderLeft", "paddingInline", "background", "backgroundColor", "textDecorationLine", "textDecorationThickness", "textUnderlineOffset", "borderRadius", "border", "marginTop", "marginLeft", "display", "textDecoration", "borderBottom", "fontWeight", "textAlign", "height", "borderTop", "margin", "backgroundImage", "marginRight", "textTheme", "markdownTheme", "codeTheme", "EditorModes", "BaseTextEditor", "forwardRef", "model", "readonly", "autoFocus", "scrollTo", "selection", "editorMode", "theme", "slots", "defaultSlots", "extensions", "debug", "forwardedRef", "themeMode", "useThemeContext", "rootRef", "useRef", "view", "setView", "useState", "useImperativeHandle", "useEffect", "hasFocus", "state", "main", "from", "to", "doc", "lineAt", "dispatch", "anchor", "focus", "current", "EditorState", "create", "text", "EditorView", "exceptionSink", "of", "err", "log", "catch", "baseTheme", "defaultTheme", "darkTheme", "editorAttributes", "class", "editor", "className", "contentAttributes", "content", "editable", "readOnly", "extension", "vim", "filter", "isNotFalsy", "newView", "parent", "dispatchTransactions", "trs", "logChanges", "update", "destroy", "handleKeyUp", "useCallback", "event", "key", "altKey", "shiftKey", "metaKey", "ctrlKey", "div", "id", "role", "tabIndex", "root", "onKeyUp", "ref", "TextEditor", "placeholder", "lineWrapping", "textTheme", "props", "updatedSlots", "defaultsDeep", "defaultTextSlots", "createBasicBundle", "MarkdownEditor", "markdownTheme", "defaultMarkdownSlots", "createMarkdownExtensions", "mx", "focusRing", "CaretRight", "ChatText", "Code", "CodeBlock", "Link", "ListBullets", "ListChecks", "ListNumbers", "Paragraph", "TextStrikethrough", "Table", "TextB", "TextHOne", "TextHTwo", "TextHThree", "TextHFour", "TextHFive", "TextHSix", "TextItalic", "createContext", "React", "Button", "DensityProvider", "Select", "getSize", "mx", "HeadingIcons", "Paragraph", "TextHOne", "TextHTwo", "TextHThree", "TextHFour", "TextHFive", "TextHSix", "ToolbarContextProvider", "useToolbarContext", "createContext", "ToolbarRoot", "children", "onAction", "state", "React", "DensityProvider", "density", "div", "role", "className", "ToolbarButton", "Icon", "onClick", "title", "getState", "disable", "active", "disabled", "handleClick", "event", "action", "preventDefault", "Button", "variant", "classNames", "mx", "onMouseDown", "getSize", "ToolbarSeparator", "MarkdownHeading", "blockType", "header", "exec", "value", "undefined", "HeadingIcon", "Select", "Root", "onValueChange", "type", "data", "parseInt", "TriggerButton", "Portal", "Content", "Viewport", "Option", "map", "level", "key", "String", "MarkdownStyles", "TextB", "s", "strong", "TextItalic", "emphasis", "TextStrikethrough", "strikethrough", "Code", "code", "MarkdownLists", "ListBullets", "listStyle", "ListNumbers", "ListChecks", "MarkdownBlocks", "CaretRight", "blockQuote", "CodeBlock", "blankLine", "Table", "MarkdownLinks", "Link", "link", "MarkdownStandard", "MarkdownExtended", "Toolbar", "ChatText", "Separator", "Markdown", "Extended", "DeferredTask", "Event", "sleep", "Context", "invariant", "log", "DEBOUNCE_INTERVAL", "SpaceAwarenessProvider", "constructor", "params", "_remoteStates", "Map", "remoteStateChange", "_space", "space", "_channel", "channel", "_peerId", "peerId", "_info", "info", "open", "_ctx", "_postTask", "_localState", "postMessage", "kind", "state", "onDispose", "listen", "message", "payload", "_handleQueryMessage", "_handlePostMessage", "catch", "err", "debug", "close", "dispose", "undefined", "getRemoteStates", "Array", "from", "values", "update", "position", "schedule", "set", "emit", "StateField", "modelState", "StateField", "define", "create", "undefined", "update", "model", "useActionHandler", "view", "action", "inlineType", "listType", "type", "setHeading", "parseInt", "data", "Inline", "Strong", "Emphasis", "Strikethrough", "Code", "setStyle", "toggleStyle", "List", "Ordered", "Bullet", "Task", "removeList", "addList", "toggleList", "removeBlockquote", "addBlockquote", "toggleBlockquote", "removeCodeblock", "addCodeblock", "insertTable", "removeLink", "addLink", "createComment", "setTimeout", "hasFocus", "focus", "useState", "useEditorView", "view", "setView", "useState", "ref", "EditorSelection", "EditorState", "EditorView", "useEffect", "useRef", "useState", "log", "isNotFalsy", "useTextEditor", "autoFocus", "scrollTo", "debug", "doc", "selection", "extensions", "onUpdate", "useRef", "view", "setView", "useState", "parentRef", "useEffect", "current", "state", "EditorState", "create", "EditorView", "exceptionSink", "of", "err", "log", "catch", "updateListener", "filter", "isNotFalsy", "parent", "dispatchTransactions", "trs", "logChanges", "update", "destroy", "main", "anchor", "EditorSelection", "single", "line", "to", "undefined", "dispatch", "effects", "scrollIntoView", "focus", "createDataExtensions", "readonly", "readOnly", "editable", "createThemeExtensions", "theme", "themeMode", "slots", "baseTheme", "defaultTheme", "darkTheme", "editorAttributes", "class", "editor", "className", "contentAttributes", "content", "get", "useEffect", "useState", "generateName", "getRawDoc", "invariant", "isAutomergeObject", "useTextModel", "props", "identity", "space", "text", "model", "setModel", "useState", "useEffect", "createModel", "useInMemoryTextModel", "id", "defaultContent", "content", "setContent", "invariant", "isAutomergeObject", "obj", "doc", "getRawDoc", "field", "awarenessProvider", "SpaceAwarenessProvider", "channel", "info", "displayName", "profile", "generateName", "identityKey", "toHex", "undefined", "color", "cursorColor", "lightColor", "light", "peerId", "extensions", "modelState", "init", "automerge", "handle", "path", "push", "awareness", "get", "docSync", "extension", "peer", "name"]
3
+ "sources": ["../../../src/index.ts", "../../../src/components/TextEditor/index.ts", "../../../src/components/TextEditor/TextEditor.tsx", "../../../src/extensions/annotations.ts", "../../../src/extensions/cursor.ts", "../../../src/extensions/autocomplete.ts", "../../../src/extensions/automerge/automerge.ts", "../../../src/extensions/automerge/cursor.ts", "../../../src/extensions/automerge/defs.ts", "../../../src/extensions/automerge/semaphore.ts", "../../../src/extensions/automerge/update-automerge.ts", "../../../src/extensions/automerge/update-codemirror.ts", "../../../src/extensions/awareness.ts", "../../../src/extensions/basic.ts", "../../../src/extensions/blast.ts", "../../../src/extensions/comments.ts", "../../../src/styles/cursors.ts", "../../../src/styles/markdown.ts", "../../../src/styles/tokens.ts", "../../../src/util.ts", "../../../src/extensions/listener.ts", "../../../src/extensions/markdown/bundle.ts", "../../../src/extensions/markdown/highlight.ts", "../../../src/extensions/markdown/code.ts", "../../../src/extensions/markdown/formatting.ts", "../../../src/extensions/markdown/heading.ts", "../../../src/extensions/markdown/hr.ts", "../../../src/extensions/markdown/image.ts", "../../../src/extensions/markdown/link.ts", "../../../src/extensions/markdown/table.ts", "../../../src/extensions/markdown/tasklist.ts", "../../../src/extensions/mention.ts", "../../../src/extensions/outliner.ts", "../../../src/extensions/typewriter.ts", "../../../src/themes/default.ts", "../../../src/components/Toolbar/Toolbar.tsx", "../../../src/hooks/awareness-provider.ts", "../../../src/hooks/defs.ts", "../../../src/hooks/useActionHandler.ts", "../../../src/hooks/useEditorView.ts", "../../../src/hooks/useTextEditor.ts", "../../../src/hooks/useTextModel.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';\nexport { type Extension } from '@codemirror/state';\nexport { type EditorView, keymap } from '@codemirror/view';\n\nexport * from './components';\nexport * from './extensions';\nexport * from './hooks';\nexport { getToken } from './styles';\nexport * from './themes';\nexport * from './util';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nexport { tags } from '@lezer/highlight';\nexport { type Extension } from '@codemirror/state';\n\nexport * from './TextEditor';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { EditorState, type Extension, type StateEffect } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\n// import { 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 useRef,\n useState,\n} from 'react';\n\nimport { log } from '@dxos/log';\nimport { useThemeContext } from '@dxos/react-ui';\nimport { focusRing, mx } from '@dxos/react-ui-theme';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { createBasicBundle, createMarkdownExtensions } from '../../extensions';\nimport { type EditorModel } from '../../hooks';\nimport { type ThemeStyles } from '../../styles';\nimport { defaultTheme, markdownTheme, textTheme } from '../../themes';\nimport { logChanges } from '../../util';\n\n// TODO(burdon): Change to enum?\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 length: number;\n after?: string;\n};\n\nexport type TextEditorSlots = {\n root?: Omit<ComponentProps<'div'>, 'ref'>;\n editor?: {\n className?: string;\n };\n content?: {\n className?: string;\n };\n};\n\n// TODO(burdon): Spellcheck?\nexport type TextEditorProps = {\n model: EditorModel; // TODO(burdon): Optional (e.g., just provide content if readonly).\n readonly?: boolean; // TODO(burdon): Move into model.\n autoFocus?: boolean;\n lineWrapping?: boolean;\n scrollTo?: StateEffect<any>; // TODO(burdon): Restore scroll position: scrollTo EditorView.scrollSnapshot().\n selection?: { anchor: number; head?: number };\n editorMode?: EditorMode; // TODO(burdon): Factor out.\n placeholder?: string;\n theme?: ThemeStyles;\n slots?: TextEditorSlots;\n extensions?: Extension[];\n debug?: boolean;\n};\n\n/**\n * Base text editor.\n */\n// TODO(burdon): Replace with useTextEditor.\nexport const BaseTextEditor = forwardRef<EditorView, TextEditorProps>(\n (\n {\n model,\n readonly,\n autoFocus,\n scrollTo,\n selection,\n editorMode,\n theme,\n slots = defaultSlots,\n extensions = [],\n debug,\n },\n forwardedRef,\n ) => {\n // TODO(burdon): Hook causes error even if properties are not spread into div.\n // Uncaught TypeError: Cannot read properties of undefined (reading 'relatedTarget')\n // Uses event.detail, which is deprecated (not event.details). At runtime the event has a property `details`.\n // https://github.com/microsoft/tabster/blob/master/src/State/FocusedElement.ts#L348 (e.detail.relatedTarget)\n // https://github.com/microsoft/keyborg/blob/49e49b2c3ba0a5f6cc518ac46825d7551def8109/src/FocusEvent.ts#L58\n // const tabsterDOMAttribute = useFocusableGroup({ tabBehavior: 'limited' });\n const { themeMode } = useThemeContext();\n\n const rootRef = useRef<HTMLDivElement>(null);\n const [view, setView] = useState<EditorView | null>(null);\n\n // The view ref can be used to focus the editor.\n // NOTE: This does not cause the parent to re-render, so the ref is not available immediately.\n useImperativeHandle<EditorView | null, EditorView | null>(forwardedRef, () => view, [view]);\n\n // Set focus.\n useEffect(() => {\n if (autoFocus && !view?.hasFocus) {\n if (view?.state.selection.main?.from === 0) {\n // Start at end of line.\n const { to } = view.state.doc.lineAt(0);\n view?.dispatch({ selection: { anchor: to } });\n }\n view?.focus();\n }\n }, [view, autoFocus]);\n\n // Create editor state and view.\n // The view is recreated if the model or extensions are changed.\n useEffect(() => {\n if (!model || !rootRef.current) {\n return;\n }\n\n //\n // EditorState\n // https://codemirror.net/docs/ref/#state.EditorStateConfig\n //\n const state = EditorState.create({\n doc: model.text(),\n selection,\n extensions: [\n // TODO(burdon): Doesn't catch errors in keymap functions.\n EditorView.exceptionSink.of((err) => {\n log.catch(err);\n }),\n\n // Theme.\n // TODO(burdon): Make configurable.\n EditorView.baseTheme(defaultTheme),\n EditorView.theme(theme ?? {}),\n EditorView.darkTheme.of(themeMode === 'dark'),\n EditorView.editorAttributes.of({ class: slots.editor?.className ?? '' }),\n EditorView.contentAttributes.of({ class: slots.content?.className ?? '' }),\n\n // State.\n EditorView.editable.of(!readonly),\n EditorState.readOnly.of(!!readonly),\n\n // Storage and replication.\n // NOTE: This must come before user extensions.\n model.extension,\n\n // TODO(burdon): Factor out? (Requires special handling for Escape/Enter below).\n editorMode === 'vim' && vim(),\n\n // Custom.\n ...extensions,\n ].filter(isNotFalsy),\n });\n\n //\n // EditorView\n // https://codemirror.net/docs/ref/#view.EditorViewConfig\n //\n const newView = new EditorView({\n state,\n parent: rootRef.current,\n scrollTo,\n // NOTE: Uncomment to debug/monitor all transactions.\n // https://codemirror.net/docs/ref/#view.EditorView.dispatch\n dispatchTransactions: (trs, view) => {\n if (debug) {\n logChanges(trs);\n }\n view.update(trs);\n },\n });\n\n view?.destroy();\n setView(newView);\n\n return () => {\n newView?.destroy();\n setView(null);\n };\n }, [rootRef, model, readonly, editorMode, themeMode]);\n\n // Handles tab/focus.\n // Pressing Escape focuses the outer div (to support tab navigation); pressing Enter refocuses the editor.\n // TODO(burdon): Convert to keymap?\n const handleKeyUp = useCallback(\n (event: KeyboardEvent) => {\n const { key, altKey, shiftKey, metaKey, ctrlKey } = event;\n switch (key) {\n case 'Enter': {\n view?.focus();\n break;\n }\n\n case 'Escape': {\n if (editorMode === 'vim' && (altKey || shiftKey || metaKey || ctrlKey)) {\n view?.focus();\n }\n break;\n }\n }\n },\n [view, editorMode],\n );\n\n return (\n <div\n key={model.id}\n role='none'\n tabIndex={0}\n {...slots.root}\n // {...(editorMode !== 'vim' && tabsterDOMAttribute)}\n onKeyUp={handleKeyUp}\n ref={rootRef}\n />\n );\n },\n);\n\nexport const TextEditor = forwardRef<EditorView, TextEditorProps>(\n ({ readonly, placeholder, lineWrapping, theme = textTheme, slots, extensions = [], ...props }, forwardedRef) => {\n const { themeMode } = useThemeContext();\n const updatedSlots = defaultsDeep({}, slots, defaultTextSlots);\n return (\n <BaseTextEditor\n ref={forwardedRef}\n readonly={readonly}\n extensions={[createBasicBundle({ themeMode, placeholder, lineWrapping }), ...extensions]}\n theme={theme}\n slots={updatedSlots}\n {...props}\n />\n );\n },\n);\n\nexport const MarkdownEditor = forwardRef<EditorView, TextEditorProps>(\n ({ readonly, placeholder, theme = markdownTheme, slots, extensions = [], ...props }, forwardedRef) => {\n const { themeMode } = useThemeContext();\n const updatedSlots = defaultsDeep({}, slots, defaultMarkdownSlots);\n return (\n <BaseTextEditor\n ref={forwardedRef}\n readonly={readonly}\n extensions={[createMarkdownExtensions({ themeMode, placeholder }), ...extensions]}\n theme={theme}\n slots={updatedSlots}\n {...props}\n />\n );\n },\n);\n\nexport const defaultSlots: TextEditorSlots = {\n root: {\n className: mx('grow', focusRing),\n },\n editor: {\n className: 'bs-full',\n },\n};\n\nexport const defaultTextSlots: TextEditorSlots = {\n ...defaultSlots,\n};\n\nexport const defaultMarkdownSlots: TextEditorSlots = {\n ...defaultSlots,\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type EditorState, type Extension, StateField } from '@codemirror/state';\nimport { Decoration, EditorView } from '@codemirror/view';\n\nimport { isNotFalsy } from '@dxos/util';\n\nimport { Cursor } from './cursor';\n\ntype Annotation = {\n cursor: string;\n};\n\nexport type AnnotationOptions = {\n match?: RegExp; // TODO(burdon): Update via hook (e.g., for search).\n};\n\nconst annotationMark = Decoration.mark({ class: 'cm-annotation' });\n\nexport const annotations = (options: AnnotationOptions = {}): Extension => {\n // TODO(burdon): Build index of matches and cursors (in background function).\n // Define annotation action in prompt. E.g., extract company names. Find links, etc.\n // Show popover card. A16Z chain demo. Identify, extract, research, link. Multi-agent.\n const match = (state: EditorState) => {\n const annotations: Annotation[] = [];\n const text = state.doc.toString();\n if (options.match) {\n const matches = text.matchAll(options.match);\n for (const match of matches) {\n const from = match.index!;\n const to = from + match[0].length;\n const cursor = Cursor.getCursorFromRange(state, { from, to });\n annotations.push({ cursor });\n }\n }\n\n return annotations;\n };\n\n const annotationsState = StateField.define<Annotation[]>({\n create: (state) => {\n return match(state);\n },\n update: (value, tr) => {\n if (!tr.changes.empty) {\n return match(tr.state);\n }\n\n return value;\n },\n });\n\n return [\n annotationsState,\n EditorView.decorations.compute([annotationsState], (state) => {\n const annotations = state.field(annotationsState);\n const decorations = annotations\n .map((annotation) => {\n const range = Cursor.getRangeFromCursor(state, annotation.cursor);\n return range && annotationMark.range(range.from, range.to);\n })\n .filter(isNotFalsy);\n\n return Decoration.set(decorations);\n }),\n styles,\n ];\n};\n\nconst styles = EditorView.baseTheme({\n '.cm-annotation': {\n textDecoration: 'underline',\n textDecorationStyle: 'wavy',\n textDecorationColor: 'red',\n },\n});\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type EditorState, Facet } from '@codemirror/state';\n\nimport type { Range } from '../hooks';\n\n/**\n * Converts indexes into the text document into stable peer-independent cursors.\n *\n * See:\n * - https://automerge.org/automerge/api-docs/js/functions/next.getCursor.html\n * - https://github.com/yjs/yjs?tab=readme-ov-file#relative-positions\n *\n * @param {assoc} number Negative values will associate the cursor with the previous character\n * while positive - with the next one.\n */\nexport interface CursorConverter {\n toCursor(position: number, assoc?: -1 | 1 | undefined): string;\n fromCursor(cursor: string): number;\n}\n\nconst defaultCursorConverter: CursorConverter = {\n toCursor: (position) => position.toString(),\n fromCursor: (cursor) => parseInt(cursor),\n};\n\nexport class Cursor {\n static readonly converter = Facet.define<CursorConverter, CursorConverter>({\n combine: (providers) => providers[0] ?? defaultCursorConverter,\n });\n\n static readonly getCursorFromRange = (state: EditorState, range: Range) => {\n const cursorConverter = state.facet(Cursor.converter);\n\n const from = cursorConverter.toCursor(range.from);\n const to = cursorConverter.toCursor(range.to, -1);\n return [from, to].join(':');\n };\n\n static readonly getRangeFromCursor = (state: EditorState, cursor: string) => {\n const cursorConverter = state.facet(Cursor.converter);\n\n const parts = cursor.split(':');\n const from = cursorConverter.fromCursor(parts[0]);\n const to = cursorConverter.fromCursor(parts[1]);\n return from !== undefined && to !== undefined ? { from, to } : undefined;\n };\n}\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 { markdownLanguage } from '@codemirror/lang-markdown';\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 // TODO(burdon): Set custom keymap.\n keymap.of(completionKeymap),\n\n // https://codemirror.net/examples/autocompletion\n // https://codemirror.net/docs/ref/#autocomplete.autocompletion\n autocompletion({\n activateOnTyping: true,\n\n // closeOnBlur: false,\n // defaultKeymap: false,\n\n // TODO(burdon): Styles/fragments.\n tooltipClass: () => 'shadow rounded',\n }),\n\n // TODO(burdon): Option to create new page?\n // TODO(burdon): Optional decoration via addToOptions\n markdownLanguage.data.of({\n autocomplete: (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// Copyright 2023 DXOS.org\n// Copyright 2024 Automerge\n// Ref: https://github.com/automerge/automerge-codemirror\n//\n\nimport { invertedEffects } from '@codemirror/commands';\nimport { StateField, type Extension, type StateEffect } from '@codemirror/state';\nimport { EditorView, ViewPlugin } from '@codemirror/view';\n\nimport { next as A, type Prop } from '@dxos/automerge/automerge';\n\nimport { cursorConverter } from './cursor';\nimport { updateHeadsEffect, type IDocHandle, isReconcile, type State } from './defs';\nimport { PatchSemaphore } from './semaphore';\nimport { Cursor } from '../cursor';\n\nexport type AutomergeOptions = {\n handle: IDocHandle;\n path: Prop[];\n};\n\nexport const automerge = ({ handle, path }: AutomergeOptions): Extension => {\n const syncState = StateField.define<State>({\n create: () => ({\n path: path.slice(),\n lastHeads: A.getHeads(handle.docSync()!),\n unreconciledTransactions: [],\n }),\n\n update: (value, tr) => {\n const result: State = {\n path: path.slice(),\n lastHeads: value.lastHeads,\n unreconciledTransactions: value.unreconciledTransactions.slice(),\n };\n\n let clearUnreconciled = false;\n for (const effect of tr.effects) {\n if (effect.is(updateHeadsEffect)) {\n result.lastHeads = effect.value.newHeads;\n clearUnreconciled = true;\n }\n }\n\n if (clearUnreconciled) {\n result.unreconciledTransactions = [];\n } else {\n if (!isReconcile(tr)) {\n result.unreconciledTransactions.push(tr);\n }\n }\n\n return result;\n },\n });\n\n const semaphore = new PatchSemaphore(handle, syncState);\n\n return [\n Cursor.converter.of(cursorConverter(handle, path)),\n syncState,\n\n // Reconcile external updates.\n ViewPlugin.fromClass(\n class {\n constructor(private readonly _view: EditorView) {\n handle.addListener('change', this._handleChange.bind(this));\n }\n\n destroy() {\n handle.removeListener('change', this._handleChange.bind(this));\n }\n\n _handleChange() {\n semaphore.reconcile(this._view);\n }\n },\n ),\n\n // Reconcile local updates.\n EditorView.updateListener.of(({ view, changes }) => {\n if (!changes.empty) {\n semaphore.reconcile(view);\n }\n }),\n\n // TODO(burdon): Record undo transactions.\n // See https://github.com/yjs/y-codemirror.next/tree/main\n // https://codemirror.net/examples/inverted-effect\n invertedEffects.of((tr) => {\n // Each change results it three transactions: insert, delete, insert.\n const effects: StateEffect<any>[] = [];\n if (!tr.changes.empty) {\n tr.changes.iterChanges((fromA, toA, fromB, toB, inserted) => {\n // effects.push(effectType.of({});\n });\n }\n\n return effects;\n }),\n ];\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport get from 'lodash.get';\n\nimport type { Prop } from '@dxos/automerge/automerge';\nimport { next as A } from '@dxos/automerge/automerge';\n\nimport { type IDocHandle } from './defs';\nimport { type CursorConverter } from '../cursor';\n\nexport const cursorConverter = (handle: IDocHandle, path: Prop[]): CursorConverter => ({\n // TODO(burdon): Handle assoc to associate with a previous character.\n toCursor: (pos) => {\n const doc = handle.docSync();\n if (!doc) {\n return '';\n }\n\n const value = get(doc, path);\n if (typeof value === 'string' && value.length <= pos) {\n return 'end';\n }\n\n // NOTE: Slice is needed because getCursor mutates the array.\n return A.getCursor(doc, path.slice(), pos);\n },\n\n fromCursor: (cursor) => {\n if (cursor === '') {\n return 0;\n }\n\n const doc = handle.docSync();\n if (!doc) {\n return 0;\n }\n\n if (cursor === 'end') {\n const value = get(doc, path);\n if (typeof value === 'string') {\n return value.length;\n } else {\n return 0;\n }\n }\n\n // NOTE: Slice is needed because getCursor mutates the array.\n return A.getCursorPosition(doc, path.slice(), cursor);\n },\n});\n", "//\n// Copyright 2023 DXOS.org\n// Copyright 2024 Automerge\n// Ref: https://github.com/automerge/automerge-codemirror\n//\n\nimport { Annotation, StateEffect, type StateField, type EditorState, type Transaction } from '@codemirror/state';\n\nimport { type ChangeFn, type ChangeOptions, type Doc, type Heads, type Prop } from '@dxos/automerge/automerge';\n\nexport type State = {\n path: Prop[];\n lastHeads: Heads;\n unreconciledTransactions: Transaction[];\n};\n\nexport const getPath = (state: EditorState, field: StateField<State>): Prop[] => state.field(field).path;\nexport const getLastHeads = (state: EditorState, field: StateField<State>): Heads => state.field(field).lastHeads;\n\nexport type UpdateHeads = {\n newHeads: Heads;\n};\n\nexport const updateHeadsEffect = StateEffect.define<UpdateHeads>({});\n\nexport const updateHeads = (newHeads: Heads): StateEffect<UpdateHeads> => updateHeadsEffect.of({ newHeads });\n\nexport const reconcileAnnotation = Annotation.define<boolean>();\n\nexport const isReconcile = (tr: Transaction): boolean => {\n return !!tr.annotation(reconcileAnnotation);\n};\n\nexport type IDocHandle<T = any> = {\n docSync(): Doc<T> | undefined;\n change(callback: ChangeFn<T>, options?: ChangeOptions<T>): void;\n changeAt(heads: Heads, callback: ChangeFn<T>, options?: ChangeOptions<T>): string[] | undefined;\n\n addListener(event: 'change', listener: () => void): void;\n removeListener(event: 'change', listener: () => void): void;\n};\n", "//\n// Copyright 2023 DXOS.org\n// Copyright 2024 Automerge\n// Ref: https://github.com/automerge/automerge-codemirror\n//\n\nimport { type StateField } from '@codemirror/state';\nimport { type EditorView } from '@codemirror/view';\n\nimport { next as A } from '@dxos/automerge/automerge';\n\nimport {\n getLastHeads,\n getPath,\n isReconcile,\n reconcileAnnotation,\n updateHeads,\n type IDocHandle,\n type State,\n} from './defs';\nimport { updateAutomerge } from './update-automerge';\nimport { updateCodeMirror } from './update-codemirror';\n\n/**\n * Implements three-way merge (on each mutation).\n */\nexport class PatchSemaphore {\n private _inReconcile = false;\n\n // prettier-ignore\n constructor(\n private readonly _handle: IDocHandle,\n private readonly _state: StateField<State>\n ) {}\n\n reconcile(view: EditorView) {\n if (!this._inReconcile) {\n this._inReconcile = true;\n this.doReconcile(view);\n this._inReconcile = false;\n }\n }\n\n private doReconcile(view: EditorView) {\n const path = getPath(view.state, this._state);\n\n // Get the heads before the unreconciled transactions are applied.\n const oldHeads = getLastHeads(view.state, this._state);\n let selection = view.state.selection;\n\n // First undo all the unreconciled transactions.\n const transactions = view.state.field(this._state).unreconciledTransactions.filter((tx) => !isReconcile(tx));\n const toInvert = transactions.slice().reverse();\n for (const tr of toInvert) {\n const inverted = tr.changes.invert(tr.startState.doc);\n selection = selection.map(inverted);\n view.dispatch({\n changes: inverted,\n annotations: reconcileAnnotation.of(true),\n });\n }\n\n // Apply the unreconciled transactions to the document.\n // NOTE: null and undefined each come from automerge and repo respectively.\n let newHeads = updateAutomerge(this._state, this._handle, transactions, view.state);\n if (newHeads === null || newHeads === undefined) {\n // TODO(alexjg): this is the call that's resetting the editor state on click.\n newHeads = A.getHeads(this._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 = A.equals(oldHeads, newHeads) ? [] : A.diff(this._handle.docSync()!, oldHeads, newHeads);\n updateCodeMirror(view, selection, path, diff);\n\n // Update automerge state.\n view.dispatch({\n effects: updateHeads(newHeads),\n annotations: reconcileAnnotation.of(false),\n });\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n// Copyright 2024 Automerge\n// Ref: https://github.com/automerge/automerge-codemirror\n//\n\nimport { type EditorState, type StateField, type Transaction, type Text } from '@codemirror/state';\n\nimport { next as A, type Heads } from '@dxos/automerge/automerge';\n\nimport { type IDocHandle, type State } from './defs';\n\nexport const updateAutomerge = (\n field: StateField<State>,\n handle: IDocHandle,\n transactions: Transaction[],\n state: EditorState, // TODO(burdon): Just pass in the state field value?\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: A.Doc<unknown>) => {\n const invertedTransactions: { from: number; del: number; insert: Text }[] = [];\n for (const tr of transactions) {\n tr.changes.iterChanges((fromA, toA, _fromB, _toB, insert) => {\n invertedTransactions.push({ from: fromA, del: toA - fromA, insert });\n });\n }\n\n // TODO(burdon): Hack to apply in reverse order to properly apply range.\n invertedTransactions.reverse().forEach(({ from, del, insert }) => {\n A.splice(doc, path.slice(), from, del, insert.toString());\n });\n });\n\n return newHeads ?? undefined;\n};\n", "//\n// Copyright 2023 DXOS.org\n// Copyright 2024 Automerge\n// Ref: https://github.com/automerge/automerge-codemirror\n//\n\nimport { ChangeSet, type ChangeSpec, type EditorSelection, type EditorState } from '@codemirror/state';\nimport { type EditorView } from '@codemirror/view';\n\nimport {\n type DelPatch,\n type InsertPatch,\n type Patch,\n type Prop,\n type PutPatch,\n type SpliceTextPatch,\n} from '@dxos/automerge/automerge';\n\nimport { reconcileAnnotation } from './defs';\n\nexport const updateCodeMirror = (view: EditorView, selection: EditorSelection, target: Prop[], patches: Patch[]) => {\n for (const patch of patches) {\n const changeSpec = handlePatch(patch, target, view.state);\n if (changeSpec != null) {\n const changeSet = ChangeSet.of(changeSpec, view.state.doc.length, '\\n');\n selection = selection.map(changeSet, 1);\n view.dispatch({\n changes: changeSet,\n annotations: reconcileAnnotation.of(false),\n });\n }\n }\n\n view.dispatch({\n selection,\n annotations: reconcileAnnotation.of(false),\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\n const text = patch.values.map((value) => (value ? value.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\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\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\n const length = state.doc.length;\n if (typeof patch.value !== 'string') {\n return []; // TODO(dmaretskyi): How to handle non-string values?\n }\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 a path to a character\n// 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\n for (let i = 0; i < textPath.length; i++) {\n if (textPath[i] !== candidatePath[i]) {\n return null;\n }\n }\n\n const index = candidatePath[candidatePath.length - 1];\n if (typeof index === 'number') {\n return index;\n }\n\n return null;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Annotation, Facet, type Extension, RangeSet, type Range } from '@codemirror/state';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n type PluginValue,\n ViewPlugin,\n type ViewUpdate,\n WidgetType,\n} from '@codemirror/view';\n\nimport { Event } from '@dxos/async';\nimport { Context } from '@dxos/context';\n\nimport { Cursor, type CursorConverter } from './cursor';\n\nexport interface AwarenessProvider {\n remoteStateChange: Event<void>;\n\n open(): void;\n close(): void;\n\n getRemoteStates(): AwarenessState[];\n update(position: AwarenessPosition | undefined): void;\n}\n\nconst dummyProvider: AwarenessProvider = {\n remoteStateChange: new Event(),\n\n open: () => {},\n close: () => {},\n\n getRemoteStates: () => [],\n update: () => {},\n};\n\nexport const awarenessProvider = Facet.define<AwarenessProvider, AwarenessProvider>({\n combine: (providers) => providers[0] ?? dummyProvider,\n});\n\n// TODO(dmaretskyi): Specify the users that actually changed. Currently, we recalculate positions for every user.\nconst RemoteSelectionChangedAnnotation = Annotation.define();\n\nexport type AwarenessPosition = {\n anchor?: string;\n head?: string;\n};\n\nexport type AwarenessInfo = {\n displayName?: string;\n // TODO(burdon): Rename light/dark.\n color?: string;\n lightColor?: string;\n};\n\nexport type AwarenessState = {\n position?: AwarenessPosition;\n peerId: string;\n info: AwarenessInfo;\n};\n\n/**\n * Extension provides presence information about other peers.\n */\nexport const awareness = (provider = dummyProvider): Extension => {\n return [\n awarenessProvider.of(provider),\n ViewPlugin.fromClass(RemoteSelectionsDecorator, {\n decorations: (value) => value.decorations,\n }),\n styles,\n ];\n};\n\n/**\n * Generates selection decorations from remote peers.\n */\nexport class RemoteSelectionsDecorator implements PluginValue {\n public decorations: DecorationSet = RangeSet.of([]);\n\n private readonly _ctx = new Context();\n\n private _cursorConverter: CursorConverter;\n private _provider: AwarenessProvider;\n private _lastAnchor?: number = undefined;\n private _lastHead?: number = undefined;\n\n constructor(view: EditorView) {\n this._cursorConverter = view.state.facet(Cursor.converter);\n this._provider = view.state.facet(awarenessProvider);\n this._provider.open();\n this._provider.remoteStateChange.on(this._ctx, () => {\n view.dispatch({ annotations: [RemoteSelectionChangedAnnotation.of([])] });\n });\n }\n\n destroy() {\n void this._ctx.dispose();\n this._provider.close();\n }\n\n update(update: ViewUpdate) {\n this._updateLocalSelection(update);\n this._updateRemoteSelections(update);\n }\n\n private _updateLocalSelection(update: ViewUpdate) {\n const hasFocus = update.view.hasFocus && update.view.dom.ownerDocument.hasFocus();\n const { anchor = undefined, head = undefined } = hasFocus ? update.state.selection.main : {};\n if (this._lastAnchor === anchor && this._lastHead === head) {\n return;\n }\n\n this._lastAnchor = anchor;\n this._lastHead = head;\n\n this._provider.update(\n anchor !== undefined && head !== undefined\n ? {\n anchor: this._cursorConverter.toCursor(anchor),\n head: this._cursorConverter.toCursor(head),\n }\n : undefined,\n );\n }\n\n private _updateRemoteSelections(update: ViewUpdate) {\n const decorations: Range<Decoration>[] = [];\n const awarenessStates = this._provider.getRemoteStates();\n for (const state of awarenessStates) {\n const anchor = state.position?.anchor ? this._cursorConverter.fromCursor(state.position.anchor) : null;\n const head = state.position?.head ? this._cursorConverter.fromCursor(state.position.head) : null;\n if (anchor == null || head == null) {\n continue;\n }\n\n const start = Math.min(Math.min(anchor, head), update.view.state.doc.length);\n const end = Math.min(Math.max(anchor, head), update.view.state.doc.length);\n\n const startLine = update.view.state.doc.lineAt(start);\n const endLine = update.view.state.doc.lineAt(end);\n\n // TODO(burdon): Factor out styles.\n const color = state.info.color ?? '#30bced';\n const lightColor = state.info.lightColor ?? color + '33';\n\n if (startLine.number === endLine.number) {\n // Selected content in a single line.\n decorations.push({\n from: start,\n to: end,\n value: Decoration.mark({\n attributes: { style: `background-color: ${lightColor}` },\n class: 'cm-collab-selection',\n }),\n });\n } else {\n // Selected content in multiple lines; first, render text-selection in the first line.\n decorations.push({\n from: start,\n to: startLine.from + startLine.length,\n value: Decoration.mark({\n attributes: { style: `background-color: ${color}` },\n class: 'cm-collab-selection',\n }),\n });\n\n // Render text-selection in the last line.\n decorations.push({\n from: endLine.from,\n to: end,\n value: Decoration.mark({\n attributes: { style: `background-color: ${color}` },\n class: 'cm-collab-selection',\n }),\n });\n\n for (let i = startLine.number + 1; i < endLine.number; i++) {\n const linePos = update.view.state.doc.line(i).from;\n decorations.push({\n from: linePos,\n to: linePos,\n value: Decoration.line({\n attributes: { style: `background-color: ${color}`, class: 'cm-collab-selectionLine' },\n }),\n });\n }\n }\n\n decorations.push({\n from: head,\n to: head,\n value: Decoration.widget({\n side: head - anchor > 0 ? -1 : 1, // The local cursor should be rendered outside the remote selection.\n block: false,\n widget: new RemoteCaretWidget(state.info.displayName ?? 'Anonymous', color),\n }),\n });\n }\n\n this.decorations = Decoration.set(decorations, true);\n }\n}\n\nclass RemoteCaretWidget extends WidgetType {\n constructor(\n private readonly _name: string,\n private readonly _color: string,\n ) {\n super();\n }\n\n override toDOM(): HTMLElement {\n const span = document.createElement('span');\n span.className = 'cm-collab-selectionCaret';\n span.style.backgroundColor = this._color;\n span.style.borderColor = this._color;\n\n const dot = document.createElement('div');\n dot.className = 'cm-collab-selectionCaretDot';\n\n const info = document.createElement('div');\n info.className = 'cm-collab-selectionInfo';\n info.innerText = this._name;\n\n span.appendChild(document.createTextNode('\\u2060'));\n span.appendChild(dot);\n span.appendChild(document.createTextNode('\\u2060'));\n span.appendChild(info);\n span.appendChild(document.createTextNode('\\u2060'));\n\n return span;\n }\n\n override updateDOM() {\n return false;\n }\n\n override eq(widget: this) {\n return widget._color === this._color;\n }\n\n override get estimatedHeight() {\n return -1;\n }\n\n override ignoreEvent() {\n return true;\n }\n}\n\nconst styles = EditorView.baseTheme({\n '.cm-collab-selection': {},\n '.cm-collab-selectionLine': {\n padding: 0,\n margin: '0px 2px 0px 4px',\n },\n '.cm-collab-selectionCaret': {\n position: 'relative',\n borderLeft: '1px solid black',\n borderRight: '1px solid black',\n marginLeft: '-1px',\n marginRight: '-1px',\n boxSizing: 'border-box',\n display: 'inline',\n cursor: 'pointer',\n },\n '.cm-collab-selectionCaretDot': {\n borderRadius: '50%',\n position: 'absolute',\n width: '.5em',\n height: '.5em',\n top: '-.25em',\n left: '-.25em',\n backgroundColor: 'inherit',\n transition: 'transform .3s ease-in-out',\n boxSizing: 'border-box',\n },\n '.cm-collab-selectionCaret:hover > .cm-collab-selectionCaretDot': {\n transform: 'scale(0)',\n transformOrigin: 'center',\n },\n '.cm-collab-selectionInfo': {\n position: 'absolute',\n transform: 'translate(-50%, 0)',\n top: '-20px',\n left: 0,\n fontSize: '.75em',\n fontFamily: 'sans-serif',\n fontStyle: 'normal',\n fontWeight: 'normal',\n lineHeight: 'normal',\n userSelect: 'none',\n color: 'white',\n padding: '2px',\n zIndex: 101,\n transition: 'opacity .3s ease-in-out',\n backgroundColor: 'inherit',\n borderRadius: '2px',\n // These should be separate.\n opacity: 0,\n transitionDelay: '0s',\n whiteSpace: 'nowrap',\n },\n '.cm-collab-selectionCaret:hover > .cm-collab-selectionInfo': {\n opacity: 1,\n transitionDelay: '0s',\n },\n});\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { closeBrackets } from '@codemirror/autocomplete';\nimport { history } from '@codemirror/commands';\nimport { bracketMatching, defaultHighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { type Extension } from '@codemirror/state';\nimport { oneDarkHighlightStyle } from '@codemirror/theme-one-dark';\nimport { drawSelection, EditorView, highlightActiveLine, placeholder } from '@codemirror/view';\n\nimport { type ThemeMode } from '@dxos/react-ui';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { type TextEditorProps } from '../components';\n\nexport type BasicBundleOptions = {\n themeMode?: ThemeMode;\n} & Pick<TextEditorProps, 'placeholder' | 'lineWrapping'>;\n\nexport const createBasicBundle = ({\n themeMode,\n placeholder: _placeholder,\n lineWrapping = true,\n}: BasicBundleOptions = {}): Extension[] =>\n [\n lineWrapping && EditorView.lineWrapping,\n\n // https://codemirror.net/docs/ref/#codemirror.minimalSetup\n bracketMatching(),\n closeBrackets(),\n drawSelection(),\n highlightActiveLine(),\n history(),\n _placeholder && placeholder(_placeholder),\n\n // https://github.com/codemirror/theme-one-dark\n themeMode === 'dark' ? syntaxHighlighting(oneDarkHighlightStyle) : syntaxHighlighting(defaultHighlightStyle),\n ].filter(isNotFalsy);\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(\n private readonly _node: HTMLElement,\n private readonly _options: BlastOptions,\n ) {\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 { invertedEffects } from '@codemirror/commands';\nimport { type Extension, Facet, StateEffect, StateField, type Text, type ChangeDesc } from '@codemirror/state';\nimport { hoverTooltip, keymap, type Command, Decoration, EditorView, type Rect } from '@codemirror/view';\nimport sortBy from 'lodash.sortby';\nimport { useEffect } from 'react';\n\nimport { debounce } from '@dxos/async';\nimport { nonNullable } from '@dxos/util';\n\nimport { Cursor } from './cursor';\nimport { type Comment, type Range } from '../hooks';\nimport { getToken } from '../styles';\nimport { callbackWrapper } from '../util';\n\n// TODO(burdon): Reconcile with theme.\nconst styles = EditorView.baseTheme({\n '&light .cm-comment, &light .cm-comment-current': { mixBlendMode: 'darken' },\n '&dark .cm-comment, &dark .cm-comment-current': { mixBlendMode: 'plus-lighter' },\n '&light .cm-comment': {\n backgroundColor: getToken('extend.colors.yellow.50'),\n },\n '&light .cm-comment-current': {\n backgroundColor: getToken('extend.colors.yellow.100'),\n },\n '&dark .cm-comment': {\n color: getToken('extend.colors.yellow.50'),\n backgroundColor: getToken('extend.colors.yellow.900'),\n },\n '&dark .cm-comment-current': {\n color: getToken('extend.colors.yellow.100'),\n backgroundColor: getToken('extend.colors.yellow.950'),\n },\n});\n\nconst commentMark = Decoration.mark({ class: 'cm-comment' });\nconst commentCurrentMark = Decoration.mark({ class: 'cm-comment-current' });\n\ntype CommentState = {\n comment: Comment;\n range: Range;\n location?: Rect | null;\n};\n\ntype SelectionState = {\n current?: string;\n closest?: string;\n};\n\nexport type CommentsState = {\n comments: CommentState[];\n selection: SelectionState;\n};\n\nexport const focusComment = (view: EditorView, id: string, center = true) => {\n const comment = view.state.field(commentsState).comments.find((range) => range.comment.id === id);\n if (!comment?.comment.cursor) {\n return;\n }\n\n const range = Cursor.getRangeFromCursor(view.state, comment.comment.cursor);\n if (range) {\n view.dispatch({\n selection: { anchor: range.from },\n effects: [\n //\n EditorView.scrollIntoView(range.from, center ? { y: 'center' } : undefined),\n setSelection.of({ current: id }),\n ],\n });\n }\n};\n\nexport const setComments = StateEffect.define<Comment[]>();\n\nexport const setSelection = StateEffect.define<SelectionState>();\n\nconst setCommentState = StateEffect.define<CommentsState>();\n\n/**\n * State field (reducer) that tracks comment ranges.\n * The ranges are tracked as Automerge cursors from which the absolute indexed ranges can be computed.\n */\nconst commentsState = StateField.define<CommentsState>({\n create: () => ({ comments: [], selection: {} }),\n update: (value, tr) => {\n for (const effect of tr.effects) {\n // Update selection.\n if (effect.is(setSelection)) {\n return { ...value, selection: effect.value };\n }\n\n // Update range from store.\n if (effect.is(setComments)) {\n const comments: CommentState[] = effect.value\n .map((comment) => {\n // Skip cut/deleted comments.\n if (!comment.cursor) {\n return undefined;\n }\n\n const range = Cursor.getRangeFromCursor(tr.state, comment.cursor);\n return range && { comment, range };\n })\n .filter(nonNullable);\n\n return { ...value, comments };\n }\n\n // Update entire state.\n if (effect.is(setCommentState)) {\n return effect.value;\n }\n }\n\n return value;\n },\n});\n\n/**\n * Decorate ranges.\n */\nconst commentsDecorations = EditorView.decorations.compute([commentsState], (state) => {\n const {\n selection: { current },\n comments,\n } = state.field(commentsState);\n\n const decorations = sortBy(comments ?? [], (range) => range.range.from)\n ?.flatMap((comment) => {\n const range = comment.range;\n if (!range || range.from === range.to) {\n console.warn('Invalid range:', range);\n return undefined;\n }\n\n if (comment.comment.id === current) {\n return commentCurrentMark.range(range.from, range.to);\n } else {\n return commentMark.range(range.from, range.to);\n }\n })\n .filter(nonNullable);\n\n return Decoration.set(decorations);\n});\n\nexport type CommentsOptions = {\n /**\n * Key shortcut to create a new thread.\n */\n key?: string;\n /**\n * Called to create a new thread and return the thread id.\n */\n onCreate?: (params: { cursor: string; from: number; location?: Rect | null }) => string | undefined;\n /**\n * Selection cut/deleted.\n */\n onDelete?: (params: { id: string }) => void;\n /**\n * Called when a comment is moved.\n */\n onUpdate?: (params: { id: string; cursor: string }) => void;\n /**\n * Called to notify which thread is currently closest to the cursor.\n */\n onSelect?: (state: CommentsState) => void;\n /**\n * Called to render tooltip.\n */\n onHover?: (el: Element, shortcut: string) => void;\n};\n\ntype TrackedComment = { id: string; from: number; to: number };\n\nconst trackPastedComments = (onUpdate: NonNullable<CommentsOptions['onUpdate']>) => {\n // Tracks indexed selections within text.\n let tracked: { text: Text; comments: TrackedComment[] } | null = null;\n\n // Track cut or copy (enables cut-and-paste and copy-delete-paste to restore comment selection).\n const handleTrack = (event: Event, view: EditorView) => {\n const comments = view.state.field(commentsState);\n const { main } = view.state.selection;\n const selectedRanges = comments.comments.filter(\n ({ range }) => range.from >= main.from && range.to <= main.to && range.from < range.to,\n );\n\n if (!selectedRanges.length) {\n tracked = null;\n } else {\n tracked = {\n text: view.state.doc.slice(main.from, main.to),\n comments: selectedRanges.map(({ comment, range }) => ({\n id: comment.id,\n from: range.from - main.from,\n to: range.to - main.from,\n })),\n };\n }\n };\n\n return [\n EditorView.domEventHandlers({\n cut: handleTrack,\n copy: handleTrack,\n }),\n\n // Track deleted comments.\n invertedEffects.of((tr) => {\n const { comments } = tr.startState.field(commentsState);\n const effects: StateEffect<any>[] = [];\n tr.changes.iterChangedRanges((fromA, toA) => {\n for (const {\n comment: { id },\n range: { from, to },\n } of comments) {\n if (from < to && from >= fromA && to <= toA) {\n effects.push(restoreCommentEffect.of({ id, from, to }));\n }\n }\n });\n\n return effects;\n }),\n\n // Handle paste or the undo of comment deletion.\n EditorView.updateListener.of((update) => {\n const restore: TrackedComment[] = [];\n\n for (let i = 0; i < update.transactions.length; i++) {\n const tr = update.transactions[i];\n for (let j = 0; j < restore.length; j++) {\n restore[j] = mapTrackedComment(restore[j], tr.changes);\n }\n for (const effect of tr.effects) {\n if (effect.is(restoreCommentEffect)) {\n restore.push(effect.value);\n }\n }\n }\n\n if (tracked) {\n const paste = update.transactions.find((tr) => tr.isUserEvent('input.paste'));\n if (paste) {\n let found = -1;\n paste.changes.iterChanges((fromA, toA, fromB, toB, text) => {\n if (text.eq(tracked!.text)) {\n for (let i = update.transactions.indexOf(paste!) + 1; i < update.transactions.length; i++) {\n fromB = update.transactions[i].changes.mapPos(fromB);\n }\n\n found = fromB;\n }\n });\n\n if (found > -1) {\n for (const moved of tracked.comments) {\n restore.push({ id: moved.id, from: found + moved.from, to: found + moved.to });\n }\n }\n\n tracked = null;\n }\n }\n\n for (const comment of restore) {\n const { comments } = update.startState.field(commentsState);\n const exists = comments.some((c) => c.comment.id === comment.id && c.range.from < c.range.to);\n if (!exists) {\n const cursor = Cursor.getCursorFromRange(update.state, comment);\n onUpdate({ id: comment.id, cursor });\n }\n }\n }),\n ];\n};\n\nconst mapTrackedComment = (comment: TrackedComment, changes: ChangeDesc) => ({\n id: comment.id,\n from: changes.mapPos(comment.from, 1),\n to: changes.mapPos(comment.to, 1),\n});\n\n// These are attached to undone/redone transactions in the editor for the purpose of restoring comments\n// that were deleted by the original changes.\nconst restoreCommentEffect = StateEffect.define<TrackedComment>({ map: mapTrackedComment });\n\nconst optionsFacet = Facet.define<CommentsOptions, CommentsOptions>({\n combine: (providers) => providers[0],\n});\n\n/**\n * Create comment thread action.\n */\nexport const createComment: Command = (view) => {\n const options = view.state.facet(optionsFacet);\n const { from, to } = view.state.selection.main;\n if (from === to) {\n return false;\n }\n\n // Don't allow selection at end of document.\n if (to === view.state.doc.length) {\n view.dispatch({\n changes: {\n from: to,\n insert: '\\n',\n },\n });\n }\n\n const cursor = Cursor.getCursorFromRange(view.state, { from, to });\n if (cursor) {\n // Create thread via callback.\n const id = options.onCreate?.({ cursor, from, location: view.coordsAtPos(from) });\n if (id) {\n // Update range.\n view.dispatch({\n effects: setSelection.of({ current: id }),\n selection: { anchor: to },\n });\n\n return true;\n }\n }\n\n return false;\n};\n\n/**\n * Comment threads.\n * 1). Updates the EditorModel to store relative selections for a set of comments threads.\n * Since the selections are relative, they do not need to be updated when the document is edited.\n * 2). Implements a StateField to track absolute selections corresponding to the comments (i.e., when the document is edited).\n * 3). Creates decoration marks to apply classes to each selection.\n * 4). Tracks the current cursor position to:\n * a). Update the decoration to show if the cursor is within a current selection.\n * b). Calls a handler to indicate which is the closest selection (e.g., to update the thread sidebar).\n * 5). Optionally, implements a hoverTooltip to show hints when creating a selection range.\n */\nexport const comments = (options: CommentsOptions = {}): Extension => {\n const { key: shortcut = \"meta-'\" } = options;\n\n const handleSelect = debounce((state: CommentsState) => options.onSelect?.(state), 200);\n\n return [\n optionsFacet.of(options),\n commentsState,\n commentsDecorations,\n styles,\n\n //\n // Keymap.\n //\n options.onCreate\n ? keymap.of([\n {\n key: shortcut,\n run: callbackWrapper(createComment),\n },\n ])\n : [],\n\n //\n // Hover tooltip (for key shortcut hints, etc.)\n // TODO(burdon): Factor out to generic hints extension for current selection/line.\n //\n options.onHover\n ? hoverTooltip(\n (view, pos) => {\n const selection = view.state.selection.main;\n if (selection && pos >= selection.from && pos <= selection.to) {\n return {\n pos: selection.from,\n end: selection.to,\n above: true,\n create: () => {\n const el = document.createElement('div');\n options.onHover!(el, shortcut);\n return { dom: el, offset: { x: 0, y: 8 } };\n },\n };\n }\n\n return null;\n },\n {\n // TODO(burdon): Hide on change triggered immediately?\n // hideOnChange: true,\n hoverTime: 1_000,\n },\n )\n : [],\n\n //\n // Track deleted ranges and update ranges for decorations.\n //\n EditorView.updateListener.of(({ view, state, changes }) => {\n let mod = false;\n const { comments, ...value } = state.field(commentsState);\n changes.iterChanges((from, to, from2, to2) => {\n comments.forEach(({ comment, range }) => {\n // Test if range deleted.\n if (from2 === to2) {\n const newRange = Cursor.getRangeFromCursor(view.state, comment.cursor!);\n if (!newRange || newRange.to - newRange.from === 0) {\n options.onDelete?.({ id: comment.id });\n }\n }\n\n // Update range.\n if (from <= range.to) {\n const newRange = Cursor.getRangeFromCursor(view.state, comment.cursor!);\n Object.assign(range, newRange);\n mod = true;\n }\n });\n });\n\n if (mod) {\n view.dispatch({ effects: setCommentState.of({ comments, ...value }) });\n }\n }),\n\n //\n // Track selection/proximity.\n //\n EditorView.updateListener.of(({ view, state }) => {\n let min = Infinity;\n const {\n selection: { current, closest },\n comments,\n } = state.field(commentsState);\n\n const { head } = state.selection.main;\n const selection: SelectionState = {};\n comments.forEach(({ comment, range }) => {\n if (head >= range.from && head <= range.to) {\n selection.current = comment.id;\n selection.closest = undefined;\n }\n\n if (!selection.current) {\n const d = Math.min(Math.abs(head - range.from), Math.abs(head - range.to));\n if (d < min) {\n selection.closest = comment.id;\n min = d;\n }\n }\n });\n\n if (selection.current !== current || selection.closest !== closest) {\n view.dispatch({ effects: setSelection.of(selection) });\n\n // Update callback.\n handleSelect({\n selection,\n comments: comments.map(({ comment, range }) => ({\n comment,\n range,\n location: view.coordsAtPos(range.from),\n })),\n });\n }\n }),\n\n options.onUpdate ? trackPastedComments(options.onUpdate) : [],\n ];\n};\n\n/**\n * Update comments state field.\n */\nexport const useComments = (view: EditorView | null, comments: Comment[] = []) => {\n useEffect(() => {\n if (view) {\n view.dispatch({\n effects: setComments.of(comments),\n });\n }\n }, [view, comments]);\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 { 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',\n 2: 'mbs-4 mbe-2 font-medium text-inherit no-underline text-3xl',\n 3: 'mbs-4 mbe-2 font-medium text-inherit no-underline text-2xl',\n 4: 'mbs-4 mbe-2 font-medium text-inherit no-underline text-xl',\n 5: 'mbs-4 mbe-2 font-medium text-inherit no-underline text-lg',\n 6: 'mbs-4 mbe-2 font-medium text-inherit no-underline',\n};\n\nexport const heading = (level: HeadingLevel) => {\n return headings[level];\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\nexport const blockquote = mx('pl-1 mr-1 border-is-4 border-primary-500/70 dark:border-primary-500/30', light);\n\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 get from 'lodash.get';\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\nexport const getToken = (path: string, defaultValue: any = undefined) => get(tokens, path, defaultValue);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport type { Transaction } from '@codemirror/state';\n\nimport { log } from '@dxos/log';\n\n/**\n * CodeMirror callbacks swallow errors so wrap handlers.\n */\n// TODO(burdon): EditorView.exceptionSink should catch errors.\nexport const callbackWrapper = <T extends Function>(fn: T): T =>\n ((...args: any[]) => {\n try {\n return fn(...args);\n } catch (err) {\n log.catch(err);\n }\n }) as unknown as T;\n\nexport const logChanges = (trs: readonly Transaction[]) => {\n const changes = trs\n .flatMap((tr) => {\n if (tr.changes.empty) {\n return undefined;\n }\n\n const changes: any[] = [];\n tr.changes.iterChanges((fromA, toA, fromB, toB, inserted) =>\n changes.push(JSON.stringify({ fromA, toA, fromB, toB, inserted: inserted.toString() })),\n );\n\n return changes;\n })\n .filter(Boolean);\n\n if (changes.length) {\n console.log('changes', changes);\n }\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\n\nexport type ListenerOptions = {\n onFocus?: (focused: boolean) => void;\n onChange?: (text: string) => void;\n};\n\n/**\n * Event listener.\n */\nexport const listener = ({ onFocus, onChange }: ListenerOptions): Extension => {\n const extensions: Extension[] = [];\n\n onFocus &&\n extensions.push(\n EditorView.focusChangeEffect.of((_, focused) => {\n onFocus(focused);\n return null;\n }),\n );\n\n onChange &&\n extensions.push(\n EditorView.updateListener.of((update) => {\n onChange(update.state.doc.toString());\n }),\n );\n\n return extensions;\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';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { markdownHighlightStyle, markdownTagsExtensions } from './highlight';\nimport { type TextEditorProps } from '../../components';\n\nexport type MarkdownBundleOptions = {\n themeMode?: ThemeMode;\n} & Pick<TextEditorProps, 'placeholder' | 'lineWrapping'>;\n\n/**\n * Markdown bundle.\n * Refs:\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 createMarkdownExtensions = ({\n themeMode,\n placeholder: _placeholder,\n lineWrapping = true,\n}: MarkdownBundleOptions = {}): Extension[] => {\n return [\n lineWrapping && EditorView.lineWrapping,\n EditorState.allowMultipleSelections.of(true),\n EditorState.tabSize.of(2),\n\n // https://github.com/codemirror/basic-setup\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()),\n\n keymap.of([\n // https://codemirror.net/docs/ref/#commands.indentWithTab\n indentWithTab,\n // https://codemirror.net/docs/ref/#autocomplete.closeBracketsKeymap\n ...closeBracketsKeymap,\n // https://codemirror.net/docs/ref/#commands.historyKeymap\n ...historyKeymap,\n // https://codemirror.net/docs/ref/#search.searchKeymap\n ...searchKeymap,\n // https://codemirror.net/docs/ref/#commands.standardKeymap\n ...standardKeymap,\n ]),\n ].filter(isNotFalsy);\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';\n\nimport {\n blockquote,\n bold,\n code,\n codeMark,\n getToken,\n heading,\n inlineUrl,\n italic,\n mark,\n strikethrough,\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 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: mark,\n },\n\n // E.g., code block language (after ```).\n {\n tag: [tags.function(tags.variableName), tags.labelName],\n class: codeMark,\n },\n\n {\n tag: [tags.monospace],\n class: 'font-mono',\n },\n\n // Headings.\n { tag: tags.heading1, class: heading(1) },\n { tag: tags.heading2, class: heading(2) },\n { tag: tags.heading3, class: heading(3) },\n { tag: tags.heading4, class: heading(4) },\n { tag: tags.heading5, class: heading(5) },\n { tag: tags.heading6, class: heading(6) },\n\n // Emphasis.\n { tag: tags.emphasis, class: italic },\n { tag: tags.strong, class: bold },\n { tag: tags.strikethrough, class: strikethrough },\n\n // Naked URLs.\n {\n tag: [markdownTags.URL],\n class: inlineUrl,\n },\n\n // 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 unless changed by an extension.\n {\n tag: [markdownTags.CodeText, markdownTags.InlineCode],\n class: code,\n },\n\n {\n tag: [markdownTags.QuoteMark],\n class: blockquote,\n },\n\n {\n tag: [markdownTags.TableCell],\n class: 'font-mono',\n },\n ],\n {\n scope: markdownLanguage,\n all: { fontFamily: getToken('fontFamily.body', []).join(',') },\n },\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport { RangeSetBuilder } from '@codemirror/state';\nimport {\n ViewPlugin,\n type DecorationSet,\n EditorView,\n type ViewUpdate,\n Decoration,\n type BlockInfo,\n WidgetType,\n} from '@codemirror/view';\n\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { getToken } from '../../styles';\n\n// TODO(burdon): Reconcile with theme.\nconst styles = EditorView.baseTheme({\n '& .cm-code': {\n fontFamily: getToken('fontFamily.mono', []).join(','),\n },\n '& .cm-codeblock': {\n width: '100%',\n paddingInline: '1rem !important',\n position: 'relative',\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n inset: 0,\n },\n },\n '&light .cm-codeblock': {\n '&::after': {\n background: getToken('extend.semanticColors.input.light'),\n mixBlendMode: 'darken',\n },\n },\n '&dark .cm-codeblock': {\n '&::after': {\n background: getToken('extend.semanticColors.input.dark'),\n mixBlendMode: 'lighten',\n },\n },\n '& .cm-codeblock-first': {\n display: 'inline-block',\n '&::after': {\n borderTopLeftRadius: '.5rem',\n borderTopRightRadius: '.5rem',\n },\n },\n '& .cm-codeblock-last': {\n display: 'inline-block',\n '&::after': {\n borderBottomLeftRadius: '.5rem',\n borderBottomRightRadius: '.5rem',\n },\n },\n});\n\n// TODO(burdon): Start from EditorView.lineBlockAt(pos).\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\n// TODO(burdon): Add copy to clipboard widget.\nclass LineWidget extends WidgetType {\n constructor(private readonly _className: string) {\n super();\n }\n\n override toDOM() {\n const el = document.createElement('span');\n el.innerHTML = '&nbsp;';\n el.className = mx('cm-code cm-codeblock', this._className);\n return el;\n }\n}\n\nconst top = new LineWidget('cm-codeblock-first');\nconst bottom = new LineWidget('cm-codeblock-last');\n\n// TODO(burdon): Selection isn't visible unless multiline (e.g., can't highlight word).\n\nconst buildDecorations = (view: EditorView): DecorationSet => {\n const builder = new RangeSetBuilder<Decoration>();\n const { state } = view;\n const blocks = view.viewportLineBlocks;\n const cursor = state.selection.main.head;\n\n for (const { from, to } of view.visibleRanges) {\n syntaxTree(state).iterate({\n enter: (node) => {\n if (node.name === 'FencedCode') {\n // FencedCode > CodeMark > [CodeInfo] > CodeText > CodeMark\n const edit = !view.state.readOnly && cursor >= node.from && cursor <= node.to;\n const range = getLineRange(blocks, node.from, node.to);\n for (let i = range[0]; i <= range[1]; i++) {\n const block = blocks[i];\n if (!edit && (i === range[0] || i === range[1])) {\n builder.add(block.from, block.to, Decoration.replace({ widget: i === range[0] ? top : bottom }));\n } else {\n builder.add(\n block.from,\n block.from,\n Decoration.line({\n class: mx(\n 'cm-code cm-codeblock',\n i === range[0] && 'cm-codeblock-first',\n i === range[1] && 'cm-codeblock-last',\n ),\n }),\n );\n }\n }\n }\n },\n from,\n to,\n });\n }\n\n return builder.finish();\n};\n\nexport const code = () => {\n return [\n ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n constructor(view: EditorView) {\n this.decorations = buildDecorations(view);\n }\n\n update(update: ViewUpdate) {\n this.decorations = buildDecorations(update.view);\n }\n },\n {\n decorations: (value) => value.decorations,\n },\n ),\n styles,\n ];\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { snippet } from '@codemirror/autocomplete';\nimport { syntaxTree } from '@codemirror/language';\nimport {\n type Extension,\n type StateCommand,\n RangeSetBuilder,\n type EditorState,\n type ChangeSpec,\n type Text,\n EditorSelection,\n type Line,\n} from '@codemirror/state';\nimport { Decoration, type DecorationSet, EditorView, keymap, ViewPlugin, type ViewUpdate } from '@codemirror/view';\nimport { type SyntaxNodeRef, type SyntaxNode } from '@lezer/common';\nimport { useState, useMemo } from 'react';\n\n// Markdown refs:\n// https://github.github.com/gfm\n// https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax\n\n// Describes the formatting situation of the selection in an editor state.\n// For inline styles `strong`, `emphasis`, `strikethrough`, and `code`,\n// the field only holds true when *all* selected text has the style,\n// or when the selection is a cursor inside such a style.\nexport type Formatting = {\n blankLine: boolean;\n // The type of the block at the selection.\n // If multiple different block types are selected, this will hold null.\n blockType:\n | 'codeblock'\n | 'heading1'\n | 'heading2'\n | 'heading3'\n | 'heading4'\n | 'heading5'\n | 'heading6'\n | 'paragraph'\n | 'tablecell'\n | null;\n // Whether all selected text is wrapped in a blockquote.\n blockQuote: boolean;\n // Whether the selected text is strong.\n strong: boolean;\n // Whether the selected text is emphasized.\n emphasis: boolean;\n // Whether the selected text is stricken through.\n strikethrough: boolean;\n // Whether the selected text is inline code.\n code: boolean;\n // Whether there are links in the selected text.\n link: boolean;\n // If all selected blocks have the same (innermost) list style, that is indicated here.\n listStyle: null | 'ordered' | 'bullet' | 'task';\n};\n\nexport const compareFormatting = (a: Formatting, b: Formatting) =>\n a.blockType === b.blockType &&\n a.strong === b.strong &&\n a.emphasis === b.emphasis &&\n a.strikethrough === b.strikethrough &&\n a.code === b.code &&\n a.link === b.link &&\n a.listStyle === b.listStyle &&\n a.blockQuote === b.blockQuote;\n\nexport enum Inline {\n Strong = 0,\n Emphasis = 1,\n Strikethrough = 2,\n Code = 3,\n}\n\nexport enum List {\n Ordered,\n Bullet,\n Task,\n}\n\n//\n// Headings\n//\n\nexport const setHeading =\n (level: number): StateCommand =>\n ({ state, dispatch }) => {\n const {\n selection: { ranges },\n doc,\n } = state;\n const changes: ChangeSpec[] = [];\n let prevBlock = -1;\n for (const range of ranges) {\n syntaxTree(state).iterate({\n from: range.from,\n to: range.to,\n enter: (node) => {\n if (!Object.hasOwn(Textblocks, node.name) || prevBlock === node.from) {\n return;\n }\n prevBlock = node.from;\n const blockType = Textblocks[node.name];\n const isHeading = /heading(\\d)/.exec(blockType);\n const curLevel = isHeading ? +isHeading[1] : node.name === 'Paragraph' ? 0 : -1;\n if (curLevel < 0 || curLevel === level) {\n return;\n }\n if (curLevel === 0) {\n changes.push({ from: node.from, insert: '#'.repeat(level) + ' ' });\n } else if (node.name === 'SetextHeading1' || node.name === 'SetextHeading2') {\n // Change Setext heading to regular one.\n const nextLine = doc.lineAt(node.to);\n if (level) {\n changes.push({ from: node.from, insert: '#'.repeat(level) + ' ' });\n }\n changes.push({ from: nextLine.from - 1, to: nextLine.to });\n } else {\n // Adjust the level of an ATX heading.\n if (level === 0) {\n changes.push({ from: node.from, to: Math.min(node.to, node.from + curLevel + 1) });\n } else if (level < curLevel) {\n changes.push({ from: node.from, to: node.from + (curLevel - level) });\n } else {\n changes.push({ from: node.from, insert: '#'.repeat(level - curLevel) });\n }\n }\n },\n });\n }\n\n if (!changes.length) {\n return false;\n }\n\n dispatch(state.update({ changes, userEvent: 'format.setHeading', scrollIntoView: true }));\n return true;\n };\n\n//\n// Styles\n//\n\nexport const setStyle =\n (type: Inline, enable: boolean): StateCommand =>\n ({ state, dispatch }) => {\n const marker = inlineMarkerText(type);\n const changes = state.changeByRange((range) => {\n // Special case for markers directly around the cursor, which will often not be parsed as valid styling\n if (!enable && range.empty) {\n const after = state.doc.sliceString(range.head, range.head + 6);\n const found = after.indexOf(marker);\n if (found >= 0 && /^[*~`]*$/.test(after.slice(0, found))) {\n const before = state.doc.sliceString(range.head - 6, range.head);\n if (\n before.slice(before.length - found - marker.length, before.length - found) === marker &&\n [...before.slice(before.length - found)].reverse().join('') === after.slice(0, found)\n ) {\n return {\n changes: [\n { from: range.head - marker.length - found, to: range.head - found },\n { from: range.head + found, to: range.head + found + marker.length },\n ],\n range: EditorSelection.cursor(range.from - marker.length),\n };\n }\n }\n }\n\n const changes: ChangeSpec[] = [];\n // Used to add insertions that should happen *after* any other insertions at the same position.\n const changesAtEnd: ChangeSpec[] = [];\n let blockStart = -1;\n let blockEnd = -1;\n let startCovered: boolean | 'adjacent' = false;\n let endCovered: boolean | 'adjacent' = false;\n let { from, to } = range;\n // Iterate the selected range. For each textblock, determine a\n // start and end position, the overlap of the selected range and\n // the block's extent, that should be styled/unstyled.\n syntaxTree(state).iterate({\n from,\n to,\n enter: (node) => {\n const { name } = node;\n if (Object.hasOwn(Textblocks, name) && Textblocks[name] !== 'codeblock') {\n // Set up for this textblock\n blockStart = blockContentStart(node);\n blockEnd = blockContentEnd(node, state.doc);\n startCovered = endCovered = false;\n } else if (name === 'Link' || (name === 'Image' && enable)) {\n // If the range partially overlaps a link or image, expand it to cover it.\n if (from < node.from && to > node.from && to <= node.to) {\n to = node.to;\n } else if (to > node.to && from >= node.from && from < node.to) {\n from = node.from;\n }\n } else if (IgnoreInline.has(name) && enable) {\n // Move endpoints out of markers.\n if (node.from < from && node.to > from) {\n if (to === from) {\n to = node.to;\n }\n from = node.to;\n }\n if (node.from < to && node.to > to) {\n to = node.from;\n }\n } else if (Object.hasOwn(InlineMarker, name)) {\n // This is an inline marker node.\n const markType = InlineMarker[name];\n const size = inlineMarkerText(markType).length;\n const openEnd = node.from + size;\n const closeStart = node.to - size;\n // Determine whether the start/end of the range is covered\n // by this.\n if (markType === type) {\n if (openEnd <= from && closeStart >= from) {\n startCovered = openEnd === from ? 'adjacent' : true;\n }\n if (openEnd <= to && closeStart >= to) {\n endCovered = closeStart === to ? 'adjacent' : true;\n }\n }\n // Marks of the same type in range, or any mark if we're\n // adding code style, need to be removed.\n if (markType === type || (type === Inline.Code && enable)) {\n if (node.from >= from && openEnd <= to) {\n changes.push({ from: node.from, to: openEnd });\n if (markType !== type && closeStart >= to) {\n // End marker outside, move start\n changesAtEnd.push({\n from: skipSpaces(Math.min(to, blockEnd), state.doc, 1, blockEnd),\n insert: inlineMarkerText(markType),\n });\n }\n }\n if (closeStart >= from && node.to <= to) {\n changes.push({ from: closeStart, to: node.to });\n if (markType !== type && openEnd <= from) {\n // Start marker outside, move end\n changes.push({\n from: skipSpaces(Math.max(from, blockStart), state.doc, -1, blockStart),\n insert: inlineMarkerText(markType),\n });\n }\n }\n }\n }\n },\n leave: (node) => {\n if (Object.hasOwn(Textblocks, node.name) && Textblocks[node.name] !== 'codeblock') {\n // Finish opening/closing the marks for this textblock\n const rangeStart = Math.max(from, blockStart);\n const rangeEnd = Math.min(to, blockEnd);\n if (enable) {\n if (!startCovered) {\n changes.push({ from: rangeStart, insert: marker });\n }\n if (!endCovered) {\n changes.push({ from: rangeEnd, insert: marker });\n }\n } else {\n if (startCovered === 'adjacent') {\n changes.push({ from: from - marker.length, to: from });\n } else if (startCovered) {\n changes.push({ from: skipSpaces(rangeStart, state.doc, -1, blockStart), insert: marker });\n }\n if (endCovered === 'adjacent') {\n changes.push({ from: to, to: to + marker.length });\n } else if (endCovered) {\n changes.push({ from: skipSpaces(rangeEnd, state.doc, 1, blockEnd), insert: marker });\n }\n }\n }\n },\n });\n const changeSet = state.changes(changes.concat(changesAtEnd));\n return {\n changes: changeSet,\n range:\n range.empty && !changeSet.empty\n ? EditorSelection.cursor(range.head + marker.length)\n : EditorSelection.range(changeSet.mapPos(range.from, 1), changeSet.mapPos(range.to, -1)),\n };\n });\n\n dispatch(\n state.update(changes, { userEvent: enable ? 'format.style.add' : 'format.style.remove', scrollIntoView: true }),\n );\n return true;\n };\n\nexport const addStyle = (style: Inline): StateCommand => setStyle(style, true);\n\nexport const removeStyle = (style: Inline): StateCommand => setStyle(style, false);\n\nexport const toggleStyle =\n (style: Inline): StateCommand =>\n (arg) => {\n const form = getFormatting(arg.state);\n return setStyle(\n style,\n style === Inline.Strong\n ? !form.strong\n : style === Inline.Emphasis\n ? !form.emphasis\n : style === Inline.Strikethrough\n ? !form.strikethrough\n : !form.code,\n )(arg);\n };\n\nexport const toggleStrong = toggleStyle(Inline.Strong);\nexport const toggleEmphasis = toggleStyle(Inline.Emphasis);\nexport const toggleStrikethrough = toggleStyle(Inline.Strikethrough);\nexport const toggleInlineCode = toggleStyle(Inline.Code);\n\nconst inlineMarkerText = (type: Inline) =>\n type === Inline.Strong ? '**' : type === Inline.Strikethrough ? '~~' : type === Inline.Emphasis ? '*' : '`';\n\n//\n// Utils\n//\n\nconst blockContentStart = (node: SyntaxNodeRef) => {\n const atx = /^ATXHeading(\\d)/.exec(node.name);\n if (atx) {\n return Math.min(node.to, node.from + +atx[1] + 1);\n }\n return node.from;\n};\n\nconst blockContentEnd = (node: SyntaxNodeRef, doc: Text) => {\n const setext = /^SetextHeading(\\d)/.exec(node.name);\n const lastLine = doc.lineAt(node.to);\n if (setext || /^[\\s>]*$/.exec(lastLine.text)) {\n return lastLine.from - 1;\n }\n return node.to;\n};\n\nconst skipSpaces = (pos: number, doc: Text, dir: -1 | 1, limit?: number) => {\n const line = doc.lineAt(pos);\n while (pos !== limit && line.text[pos - line.from - (dir < 0 ? 1 : 0)] === ' ') {\n pos += dir;\n }\n return pos;\n};\n\n// TODO(burdon): Define and trigger snippets for codeblock, table, etc.\nconst snippets = {\n codeblock: snippet(\n [\n //\n '```#{}',\n '#{}',\n '```',\n ].join('\\n'),\n ),\n table: snippet(\n [\n //\n '| #{col1} | #{col2} |',\n '| ---- | ---- |',\n '| #{val1} | #{val2} |',\n '| #{val3} | #{val4} |',\n '',\n ].join('\\n'),\n ),\n};\n\n//\n// Table\n//\n\nexport const insertTable = (view: EditorView) => {\n const {\n selection: { main },\n doc,\n } = view.state;\n const { number } = doc.lineAt(main.anchor);\n const { from } = doc.line(number);\n\n snippets.table(view, null, from, from);\n};\n\n//\n// Links\n//\n\n// For each link in the given range, remove the link markup\nconst removeLinkInner = (from: number, to: number, changes: ChangeSpec[], state: EditorState) => {\n syntaxTree(state).iterate({\n from,\n to,\n enter: (node) => {\n if (node.name === 'Link' && node.from < to && node.to > from) {\n node.node.cursor().iterate((node) => {\n const { name } = node;\n if (name === 'LinkMark' || name === 'LinkLabel') {\n changes.push({ from: node.from, to: node.to });\n } else if (name === 'LinkTitle' || name === 'URL') {\n changes.push({ from: skipSpaces(node.from, state.doc, -1), to: skipSpaces(node.to, state.doc, 1) });\n }\n });\n return false;\n }\n },\n });\n};\n\n// Remove all links touching the selection\nexport const removeLink: StateCommand = ({ state, dispatch }) => {\n const changes: ChangeSpec[] = [];\n for (const { from, to } of state.selection.ranges) {\n removeLinkInner(from, to, changes, state);\n }\n if (!changes) {\n return false;\n }\n dispatch(state.update({ changes, userEvent: 'format.link.remove', scrollIntoView: true }));\n return true;\n};\n\n// Add link markup around the selection\nexport const addLink: StateCommand = ({ state, dispatch }) => {\n const changes = state.changeByRange((range) => {\n let { from, to } = range;\n const cutStyles: SyntaxNode[] = [];\n let okay: boolean | null = null;\n // Check whether this range is in a position where a link makes sense\n syntaxTree(state).iterate({\n from,\n to,\n enter: (node) => {\n if (Object.hasOwn(Textblocks, node.name)) {\n // If the selection spans multiple textblocks or is in a\n // code block, abort\n okay =\n Textblocks[node.name] !== 'codeblock' &&\n from >= blockContentStart(node) &&\n to <= blockContentEnd(node, state.doc);\n } else if (Object.hasOwn(InlineMarker, node.name)) {\n // Look for inline styles that partially overlap the range.\n // Expand the range over them if they start directly\n // outside, otherwise mark them for later\n const sNode = node.node;\n if (node.from < from && node.to <= to) {\n if (sNode.firstChild!.to === from) {\n from = node.from;\n } else {\n cutStyles.push(sNode);\n }\n } else if (node.from >= from && node.to > to) {\n if (sNode.lastChild!.from === to) {\n to = node.to;\n } else {\n cutStyles.push(sNode);\n }\n }\n }\n },\n });\n\n if (okay === null) {\n // No textblock found around selection. Check if the rest of the line is empty.\n const line = state.doc.lineAt(from);\n okay = to <= line.to && !/\\S/.test(line.text.slice(from - line.from));\n }\n if (!okay) {\n return { range };\n }\n\n const changes: ChangeSpec[] = [];\n // Some changes must be moved to end of change array so that they are applied in the right order\n const changesAfter: ChangeSpec[] = [];\n // Clear existing links.\n removeLinkInner(from, to, changesAfter, state);\n let cursorOffset = 1;\n // Close and reopen inline styles that partially overlap the range.\n for (const style of cutStyles) {\n const type = InlineMarker[style.name];\n const mark = inlineMarkerText(type);\n if (style.from < from) {\n // Extends before.\n changes.push({ from: skipSpaces(from, state.doc, -1), insert: mark });\n changesAfter.push({ from: skipSpaces(from, state.doc, 1, to), insert: mark });\n } else {\n changes.push({ from: skipSpaces(to, state.doc, -1, from), insert: mark });\n const after = skipSpaces(to, state.doc, 1);\n if (after === to) {\n cursorOffset += mark.length;\n }\n changesAfter.push({ from: after, insert: mark });\n }\n }\n // Add the link markup.\n changes.push({ from, insert: '[' }, { from: to, insert: ']()' });\n const changeSet = state.changes(changes.concat(changesAfter));\n // Put the cursor between the parenthesis.\n return { changes: changeSet, range: EditorSelection.cursor(changeSet.mapPos(to, 1) - cursorOffset) };\n });\n if (changes.changes.empty) {\n return false;\n }\n\n dispatch(state.update(changes, { userEvent: 'format.link.add', scrollIntoView: true }));\n return true;\n};\n\n//\n// Lists\n//\n\nexport const addList =\n (type: List): StateCommand =>\n ({ state, dispatch }) => {\n let lastBlock = -1;\n let counter = 1;\n let first = true;\n let parentColumn: number | null = null;\n const blocks: { node: SyntaxNode; counter: number; parentColumn: number | null }[] = [];\n\n // Scan the syntax tree to locate textblocks that can be wrapped.\n for (const { from, to } of state.selection.ranges) {\n syntaxTree(state).iterate({\n from,\n to,\n enter: (node) => {\n if ((Object.hasOwn(Textblocks, node.name) && node.name !== 'TableCell') || node.name === 'Table') {\n if (first) {\n // For the first block, see if it follows a list,\n // so we can take indentation and numbering information from that one.\n let before = node.node.prevSibling;\n while (before && /Mark$/.test(before.name)) {\n before = before.prevSibling;\n }\n if (before?.name === (type === List.Ordered ? 'OrderedList' : 'BulletList')) {\n const item = before.lastChild!;\n const itemLine = state.doc.lineAt(item.from);\n const itemText = itemLine.text.slice(item.from - itemLine.from);\n parentColumn = item.from - itemLine.from + /^\\s*/.exec(itemText)![0].length;\n if (type === List.Ordered) {\n const mark = /^\\s*(\\d+)[.)]/.exec(itemText);\n if (mark) {\n parentColumn += mark[1].length;\n counter = +mark[1] + 1;\n }\n }\n }\n first = false;\n }\n if (node.from === lastBlock) {\n return;\n }\n lastBlock = node.from;\n blocks.push({ node: node.node, counter, parentColumn });\n counter++;\n return false;\n }\n },\n leave: (node) => {\n // When exiting block-level markup, reset the indentation and counter.\n if (node.name === 'BulletList' || node.name === 'OrderedList' || node.name === 'Blockquote') {\n counter = 1;\n parentColumn = null;\n }\n },\n });\n }\n\n if (!blocks.length) {\n // Insert a new list item if the selection is empty.\n const { from, to } = state.doc.lineAt(state.selection.main.anchor);\n if (from === to) {\n dispatch(\n state.update({\n changes: [\n {\n from,\n insert: type === List.Bullet ? '- ' : type === List.Ordered ? '1. ' : '- [ ] ',\n },\n ],\n userEvent: 'format.list.add',\n scrollIntoView: true,\n }),\n );\n return true;\n }\n\n return false;\n }\n\n const changes: ChangeSpec[] = [];\n for (let i = 0; i < blocks.length; i++) {\n const { node, counter, parentColumn } = blocks[i];\n const nodeFrom = node.name === 'CodeBlock' ? node.from - 4 : node.from;\n // Compute a padding based on whether we are after whitespace.\n let padding = nodeFrom > 0 && !/\\s/.test(state.doc.sliceString(nodeFrom - 1, nodeFrom)) ? 1 : 0;\n // On ordered lists, the number is counted in the padding.\n if (type === List.Ordered) {\n padding += String(counter).length;\n }\n let line = state.doc.lineAt(nodeFrom);\n const column = nodeFrom - line.from;\n // Align to the list above if possible.\n if (parentColumn !== null && parentColumn > column) {\n padding = Math.max(padding, parentColumn - column);\n }\n\n let mark;\n if (type === List.Ordered) {\n // Scan ahead to find the max number we're adding, adjust padding for that.\n let max = counter;\n for (let j = i + 1; j < blocks.length; j++) {\n if (blocks[j].counter !== max + 1) {\n break;\n }\n max++;\n }\n const num = String(counter);\n padding = Math.max(String(max).length, padding);\n mark = ' '.repeat(Math.max(0, padding - num.length)) + num + '. ';\n } else {\n mark = ' '.repeat(padding) + '- ' + (type === List.Task ? '[ ] ' : '');\n }\n\n changes.push({ from: nodeFrom, insert: mark });\n // Add indentation for the other lines in this block\n while (line.to < node.to) {\n line = state.doc.lineAt(line.to + 1);\n const open = /^[\\s>]*/.exec(line.text)![0].length;\n changes.push({ from: line.from + Math.min(open, column), insert: ' '.repeat(mark.length) });\n }\n }\n\n // If we are inserting an ordered list and there is another one right after the last selected block,\n // renumber that one to match the new order.\n if (type === List.Ordered) {\n const last = blocks[blocks.length - 1];\n let next = last.node.nextSibling;\n while (next && /Mark$/.test(next.name)) {\n next = next.nextSibling;\n }\n if (next?.name === 'OrderedList') {\n renumberListItems(next.firstChild, last.counter + 1, changes, state.doc);\n }\n }\n\n dispatch(state.update({ changes, userEvent: 'format.list.add', scrollIntoView: true }));\n return true;\n };\n\nexport const removeList =\n (type: List): StateCommand =>\n ({ state, dispatch }) => {\n let lastBlock = -1;\n const changes: ChangeSpec[] = [];\n const stack: string[] = [];\n const targetNodeType = type === List.Ordered ? 'OrderedList' : type === List.Bullet ? 'BulletList' : 'TaskList';\n // Scan the syntax tree to locate list items that can be unwrapped.\n for (const { from, to } of state.selection.ranges) {\n syntaxTree(state).iterate({\n from,\n to,\n enter: (node) => {\n const { name } = node;\n if (name === 'BulletList' || name === 'OrderedList' || name === 'Blockquote') {\n // Maintain block context.\n stack.push(name);\n } else if (name === 'Task' && stack[stack.length - 1] === 'BulletList') {\n stack[stack.length - 1] = 'TaskList';\n }\n },\n leave: (node) => {\n const { name } = node;\n if (name === 'BulletList' || name === 'OrderedList' || name === 'Blockquote') {\n stack.pop();\n } else if (name === 'ListItem' && stack[stack.length - 1] === targetNodeType && node.from !== lastBlock) {\n lastBlock = node.from;\n let line = state.doc.lineAt(node.from);\n const mark = /^\\s*(\\d+[.)] |[-*+] (\\[[ x]\\] )?)/.exec(line.text.slice(node.from - line.from));\n if (!mark) {\n return false;\n }\n const column = node.from - line.from;\n // Delete the marker on the first line.\n changes.push({ from: node.from, to: node.from + mark[0].length });\n // and indentation on subsequent lines.\n while (line.to < node.to) {\n line = state.doc.lineAt(line.to + 1);\n const open = /^[\\s>]*/.exec(line.text)![0].length;\n if (open > column) {\n changes.push({ from: line.from + column, to: line.from + Math.min(column + mark[0].length, open) });\n }\n }\n if (node.to >= to) {\n renumberListItems(node.node.nextSibling, 1, changes, state.doc);\n }\n return false;\n }\n },\n });\n }\n if (!changes.length) {\n return false;\n }\n\n dispatch(state.update({ changes, userEvent: 'format.list.remove', scrollIntoView: true }));\n return true;\n };\n\nexport const toggleList =\n (type: List): StateCommand =>\n (target) => {\n const formatting = getFormatting(target.state);\n const active =\n formatting.listStyle === (type === List.Bullet ? 'bullet' : type === List.Ordered ? 'ordered' : 'task');\n return (active ? removeList(type) : addList(type))(target);\n };\n\nconst renumberListItems = (item: SyntaxNode | null, counter: number, changes: ChangeSpec[], doc: Text) => {\n for (; item; item = item.nextSibling) {\n if (item.name === 'ListItem') {\n const number = /(\\s*)(\\d+)[.)]/.exec(doc.sliceString(item.from, item.from + 10));\n if (!number || +number[2] === counter) {\n break;\n }\n const size = number[1].length + number[2].length;\n const newNum = String(counter);\n changes.push({ from: item.from + Math.max(0, size - newNum.length), to: item.from + size, insert: newNum });\n counter++;\n }\n }\n};\n\n//\n// Block quotes\n//\n\nexport const setBlockquote =\n (enable: boolean): StateCommand =>\n ({ state, dispatch }) => {\n const lines: Line[] = [];\n let lastBlock = -1;\n for (const { from, to } of state.selection.ranges) {\n syntaxTree(state).iterate({\n from,\n to,\n enter: (node) => {\n if (Object.hasOwn(Textblocks, node.name) || node.name === 'Table') {\n if (node.from === lastBlock) {\n return false;\n }\n lastBlock = node.from;\n let line = state.doc.lineAt(node.from);\n if (line.number > 1) {\n const prevLine = state.doc.line(line.number - 1);\n if (/^[>\\s]*$/.test(prevLine.text)) {\n if (!enable || (lines.length && lines[lines.length - 1].number === prevLine.number - 1)) {\n lines.push(prevLine);\n }\n }\n }\n for (;;) {\n lines.push(line);\n if (line.to >= node.to) {\n break;\n }\n line = state.doc.line(line.number + 1);\n }\n if (!enable && line.number < state.doc.lines) {\n const nextLine = state.doc.line(line.number + 1);\n if (/^[>\\s]*$/.test(nextLine.text)) {\n lines.push(nextLine);\n }\n }\n return false;\n }\n },\n });\n }\n\n const changes: ChangeSpec[] = [];\n for (const line of lines) {\n if (enable) {\n changes.push({ from: line.from, insert: /\\S/.test(line.text) ? '> ' : '>' });\n } else {\n const quote = /((?:[\\s>\\-+*]|\\d+[.)])*?)> ?/.exec(line.text);\n if (quote) {\n changes.push({ from: line.from + quote[1].length, to: line.from + quote[0].length });\n }\n }\n }\n if (!changes.length) {\n return false;\n }\n\n dispatch(\n state.update({\n changes,\n userEvent: enable ? 'format.blockquote.add' : 'format.blockquote.remove',\n scrollIntoView: true,\n }),\n );\n return true;\n };\n\nexport const addBlockquote = setBlockquote(true);\n\nexport const removeBlockquote = setBlockquote(false);\n\nexport const toggleBlockquote: StateCommand = (target) => {\n return (getFormatting(target.state).blockQuote ? removeBlockquote : addBlockquote)(target);\n};\n\n//\n// Code block\n//\n\nexport const addCodeblock: StateCommand = (target) => {\n const { state, dispatch } = target;\n const { selection } = state;\n // If on a blank line, use the code block snippet.\n if (selection.ranges.length === 1 && selection.main.empty) {\n const { head } = selection.main;\n const line = state.doc.lineAt(head);\n if (!/\\S/.test(line.text) && head === line.from) {\n snippets.codeblock(target, null, line.from, line.to);\n return true;\n }\n }\n\n // Otherwise, wrap any selected blocks in triple backticks.\n const ranges: { from: number; to: number }[] = [];\n for (const { from, to } of selection.ranges) {\n let blockFrom = from;\n let blockTo = to;\n syntaxTree(state).iterate({\n from,\n to,\n enter: (node) => {\n if (Object.hasOwn(Textblocks, node.name)) {\n if (from >= node.from && to <= node.to) {\n // Selection in a single block.\n blockFrom = node.from;\n blockTo = node.to;\n } else {\n // Expand to cover whole lines.\n blockFrom = Math.min(blockFrom, state.doc.lineAt(node.from).from);\n blockTo = Math.max(blockTo, state.doc.lineAt(node.to).to);\n }\n }\n },\n });\n if (ranges.length && ranges[ranges.length - 1].to >= blockFrom - 1) {\n ranges[ranges.length - 1].to = blockTo;\n } else {\n ranges.push({ from: blockFrom, to: blockTo });\n }\n }\n if (!ranges.length) {\n return false;\n }\n\n const changes: ChangeSpec[] = ranges.map(({ from, to }) => {\n const column = from - state.doc.lineAt(from).from;\n return [\n { from, insert: '```\\n' + ' '.repeat(column) },\n { from: to, insert: '\\n' + ' '.repeat(column) + '```' },\n ];\n });\n dispatch(state.update({ changes, userEvent: 'format.codeblock.add', scrollIntoView: true }));\n return true;\n};\n\nexport const removeCodeblock: StateCommand = ({ state, dispatch }) => {\n const changes: ChangeSpec[] = [];\n let lastBlock = -1;\n // Find all code blocks, remove their markup\n for (const { from, to } of state.selection.ranges) {\n syntaxTree(state).iterate({\n from,\n to,\n enter: (node) => {\n if (Textblocks[node.name] === 'codeblock' && lastBlock !== node.from) {\n lastBlock = node.from;\n const firstLine = state.doc.lineAt(node.from);\n if (node.name === 'FencedCode') {\n changes.push({ from: node.from, to: firstLine.to + 1 + node.from - firstLine.from });\n const lastLine = state.doc.lineAt(node.to);\n if (/^([\\s>]|[-*+] |\\d+[).])*`+$/.test(lastLine.text)) {\n changes.push({\n from: lastLine.from - (lastLine.number === firstLine.number + 1 ? 0 : 1),\n to: lastLine.to,\n });\n }\n } else {\n // Indented code block\n const column = node.from - firstLine.from;\n for (let line = firstLine; ; line = state.doc.line(line.number + 1)) {\n changes.push({ from: line.from + column - 4, to: line.from + column });\n if (line.to >= node.to) {\n break;\n }\n }\n }\n }\n },\n });\n }\n if (!changes.length) {\n return false;\n }\n\n dispatch(state.update({ changes, userEvent: 'format.codeblock.remove', scrollIntoView: true }));\n return true;\n};\n\nexport const toggleCodeblock: StateCommand = (target) => {\n return (getFormatting(target.state).blockType === 'codeblock' ? removeCodeblock : addCodeblock)(target);\n};\n\n//\n// Formatting extension.\n//\n\nexport type FormattingOptions = {};\n\nexport const formatting = (options: FormattingOptions = {}): Extension => {\n return [\n keymap.of([\n {\n key: 'meta-b',\n run: toggleStrong,\n },\n ]),\n styling(),\n ];\n};\n\nconst styling = (): Extension => {\n const buildDecorations = (view: EditorView): DecorationSet => {\n const builder = new RangeSetBuilder<Decoration>();\n const { state } = view;\n const cursor = state.selection.main.head;\n\n // TODO(burdon): Bug if '***foo***' (since StrongEmphasis is nested inside EmphasisMark).\n // Ranges must be added sorted by `from` position and `startSide`.\n const replace = (node: SyntaxNodeRef, marks: SyntaxNode[]) => {\n if (cursor <= node.from || cursor >= node.to) {\n for (const mark of marks) {\n builder.add(mark.from, mark.to, Decoration.replace({}));\n }\n }\n };\n\n for (const { from, to } of view.visibleRanges) {\n syntaxTree(state).iterate({\n enter: (node) => {\n switch (node.name) {\n case 'Emphasis':\n case 'StrongEmphasis': {\n const marks = node.node.getChildren('EmphasisMark');\n replace(node, marks);\n break;\n }\n\n case 'Strikethrough': {\n const marks = node.node.getChildren('StrikethroughMark');\n replace(node, marks);\n break;\n }\n }\n },\n from,\n to,\n });\n }\n\n return builder.finish();\n };\n\n return [\n ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n constructor(view: EditorView) {\n this.decorations = buildDecorations(view);\n }\n\n update(update: ViewUpdate) {\n this.decorations = buildDecorations(update.view);\n }\n },\n {\n decorations: (value) => value.decorations,\n },\n ),\n ];\n};\n\nconst InlineMarker: { [name: string]: number } = {\n Emphasis: Inline.Emphasis,\n StrongEmphasis: Inline.Strong,\n InlineCode: Inline.Code,\n Strikethrough: Inline.Strikethrough,\n};\n\nconst IgnoreInline = new Set([\n 'Autolink',\n 'CodeMark',\n 'CodeText',\n 'Comment',\n 'EmphasisMark',\n 'Hardbreak',\n 'HeaderMark',\n 'HTMLTag',\n 'LinkMark',\n 'ListMark',\n 'ProcessingInstruction',\n 'QuoteMark',\n 'StrikethroughMark',\n 'SubscriptMark',\n 'SuperscriptMark',\n 'TaskMarker',\n]);\n\nconst Textblocks: { [name: string]: NonNullable<Formatting['blockType']> } = {\n ATXHeading1: 'heading1',\n ATXHeading2: 'heading2',\n ATXHeading3: 'heading3',\n ATXHeading4: 'heading4',\n ATXHeading5: 'heading5',\n ATXHeading6: 'heading6',\n CodeBlock: 'codeblock',\n FencedCode: 'codeblock',\n Paragraph: 'paragraph',\n SetextHeading1: 'heading1',\n SetextHeading2: 'heading2',\n TableCell: 'tablecell',\n Task: 'paragraph',\n};\n\n/**\n * Query an editor state for the active formatting at the selection.\n */\nexport const getFormatting = (state: EditorState): Formatting => {\n // These will track the formatting we've seen so far.\n // False indicates mixed block types.\n let blockType: Formatting['blockType'] | false = null;\n // Indexed by the Inline enum, tracks inline markup.\n // null = no text seen, true = all text had the mark, false = saw text without it.\n const inline: (boolean | null)[] = [null, null, null, null];\n let link: boolean = false;\n let blockQuote: boolean | null = null;\n // False indicates mixed list styles\n let listStyle: Formatting['listStyle'] | null | false = null;\n\n // Track block context for list/blockquote handling.\n const stack: ('BulletList' | 'OrderedList' | 'Blockquote' | 'TaskList')[] = [];\n // This is set when entering a textblock (paragraph, heading, etc.)\n // and cleared when exiting again. It is used to track inline style.\n // `active` holds an array that indicates, for the various style (`Inline` enum) whether they are currently active.\n let currentBlock: { pos: number; end: number; active: boolean[] } | null = null;\n // Advance over regular inline text. Will update `inline` depending on what styles are active.\n const advanceInline = (upto: number) => {\n if (!currentBlock) {\n return;\n }\n upto = Math.min(upto, currentBlock.end);\n if (upto <= currentBlock.pos) {\n return;\n }\n for (let i = 0; i < currentBlock.active.length; i++) {\n if (inline[i] === false) {\n continue;\n } else if (currentBlock.active[i]) {\n inline[i] = true;\n } else if (/\\S/.test(state.doc.sliceString(currentBlock.pos, upto))) {\n inline[i] = false;\n }\n }\n currentBlock.pos = upto;\n };\n\n // Skip markup that shouldn't be treated as inline text for style-tracking purposes.\n const skipInline = (upto: number) => {\n if (currentBlock && upto > currentBlock.pos) {\n currentBlock.pos = Math.min(upto, currentBlock.end);\n }\n };\n\n const { selection } = state;\n for (const range of selection.ranges) {\n if (range.empty && inline.some((v) => v === null)) {\n // Check for markers directly around the cursor (which, not being valid Markdown, the syntax tree won't pick up).\n const contextSize = Math.min(range.head, 6);\n const contextBefore = state.doc.sliceString(range.head - contextSize, range.head);\n let contextAfter = state.doc.sliceString(range.head, range.head + contextSize);\n for (let i = 0; i < contextSize; i++) {\n const ch = contextAfter[i];\n if (ch !== contextBefore[contextBefore.length - 1 - i] || !/[~`*]/.test(ch)) {\n contextAfter = contextAfter.slice(0, i);\n break;\n }\n }\n for (let i = 0; i < inline.length; i++) {\n const mark = inlineMarkerText(i);\n const found = contextAfter.indexOf(mark);\n if (found > -1) {\n contextAfter = contextAfter.slice(0, found) + contextAfter.slice(found + mark.length);\n if (inline[i] === null) {\n inline[i] = true;\n }\n }\n }\n }\n\n syntaxTree(state).iterate({\n from: range.from,\n to: range.to,\n enter: (node) => {\n advanceInline(node.from);\n const { name } = node;\n if (name === 'BulletList' || name === 'OrderedList' || name === 'Blockquote') {\n // Maintain block context.\n stack.push(name);\n } else if (name === 'Link') {\n link = true;\n } else if (Object.hasOwn(Textblocks, name) && (range.empty || node.to > range.from || node.from < range.to)) {\n if (name === 'Task' && stack[stack.length - 1] === 'BulletList') {\n stack[stack.length - 1] = 'TaskList';\n }\n const blockCode = Textblocks[name];\n if (blockType === null) {\n blockType = blockCode;\n } else if (blockType !== blockCode) {\n blockType = false;\n }\n if (blockCode !== 'codeblock' && inline.some((i) => i !== false)) {\n // Set up inline content tracking for non-code textblocks.\n currentBlock = {\n pos: Math.max(range.from, node.from),\n end: Math.min(range.to, node.to),\n active: [false, false, false, false],\n };\n }\n } else if (Object.hasOwn(InlineMarker, name) && currentBlock) {\n const index = InlineMarker[name];\n // Cursors selections always count as active.\n if (range.empty && inline[index] === null) {\n inline[index] = true;\n }\n currentBlock.active[index] = true;\n } else if (IgnoreInline.has(name)) {\n skipInline(node.to);\n }\n },\n leave: (node) => {\n advanceInline(node.to);\n const { name } = node;\n if (name === 'BulletList' || name === 'OrderedList' || name === 'Blockquote') {\n // Track block context.\n stack.pop();\n } else if (Object.hasOwn(Textblocks, name)) {\n // Scan the stack for blockquote/list context.\n // Done at end of node because task lists aren't recognized until a task is seen\n let hasList: Formatting['listStyle'] | false = false;\n let hasQuote = false;\n for (let i = stack.length - 1; i >= 0; i--) {\n if (stack[i] === 'Blockquote') {\n hasQuote = true;\n } else if (!hasList) {\n hasList = stack[i] === 'TaskList' ? 'task' : stack[i] === 'BulletList' ? 'bullet' : 'ordered';\n }\n }\n if (blockQuote === null) {\n blockQuote = hasQuote;\n } else if (!hasQuote && blockQuote) {\n blockQuote = false;\n }\n if (listStyle === null) {\n listStyle = hasList;\n } else if (listStyle !== hasList) {\n listStyle = false;\n }\n\n // End textblock.\n currentBlock = null;\n } else if (Object.hasOwn(InlineMarker, name) && currentBlock) {\n // Track markup in textblock.\n currentBlock.active[InlineMarker[name]] = false;\n }\n },\n });\n }\n\n const { from, to } = state.doc.lineAt(selection.main.anchor);\n const blankLine = from === to;\n\n return {\n blankLine,\n blockType: blockType || null,\n blockQuote: blockQuote ?? false,\n code: inline[Inline.Code] ?? false,\n emphasis: inline[Inline.Emphasis] ?? false,\n strong: inline[Inline.Strong] ?? false,\n strikethrough: inline[Inline.Strikethrough] ?? false,\n link,\n listStyle: listStyle || null,\n };\n};\n\n/**\n * Hook computes the current formatting state.\n */\nexport const useFormattingState = (): [Formatting | null, Extension] => {\n const [state, setState] = useState<Formatting | null>(null);\n const observer = useMemo(\n () =>\n EditorView.updateListener.of((update) => {\n if (update.docChanged || update.selectionSet) {\n const newState = getFormatting(update.state);\n if (!state || !compareFormatting(state, newState)) {\n setState(newState);\n }\n }\n }),\n [],\n );\n\n return [state, observer];\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport { RangeSetBuilder } from '@codemirror/state';\nimport { Decoration, type DecorationSet, type EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';\n\nconst buildDecorations = (view: EditorView): DecorationSet => {\n const builder = new RangeSetBuilder<Decoration>();\n const { state } = view;\n const cursor = state.selection.main.head;\n\n for (const { from, to } of view.visibleRanges) {\n syntaxTree(state).iterate({\n enter: (node) => {\n switch (node.name) {\n case 'ATXHeading1':\n case 'ATXHeading2':\n case 'ATXHeading3':\n case 'ATXHeading4':\n case 'ATXHeading5':\n case 'ATXHeading6': {\n const mark = node.node.getChild('HeaderMark');\n if (mark) {\n if (!view.hasFocus || view.state.readOnly || cursor < node.from || cursor > node.to) {\n builder.add(mark.from, mark.to + 1, Decoration.replace({}));\n }\n }\n }\n }\n },\n from,\n to,\n });\n }\n\n return builder.finish();\n};\n\nexport const heading = () => {\n return [\n ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n constructor(view: EditorView) {\n this.decorations = buildDecorations(view);\n }\n\n update(update: ViewUpdate) {\n this.decorations = buildDecorations(update.view);\n }\n },\n {\n decorations: (value) => value.decorations,\n },\n ),\n ];\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport { RangeSetBuilder } from '@codemirror/state';\nimport { Decoration, type DecorationSet, EditorView, ViewPlugin, type ViewUpdate, WidgetType } from '@codemirror/view';\n\nimport { getToken } from '../../styles';\n\n// TODO(burdon): Reconcile with theme.\nconst styles = EditorView.baseTheme({\n '& .cm-hr': {\n // Note that block-level decorations should not have vertical margins,\n borderTop: `1px solid ${getToken('extend.colors.neutral.200')}`,\n },\n});\n\nclass HorizontalRuleWidget extends WidgetType {\n override toDOM() {\n const el = document.createElement('div');\n el.className = 'cm-hr';\n return el;\n }\n}\n\nconst decoration = Decoration.replace({ widget: new HorizontalRuleWidget() });\n\nconst buildDecorations = (view: EditorView): DecorationSet => {\n const builder = new RangeSetBuilder<Decoration>();\n const { state } = view;\n const cursor = state.selection.main.head;\n\n for (const { from, to } of view.visibleRanges) {\n syntaxTree(state).iterate({\n enter: (node) => {\n if (node.name === 'HorizontalRule') {\n // Check if cursor is inside text.\n if (cursor <= node.from || cursor >= node.to) {\n builder.add(node.from, node.to, decoration);\n }\n }\n },\n from,\n to,\n });\n }\n\n return builder.finish();\n};\n\nexport const hr = () => {\n return [\n ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n constructor(view: EditorView) {\n this.decorations = buildDecorations(view);\n }\n\n update(update: ViewUpdate) {\n this.decorations = buildDecorations(update.view);\n }\n },\n {\n decorations: (value) => value.decorations,\n },\n ),\n styles,\n ];\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport { type EditorState, type Extension, StateField, type Transaction, type Range } from '@codemirror/state';\nimport { Decoration, type DecorationSet, EditorView, WidgetType } from '@codemirror/view';\n\nexport type ImageOptions = {};\n\nexport const image = (options: ImageOptions = {}): Extension => {\n return StateField.define<DecorationSet>({\n create: (state) => {\n return Decoration.set(buildDecorations(0, state.doc.length, state));\n },\n update: (value: DecorationSet, tr: Transaction) => {\n if (!tr.docChanged && !tr.selection) {\n return value;\n }\n // Find range of changes and cursor changes.\n const cursor = tr.state.selection.main.head;\n const oldCursor = tr.changes.mapPos(tr.startState.selection.main.head);\n let from = Math.min(cursor, oldCursor);\n let to = Math.max(cursor, oldCursor);\n tr.changes.iterChangedRanges((fromA, toA, fromB, toB) => {\n from = Math.min(from, fromB);\n to = Math.max(to, toB);\n });\n // Expand to cover lines\n from = tr.state.doc.lineAt(from).from;\n to = tr.state.doc.lineAt(to).to;\n return value.map(tr.changes).update({\n filterFrom: from,\n filterTo: to,\n filter: () => false,\n add: buildDecorations(from, to, tr.state),\n });\n },\n provide: (field) => EditorView.decorations.from(field),\n });\n};\n\nconst buildDecorations = (from: number, to: number, state: EditorState) => {\n const decorations: Range<Decoration>[] = [];\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 decorations.push(\n Decoration.replace({\n block: true, // Prevent cursor from entering.\n widget: new ImageWidget(url),\n }).range(hide ? node.from : node.to, node.to),\n );\n }\n }\n },\n from,\n to,\n });\n\n return decorations;\n};\n\nclass ImageWidget extends WidgetType {\n constructor(readonly _url: string) {\n super();\n }\n\n override eq(other: this) {\n return this._url === (other as any as ImageWidget)._url;\n }\n\n override toDOM(view: EditorView) {\n const img = document.createElement('img');\n img.setAttribute('src', this._url);\n img.setAttribute('class', 'cm-image');\n // Images are hidden until successfully loaded to avoid flickering effects.\n img.onload = () => img.classList.add('cm-loaded-image');\n return img;\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n// Copyright CodeMirror\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport { type Extension, RangeSetBuilder } from '@codemirror/state';\nimport {\n hoverTooltip,\n Decoration,\n type DecorationSet,\n type EditorView,\n ViewPlugin,\n type ViewUpdate,\n WidgetType,\n} from '@codemirror/view';\nimport { type SyntaxNode } from '@lezer/common';\n\nimport { tooltipContent } from '@dxos/react-ui-theme';\n\n// Adapted from:\n// https://codemirror.net/try/?c=aW1wb3J0IHsgYmFzaWNTZXR1cCwgRWRpdG9yVmlldyB9IGZyb20gImNvZGVtaXJyb3IiCmltcG9ydCB7IG1hcmtkb3duIH0gZnJvbSAiQGNvZGVtaXJyb3IvbGFuZy1tYXJrZG93biIKaW1wb3J0IHsgc3ludGF4VHJlZSB9IGZyb20gIkBjb2RlbWlycm9yL2xhbmd1YWdlIjsKaW1wb3J0IHsgRWRpdG9yU3RhdGUsIFJhbmdlU2V0QnVpbGRlciwgU3RhdGVGaWVsZCB9IGZyb20gIkBjb2RlbWlycm9yL3N0YXRlIjsKaW1wb3J0IHsgRGVjb3JhdGlvbiwgV2lkZ2V0VHlwZSB9IGZyb20gIkBjb2RlbWlycm9yL3ZpZXciOwoKY2xhc3MgTGluayBleHRlbmRzIFdpZGdldFR5cGUgewogIGNvbnN0cnVjdG9yKHRleHQsIHVybCkgewogICAgc3VwZXIoKQogICAgdGhpcy50ZXh0ID0gdGV4dAogICAgdGhpcy51cmwgPSB1cmwKICB9CiAgZXEob3RoZXIpIHsgcmV0dXJuIHRoaXMudGV4dCA9PSBvdGhlci50ZXh0ICYmIHRoaXMudXJsID09IG90aGVyLnVybCB9CiAgdG9ET00oKSB7CiAgICBsZXQgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgbGluay50ZXh0Q29udGVudCA9IHRoaXMudGV4dAogICAgbGluay5ocmVmID0gdGhpcy51cmwKICAgIHJldHVybiBsaW5rOwogIH0KfQoKbGV0IGRlY29yYXRpb25zRmllbGQgPSBTdGF0ZUZpZWxkLmRlZmluZSh7CiAgY3JlYXRlKCkgewogICAgcmV0dXJuIERlY29yYXRpb24ubm9uZTsKICB9LAogIHVwZGF0ZShfLCB0cikgewogICAgY29uc3QgYnVpbGRlciA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKTsKICAgIGxldCBjdXJzb3IgPSB0ci5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5oZWFkOwogICAgc3ludGF4VHJlZSh0ci5zdGF0ZSkuaXRlcmF0ZSh7CiAgICAgIGVudGVyOiAobm9kZSkgPT4gewogICAgICAgIGlmICgoY3Vyc29yIDwgbm9kZS5mcm9tIHx8IGN1cnNvciA+IG5vZGUudG8pICYmIG5vZGUubmFtZSA9PSAiTGluayIpIHsKICAgICAgICAgIGxldCBtYXJrcyA9IG5vZGUubm9kZS5nZXRDaGlsZHJlbigiTGlua01hcmsiKTsKICAgICAgICAgIGxldCB0ZXh0ID0gbWFya3MubGVuZ3RoID49IDIgPyB0ci5zdGF0ZS5zbGljZURvYyhtYXJrc1swXS50bywgbWFya3NbMV0uZnJvbSkgOiAiIgoKICAgICAgICAgIGxldCB1cmxOb2RlID0gbm9kZS5ub2RlLmdldENoaWxkKCJVUkwiKTsKICAgICAgICAgIGxldCB1cmwgPSB1cmxOb2RlID8gdHIuc3RhdGUuc2xpY2VEb2ModXJsTm9kZS5mcm9tLCB1cmxOb2RlLnRvKSA6ICIiCiAgICAgICAgICBidWlsZGVyLmFkZChub2RlLmZyb20sIG5vZGUudG8sIERlY29yYXRpb24ucmVwbGFjZSh7CiAgICAgICAgICAgIHdpZGdldDogbmV3IExpbmsodGV4dCwgdXJsKSwKICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSwKICAgIH0pOwogICAgcmV0dXJuIGJ1aWxkZXIuZmluaXNoKCk7CiAgfSwKICBwcm92aWRlOiAoZikgPT4gRWRpdG9yVmlldy5kZWNvcmF0aW9ucy5mcm9tKGYpLAp9KTsKCmxldCB2aWV3ID0gbmV3IEVkaXRvclZpZXcoewogIGRvYzogIiMgSGVsbG8gV29ybGRcblxuW1Rlc3RdKGh0dHBzOi8vZXhhbXBsZS5jb20pXG5cblxuIiwKICBleHRlbnNpb25zOiBbZGVjb3JhdGlvbnNGaWVsZCwgbWFya2Rvd24oKV0sCiAgcGFyZW50OiBkb2N1bWVudC5ib2R5LAp9KTsKCnZpZXcuZm9jdXMoKTs=\n// https://discuss.codemirror.net/t/link-widget-is-clicked-only-if-editor-is-out-of-focus/7433\n\n// TODO(burdon): Callback to dynamically lookup title of linked pages.\nexport type LinkOptions = {\n link?: boolean;\n onHover?: (el: Element, url: string) => void;\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 const extensions: Extension[] = [\n ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n constructor(view: EditorView) {\n this.decorations = buildDecorations(view, options);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged || update.selectionSet) {\n this.decorations = buildDecorations(update.view, options);\n }\n }\n },\n {\n decorations: (value) => value.decorations,\n },\n ),\n ];\n\n if (options.onHover) {\n extensions.push(\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 hoverTooltip((view, pos, side) => {\n const syntax = syntaxTree(view.state).resolveInner(pos, side);\n let link = null;\n for (let i = 0, node: SyntaxNode | null = syntax; !link && node && i < 5; node = node.parent, i++) {\n link = node.name === 'Link' ? node : null;\n }\n\n const url = link && link.getChild('URL');\n if (!url || !link) {\n return null;\n }\n\n const urlText = view.state.sliceDoc(url.from, url.to);\n return {\n pos: link.from,\n end: link.to,\n above: true,\n create: () => {\n const el = document.createElement('div');\n el.className = tooltipContent({}, 'pli-2 plb-1');\n options.onHover!(el, urlText);\n return { dom: el, offset: { x: 0, y: 4 } };\n },\n };\n }),\n );\n }\n\n return extensions;\n};\n\nclass LinkButton extends WidgetType {\n constructor(\n private readonly _url: string,\n private readonly _onAttach: LinkOptions['onRender'],\n ) {\n super();\n }\n\n override eq(other: this) {\n return this._url === other._url;\n }\n\n override 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(\n private readonly _text: string,\n private readonly _url?: string,\n ) {\n super();\n }\n\n override eq(other: this) {\n return this._url === other._url;\n }\n\n override 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: view.posAtDOM(link),\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 buildDecorations = (view: EditorView, options: LinkOptions): DecorationSet => {\n const builder = new RangeSetBuilder<Decoration>();\n const { state } = view;\n const cursor = state.selection.main.head;\n\n for (const { from, to } of view.visibleRanges) {\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 // TODO(burdon): Don't expand if moving cursor up/down.\n if (!view.hasFocus || state.readOnly || cursor < node.from || cursor > node.to) {\n builder.add(\n node.from,\n node.to,\n Decoration.replace({\n widget: new LinkText(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(url, options.onRender),\n }),\n );\n }\n\n return false;\n }\n },\n from,\n to,\n });\n }\n\n return builder.finish();\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\n// TODO(burdon): Advanced formatting (left/right/center).\n// TODO(burdon): Editor to auto balance columns.\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 &&\n builder.add(\n table.from,\n table.to,\n Decoration.replace({\n widget: new TableWidget(table),\n }),\n );\n\n // Add class for styling.\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: this) {\n return (\n this._table.header?.join() === other._table.header?.join() &&\n this._table.rows?.join() === other._table.rows?.join()\n );\n }\n\n override 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 override ignoreEvent(e: Event) {\n return !/^mouse/.test(e.type);\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport { RangeSetBuilder } from '@codemirror/state';\nimport { EditorView, Decoration, WidgetType, ViewPlugin, type DecorationSet, type ViewUpdate } from '@codemirror/view';\n\nimport { getToken } from '../../styles';\n\n// TODO(burdon): Reconcile with theme.\nconst styles = EditorView.baseTheme({\n '& .cm-task': {\n color: getToken('extend.colors.blue.500'),\n },\n '& .cm-task-checkbox': {\n marginLeft: '4px',\n marginRight: '4px',\n },\n});\n\nclass CheckboxWidget extends WidgetType {\n constructor(private _checked: boolean) {\n super();\n }\n\n override eq(other: this) {\n return this._checked === other._checked;\n }\n\n override toDOM(view: EditorView) {\n const input = document.createElement('input');\n input.className = 'cm-task-checkbox';\n input.type = 'checkbox';\n input.checked = this._checked;\n if (view.state.readOnly) {\n input.setAttribute('disabled', 'true');\n } else {\n input.onmousedown = (event: Event) => {\n const pos = view.posAtDOM(input);\n const text = view.state.sliceDoc(pos, pos + 3);\n if (text === (this._checked ? '[x]' : '[ ]')) {\n view.dispatch({\n changes: { from: pos + 1, to: pos + 2, insert: this._checked ? ' ' : 'x' },\n });\n event.preventDefault();\n }\n };\n }\n\n return input;\n }\n\n override ignoreEvent() {\n return false;\n }\n}\n\nconst checkedDecoration = Decoration.replace({ widget: new CheckboxWidget(true) });\nconst uncheckedDecoration = Decoration.replace({ widget: new CheckboxWidget(false) });\n\nconst buildDecorations = (view: EditorView): DecorationSet => {\n const builder = new RangeSetBuilder<Decoration>();\n const { state } = view;\n const cursor = state.selection.main.head;\n\n for (const { from, to } of view.visibleRanges) {\n syntaxTree(state).iterate({\n enter: (node) => {\n if (node.name === 'TaskMarker') {\n // Check if cursor is inside text.\n if (cursor < node.from || cursor > node.to) {\n const checked = state.doc.sliceString(node.from + 1, node.to - 1) === 'x';\n builder.add(node.from - 2, node.from - 1, Decoration.mark({ class: 'cm-task' }));\n builder.add(node.from, node.to, checked ? checkedDecoration : uncheckedDecoration);\n }\n }\n },\n from,\n to,\n });\n }\n\n return builder.finish();\n};\n\nexport type TasklistOptions = {};\n\nexport const tasklist = (options: TasklistOptions = {}) => {\n return [\n ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n constructor(view: EditorView) {\n this.decorations = buildDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged || update.selectionSet) {\n this.decorations = buildDecorations(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 { 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\n// TODO(burdon): Can only have a single autocompletion. Merge configuration with autocomplete.\nexport const mention = ({ onSearch }: MentionOptions): Extension => {\n return autocompletion({\n // TODO(burdon): Not working.\n activateOnTyping: true,\n // activateOnTypingDelay: 100,\n // selectOnOpen: true,\n closeOnBlur: false, // For debugging.\n // defaultKeymap: false,\n icons: false,\n override: [\n (context: CompletionContext): CompletionResult | null => {\n console.log(context);\n\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.slice(1).toLowerCase()).map((value) => ({ label: `@${value}` })),\n };\n },\n ],\n });\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\n\nexport type OutlinerOptions = {};\n\n// TODO(burdon): Experimental component: multiple hierarchical draggable editor sections.\nexport const outliner = (options: OutlinerOptions = {}): Extension => {\n return [];\n};\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 * Configurable plugin that let's user cycle through pre-configured input script.\n */\nexport const typewriter = ({ delay = 75, items = defaultItems }: DemoOptions = {}): Extension => {\n let t: any;\n let idx = 0; // TODO(burdon): Make global.\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 get from 'lodash.get';\n\nimport { type ThemeStyles, tokens } from '../styles';\n\n// TODO(burdon): Can we use @apply and import css file?\n// https://tailwindcss.com/docs/reusing-styles#extracting-classes-with-apply?\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: ThemeStyles = {\n //\n // Main layout:\n // https://codemirror.net/examples/styling\n //\n // <div class=\"cm-editor [cm-focused] [generated classes]\">\n // <div class=\"cm-scroller\">\n // <div class=\"cm-gutters\">\n // <div class=\"cm-gutter [...]\">\n // <div class=\"cm-gutterElement\">...</div>\n // </div>\n // </div>\n // <div class=\"cm-content\" role=\"textbox\" contenteditable=\"true\">\n // <div class=\"cm-line\"></div>\n // </div>\n // <div class=\"cm-selectionLayer\">\n // <div class=\"cm-selectionBackground\"></div>\n // </div>\n // <div class=\"cm-cursorLayer\">\n // <div class=\"cm-cursor\"></div>\n // </div>\n // </div>\n // </div>\n //\n\n '&': {},\n '&.cm-focused': {\n outline: 'none',\n },\n\n '.cm-scroller': {\n // overflow: 'visible',\n fontFamily: get(tokens, 'fontFamily.mono', []).join(','),\n lineHeight: 1.4,\n },\n\n '.cm-content': {\n padding: 0,\n // NOTE: 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.semanticColors.base.fg.light', 'black'),\n caretColor: 'black',\n },\n '&dark .cm-content': {\n color: get(tokens, 'extend.semanticColors.base.fg.dark', '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 '&light .cm-placeholder': {\n color: get(tokens, 'extend.semanticColors.description.light', 'rgba(0,0,0,.2)'),\n },\n '&dark .cm-placeholder': {\n color: get(tokens, 'extend.semanticColors.description.dark', 'rgba(255,255,255,.2)'),\n },\n\n //\n // line\n //\n '.cm-line': {\n paddingInline: 0,\n },\n '.cm-activeLine': {\n background: 'transparent',\n },\n\n //\n // Selection\n //\n\n '&light .cm-selectionBackground': {\n background: get(tokens, 'extend.colors.primary.100'),\n },\n '&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground': {\n background: get(tokens, 'extend.colors.primary.200'),\n },\n '&dark .cm-selectionBackground': {\n background: get(tokens, 'extend.colors.primary.700'),\n },\n '&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground': {\n background: get(tokens, 'extend.colors.primary.600'),\n },\n\n //\n // Search\n //\n\n '&light .cm-searchMatch': {\n backgroundColor: get(tokens, 'extend.colors.yellow.100'),\n },\n '&dark .cm-searchMatch': {\n backgroundColor: get(tokens, 'extend.colors.yellow.700'),\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 // 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 display: 'block',\n height: '0',\n },\n '.cm-image.cm-loaded-image': {\n height: 'auto',\n borderTop: '0.5rem solid transparent',\n borderBottom: '0.5rem solid transparent',\n },\n\n //\n // font size\n // TODO(thure): This appears to be the best or only way to set selection caret heights,\n // 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 * TODO(burdon): Needs styling attention (esp. dark mode).\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 },\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 backgroundImage: 'none',\n border: 'none',\n '&:hover': {\n background: get(tokens, 'extend.colors.neutral.200'),\n },\n '&:active': {\n background: get(tokens, 'extend.colors.neutral.300'),\n backgroundImage: 'none',\n },\n },\n '.cm-panel input[type=checkbox]': {\n marginRight: '0.4rem !important',\n },\n};\n\nexport const textTheme: ThemeStyles = {\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: ThemeStyles = {\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 codeTheme: ThemeStyles = {\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 2024 DXOS.org\n//\n\nimport {\n type Icon,\n CaretRight,\n ChatText,\n Code,\n CodeBlock,\n Link,\n ListBullets,\n ListChecks,\n ListNumbers,\n Paragraph,\n TextStrikethrough,\n Table,\n TextB,\n TextHOne,\n TextHTwo,\n TextHThree,\n TextHFour,\n TextHFive,\n TextHSix,\n TextItalic,\n} from '@phosphor-icons/react';\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren } from 'react';\n\nimport { Button, type ButtonProps, DensityProvider, Select } from '@dxos/react-ui';\nimport { getSize, mx } from '@dxos/react-ui-theme';\n\nimport { type Formatting } from '../../extensions';\n\nconst HeadingIcons: { [key: string]: Icon } = {\n '0': Paragraph,\n '1': TextHOne,\n '2': TextHTwo,\n '3': TextHThree,\n '4': TextHFour,\n '5': TextHFive,\n '6': TextHSix,\n};\n\n// TODO(burdon): Revert to string to make extensible?\nexport type ActionType =\n | 'blockquote'\n | 'strong'\n | 'codeblock'\n | 'comment'\n | 'heading'\n | 'image'\n | 'emphasis'\n | 'code'\n | 'link'\n | 'list-bullet'\n | 'list-ordered'\n | 'list-tasks'\n | 'mention'\n | 'prompt'\n | 'strikethrough'\n | 'table';\n\nexport type Action = {\n type: ActionType;\n data?: any;\n};\n\nexport type ToolbarProps = PropsWithChildren<{\n state: Formatting | null;\n onAction?: (action: Action) => void;\n}>;\n\nconst [ToolbarContextProvider, useToolbarContext] = createContext<ToolbarProps>('Toolbar');\n\nconst ToolbarRoot = ({ children, onAction, state }: ToolbarProps) => {\n return (\n <ToolbarContextProvider onAction={onAction} state={state}>\n <DensityProvider density='fine'>\n <div role='toolbar' className='flex w-full shrink-0 p-1 gap-4 items-center whitespace-nowrap overflow-hidden'>\n {children}\n </div>\n </DensityProvider>\n </ToolbarContextProvider>\n );\n};\n\ntype ToolbarButtonProps = {\n Icon: Icon;\n disable?: (state: Formatting) => boolean;\n getState?: (state: Formatting) => boolean;\n onClick: (state: Formatting | null) => Action | undefined;\n} & NonNullable<Pick<ButtonProps, 'title'>>;\n\nconst ToolbarButton = ({ Icon, onClick, title, getState, disable }: ToolbarButtonProps) => {\n const { onAction, state } = useToolbarContext('ToolbarButton');\n const active = getState && state ? getState(state) : false;\n const disabled = disable && state ? disable(state) : false;\n\n const handleClick = (event: React.MouseEvent) => {\n const action = onClick(state);\n if (action) {\n onAction?.(action);\n event.preventDefault();\n }\n };\n\n return (\n <Button\n variant='ghost'\n classNames={mx('p-2', active && 'ring-[1px]')}\n onMouseDown={handleClick}\n title={title}\n disabled={disabled}\n >\n <Icon className={getSize(5)} />\n </Button>\n );\n};\n\nconst ToolbarSeparator = () => <div className='grow' />;\n\nconst MarkdownHeading = () => {\n const { onAction, state } = useToolbarContext('MarkdownFormatting');\n const blockType = state ? state.blockType : 'paragraph';\n const header = blockType && /heading(\\d)/.exec(blockType);\n const value = header ? header[1] : blockType === 'paragraph' || !blockType ? '0' : undefined;\n const HeadingIcon = HeadingIcons[value ?? '0'];\n return (\n <Select.Root\n disabled={value === null}\n value={value ?? '0'}\n onValueChange={(value) => onAction?.({ type: 'heading', data: parseInt(value) })}\n >\n <Select.TriggerButton>\n <HeadingIcon className={getSize(5)} />\n </Select.TriggerButton>\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n <Select.Option value='0'>Paragraph</Select.Option>\n {[1, 2, 3, 4, 5, 6].map((level) => (\n <Select.Option key={level} value={String(level)}>\n Heading {level}\n </Select.Option>\n ))}\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n );\n};\n\nconst MarkdownStyles = () => (\n <div role='none'>\n <ToolbarButton\n Icon={TextB}\n title='String'\n disable={(s) => s.blockType === 'codeblock'}\n getState={(s) => s.strong}\n onClick={(s) => ({ type: 'strong', data: s ? !s.strong : null })}\n />\n <ToolbarButton\n Icon={TextItalic}\n title='Emphasis'\n disable={(s) => s.blockType === 'codeblock'}\n getState={(s) => s.emphasis}\n onClick={(s) => ({ type: 'emphasis', data: s ? !s.emphasis : null })}\n />\n <ToolbarButton\n Icon={TextStrikethrough}\n title='Strike-through'\n disable={(s) => s.blockType === 'codeblock'}\n getState={(s) => s.strikethrough}\n onClick={(s) => ({ type: 'strikethrough', data: s ? !s.strikethrough : null })}\n />\n <ToolbarButton\n Icon={Code}\n title='Inline code'\n disable={(s) => s.blockType === 'codeblock'}\n getState={(s) => s.code}\n onClick={(s) => ({ type: 'code', data: s ? !s.code : null })}\n />\n </div>\n);\n\nconst MarkdownLists = () => (\n <div role='none'>\n <ToolbarButton\n Icon={ListBullets}\n title='Bullet list'\n getState={(s) => s.listStyle === 'bullet'}\n onClick={(s) => ({ type: 'list-bullet', data: s ? s.listStyle !== 'bullet' : null })}\n />\n <ToolbarButton\n Icon={ListNumbers}\n title='Numbered list'\n getState={(s) => s.listStyle === 'ordered'}\n onClick={(s) => ({ type: 'list-ordered', data: s ? s.listStyle !== 'ordered' : null })}\n />\n <ToolbarButton\n Icon={ListChecks}\n title='Task list'\n getState={(s) => s.listStyle === 'task'}\n onClick={(s) => ({ type: 'list-tasks', data: s ? s.listStyle !== 'task' : null })}\n />\n </div>\n);\n\nconst MarkdownBlocks = () => (\n <div role='none'>\n <ToolbarButton\n Icon={CaretRight}\n title='Block quote'\n getState={(s) => s.blockQuote}\n onClick={(s) => ({ type: 'blockquote', data: s ? !s.blockQuote : null })}\n />\n <ToolbarButton\n Icon={CodeBlock}\n title='Code block'\n disable={(s) => !s.blankLine}\n getState={(s) => s.blockType === 'codeblock'}\n onClick={(s) => ({ type: 'codeblock', data: s ? s.blockType !== 'codeblock' : null })}\n />\n <ToolbarButton Icon={Table} title='Table' disable={(s) => !s.blankLine} onClick={() => ({ type: 'table' })} />\n </div>\n);\n\nconst MarkdownLinks = () => (\n <div role='none'>\n <ToolbarButton\n Icon={Link}\n title='Link'\n getState={(s) => s.link}\n onClick={(s) => ({ type: 'link', data: s ? !s.link : null })}\n />\n {/* <ToolbarButton Icon={At} title='Mention' onClick={() => ({ type: 'mention' })} /> */}\n {/* <ToolbarButton Icon={Image} title='Image' onClick={() => ({ type: 'image' })} /> */}\n </div>\n);\n\nconst MarkdownStandard = () => (\n <>\n <MarkdownHeading />\n <MarkdownStyles />\n <MarkdownLists />\n <MarkdownBlocks />\n <MarkdownLinks />\n </>\n);\n\nconst MarkdownExtended = () => (\n <Toolbar.Button Icon={ChatText} title='Create comment' onClick={() => ({ type: 'comment' })} />\n);\n\nexport const Toolbar = {\n Root: ToolbarRoot,\n Button: ToolbarButton,\n Separator: ToolbarSeparator,\n Markdown: MarkdownStandard,\n Extended: MarkdownExtended,\n};\n\nexport { useToolbarContext };\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { DeferredTask, Event, sleep } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { type Space } from '@dxos/react-client/echo';\nimport { type GossipMessage } from '@dxos/react-client/mesh';\n\nimport { type AwarenessInfo, type AwarenessPosition, type AwarenessProvider, type AwarenessState } from '../extensions';\n\ntype ProtocolMessage =\n | {\n kind: 'query';\n }\n | {\n kind: 'post';\n state: AwarenessState;\n };\n\nconst DEBOUNCE_INTERVAL = 100; // ms\n\nexport type AwarenessProviderParams = {\n space: Space;\n channel: string;\n peerId: string;\n info: AwarenessInfo;\n};\n\n/**\n * Receives and broadcasts profile and cursor position.\n */\nexport class SpaceAwarenessProvider implements AwarenessProvider {\n private readonly _remoteStates = new Map<string, AwarenessState>();\n\n private readonly _space: Space;\n private readonly _channel: string;\n private readonly _peerId: string;\n private readonly _info: AwarenessInfo;\n\n private _ctx?: Context;\n private _postTask?: DeferredTask;\n private _localState?: AwarenessState;\n\n public readonly remoteStateChange = new Event<void>();\n\n constructor(params: AwarenessProviderParams) {\n this._space = params.space;\n this._channel = params.channel;\n this._peerId = params.peerId;\n this._info = params.info;\n }\n\n open() {\n this._ctx = new Context();\n this._postTask = new DeferredTask(this._ctx, async () => {\n if (this._localState) {\n await this._space.postMessage(this._channel, {\n kind: 'post',\n state: this._localState,\n } satisfies ProtocolMessage);\n\n await sleep(DEBOUNCE_INTERVAL);\n }\n });\n\n this._ctx.onDispose(\n this._space.listen(this._channel, (message: GossipMessage) => {\n switch (message.payload.kind) {\n case 'query': {\n this._handleQueryMessage();\n break;\n }\n case 'post': {\n this._handlePostMessage(message.payload);\n break;\n }\n }\n }),\n );\n\n void this._space\n .postMessage(this._channel, {\n kind: 'query',\n } satisfies ProtocolMessage)\n .catch((err) => {\n log.debug('failed to query awareness', { err });\n });\n }\n\n close() {\n void this._ctx?.dispose();\n this._ctx = undefined;\n this._postTask = undefined;\n }\n\n getRemoteStates(): AwarenessState[] {\n return Array.from(this._remoteStates.values());\n }\n\n update(position: AwarenessPosition | undefined): void {\n invariant(this._postTask);\n this._localState = {\n peerId: this._peerId,\n position,\n info: this._info,\n };\n\n this._postTask.schedule();\n }\n\n private _handleQueryMessage() {\n invariant(this._postTask);\n this._postTask.schedule();\n }\n\n private _handlePostMessage(message: ProtocolMessage) {\n invariant(message.kind === 'post');\n this._remoteStates.set(message.state.peerId, message.state);\n this.remoteStateChange.emit();\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Extension, StateField } from '@codemirror/state';\n\nimport { type DocAccessor } from '@dxos/echo-schema';\n\n// Runtime data structure.\nexport type Range = {\n from: number;\n to: number;\n};\n\n// Persistent data structure.\nexport type Comment = {\n id: string;\n cursor?: string;\n};\n\nexport type EditorModel = {\n id: string;\n text: () => string;\n extension?: Extension;\n\n // TODO(burdon): Remove.\n content: string | DocAccessor;\n\n // TODO(burdon): Remove.\n peer?: {\n id: string;\n name?: string;\n };\n};\n\n/**\n * State field makes the model available to other extensions.\n */\nexport const modelState = StateField.define<EditorModel | undefined>({\n create: () => undefined,\n update: (model) => model,\n});\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport type { EditorView } from '@codemirror/view';\n\nimport type { ToolbarProps } from '../components';\nimport {\n createComment,\n insertTable,\n setHeading,\n setStyle,\n toggleStyle,\n addLink,\n removeLink,\n Inline,\n List,\n addList,\n removeList,\n toggleList,\n addBlockquote,\n removeBlockquote,\n addCodeblock,\n removeCodeblock,\n toggleBlockquote,\n} from '../extensions';\n\nexport const useActionHandler = (view?: EditorView | null): ToolbarProps['onAction'] => {\n return (action) => {\n if (!view) {\n return;\n }\n\n let inlineType, listType;\n switch (action.type) {\n case 'heading':\n setHeading(parseInt(action.data))(view);\n break;\n\n case 'strong':\n case 'emphasis':\n case 'strikethrough':\n case 'code':\n inlineType =\n action.type === 'strong'\n ? Inline.Strong\n : action.type === 'emphasis'\n ? Inline.Emphasis\n : action.type === 'strikethrough'\n ? Inline.Strikethrough\n : Inline.Code;\n (typeof action.data === 'boolean' ? setStyle(inlineType, action.data) : toggleStyle(inlineType))(view);\n break;\n\n case 'list-ordered':\n case 'list-bullet':\n case 'list-tasks':\n listType =\n action.type === 'list-ordered' ? List.Ordered : action.type === 'list-bullet' ? List.Bullet : List.Task;\n (action.data === false\n ? removeList(listType)\n : action.data === true\n ? addList(listType)\n : toggleList(listType))(view);\n break;\n\n case 'blockquote':\n (action.data === false ? removeBlockquote : action.data === true ? addBlockquote : toggleBlockquote)(view);\n break;\n case 'codeblock':\n (action.data === false ? removeCodeblock : addCodeblock)(view);\n break;\n case 'table':\n insertTable(view);\n break;\n\n case 'link':\n (action.data === false ? removeLink : addLink)(view);\n break;\n\n case 'comment':\n createComment(view);\n break;\n }\n\n // TODO(burdon): Hack otherwise remains on heading selector.\n setTimeout(() => {\n if (!view.hasFocus) {\n view.focus();\n }\n });\n };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\nimport { type RefCallback, useState } from 'react';\n\n/**\n * Hook for accessing the editor view.\n *\n * ```tsx\n * const Test = () => {\n * const [editorRef, editorView] = useEditorView();\n * useEffect(() => {\n * editorView?.focus();\n * }, [editorView]);\n * return <TextEditor ref={editorRef} />;\n * };\n * ```\n */\nexport const useEditorView = (): [RefCallback<EditorView | null>, EditorView | null] => {\n const [view, setView] = useState<EditorView | null>(null);\n return [\n (ref: EditorView | null) => {\n setView(ref);\n },\n view,\n ];\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport {\n EditorSelection,\n EditorState,\n type EditorStateConfig,\n type Extension,\n type StateEffect,\n} from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport { type RefObject, useEffect, useRef, useState } from 'react';\n\nimport { log } from '@dxos/log';\nimport { type ThemeMode } from '@dxos/react-ui';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { type ThemeStyles } from '..//styles';\nimport { defaultTheme } from '../themes';\nimport { logChanges } from '../util';\n\nexport type UseTextEditorOptions = {\n autoFocus?: boolean;\n scrollTo?: StateEffect<any>;\n debug?: boolean;\n} & EditorStateConfig;\n\nexport type UseTextEditor = {\n parentRef: RefObject<HTMLDivElement>;\n view?: EditorView;\n};\n\n/**\n * Hook for creating editor.\n */\nexport const useTextEditor = ({\n autoFocus,\n scrollTo,\n debug,\n doc,\n selection,\n extensions,\n}: UseTextEditorOptions = {}): UseTextEditor => {\n const onUpdate = useRef<() => void>();\n const [view, setView] = useState<EditorView>();\n const parentRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (parentRef.current) {\n // https://codemirror.net/docs/ref/#state.EditorStateConfig\n const state = EditorState.create({\n doc,\n selection,\n extensions: [\n // TODO(burdon): Doesn't catch errors in keymap functions.\n EditorView.exceptionSink.of((err) => {\n log.catch(err);\n }),\n extensions,\n EditorView.updateListener.of(() => {\n onUpdate.current?.();\n }),\n ].filter(isNotFalsy),\n });\n\n // https://codemirror.net/docs/ref/#view.EditorViewConfig\n const view = new EditorView({\n parent: parentRef.current,\n scrollTo,\n state,\n // NOTE: Uncomment to debug/monitor all transactions.\n // https://codemirror.net/docs/ref/#view.EditorView.dispatch\n dispatchTransactions: (trs, view) => {\n if (debug) {\n logChanges(trs);\n }\n view.update(trs);\n },\n });\n\n setView(view);\n }\n\n return () => {\n view?.destroy();\n };\n }, [parentRef]);\n\n useEffect(() => {\n if (view) {\n // Select end of line if not specified.\n if (!selection && !view.state.selection.main.anchor) {\n selection = EditorSelection.single(view.state.doc.line(1).to);\n }\n\n // Set selection after first update (since content may rerender on focus).\n // TODO(burdon): BUG on first render may appear in middle of formatted heading.\n // TODO(burdon): Make invisible until first render?\n if (selection || scrollTo) {\n onUpdate.current = () => {\n onUpdate.current = undefined;\n view.dispatch({ selection, effects: scrollTo && [scrollTo], scrollIntoView: !scrollTo });\n };\n }\n\n if (autoFocus) {\n view.focus();\n }\n }\n }, [view, autoFocus, selection, scrollTo]);\n\n return { parentRef, view };\n};\n\n// TODO(burdon): Factor out extension factories.\n\nexport type DataExtensionsOptions = {\n readonly?: boolean;\n};\n\n// TODO(burdon): Pass in TextObject (remove model).\nexport const createDataExtensions = ({ readonly = false } = {}): Extension => {\n return [\n //\n EditorState.readOnly.of(readonly),\n EditorView.editable.of(!readonly),\n ];\n};\n\nexport type ThemeExtensionsOptions = {\n theme?: ThemeStyles;\n themeMode?: ThemeMode;\n lineWrap?: boolean;\n slots?: {\n editor?: {\n className?: string;\n };\n content?: {\n className?: string;\n };\n };\n};\n\nexport const createThemeExtensions = ({ theme, themeMode, slots }: ThemeExtensionsOptions = {}): Extension => {\n return [\n //\n EditorView.baseTheme(defaultTheme),\n theme && EditorView.theme(theme),\n EditorView.darkTheme.of(themeMode === 'dark'),\n EditorView.editorAttributes.of({ class: slots?.editor?.className ?? '' }),\n EditorView.contentAttributes.of({ class: slots?.content?.className ?? '' }),\n ].filter(isNotFalsy);\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport get from 'lodash.get';\nimport { type Dispatch, type SetStateAction, useEffect, useState } from 'react';\n\nimport { generateName } from '@dxos/display-name';\nimport { type AutomergeTextCompat, getRawDoc } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { isAutomergeObject, type Space, type TextObject } from '@dxos/react-client/echo';\nimport { type Identity } from '@dxos/react-client/halo';\n\nimport { SpaceAwarenessProvider } from './awareness-provider';\nimport { type EditorModel, modelState } from './defs';\nimport { automerge, awareness } from '../extensions';\nimport { cursorColor } from '../styles';\n\n// TODO(burdon): Remove space/identity dependency. Define interface for the framework re content and presence.\nexport type UseTextModelProps = {\n identity?: Identity | null;\n space?: Space;\n text?: TextObject;\n};\n\nexport const useTextModel = (props: UseTextModelProps): EditorModel | undefined => {\n const { identity, space, text } = props;\n const [model, setModel] = useState<EditorModel | undefined>();\n useEffect(() => setModel(createModel(props)), [identity, space, text]);\n return model;\n};\n\n/**\n * For use primarily in stories & tests so the dependence on TextObject can be avoided.\n * @param id\n * @param defaultContent\n */\nexport const useInMemoryTextModel = ({\n id,\n defaultContent,\n}: {\n id: string;\n defaultContent?: string;\n}): EditorModel & { setContent: Dispatch<SetStateAction<string>> } => {\n const [content, setContent] = useState(defaultContent ?? '');\n return { id, content, setContent, text: () => content };\n};\n\nconst createModel = ({ space, identity, text }: UseTextModelProps) => {\n if (!text) {\n return undefined;\n }\n\n invariant(isAutomergeObject(text));\n const obj = text as any as AutomergeTextCompat;\n const doc = getRawDoc(obj, [obj.field]);\n\n const awarenessProvider =\n space &&\n new SpaceAwarenessProvider({\n space,\n channel: `automerge.awareness.${obj.id}`,\n info: {\n displayName: identity ? identity.profile?.displayName ?? generateName(identity.identityKey.toHex()) : undefined,\n color: cursorColor.color,\n lightColor: cursorColor.light,\n },\n peerId: identity?.identityKey.toHex() ?? 'Anonymous',\n });\n\n const extensions = [modelState.init(() => model), automerge({ handle: doc.handle, path: doc.path })];\n if (awarenessProvider) {\n extensions.push(awareness(awarenessProvider));\n }\n\n const model: EditorModel = {\n id: obj.id,\n content: doc,\n text: () => get(doc.handle.docSync(), doc.path),\n extension: extensions,\n peer: identity\n ? {\n id: identity.identityKey.toHex(),\n name: identity.profile?.displayName,\n }\n : undefined,\n };\n\n return model;\n};\n"],
5
+ "mappings": ";AAIA,SAASA,gBAAgB;AACzB,SAASC,KAAKC,OAAOC,oBAAoB;AAEzC,SAA0BC,UAAAA,eAAc;;;ACHxC,SAASC,QAAAA,aAAY;;;ACArB,SAASC,eAAAA,oBAAqD;AAC9D,SAASC,cAAAA,oBAAkB;AAE3B,SAASC,WAAW;AACpB,OAAOC,mBAAkB;AACzB,OAAOC,SAGLC,YACAC,aACAC,aAAAA,YACAC,qBACAC,QACAC,YAAAA,iBACK;AAEP,SAASC,OAAAA,YAAW;AACpB,SAASC,uBAAuB;AAChC,SAASC,WAAWC,MAAAA,WAAU;AAC9B,SAASC,cAAAA,mBAAkB;;;ACnB3B,SAA2CC,kBAAkB;AAC7D,SAASC,YAAYC,kBAAkB;AAEvC,SAASC,kBAAkB;;;ACH3B,SAA2BC,aAAa;AAmBxC,IAAMC,yBAA0C;EAC9CC,UAAU,CAACC,aAAaA,SAASC,SAAQ;EACzCC,YAAY,CAACC,WAAWC,SAASD,MAAAA;AACnC;AAEO,IAAME,SAAN,MAAMA,QAAAA;EACX;SAAgBC,YAAYC,MAAMC,OAAyC;MACzEC,SAAS,CAACC,cAAcA,UAAU,CAAA,KAAMZ;IAC1C,CAAA;;EAEA;SAAgBa,qBAAqB,CAACC,OAAoBC,UAAAA;AACxD,YAAMC,mBAAkBF,MAAMG,MAAMV,QAAOC,SAAS;AAEpD,YAAMU,OAAOF,iBAAgBf,SAASc,MAAMG,IAAI;AAChD,YAAMC,KAAKH,iBAAgBf,SAASc,MAAMI,IAAI,EAAC;AAC/C,aAAO;QAACD;QAAMC;QAAIC,KAAK,GAAA;IACzB;;EAEA;SAAgBC,qBAAqB,CAACP,OAAoBT,WAAAA;AACxD,YAAMW,mBAAkBF,MAAMG,MAAMV,QAAOC,SAAS;AAEpD,YAAMc,QAAQjB,OAAOkB,MAAM,GAAA;AAC3B,YAAML,OAAOF,iBAAgBZ,WAAWkB,MAAM,CAAA,CAAE;AAChD,YAAMH,KAAKH,iBAAgBZ,WAAWkB,MAAM,CAAA,CAAE;AAC9C,aAAOJ,SAASM,UAAaL,OAAOK,SAAY;QAAEN;QAAMC;MAAG,IAAIK;IACjE;;AACF;;;AD9BA,IAAMC,iBAAiBC,WAAWC,KAAK;EAAEC,OAAO;AAAgB,CAAA;AAEzD,IAAMC,cAAc,CAACC,UAA6B,CAAC,MAAC;AAIzD,QAAMC,QAAQ,CAACC,UAAAA;AACb,UAAMH,eAA4B,CAAA;AAClC,UAAMI,OAAOD,MAAME,IAAIC,SAAQ;AAC/B,QAAIL,QAAQC,OAAO;AACjB,YAAMK,UAAUH,KAAKI,SAASP,QAAQC,KAAK;AAC3C,iBAAWA,UAASK,SAAS;AAC3B,cAAME,OAAOP,OAAMQ;AACnB,cAAMC,KAAKF,OAAOP,OAAM,CAAA,EAAGU;AAC3B,cAAMC,SAASC,OAAOC,mBAAmBZ,OAAO;UAAEM;UAAME;QAAG,CAAA;AAC3DX,QAAAA,aAAYgB,KAAK;UAAEH;QAAO,CAAA;MAC5B;IACF;AAEA,WAAOb;EACT;AAEA,QAAMiB,mBAAmBC,WAAWC,OAAqB;IACvDC,QAAQ,CAACjB,UAAAA;AACP,aAAOD,MAAMC,KAAAA;IACf;IACAkB,QAAQ,CAACC,OAAOC,OAAAA;AACd,UAAI,CAACA,GAAGC,QAAQC,OAAO;AACrB,eAAOvB,MAAMqB,GAAGpB,KAAK;MACvB;AAEA,aAAOmB;IACT;EACF,CAAA;AAEA,SAAO;IACLL;IACAS,WAAWC,YAAYC,QAAQ;MAACX;OAAmB,CAACd,UAAAA;AAClD,YAAMH,eAAcG,MAAM0B,MAAMZ,gBAAAA;AAChC,YAAMU,cAAc3B,aACjB8B,IAAI,CAACC,eAAAA;AACJ,cAAMC,QAAQlB,OAAOmB,mBAAmB9B,OAAO4B,WAAWlB,MAAM;AAChE,eAAOmB,SAASpC,eAAeoC,MAAMA,MAAMvB,MAAMuB,MAAMrB,EAAE;MAC3D,CAAA,EACCuB,OAAOC,UAAAA;AAEV,aAAOtC,WAAWuC,IAAIT,WAAAA;IACxB,CAAA;IACAU;;AAEJ;AAEA,IAAMA,SAASX,WAAWY,UAAU;EAClC,kBAAkB;IAChBC,gBAAgB;IAChBC,qBAAqB;IACrBC,qBAAqB;EACvB;AACF,CAAA;;;AErEA,SACEC,gBACAC,wBAIK;AACP,SAASC,wBAAwB;AACjC,SAASC,cAAc;AAWhB,IAAMC,eAAe,CAAC,EAAEC,SAAQ,MAAuB;AAC5D,SAAO;;;;IAILC,OAAOC,GAAGC,gBAAAA;;;IAIVC,eAAe;MACbC,kBAAkB;;;;MAMlBC,cAAc,MAAM;IACtB,CAAA;;;IAIAC,iBAAiBC,KAAKN,GAAG;MACvBH,cAAc,CAACU,YAAAA;AACb,cAAMC,QAAQD,QAAQE,YAAY,KAAA;AAClC,YAAI,CAACD,SAAUA,MAAME,SAASF,MAAMG,MAAM,CAACJ,QAAQK,UAAW;AAC5D,iBAAO;QACT;AAEA,eAAO;UACLF,MAAMF,MAAME;UACZG,SAASf,SAASU,MAAMM,KAAKC,YAAW,CAAA;QAC1C;MACF;IACF,CAAA;;AAEJ;;;ACxDA,SAASC,uBAAuB;AAChC,SAASC,cAAAA,mBAAoD;AAC7D,SAASC,cAAAA,aAAYC,kBAAkB;AAEvC,SAASC,QAAQC,UAAoB;;;ACNrC,OAAOC,SAAS;AAGhB,SAASC,QAAQC,SAAS;AAKnB,IAAMC,kBAAkB,CAACC,QAAoBC,UAAmC;;EAErFC,UAAU,CAACC,QAAAA;AACT,UAAMC,MAAMJ,OAAOK,QAAO;AAC1B,QAAI,CAACD,KAAK;AACR,aAAO;IACT;AAEA,UAAME,QAAQC,IAAIH,KAAKH,IAAAA;AACvB,QAAI,OAAOK,UAAU,YAAYA,MAAME,UAAUL,KAAK;AACpD,aAAO;IACT;AAGA,WAAOM,EAAEC,UAAUN,KAAKH,KAAKU,MAAK,GAAIR,GAAAA;EACxC;EAEAS,YAAY,CAACC,WAAAA;AACX,QAAIA,WAAW,IAAI;AACjB,aAAO;IACT;AAEA,UAAMT,MAAMJ,OAAOK,QAAO;AAC1B,QAAI,CAACD,KAAK;AACR,aAAO;IACT;AAEA,QAAIS,WAAW,OAAO;AACpB,YAAMP,QAAQC,IAAIH,KAAKH,IAAAA;AACvB,UAAI,OAAOK,UAAU,UAAU;AAC7B,eAAOA,MAAME;MACf,OAAO;AACL,eAAO;MACT;IACF;AAGA,WAAOC,EAAEK,kBAAkBV,KAAKH,KAAKU,MAAK,GAAIE,MAAAA;EAChD;AACF;;;AC7CA,SAASE,YAAYC,mBAAwE;AAUtF,IAAMC,UAAU,CAACC,OAAoBC,UAAqCD,MAAMC,MAAMA,KAAAA,EAAOC;AAC7F,IAAMC,eAAe,CAACH,OAAoBC,UAAoCD,MAAMC,MAAMA,KAAAA,EAAOG;AAMjG,IAAMC,oBAAoBC,YAAYC,OAAoB,CAAC,CAAA;AAE3D,IAAMC,cAAc,CAACC,aAA8CJ,kBAAkBK,GAAG;EAAED;AAAS,CAAA;AAEnG,IAAME,sBAAsBC,WAAWL,OAAM;AAE7C,IAAMM,cAAc,CAACC,OAAAA;AAC1B,SAAO,CAAC,CAACA,GAAGC,WAAWJ,mBAAAA;AACzB;;;ACtBA,SAASK,QAAQC,UAAS;;;ACD1B,SAASC,QAAQC,UAAqB;AAI/B,IAAMC,kBAAkB,CAC7BC,OACAC,QACAC,cACAC,UAAAA;AAEA,QAAM,EAAEC,WAAWC,KAAI,IAAKF,MAAMH,MAAMA,KAAAA;AAIxC,MAAIM,aAAa;AACjB,aAAWC,MAAML,cAAc;AAC7BK,OAAGC,QAAQC,YAAY,MAAA;AACrBH,mBAAa;IACf,CAAA;EACF;AAEA,MAAI,CAACA,YAAY;AACf,WAAOI;EACT;AAEA,QAAMC,WAAWV,OAAOW,SAASR,WAAW,CAACS,QAAAA;AAC3C,UAAMC,uBAAsE,CAAA;AAC5E,eAAWP,MAAML,cAAc;AAC7BK,SAAGC,QAAQC,YAAY,CAACM,OAAOC,KAAKC,QAAQC,MAAMC,WAAAA;AAChDL,6BAAqBM,KAAK;UAAEC,MAAMN;UAAOO,KAAKN,MAAMD;UAAOI;QAAO,CAAA;MACpE,CAAA;IACF;AAGAL,yBAAqBS,QAAO,EAAGC,QAAQ,CAAC,EAAEH,MAAMC,KAAKH,OAAM,MAAE;AAC3DM,MAAAA,GAAEC,OAAOb,KAAKR,KAAKsB,MAAK,GAAIN,MAAMC,KAAKH,OAAOS,SAAQ,CAAA;IACxD,CAAA;EACF,CAAA;AAEA,SAAOjB,YAAYD;AACrB;;;AC1CA,SAASmB,iBAA0E;AAc5E,IAAMC,mBAAmB,CAACC,MAAkBC,WAA4BC,QAAgBC,YAAAA;AAC7F,aAAWC,SAASD,SAAS;AAC3B,UAAME,aAAaC,YAAYF,OAAOF,QAAQF,KAAKO,KAAK;AACxD,QAAIF,cAAc,MAAM;AACtB,YAAMG,YAAYC,UAAUC,GAAGL,YAAYL,KAAKO,MAAMI,IAAIC,QAAQ,IAAA;AAClEX,kBAAYA,UAAUY,IAAIL,WAAW,CAAA;AACrCR,WAAKc,SAAS;QACZC,SAASP;QACTQ,aAAaC,oBAAoBP,GAAG,KAAA;MACtC,CAAA;IACF;EACF;AAEAV,OAAKc,SAAS;IACZb;IACAe,aAAaC,oBAAoBP,GAAG,KAAA;EACtC,CAAA;AACF;AAEA,IAAMJ,cAAc,CAACF,OAAcF,QAAgBK,UAAAA;AACjD,MAAIH,MAAMc,WAAW,UAAU;AAC7B,WAAOC,aAAajB,QAAQE,KAAAA;EAC9B,WAAWA,MAAMc,WAAW,UAAU;AACpC,WAAOE,aAAalB,QAAQE,KAAAA;EAC9B,WAAWA,MAAMc,WAAW,OAAO;AACjC,WAAOG,UAAUnB,QAAQE,KAAAA;EAC3B,WAAWA,MAAMc,WAAW,OAAO;AACjC,WAAOI,UAAUpB,QAAQE,OAAOG,KAAAA;EAClC,OAAO;AACL,WAAO;EACT;AACF;AAEA,IAAMY,eAAe,CAACjB,QAAgBE,UAAAA;AACpC,QAAMmB,QAAQC,SAAStB,QAAQE,MAAMqB,IAAI;AACzC,MAAIF,SAAS,MAAM;AACjB,WAAO,CAAA;EACT;AAEA,QAAMG,OAAOtB,MAAMuB,OAAOd,IAAI,CAACe,UAAWA,QAAQA,MAAMC,SAAQ,IAAK,EAAA,EAAKC,KAAK,EAAA;AAC/E,SAAO;IAAC;MAAEC,MAAMR;MAAOS,IAAIT;MAAOU,QAAQP;IAAK;;AACjD;AAEA,IAAMN,eAAe,CAAClB,QAAgBE,UAAAA;AACpC,QAAMmB,QAAQC,SAAStB,QAAQE,MAAMqB,IAAI;AACzC,MAAIF,SAAS,MAAM;AACjB,WAAO,CAAA;EACT;AAEA,SAAO;IAAC;MAAEQ,MAAMR;MAAOU,QAAQ7B,MAAMwB;IAAM;;AAC7C;AAEA,IAAMP,YAAY,CAACnB,QAAgBE,UAAAA;AACjC,QAAMmB,QAAQC,SAAStB,QAAQE,MAAMqB,IAAI;AACzC,MAAIF,SAAS,MAAM;AACjB,WAAO,CAAA;EACT;AAEA,QAAMX,SAASR,MAAMQ,UAAU;AAC/B,SAAO;IAAC;MAAEmB,MAAMR;MAAOS,IAAIT,QAAQX;IAAO;;AAC5C;AAEA,IAAMU,YAAY,CAACpB,QAAgBE,OAAiBG,UAAAA;AAClD,QAAMgB,QAAQC,SAAStB,QAAQ;OAAIE,MAAMqB;IAAM;GAAE;AACjD,MAAIF,SAAS,MAAM;AACjB,WAAO,CAAA;EACT;AAEA,QAAMX,SAASL,MAAMI,IAAIC;AACzB,MAAI,OAAOR,MAAMwB,UAAU,UAAU;AACnC,WAAO,CAAA;EACT;AAEA,SAAO;IAAC;MAAEG,MAAM;MAAGC,IAAIpB;MAAQqB,QAAQ7B,MAAMwB;IAAa;;AAC5D;AAIA,IAAMJ,WAAW,CAACU,UAAkBC,kBAAAA;AAClC,MAAIA,cAAcvB,WAAWsB,SAAStB,SAAS,GAAG;AAChD,WAAO;EACT;AAEA,WAASwB,IAAI,GAAGA,IAAIF,SAAStB,QAAQwB,KAAK;AACxC,QAAIF,SAASE,CAAAA,MAAOD,cAAcC,CAAAA,GAAI;AACpC,aAAO;IACT;EACF;AAEA,QAAMb,QAAQY,cAAcA,cAAcvB,SAAS,CAAA;AACnD,MAAI,OAAOW,UAAU,UAAU;AAC7B,WAAOA;EACT;AAEA,SAAO;AACT;;;AFzFO,IAAMc,iBAAN,MAAMA;;EAIXC,YACmBC,SACAC,QACjB;SAFiBD,UAAAA;SACAC,SAAAA;SALXC,eAAe;EAMpB;EAEHC,UAAUC,MAAkB;AAC1B,QAAI,CAAC,KAAKF,cAAc;AACtB,WAAKA,eAAe;AACpB,WAAKG,YAAYD,IAAAA;AACjB,WAAKF,eAAe;IACtB;EACF;EAEQG,YAAYD,MAAkB;AACpC,UAAME,OAAOC,QAAQH,KAAKI,OAAO,KAAKP,MAAM;AAG5C,UAAMQ,WAAWC,aAAaN,KAAKI,OAAO,KAAKP,MAAM;AACrD,QAAIU,YAAYP,KAAKI,MAAMG;AAG3B,UAAMC,eAAeR,KAAKI,MAAMK,MAAM,KAAKZ,MAAM,EAAEa,yBAAyBC,OAAO,CAACC,OAAO,CAACC,YAAYD,EAAAA,CAAAA;AACxG,UAAME,WAAWN,aAAaO,MAAK,EAAGC,QAAO;AAC7C,eAAWC,MAAMH,UAAU;AACzB,YAAMI,WAAWD,GAAGE,QAAQC,OAAOH,GAAGI,WAAWC,GAAG;AACpDf,kBAAYA,UAAUgB,IAAIL,QAAAA;AAC1BlB,WAAKwB,SAAS;QACZL,SAASD;QACTO,aAAaC,oBAAoBC,GAAG,IAAA;MACtC,CAAA;IACF;AAIA,QAAIC,WAAWC,gBAAgB,KAAKhC,QAAQ,KAAKD,SAASY,cAAcR,KAAKI,KAAK;AAClF,QAAIwB,aAAa,QAAQA,aAAaE,QAAW;AAE/CF,iBAAWG,GAAEC,SAAS,KAAKpC,QAAQqC,QAAO,CAAA;IAC5C;AAGA,UAAMC,OAAOH,GAAEI,OAAO9B,UAAUuB,QAAAA,IAAY,CAAA,IAAKG,GAAEG,KAAK,KAAKtC,QAAQqC,QAAO,GAAK5B,UAAUuB,QAAAA;AAC3FQ,qBAAiBpC,MAAMO,WAAWL,MAAMgC,IAAAA;AAGxClC,SAAKwB,SAAS;MACZa,SAASC,YAAYV,QAAAA;MACrBH,aAAaC,oBAAoBC,GAAG,KAAA;IACtC,CAAA;EACF;AACF;;;AH1DO,IAAMY,YAAY,CAAC,EAAEC,QAAQC,KAAI,MAAoB;AAC1D,QAAMC,YAAYC,YAAWC,OAAc;IACzCC,QAAQ,OAAO;MACbJ,MAAMA,KAAKK,MAAK;MAChBC,WAAWC,GAAEC,SAAST,OAAOU,QAAO,CAAA;MACpCC,0BAA0B,CAAA;IAC5B;IAEAC,QAAQ,CAACC,OAAOC,OAAAA;AACd,YAAMC,SAAgB;QACpBd,MAAMA,KAAKK,MAAK;QAChBC,WAAWM,MAAMN;QACjBI,0BAA0BE,MAAMF,yBAAyBL,MAAK;MAChE;AAEA,UAAIU,oBAAoB;AACxB,iBAAWC,UAAUH,GAAGI,SAAS;AAC/B,YAAID,OAAOE,GAAGC,iBAAAA,GAAoB;AAChCL,iBAAOR,YAAYU,OAAOJ,MAAMQ;AAChCL,8BAAoB;QACtB;MACF;AAEA,UAAIA,mBAAmB;AACrBD,eAAOJ,2BAA2B,CAAA;MACpC,OAAO;AACL,YAAI,CAACW,YAAYR,EAAAA,GAAK;AACpBC,iBAAOJ,yBAAyBY,KAAKT,EAAAA;QACvC;MACF;AAEA,aAAOC;IACT;EACF,CAAA;AAEA,QAAMS,YAAY,IAAIC,eAAezB,QAAQE,SAAAA;AAE7C,SAAO;IACLwB,OAAOC,UAAUC,GAAGC,gBAAgB7B,QAAQC,IAAAA,CAAAA;IAC5CC;;IAGA4B,WAAWC,UACT,MAAA;MACEC,YAA6BC,OAAmB;aAAnBA,QAAAA;AAC3BjC,eAAOkC,YAAY,UAAU,KAAKC,cAAcC,KAAK,IAAI,CAAA;MAC3D;MAEAC,UAAU;AACRrC,eAAOsC,eAAe,UAAU,KAAKH,cAAcC,KAAK,IAAI,CAAA;MAC9D;MAEAD,gBAAgB;AACdX,kBAAUe,UAAU,KAAKN,KAAK;MAChC;IACF,CAAA;;IAIFO,YAAWC,eAAeb,GAAG,CAAC,EAAEc,MAAMC,QAAO,MAAE;AAC7C,UAAI,CAACA,QAAQC,OAAO;AAClBpB,kBAAUe,UAAUG,IAAAA;MACtB;IACF,CAAA;;;;IAKAG,gBAAgBjB,GAAG,CAACd,OAAAA;AAElB,YAAMI,UAA8B,CAAA;AACpC,UAAI,CAACJ,GAAG6B,QAAQC,OAAO;AACrB9B,WAAG6B,QAAQG,YAAY,CAACC,OAAOC,KAAKC,OAAOC,KAAKC,aAAAA;QAEhD,CAAA;MACF;AAEA,aAAOjC;IACT,CAAA;;AAEJ;;;AMlGA,SAASkC,cAAAA,aAAYC,SAAAA,QAAuBC,gBAA4B;AACxE,SACEC,cAAAA,aAEAC,cAAAA,aAEAC,cAAAA,aAEAC,kBACK;AAEP,SAASC,aAAa;AACtB,SAASC,eAAe;AAcxB,IAAMC,gBAAmC;EACvCC,mBAAmB,IAAIC,MAAAA;EAEvBC,MAAM,MAAA;EAAO;EACbC,OAAO,MAAA;EAAO;EAEdC,iBAAiB,MAAM,CAAA;EACvBC,QAAQ,MAAA;EAAO;AACjB;AAEO,IAAMC,oBAAoBC,OAAMC,OAA6C;EAClFC,SAAS,CAACC,cAAcA,UAAU,CAAA,KAAMX;AAC1C,CAAA;AAGA,IAAMY,mCAAmCC,YAAWJ,OAAM;AAuBnD,IAAMK,YAAY,CAACC,WAAWf,kBAAa;AAChD,SAAO;IACLO,kBAAkBS,GAAGD,QAAAA;IACrBE,YAAWC,UAAUC,2BAA2B;MAC9CC,aAAa,CAACC,UAAUA,MAAMD;IAChC,CAAA;IACAE;;AAEJ;AAKO,IAAMH,4BAAN,MAAMA;EAUXI,YAAYC,MAAkB;AATvBJ,uBAA6BK,SAAST,GAAG,CAAA,CAAE;AAEjCU,gBAAO,IAAIC,QAAAA;AAIpBC,uBAAuBC;AACvBC,qBAAqBD;AAG3B,SAAKE,mBAAmBP,KAAKQ,MAAMC,MAAMC,OAAOC,SAAS;AACzD,SAAKC,YAAYZ,KAAKQ,MAAMC,MAAM1B,iBAAAA;AAClC,SAAK6B,UAAUjC,KAAI;AACnB,SAAKiC,UAAUnC,kBAAkBoC,GAAG,KAAKX,MAAM,MAAA;AAC7CF,WAAKc,SAAS;QAAEC,aAAa;UAAC3B,iCAAiCI,GAAG,CAAA,CAAE;;MAAG,CAAA;IACzE,CAAA;EACF;EAEAwB,UAAU;AACR,SAAK,KAAKd,KAAKe,QAAO;AACtB,SAAKL,UAAUhC,MAAK;EACtB;EAEAE,OAAOA,SAAoB;AACzB,SAAKoC,sBAAsBpC,OAAAA;AAC3B,SAAKqC,wBAAwBrC,OAAAA;EAC/B;EAEQoC,sBAAsBpC,SAAoB;AAChD,UAAMsC,WAAWtC,QAAOkB,KAAKoB,YAAYtC,QAAOkB,KAAKqB,IAAIC,cAAcF,SAAQ;AAC/E,UAAM,EAAEG,SAASlB,QAAWmB,OAAOnB,OAAS,IAAKe,WAAWtC,QAAO0B,MAAMiB,UAAUC,OAAO,CAAC;AAC3F,QAAI,KAAKtB,gBAAgBmB,UAAU,KAAKjB,cAAckB,MAAM;AAC1D;IACF;AAEA,SAAKpB,cAAcmB;AACnB,SAAKjB,YAAYkB;AAEjB,SAAKZ,UAAU9B,OACbyC,WAAWlB,UAAamB,SAASnB,SAC7B;MACEkB,QAAQ,KAAKhB,iBAAiBoB,SAASJ,MAAAA;MACvCC,MAAM,KAAKjB,iBAAiBoB,SAASH,IAAAA;IACvC,IACAnB,MAAAA;EAER;EAEQc,wBAAwBrC,SAAoB;AAClD,UAAMc,cAAmC,CAAA;AACzC,UAAMgC,kBAAkB,KAAKhB,UAAU/B,gBAAe;AACtD,eAAW2B,SAASoB,iBAAiB;AACnC,YAAML,SAASf,MAAMqB,UAAUN,SAAS,KAAKhB,iBAAiBuB,WAAWtB,MAAMqB,SAASN,MAAM,IAAI;AAClG,YAAMC,OAAOhB,MAAMqB,UAAUL,OAAO,KAAKjB,iBAAiBuB,WAAWtB,MAAMqB,SAASL,IAAI,IAAI;AAC5F,UAAID,UAAU,QAAQC,QAAQ,MAAM;AAClC;MACF;AAEA,YAAMO,QAAQC,KAAKC,IAAID,KAAKC,IAAIV,QAAQC,IAAAA,GAAO1C,QAAOkB,KAAKQ,MAAM0B,IAAIC,MAAM;AAC3E,YAAMC,MAAMJ,KAAKC,IAAID,KAAKK,IAAId,QAAQC,IAAAA,GAAO1C,QAAOkB,KAAKQ,MAAM0B,IAAIC,MAAM;AAEzE,YAAMG,YAAYxD,QAAOkB,KAAKQ,MAAM0B,IAAIK,OAAOR,KAAAA;AAC/C,YAAMS,UAAU1D,QAAOkB,KAAKQ,MAAM0B,IAAIK,OAAOH,GAAAA;AAG7C,YAAMK,QAAQjC,MAAMkC,KAAKD,SAAS;AAClC,YAAME,aAAanC,MAAMkC,KAAKC,cAAcF,QAAQ;AAEpD,UAAIH,UAAUM,WAAWJ,QAAQI,QAAQ;AAEvChD,oBAAYiD,KAAK;UACfC,MAAMf;UACNgB,IAAIX;UACJvC,OAAOmD,YAAWC,KAAK;YACrBC,YAAY;cAAEC,OAAO,qBAAqBR,UAAAA;YAAa;YACvDS,OAAO;UACT,CAAA;QACF,CAAA;MACF,OAAO;AAELxD,oBAAYiD,KAAK;UACfC,MAAMf;UACNgB,IAAIT,UAAUQ,OAAOR,UAAUH;UAC/BtC,OAAOmD,YAAWC,KAAK;YACrBC,YAAY;cAAEC,OAAO,qBAAqBV,KAAAA;YAAQ;YAClDW,OAAO;UACT,CAAA;QACF,CAAA;AAGAxD,oBAAYiD,KAAK;UACfC,MAAMN,QAAQM;UACdC,IAAIX;UACJvC,OAAOmD,YAAWC,KAAK;YACrBC,YAAY;cAAEC,OAAO,qBAAqBV,KAAAA;YAAQ;YAClDW,OAAO;UACT,CAAA;QACF,CAAA;AAEA,iBAASC,IAAIf,UAAUM,SAAS,GAAGS,IAAIb,QAAQI,QAAQS,KAAK;AAC1D,gBAAMC,UAAUxE,QAAOkB,KAAKQ,MAAM0B,IAAIqB,KAAKF,CAAAA,EAAGP;AAC9ClD,sBAAYiD,KAAK;YACfC,MAAMQ;YACNP,IAAIO;YACJzD,OAAOmD,YAAWO,KAAK;cACrBL,YAAY;gBAAEC,OAAO,qBAAqBV,KAAAA;gBAASW,OAAO;cAA0B;YACtF,CAAA;UACF,CAAA;QACF;MACF;AAEAxD,kBAAYiD,KAAK;QACfC,MAAMtB;QACNuB,IAAIvB;QACJ3B,OAAOmD,YAAWQ,OAAO;UACvBC,MAAMjC,OAAOD,SAAS,IAAI,KAAK;UAC/BmC,OAAO;UACPF,QAAQ,IAAIG,kBAAkBnD,MAAMkC,KAAKkB,eAAe,aAAanB,KAAAA;QACvE,CAAA;MACF,CAAA;IACF;AAEA,SAAK7C,cAAcoD,YAAWa,IAAIjE,aAAa,IAAA;EACjD;AACF;AAEA,IAAM+D,oBAAN,cAAgCG,WAAAA;EAC9B/D,YACmBgE,OACAC,QACjB;AACA,UAAK;SAHYD,QAAAA;SACAC,SAAAA;EAGnB;EAESC,QAAqB;AAC5B,UAAMC,OAAOC,SAASC,cAAc,MAAA;AACpCF,SAAKG,YAAY;AACjBH,SAAKf,MAAMmB,kBAAkB,KAAKN;AAClCE,SAAKf,MAAMoB,cAAc,KAAKP;AAE9B,UAAMQ,MAAML,SAASC,cAAc,KAAA;AACnCI,QAAIH,YAAY;AAEhB,UAAM3B,OAAOyB,SAASC,cAAc,KAAA;AACpC1B,SAAK2B,YAAY;AACjB3B,SAAK+B,YAAY,KAAKV;AAEtBG,SAAKQ,YAAYP,SAASQ,eAAe,QAAA,CAAA;AACzCT,SAAKQ,YAAYF,GAAAA;AACjBN,SAAKQ,YAAYP,SAASQ,eAAe,QAAA,CAAA;AACzCT,SAAKQ,YAAYhC,IAAAA;AACjBwB,SAAKQ,YAAYP,SAASQ,eAAe,QAAA,CAAA;AAEzC,WAAOT;EACT;EAESU,YAAY;AACnB,WAAO;EACT;EAESC,GAAGrB,QAAc;AACxB,WAAOA,OAAOQ,WAAW,KAAKA;EAChC;EAEA,IAAac,kBAAkB;AAC7B,WAAO;EACT;EAESC,cAAc;AACrB,WAAO;EACT;AACF;AAEA,IAAMjF,UAASkF,YAAWC,UAAU;EAClC,wBAAwB,CAAC;EACzB,4BAA4B;IAC1BC,SAAS;IACTC,QAAQ;EACV;EACA,6BAA6B;IAC3BtD,UAAU;IACVuD,YAAY;IACZC,aAAa;IACbC,YAAY;IACZC,aAAa;IACbC,WAAW;IACXC,SAAS;IACTC,QAAQ;EACV;EACA,gCAAgC;IAC9BC,cAAc;IACd9D,UAAU;IACV+D,OAAO;IACPC,QAAQ;IACRC,KAAK;IACLC,MAAM;IACNzB,iBAAiB;IACjB0B,YAAY;IACZR,WAAW;EACb;EACA,kEAAkE;IAChES,WAAW;IACXC,iBAAiB;EACnB;EACA,4BAA4B;IAC1BrE,UAAU;IACVoE,WAAW;IACXH,KAAK;IACLC,MAAM;IACNI,UAAU;IACVC,YAAY;IACZC,WAAW;IACXC,YAAY;IACZC,YAAY;IACZC,YAAY;IACZ/D,OAAO;IACPyC,SAAS;IACTuB,QAAQ;IACRT,YAAY;IACZ1B,iBAAiB;IACjBqB,cAAc;;IAEde,SAAS;IACTC,iBAAiB;IACjBC,YAAY;EACd;EACA,8DAA8D;IAC5DF,SAAS;IACTC,iBAAiB;EACnB;AACF,CAAA;;;ACpTA,SAASE,qBAAqB;AAC9B,SAASC,eAAe;AACxB,SAASC,iBAAiBC,uBAAuBC,0BAA0B;AAE3E,SAASC,6BAA6B;AACtC,SAASC,eAAeC,cAAAA,aAAYC,qBAAqBC,mBAAmB;AAG5E,SAASC,cAAAA,mBAAkB;AAQpB,IAAMC,oBAAoB,CAAC,EAChCC,WACAC,aAAaC,cACbC,eAAe,KAAI,IACG,CAAC,MACvB;EACEA,gBAAgBC,YAAWD;;EAG3BE,gBAAAA;EACAC,cAAAA;EACAC,cAAAA;EACAC,oBAAAA;EACAC,QAAAA;EACAP,gBAAgBD,YAAYC,YAAAA;;EAG5BF,cAAc,SAASU,mBAAmBC,qBAAAA,IAAyBD,mBAAmBE,qBAAAA;EACtFC,OAAOC,WAAAA;;;AC9BX,SAASC,cAAAA,aAAYC,UAAAA,eAAc;AACnC,OAAOC,kBAAkB;AAEzB,SAASC,iBAAiB;;AAenB,IAAMC,iBAA+B;EAC1CC,QAAQ;EACRC,cAAc;EACdC,iBAAiB;EACjBC,sBAAsB;EACtBC,cAAc;IAAEC,KAAK;IAAGC,KAAK;EAAE;EAC/BC,kBAAkB;IAAEF,KAAK;IAAGC,KAAK;EAAG;EACpCE,uBAAuB;IAAEC,GAAG;MAAC;MAAI;;IAAIC,GAAG;MAAC;MAAM;;EAAM;EACrDC,oBAAoB;EACpBC,gBAAgB;AAClB;AAEO,IAAMC,QAAQ,CAACC,UAAiCf,mBAAc;AACnE,MAAIgB;AACJ,MAAIC,OAAO;AAEX,QAAMC,WAAW,CAACC,MAAkBC,QAAAA;AAClC,UAAM,EAAEC,MAAMX,IAAI,GAAGY,KAAKX,IAAI,EAAC,IAAKQ,KAAKI,cAAcH,GAAAA,KAAQ,CAAC;AAChE,UAAMI,UAAUC,SAASC,iBAAiBhB,GAAGC,CAAAA;AAE7C,UAAM,EAAEgB,YAAYN,OAAO,GAAGO,WAAWN,OAAM,EAAC,IAAKH,KAAKU,UAAUC,iBAAiB,CAAC;AACtF,UAAMC,QAAQ;MAAErB,GAAGA,IAAIW;MAAMV,GAAGA,IAAIW;IAAI;AAExC,WAAO;MAAEE;MAASO;IAAM;EAC1B;AAEA,SAAO;;IAELnC,YAAWoC,eAAeC,GAAG,CAACC,YAAAA;AAE5B,UAAIlB,SAASmB,SAASD,QAAOf,KAAKU,WAAW;AAC3C,YAAIb,SAAS;AACXA,kBAAQoB,QAAO;QACjB;AAEApB,kBAAU,IAAIqB,QACZH,QAAOf,KAAKU,WACZ/B,aACE;UACEK,iBAAiB;UACjBS,oBAAoB;UACpB0B,OAAO,MAAM;YAAC,MAAMC,KAAKC,OAAM,IAAK;YAAK;YAAG;;QAC9C,GACAzB,SACAf,cAAAA,CAAAA;AAGJgB,gBAAQyB,WAAU;AAClBzB,gBAAQ0B,MAAK;MACf,OAAO;AACL1B,gBAAQ2B,OAAM;MAChB;AAEA,YAAMC,UAAUV,QAAOW,MAAMC,UAAUC,KAAKC;AAC5C,UAAIJ,YAAY3B,MAAM;AACpBA,eAAO2B;AAEP,cAAM,EAAEpB,SAASO,MAAK,IAAKb,SAASgB,QAAOf,MAAMyB,UAAU,CAAA;AAC3D,YAAIpB,WAAWO,OAAO;AACpBf,kBAAQiC,MAAM;YAAEzB;YAASO;UAAM,CAAA;QACjC;MACF;IACF,CAAA;IAEAlC,QAAOoC,GAAG;MACR;QACEiB,KAAK,CAACC,GAAGC,UAAAA;AACP,cAAIpC,SAAS;AACX,gBAAIoC,MAAMC,QAAQ,WAAWD,MAAME,UAAU;AAC3CtC,sBAAQuC,MAAM;gBAAEC,MAAM;cAAI,CAAA;AAC1B,qBAAO;YACT;UACF;AAEA,iBAAO;QACT;MACF;KACD;;AAEL;AAMA,IAAMnB,UAAN,MAAMA;EAgBJoB,YACmBC,OACAC,UACjB;SAFiBD,QAAAA;SACAC,WAAAA;SAZnBC,WAAW;SAEXC,aAAa;SACbC,gBAAgB;SAEhBC,aAAyB,CAAA;SACzBC,mBAAmB;SAEnBC,aAAa;MAAEvD,GAAG;MAAGC,GAAG;IAAE;SA2F1B4C,QAAQW,SAA2B,CAAC,EAAEV,KAAI,MAAE;AAC1C,WAAKK,aAAa,KAAKC,iBAAiBN;AACxC,WAAKM,gBAAgBN;IACvB,GAAG,GAAA;SAEHP,QAAQiB,SAAgE,CAAC,EAAE1C,SAASO,MAAK,MAAE;AACzF,YAAMO,QAAQ6B,iBAAiB3C,SAAS,KAAKmC,SAASrB,KAAK;AAC3D,YAAM8B,eAAe5B,OAAO,KAAKmB,SAASnD,iBAAiBF,KAAK,KAAKqD,SAASnD,iBAAiBD,GAAG;AAClG,YAAM8D,MAAM,KAAKJ,WAAWvD,MAAMqB,MAAMrB,IAAI,IAAI,KAAKuD,WAAWvD,IAAIqB,MAAMrB,IAAI,IAAI;AAClF,WAAKuD,aAAalC;AAClB,eAASuC,IAAIF,cAAcE,KAAKA,IAAI,GAAG;AACrC,aAAKP,WAAW,KAAKC,gBAAgB,IAAI,KAAKO,QAAQC,OAAOzC,MAAMrB,IAAI2D,MAAM,IAAItC,MAAMpB,GAAG2B,KAAAA;AAC1F,aAAK0B,oBAAoB,KAAKA,mBAAmB,KAAK,KAAKL,SAASzD;MACtE;IACF,GAAG,GAAA;AAnGD,SAAKqE,UAAU,KAAKZ,SAAS1D,WAAW,IAAI,IAAIwE,QAAQd,QAAAA,IAAY,IAAIe,QAAQf,QAAAA;EAClF;EAEA,IAAIxB,OAAO;AACT,WAAO,KAAKuB;EACd;EAEAjB,aAAa;AAEX1C,cAAU,CAAC,KAAK4E,WAAW,CAAC,KAAKC,MAAI,QAAA;;;;;;;;;AAErC,SAAKD,UAAUlD,SAASoD,cAAc,QAAA;AACtC,SAAKF,QAAQG,KAAK;AAClB,SAAKH,QAAQI,MAAMC,WAAW;AAC9B,SAAKL,QAAQI,MAAME,SAAS;AAC5B,SAAKN,QAAQI,MAAMG,gBAAgB;AAGnC,SAAKN,OAAO,KAAKD,QAAQQ,WAAW,IAAA;AAEpC,UAAMC,SAAS,KAAK1B,MAAM5B,eAAeA;AACzCsD,YAAQC,YAAY,KAAKV,OAAO;AAEhC,SAAKhC,OAAM;EACb;EAEAP,UAAU;AACR,SAAKkD,KAAI;AAET,QAAI,KAAKX,SAAS;AAChB,WAAKA,QAAQY,OAAM;AACnB,WAAKZ,UAAUa;AACf,WAAKZ,OAAOY;IACd;EACF;EAEA7C,SAAS;AACP,QAAI,KAAKe,MAAM5B,iBAAiB,KAAK6C,SAAS;AAC5C,YAAM,EAAEhD,YAAYjB,GAAGkB,WAAWjB,GAAG8E,aAAaC,OAAOC,cAAcC,OAAM,IAAK,KAAKlC,MAAM5B;AAC7F,WAAK6C,QAAQI,MAAMzD,MAAM,GAAGX,CAAAA;AAC5B,WAAKgE,QAAQI,MAAM1D,OAAO,GAAGX,CAAAA;AAC7B,WAAKiE,QAAQe,QAAQA;AACrB,WAAKf,QAAQiB,SAASA;IACxB;EACF;EAEAlD,QAAQ;AAEN3C,cAAU,KAAK4E,WAAW,KAAKC,MAAI,QAAA;;;;;;;;;AACnC,SAAKhB,WAAW;AAChB,SAAKiC,KAAI;EACX;EAEAP,OAAO;AAEL,SAAK1B,WAAW;AAChB,SAAKF,MAAMqB,MAAMe,YAAY;EAC/B;EAEAD,OAAO;AACL,QAAI,CAAC,KAAKjC,YAAY,CAAC,KAAKe,WAAW,CAAC,KAAKC,MAAM;AACjD;IACF;AAEA,SAAKA,KAAKmB,UAAU,GAAG,GAAG,KAAKpB,QAAQe,SAAS,GAAG,KAAKf,QAAQiB,UAAU,CAAA;AAG1E,UAAMI,OAAM,oBAAIC,KAAAA,GAAOC,QAAO;AAC9B,SAAKC,cAAcH;AACnB,UAAMI,MAAMJ,MAAM,KAAKG,aAAa;AACpC,SAAKA,YAAYH;AAEjB,QAAI,KAAKnC,aAAa,GAAG;AACvB,WAAKA,cAAcuC;AACnB,YAAMC,YAAa,KAAKxC,aAAa,KAAKC,gBAAiB,KAAKH,SAAS9C;AACzE,YAAMyF,SAAS9D,OAAO,CAAC6D,WAAWA,SAAAA;AAClC,YAAME,SAAS/D,OAAO,CAAC6D,WAAWA,SAAAA;AAClC,WAAK3C,MAAOqB,MAAMe,YAAY,aAAaQ,MAAAA,MAAYC,MAAAA;IACzD;AAEA,SAAKC,cAAa;AAElBC,0BAAsB,KAAKZ,KAAKa,KAAK,IAAI,CAAA;EAC3C;EAkBAF,gBAAgB;AACd,aAASlC,IAAI,KAAKP,WAAW4C,QAAQrC,KAAKA,IAAI,GAAG;AAC/C,YAAMsC,WAAW,KAAK7C,WAAWO,CAAAA;AACjC,UAAI,CAACsC,UAAU;AACb;MACF;AAEA,UAAIA,SAASC,QAAQ,QAAQD,SAASE,QAAQ,KAAK;AACjD;MACF;AAEA,WAAKvC,QAAQrC,OAAO,KAAK0C,MAAOgC,QAAAA;IAClC;EACF;AACF;AAmBA,IAAeG,SAAf,MAAeA;EACbtD,YAA+BE,UAAwB;SAAxBA,WAAAA;EAAyB;AAG1D;AAEA,IAAMc,UAAN,cAAsBsC,OAAAA;EACpBvC,OAAO9D,GAAWC,GAAW2B,OAA0B;AACrD,WAAO;MACL5B;MACAC,GAAGA,IAAI;MACPqG,IAAIxE,OAAO,KAAKmB,SAASlD,sBAAsBC,EAAE,CAAA,GAAI,KAAKiD,SAASlD,sBAAsBC,EAAE,CAAA,CAAE;MAC7FuG,IAAIzE,OAAO,KAAKmB,SAASlD,sBAAsBE,EAAE,CAAA,GAAI,KAAKgD,SAASlD,sBAAsBE,EAAE,CAAA,CAAE;MAC7FmG,MAAMtE,OAAO,KAAKmB,SAAStD,aAAaC,KAAK,KAAKqD,SAAStD,aAAaE,GAAG;MAC3E+B;MACAuE,OAAO;IACT;EACF;EAEA3E,OAAOgF,KAA+BN,UAAoB;AACxDA,aAASK,MAAM,KAAKtD,SAASxD;AAC7ByG,aAASlG,KAAKkG,SAASI;AACvBJ,aAASjG,KAAKiG,SAASK;AACvBL,aAASC,SAAS,KAAKlD,SAASvD;AAEhC8G,QAAIC,YAAY,QAAQP,SAAStE,MAAM,CAAA,CAAE,IAAIsE,SAAStE,MAAM,CAAA,CAAE,IAAIsE,SAAStE,MAAM,CAAA,CAAE,IAAIsE,SAASC,KAAK;AACrGK,QAAIE,SAAS7E,KAAK8E,MAAMT,SAASlG,IAAI,CAAA,GAAI6B,KAAK8E,MAAMT,SAASjG,IAAI,CAAA,GAAIiG,SAASE,MAAMF,SAASE,IAAI;EACnG;AACF;AAMA,IAAMpC,UAAN,cAAsBqC,OAAAA;EACpBvC,OAAO9D,GAAWC,GAAW2B,OAA0B;AACrD,WAAO;MACL5B;MACAC,GAAGA,IAAI;MACPqG,IAAIxE,OAAO,KAAKmB,SAASlD,sBAAsBC,EAAE,CAAA,GAAI,KAAKiD,SAASlD,sBAAsBC,EAAE,CAAA,CAAE;MAC7FuG,IAAIzE,OAAO,KAAKmB,SAASlD,sBAAsBE,EAAE,CAAA,GAAI,KAAKgD,SAASlD,sBAAsBE,EAAE,CAAA,CAAE;MAC7FmG,MAAMtE,OAAO,KAAKmB,SAAStD,aAAaC,KAAK,KAAKqD,SAAStD,aAAaE,GAAG;MAC3E+B;MACAuE,OAAO;MACPS,OAAQ9E,OAAO,GAAG,GAAA,IAAOD,KAAKgF,KAAM;MACpCC,MAAM;MACNC,QAAQ;IACV;EACF;EAEAvF,OAAOgF,KAA+BN,UAAoB;AACxDA,aAASK,MAAM,KAAKtD,SAASxD;AAC7ByG,aAASlG,KAAKkG,SAASI;AACvBJ,aAASjG,KAAKiG,SAASK;AACvBL,aAASI,MAAMJ,SAASY;AACxBZ,aAASK,MAAML,SAASY;AACxBZ,aAASU,SAAU9E,OAAO,MAAM,GAAA;AAChCoE,aAASI,MAAMzE,KAAKmF,IAAId,SAASU,KAAK,IAAK;AAC3CV,aAASK,MAAM1E,KAAKoF,IAAIf,SAASU,KAAK,IAAK;AAC3CV,aAASE,QAAQ,KAAKnD,SAAS/C;AAC/BgG,aAASC,SAAS,KAAKlD,SAASvD;AAEhC8G,QAAIC,YAAY,QAAQP,SAAStE,MAAM,CAAA,CAAE,IAAIsE,SAAStE,MAAM,CAAA,CAAE,IAAIsE,SAAStE,MAAM,CAAA,CAAE,IAAIsE,SAASC,KAAK;AACrGK,QAAIU,UAAS;AACbV,QAAIW,IAAItF,KAAK8E,MAAMT,SAASlG,IAAI,CAAA,GAAI6B,KAAK8E,MAAMT,SAASjG,IAAI,CAAA,GAAIiG,SAASE,MAAM,GAAG,IAAIvE,KAAKgF,EAAE;AAC7FL,QAAIY,KAAI;EACV;AACF;AAMA,SAAS5D,SAAY6D,UAA4BC,OAAa;AAC5D,MAAIC,OAAO;AACX,SAAO,YAAaC,MAAW;AAC7B,QAAI,CAACD,MAAM;AAETF,eAASI,MAAM,MAAMD,IAAAA;AACrBD,aAAO;AACPG,iBAAW,MAAA;AACTH,eAAO;MACT,GAAGD,KAAAA;IACL;EACF;AACF;AAEA,IAAM7D,mBAAmB,CAAChC,MAAeG,UAAAA;AACvC,MAAI,OAAOA,UAAU,YAAY;AAC/B,WAAOA,MAAAA;EACT;AAEA,QAAM+F,UAAUC,iBAAiBnG,IAAAA,EAAMG;AACvC,MAAI+F,SAAS;AACX,UAAM3H,IAAI2H,QAAQE,MAAM,qBAAA,GAAwBC,MAAM,CAAA;AACtD,QAAI9H,GAAG;AACL,aAAOA;IACT;EACF;AAEA,SAAO;IAAC;IAAI;IAAI;;AAClB;AAEA,IAAM8B,SAAS,CAAClC,KAAaC,QAAAA;AAC3B,MAAI,CAACA,KAAK;AACRA,UAAMD;AACNA,UAAM;EACR;AAEA,SAAOA,MAAM,CAAC,EAAEiC,KAAKC,OAAM,KAAMjC,MAAMD,MAAM;AAC/C;;;ACnXA,SAASmI,mBAAAA,wBAAuB;AAChC,SAAyBC,SAAAA,QAAOC,eAAAA,cAAaC,cAAAA,mBAA8C;AAC3F,SAASC,cAAcC,UAAAA,SAAsBC,cAAAA,aAAYC,cAAAA,mBAA6B;AACtF,OAAOC,YAAY;AACnB,SAASC,iBAAiB;AAE1B,SAASC,gBAAgB;AACzB,SAASC,mBAAmB;;;ACL5B,YAAYC,aAAY;AAExB,IAAMC,eAAe;EACnB;IAAEC,OAAO;IAAWC,OAAO;EAAY;EACvC;IAAED,OAAO;IAAWC,OAAO;EAAY;EACvC;IAAED,OAAO;IAAWC,OAAO;EAAY;EACvC;IAAED,OAAO;IAAWC,OAAO;EAAY;EACvC;IAAED,OAAO;IAAWC,OAAO;EAAY;EACvC;IAAED,OAAO;IAAWC,OAAO;EAAY;EACvC;IAAED,OAAO;IAAWC,OAAO;EAAY;EACvC;IAAED,OAAO;IAAWC,OAAO;EAAY;;AAIlC,IAAMC,cAAcH,aAAoBI,eAAM,IAAKJ,aAAaK,MAAM;;;AChB7E,SAASC,UAAU;AAMZ,IAAMC,WAAyC;EACpD,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;AACL;AAEO,IAAMC,UAAU,CAACC,UAAAA;AACtB,SAAOF,SAASE,KAAAA;AAClB;AAGO,IAAMC,QAAQ;AAEd,IAAMC,OAAOC,GAAG,uDAAuDF,KAAAA;AAIvE,IAAMG,OAAO;AACb,IAAMC,SAAS;AACf,IAAMC,gBAAgB;AAEtB,IAAMC,OAAO;AACb,IAAMC,WAAW;AAGjB,IAAMC,YAAYC,GAAGC,MAAM,MAAA;AAE3B,IAAMC,aAAaF,GAAG,0EAA0EG,KAAAA;;;ACpCvG,OAAOC,UAAS;AAGhB,SAASC,sBAA2C;AAO7C,IAAMC,SAAkCC,eAAe,CAAC,CAAA,EAAGC;AAE3D,IAAMC,WAAW,CAACC,MAAcC,eAAoBC,WAAcC,KAAIP,QAAQI,MAAMC,YAAAA;;;ACV3F,SAASG,WAAW;;AAMb,IAAMC,kBAAkB,CAAqBC,OACjD,IAAIC,SAAAA;AACH,MAAI;AACF,WAAOD,GAAAA,GAAMC,IAAAA;EACf,SAASC,KAAK;AACZJ,QAAIK,MAAMD,KAAAA,QAAAA;;;;;;EACZ;AACF;AAEK,IAAME,aAAa,CAACC,QAAAA;AACzB,QAAMC,UAAUD,IACbE,QAAQ,CAACC,OAAAA;AACR,QAAIA,GAAGF,QAAQG,OAAO;AACpB,aAAOC;IACT;AAEA,UAAMJ,WAAiB,CAAA;AACvBE,OAAGF,QAAQK,YAAY,CAACC,OAAOC,KAAKC,OAAOC,KAAKC,aAC9CV,SAAQW,KAAKC,KAAKC,UAAU;MAAEP;MAAOC;MAAKC;MAAOC;MAAKC,UAAUA,SAASI,SAAQ;IAAG,CAAA,CAAA,CAAA;AAGtF,WAAOd;EACT,CAAA,EACCe,OAAOC,OAAAA;AAEV,MAAIhB,QAAQiB,QAAQ;AAClBC,YAAQ1B,IAAI,WAAWQ,OAAAA;EACzB;AACF;;;AJrBA,IAAMmB,UAASC,YAAWC,UAAU;EAClC,kDAAkD;IAAEC,cAAc;EAAS;EAC3E,gDAAgD;IAAEA,cAAc;EAAe;EAC/E,sBAAsB;IACpBC,iBAAiBC,SAAS,yBAAA;EAC5B;EACA,8BAA8B;IAC5BD,iBAAiBC,SAAS,0BAAA;EAC5B;EACA,qBAAqB;IACnBC,OAAOD,SAAS,yBAAA;IAChBD,iBAAiBC,SAAS,0BAAA;EAC5B;EACA,6BAA6B;IAC3BC,OAAOD,SAAS,0BAAA;IAChBD,iBAAiBC,SAAS,0BAAA;EAC5B;AACF,CAAA;AAEA,IAAME,cAAcC,YAAWC,KAAK;EAAEC,OAAO;AAAa,CAAA;AAC1D,IAAMC,qBAAqBH,YAAWC,KAAK;EAAEC,OAAO;AAAqB,CAAA;AAkBlE,IAAME,eAAe,CAACC,MAAkBC,IAAYC,SAAS,SAAI;AACtE,QAAMC,UAAUH,KAAKI,MAAMC,MAAMC,aAAAA,EAAeC,SAASC,KAAK,CAACC,WAAUA,OAAMN,QAAQF,OAAOA,EAAAA;AAC9F,MAAI,CAACE,SAASA,QAAQO,QAAQ;AAC5B;EACF;AAEA,QAAMD,QAAQE,OAAOC,mBAAmBZ,KAAKI,OAAOD,QAAQA,QAAQO,MAAM;AAC1E,MAAID,OAAO;AACTT,SAAKa,SAAS;MACZC,WAAW;QAAEC,QAAQN,MAAMO;MAAK;MAChCC,SAAS;;QAEP7B,YAAW8B,eAAeT,MAAMO,MAAMd,SAAS;UAAEiB,GAAG;QAAS,IAAIC,MAAAA;QACjEC,aAAaC,GAAG;UAAEC,SAAStB;QAAG,CAAA;;IAElC,CAAA;EACF;AACF;AAEO,IAAMuB,cAAcC,aAAYC,OAAM;AAEtC,IAAML,eAAeI,aAAYC,OAAM;AAE9C,IAAMC,kBAAkBF,aAAYC,OAAM;AAM1C,IAAMpB,gBAAgBsB,YAAWF,OAAsB;EACrDG,QAAQ,OAAO;IAAEtB,UAAU,CAAA;IAAIO,WAAW,CAAC;EAAE;EAC7CgB,QAAQ,CAACC,OAAOC,OAAAA;AACd,eAAWC,UAAUD,GAAGf,SAAS;AAE/B,UAAIgB,OAAOC,GAAGb,YAAAA,GAAe;AAC3B,eAAO;UAAE,GAAGU;UAAOjB,WAAWmB,OAAOF;QAAM;MAC7C;AAGA,UAAIE,OAAOC,GAAGV,WAAAA,GAAc;AAC1B,cAAMjB,YAA2B0B,OAAOF,MACrCI,IAAI,CAAChC,YAAAA;AAEJ,cAAI,CAACA,QAAQO,QAAQ;AACnB,mBAAOU;UACT;AAEA,gBAAMX,QAAQE,OAAOC,mBAAmBoB,GAAG5B,OAAOD,QAAQO,MAAM;AAChE,iBAAOD,SAAS;YAAEN;YAASM;UAAM;QACnC,CAAA,EACC2B,OAAOC,WAAAA;AAEV,eAAO;UAAE,GAAGN;UAAOxB,UAAAA;QAAS;MAC9B;AAGA,UAAI0B,OAAOC,GAAGP,eAAAA,GAAkB;AAC9B,eAAOM,OAAOF;MAChB;IACF;AAEA,WAAOA;EACT;AACF,CAAA;AAKA,IAAMO,sBAAsBlD,YAAWmD,YAAYC,QAAQ;EAAClC;GAAgB,CAACF,UAAAA;AAC3E,QAAM,EACJU,WAAW,EAAES,QAAO,GACpBhB,UAAAA,UAAQ,IACNH,MAAMC,MAAMC,aAAAA;AAEhB,QAAMiC,cAAcE,OAAOlC,aAAY,CAAA,GAAI,CAACE,UAAUA,MAAMA,MAAMO,IAAI,GAClE0B,QAAQ,CAACvC,YAAAA;AACT,UAAMM,QAAQN,QAAQM;AACtB,QAAI,CAACA,SAASA,MAAMO,SAASP,MAAMkC,IAAI;AACrCC,cAAQC,KAAK,kBAAkBpC,KAAAA;AAC/B,aAAOW;IACT;AAEA,QAAIjB,QAAQA,QAAQF,OAAOsB,SAAS;AAClC,aAAOzB,mBAAmBW,MAAMA,MAAMO,MAAMP,MAAMkC,EAAE;IACtD,OAAO;AACL,aAAOjD,YAAYe,MAAMA,MAAMO,MAAMP,MAAMkC,EAAE;IAC/C;EACF,CAAA,EACCP,OAAOC,WAAAA;AAEV,SAAO1C,YAAWmD,IAAIP,WAAAA;AACxB,CAAA;AA+BA,IAAMQ,sBAAsB,CAACC,aAAAA;AAE3B,MAAIC,UAA6D;AAGjE,QAAMC,cAAc,CAACC,OAAcnD,SAAAA;AACjC,UAAMO,YAAWP,KAAKI,MAAMC,MAAMC,aAAAA;AAClC,UAAM,EAAE8C,KAAI,IAAKpD,KAAKI,MAAMU;AAC5B,UAAMuC,iBAAiB9C,UAASA,SAAS6B,OACvC,CAAC,EAAE3B,MAAK,MAAOA,MAAMO,QAAQoC,KAAKpC,QAAQP,MAAMkC,MAAMS,KAAKT,MAAMlC,MAAMO,OAAOP,MAAMkC,EAAE;AAGxF,QAAI,CAACU,eAAeC,QAAQ;AAC1BL,gBAAU;IACZ,OAAO;AACLA,gBAAU;QACRM,MAAMvD,KAAKI,MAAMoD,IAAIC,MAAML,KAAKpC,MAAMoC,KAAKT,EAAE;QAC7CpC,UAAU8C,eAAelB,IAAI,CAAC,EAAEhC,SAASM,MAAK,OAAQ;UACpDR,IAAIE,QAAQF;UACZe,MAAMP,MAAMO,OAAOoC,KAAKpC;UACxB2B,IAAIlC,MAAMkC,KAAKS,KAAKpC;QACtB,EAAA;MACF;IACF;EACF;AAEA,SAAO;IACL5B,YAAWsE,iBAAiB;MAC1BC,KAAKT;MACLU,MAAMV;IACR,CAAA;;IAGAW,iBAAgBvC,GAAG,CAACU,OAAAA;AAClB,YAAM,EAAEzB,UAAAA,UAAQ,IAAKyB,GAAG8B,WAAWzD,MAAMC,aAAAA;AACzC,YAAMW,UAA8B,CAAA;AACpCe,SAAG+B,QAAQC,kBAAkB,CAACC,OAAOC,QAAAA;AACnC,mBAAW,EACT/D,SAAS,EAAEF,GAAE,GACbQ,OAAO,EAAEO,MAAM2B,GAAE,EAAE,KAChBpC,WAAU;AACb,cAAIS,OAAO2B,MAAM3B,QAAQiD,SAAStB,MAAMuB,KAAK;AAC3CjD,oBAAQkD,KAAKC,qBAAqB9C,GAAG;cAAErB;cAAIe;cAAM2B;YAAG,CAAA,CAAA;UACtD;QACF;MACF,CAAA;AAEA,aAAO1B;IACT,CAAA;;IAGA7B,YAAWiF,eAAe/C,GAAG,CAACQ,YAAAA;AAC5B,YAAMwC,UAA4B,CAAA;AAElC,eAASC,IAAI,GAAGA,IAAIzC,QAAO0C,aAAalB,QAAQiB,KAAK;AACnD,cAAMvC,KAAKF,QAAO0C,aAAaD,CAAAA;AAC/B,iBAASE,IAAI,GAAGA,IAAIH,QAAQhB,QAAQmB,KAAK;AACvCH,kBAAQG,CAAAA,IAAKC,kBAAkBJ,QAAQG,CAAAA,GAAIzC,GAAG+B,OAAO;QACvD;AACA,mBAAW9B,UAAUD,GAAGf,SAAS;AAC/B,cAAIgB,OAAOC,GAAGkC,oBAAAA,GAAuB;AACnCE,oBAAQH,KAAKlC,OAAOF,KAAK;UAC3B;QACF;MACF;AAEA,UAAIkB,SAAS;AACX,cAAM0B,QAAQ7C,QAAO0C,aAAahE,KAAK,CAACwB,OAAOA,GAAG4C,YAAY,aAAA,CAAA;AAC9D,YAAID,OAAO;AACT,cAAIE,QAAQ;AACZF,gBAAMZ,QAAQe,YAAY,CAACb,OAAOC,KAAKa,OAAOC,KAAKzB,SAAAA;AACjD,gBAAIA,KAAK0B,GAAGhC,QAASM,IAAI,GAAG;AAC1B,uBAASgB,IAAIzC,QAAO0C,aAAaU,QAAQP,KAAAA,IAAU,GAAGJ,IAAIzC,QAAO0C,aAAalB,QAAQiB,KAAK;AACzFQ,wBAAQjD,QAAO0C,aAAaD,CAAAA,EAAGR,QAAQoB,OAAOJ,KAAAA;cAChD;AAEAF,sBAAQE;YACV;UACF,CAAA;AAEA,cAAIF,QAAQ,IAAI;AACd,uBAAWO,SAASnC,QAAQ1C,UAAU;AACpC+D,sBAAQH,KAAK;gBAAElE,IAAImF,MAAMnF;gBAAIe,MAAM6D,QAAQO,MAAMpE;gBAAM2B,IAAIkC,QAAQO,MAAMzC;cAAG,CAAA;YAC9E;UACF;AAEAM,oBAAU;QACZ;MACF;AAEA,iBAAW9C,WAAWmE,SAAS;AAC7B,cAAM,EAAE/D,UAAAA,UAAQ,IAAKuB,QAAOgC,WAAWzD,MAAMC,aAAAA;AAC7C,cAAM+E,SAAS9E,UAAS+E,KAAK,CAACC,MAAMA,EAAEpF,QAAQF,OAAOE,QAAQF,MAAMsF,EAAE9E,MAAMO,OAAOuE,EAAE9E,MAAMkC,EAAE;AAC5F,YAAI,CAAC0C,QAAQ;AACX,gBAAM3E,SAASC,OAAO6E,mBAAmB1D,QAAO1B,OAAOD,OAAAA;AACvD6C,mBAAS;YAAE/C,IAAIE,QAAQF;YAAIS;UAAO,CAAA;QACpC;MACF;IACF,CAAA;;AAEJ;AAEA,IAAMgE,oBAAoB,CAACvE,SAAyB4D,aAAyB;EAC3E9D,IAAIE,QAAQF;EACZe,MAAM+C,QAAQoB,OAAOhF,QAAQa,MAAM,CAAA;EACnC2B,IAAIoB,QAAQoB,OAAOhF,QAAQwC,IAAI,CAAA;AACjC;AAIA,IAAMyB,uBAAuB3C,aAAYC,OAAuB;EAAES,KAAKuC;AAAkB,CAAA;AAEzF,IAAMe,eAAeC,OAAMhE,OAAyC;EAClEiE,SAAS,CAACC,cAAcA,UAAU,CAAA;AACpC,CAAA;AAKO,IAAMC,gBAAyB,CAAC7F,SAAAA;AACrC,QAAM8F,UAAU9F,KAAKI,MAAM2F,MAAMN,YAAAA;AACjC,QAAM,EAAEzE,MAAM2B,GAAE,IAAK3C,KAAKI,MAAMU,UAAUsC;AAC1C,MAAIpC,SAAS2B,IAAI;AACf,WAAO;EACT;AAGA,MAAIA,OAAO3C,KAAKI,MAAMoD,IAAIF,QAAQ;AAChCtD,SAAKa,SAAS;MACZkD,SAAS;QACP/C,MAAM2B;QACNqD,QAAQ;MACV;IACF,CAAA;EACF;AAEA,QAAMtF,SAASC,OAAO6E,mBAAmBxF,KAAKI,OAAO;IAAEY;IAAM2B;EAAG,CAAA;AAChE,MAAIjC,QAAQ;AAEV,UAAMT,KAAK6F,QAAQG,WAAW;MAAEvF;MAAQM;MAAMkF,UAAUlG,KAAKmG,YAAYnF,IAAAA;IAAM,CAAA;AAC/E,QAAIf,IAAI;AAEND,WAAKa,SAAS;QACZI,SAASI,aAAaC,GAAG;UAAEC,SAAStB;QAAG,CAAA;QACvCa,WAAW;UAAEC,QAAQ4B;QAAG;MAC1B,CAAA;AAEA,aAAO;IACT;EACF;AAEA,SAAO;AACT;AAaO,IAAMpC,WAAW,CAACuF,UAA2B,CAAC,MAAC;AACpD,QAAM,EAAEM,KAAKC,WAAW,SAAQ,IAAKP;AAErC,QAAMQ,eAAeC,SAAS,CAACnG,UAAyB0F,QAAQU,WAAWpG,KAAAA,GAAQ,GAAA;AAEnF,SAAO;IACLqF,aAAanE,GAAGwE,OAAAA;IAChBxF;IACAgC;IACAnD;;;;IAKA2G,QAAQG,WACJQ,QAAOnF,GAAG;MACR;QACE8E,KAAKC;QACLK,KAAKC,gBAAgBd,aAAAA;MACvB;KACD,IACD,CAAA;;;;;IAMJC,QAAQc,UACJC,aACE,CAAC7G,MAAM8G,QAAAA;AACL,YAAMhG,YAAYd,KAAKI,MAAMU,UAAUsC;AACvC,UAAItC,aAAagG,OAAOhG,UAAUE,QAAQ8F,OAAOhG,UAAU6B,IAAI;AAC7D,eAAO;UACLmE,KAAKhG,UAAUE;UACf+F,KAAKjG,UAAU6B;UACfqE,OAAO;UACPnF,QAAQ,MAAA;AACN,kBAAMoF,KAAKC,SAASC,cAAc,KAAA;AAClCrB,oBAAQc,QAASK,IAAIZ,QAAAA;AACrB,mBAAO;cAAEe,KAAKH;cAAII,QAAQ;gBAAEC,GAAG;gBAAGnG,GAAG;cAAE;YAAE;UAC3C;QACF;MACF;AAEA,aAAO;IACT,GACA;;;MAGEoG,WAAW;IACb,CAAA,IAEF,CAAA;;;;IAKJnI,YAAWiF,eAAe/C,GAAG,CAAC,EAAEtB,MAAMI,OAAO2D,QAAO,MAAE;AACpD,UAAIyD,MAAM;AACV,YAAM,EAAEjH,UAAAA,WAAU,GAAGwB,MAAAA,IAAU3B,MAAMC,MAAMC,aAAAA;AAC3CyD,cAAQe,YAAY,CAAC9D,MAAM2B,IAAI8E,OAAOC,QAAAA;AACpCnH,QAAAA,UAASoH,QAAQ,CAAC,EAAExH,SAASM,MAAK,MAAE;AAElC,cAAIgH,UAAUC,KAAK;AACjB,kBAAME,WAAWjH,OAAOC,mBAAmBZ,KAAKI,OAAOD,QAAQO,MAAM;AACrE,gBAAI,CAACkH,YAAYA,SAASjF,KAAKiF,SAAS5G,SAAS,GAAG;AAClD8E,sBAAQ+B,WAAW;gBAAE5H,IAAIE,QAAQF;cAAG,CAAA;YACtC;UACF;AAGA,cAAIe,QAAQP,MAAMkC,IAAI;AACpB,kBAAMiF,WAAWjH,OAAOC,mBAAmBZ,KAAKI,OAAOD,QAAQO,MAAM;AACrEoH,mBAAOC,OAAOtH,OAAOmH,QAAAA;AACrBJ,kBAAM;UACR;QACF,CAAA;MACF,CAAA;AAEA,UAAIA,KAAK;AACPxH,aAAKa,SAAS;UAAEI,SAASU,gBAAgBL,GAAG;YAAEf,UAAAA;YAAU,GAAGwB;UAAM,CAAA;QAAG,CAAA;MACtE;IACF,CAAA;;;;IAKA3C,YAAWiF,eAAe/C,GAAG,CAAC,EAAEtB,MAAMI,MAAK,MAAE;AAC3C,UAAI4H,MAAMC;AACV,YAAM,EACJnH,WAAW,EAAES,SAAS2G,QAAO,GAC7B3H,UAAAA,UAAQ,IACNH,MAAMC,MAAMC,aAAAA;AAEhB,YAAM,EAAE6H,KAAI,IAAK/H,MAAMU,UAAUsC;AACjC,YAAMtC,YAA4B,CAAC;AACnCP,MAAAA,UAASoH,QAAQ,CAAC,EAAExH,SAASM,MAAK,MAAE;AAClC,YAAI0H,QAAQ1H,MAAMO,QAAQmH,QAAQ1H,MAAMkC,IAAI;AAC1C7B,oBAAUS,UAAUpB,QAAQF;AAC5Ba,oBAAUoH,UAAU9G;QACtB;AAEA,YAAI,CAACN,UAAUS,SAAS;AACtB,gBAAM6G,IAAIC,KAAKL,IAAIK,KAAKC,IAAIH,OAAO1H,MAAMO,IAAI,GAAGqH,KAAKC,IAAIH,OAAO1H,MAAMkC,EAAE,CAAA;AACxE,cAAIyF,IAAIJ,KAAK;AACXlH,sBAAUoH,UAAU/H,QAAQF;AAC5B+H,kBAAMI;UACR;QACF;MACF,CAAA;AAEA,UAAItH,UAAUS,YAAYA,WAAWT,UAAUoH,YAAYA,SAAS;AAClElI,aAAKa,SAAS;UAAEI,SAASI,aAAaC,GAAGR,SAAAA;QAAW,CAAA;AAGpDwF,qBAAa;UACXxF;UACAP,UAAUA,UAAS4B,IAAI,CAAC,EAAEhC,SAASM,MAAK,OAAQ;YAC9CN;YACAM;YACAyF,UAAUlG,KAAKmG,YAAY1F,MAAMO,IAAI;UACvC,EAAA;QACF,CAAA;MACF;IACF,CAAA;IAEA8E,QAAQ9C,WAAWD,oBAAoB+C,QAAQ9C,QAAQ,IAAI,CAAA;;AAE/D;AAKO,IAAMuF,cAAc,CAACvI,MAAyBO,YAAsB,CAAA,MAAE;AAC3EiI,YAAU,MAAA;AACR,QAAIxI,MAAM;AACRA,WAAKa,SAAS;QACZI,SAASO,YAAYF,GAAGf,SAAAA;MAC1B,CAAA;IACF;EACF,GAAG;IAACP;IAAMO;GAAS;AACrB;;;AKheA,SAASkI,cAAAA,mBAAkB;AAUpB,IAAMC,WAAW,CAAC,EAAEC,SAASC,SAAQ,MAAmB;AAC7D,QAAMC,aAA0B,CAAA;AAEhCF,aACEE,WAAWC,KACTC,YAAWC,kBAAkBC,GAAG,CAACC,GAAGC,YAAAA;AAClCR,YAAQQ,OAAAA;AACR,WAAO;EACT,CAAA,CAAA;AAGJP,cACEC,WAAWC,KACTC,YAAWK,eAAeH,GAAG,CAACI,YAAAA;AAC5BT,aAASS,QAAOC,MAAMC,IAAIC,SAAQ,CAAA;EACpC,CAAA,CAAA;AAGJ,SAAOX;AACT;;;AC9BA,SAASY,iBAAAA,gBAAeC,2BAA2B;AACnD,SAASC,WAAAA,UAASC,eAAeC,eAAeC,sBAAsB;AACtE,SAASC,oBAAAA,mBAAkBC,gBAAgB;AAC3C,SAASC,mBAAAA,kBAAiBC,yBAAAA,wBAAuBC,eAAeC,sBAAAA,2BAA0B;AAC1F,SAASC,iBAAiB;AAC1B,SAASC,oBAAoB;AAC7B,SAASC,mBAAmC;AAC5C,SAASC,yBAAAA,8BAA6B;AACtC,SACEC,iBACAC,iBAAAA,gBACAC,YACAC,cAAAA,aACAC,uBAAAA,sBACAC,UAAAA,SACAC,eAAAA,oBACK;AAGP,SAASC,cAAAA,mBAAkB;;;ACnB3B,SAASC,oBAAAA,yBAAwB;AACjC,SAASC,sBAAsB;AAC/B,SAASC,MAAMC,WAAWC,WAAW;AACrC,SAA8BC,aAAa;AAoBpC,IAAMC,eAAe;EAC1BC,YAAYC,IAAIC,OAAM;EACtBC,UAAUF,IAAIC,OAAM;EACpBE,UAAUH,IAAIC,OAAM;EACpBG,cAAcJ,IAAIC,OAAM;EACxBI,YAAYL,IAAIC,OAAM;EACtBK,YAAYN,IAAIC,OAAM;EACtBM,WAAWP,IAAIC,OAAM;EACrBO,eAAeR,IAAIC,OAAM;EACzBQ,UAAUT,IAAIC,OAAM;EACpBS,WAAWV,IAAIC,OAAM;EACrBU,KAAKX,IAAIC,OAAM;;EAGfW,WAAWZ,IAAIC,OAAM;AACvB;AAIAY,MAAMC,aAAaC,QAAQ,CAACC,SAAAA;AAC1B,UAAQA,MAAMC,MAAAA;IACZ,KAAK,aAAa;AAChBD,WAAKE,QAAQpB,aAAac;AAC1B;IACF;EACF;AACF,CAAA;AAEO,IAAMO,yBAA2C;EACtDN;EACA;IACEO,OAAO;MAACC,UAAUvB,YAAAA;;EACpB;;AAcK,IAAMwB,yBAAyB,CAACC,aAAAA;AACrC,SAAOC,eAAevB,OACpB;IACE;MACEwB,KAAK;QACHC,KAAKC;QACLD,KAAKT;QACLS,KAAKE;QACLF,KAAKG;QACLH,KAAKI;QACLJ,KAAKK;QACLL,KAAKM;QACLN,KAAKO,SAASP,KAAKT,IAAI;QACvBS,KAAKQ,SAASR,KAAKT,IAAI;QACvBS,KAAKS,WAAWT,KAAKT,IAAI;QACzBS,KAAKU;QACLV,KAAKW;QACLX,KAAKY;QACLZ,KAAKa;QACLb,KAAKc;QACLd,KAAKe;QACLf,KAAKgB;QACLhB,KAAKiB;QACLjB,KAAKkB;QACLlB,KAAKmB;QACLnB,KAAKoB;QACLpB,KAAKqB;QACLrB,KAAKsB;QACLtB,KAAKuB,QAAQvB,KAAKwB,MAAM;QACxBxB,KAAKyB;QACLzB,KAAK0B;QACL1B,KAAK2B;QACL3B,KAAK4B;QACL5B,KAAKuB,QAAQvB,KAAK6B,YAAY;QAC9B7B,KAAK8B;QACL9B,KAAKwB;QACLxB,KAAK+B;QACL/B,KAAKgC;;MAEP1B,OAAO;IACT;;IAGA;MACEP,KAAK;QACHC,KAAKyB;QACLzB,KAAK8B;QACL1D,aAAaS;QACbT,aAAaU;QACbV,aAAaW;;MAEfkD,OAAOC;IACT;;IAGA;MACEnC,KAAK;QAAC3B,aAAaI;QAAUJ,aAAaO;QAAYP,aAAaY;QAAWZ,aAAaM;;MAC3FuD,OAAOC;IACT;;IAGA;MACEnC,KAAK;QAACC,KAAKmC,SAASnC,KAAK6B,YAAY;QAAG7B,KAAKoC;;MAC7CH,OAAOI;IACT;IAEA;MACEtC,KAAK;QAACC,KAAKsC;;MACXL,OAAO;IACT;;IAGA;MAAElC,KAAKC,KAAKuC;MAAUN,OAAOO,QAAQ,CAAA;IAAG;IACxC;MAAEzC,KAAKC,KAAKyC;MAAUR,OAAOO,QAAQ,CAAA;IAAG;IACxC;MAAEzC,KAAKC,KAAK0C;MAAUT,OAAOO,QAAQ,CAAA;IAAG;IACxC;MAAEzC,KAAKC,KAAK2C;MAAUV,OAAOO,QAAQ,CAAA;IAAG;IACxC;MAAEzC,KAAKC,KAAK4C;MAAUX,OAAOO,QAAQ,CAAA;IAAG;IACxC;MAAEzC,KAAKC,KAAK6C;MAAUZ,OAAOO,QAAQ,CAAA;IAAG;;IAGxC;MAAEzC,KAAKC,KAAK8C;MAAUb,OAAOc;IAAO;IACpC;MAAEhD,KAAKC,KAAKgD;MAAQf,OAAOgB;IAAK;IAChC;MAAElD,KAAKC,KAAKkD;MAAejB,OAAOiB;IAAc;;IAGhD;MACEnD,KAAK;QAAC3B,aAAaa;;MACnBgD,OAAOkB;IACT;;;;;;IAOA;MACEpD,KAAK;QAAC3B,aAAaK;QAAUL,aAAaQ;;MAC1CqD,OAAOmB;IACT;IAEA;MACErD,KAAK;QAAC3B,aAAaY;;MACnBiD,OAAOoB;IACT;IAEA;MACEtD,KAAK;QAAC3B,aAAac;;MACnB+C,OAAO;IACT;KAEF;IACEqB,OAAOC;IACPC,KAAK;MAAEC,YAAYC,SAAS,mBAAmB,CAAA,CAAE,EAAEC,KAAK,GAAA;IAAK;EAC/D,CAAA;AAEJ;;;ADrJO,IAAMC,2BAA2B,CAAC,EACvCC,WACAC,aAAaC,cACbC,eAAe,KAAI,IACM,CAAC,MAAC;AAC3B,SAAO;IACLA,gBAAgBC,YAAWD;IAC3BE,YAAYC,wBAAwBC,GAAG,IAAA;IACvCF,YAAYG,QAAQD,GAAG,CAAA;;IAGvBE,iBAAAA;IACAC,eAAAA;IACAC,gBAAAA;IACAC,WAAAA;IACAC,eAAAA;IACAC,qBAAAA;IACAC,SAAAA;IACAC,cAAAA;IACAd,gBAAgBD,aAAYC,YAAAA;;;;IAK5Be,SAAS;;;;;;MAMPC,MAAMC;;MAGNC,eAAeC;;MAGfC,YAAY;;QAEVC;;IAEJ,CAAA;;IAGAvB,cAAc,SAASwB,oBAAmBC,sBAAAA,IAAyBD,oBAAmBE,sBAAAA;;IAGtFF,oBAAmBG,uBAAAA,CAAAA;IAEnBC,QAAOrB,GAAG;;MAERsB;;SAEGC;;SAEAC;;SAEAC;;SAEAC;KACJ;IACDC,OAAOC,WAAAA;AACX;;;AEhGA,SAASC,kBAAkB;AAC3B,SAASC,uBAAuB;AAChC,SACEC,cAAAA,aAEAC,cAAAA,aAEAC,cAAAA,aAEAC,cAAAA,mBACK;AAEP,SAASC,MAAAA,WAAU;AAKnB,IAAMC,UAASC,YAAWC,UAAU;EAClC,cAAc;IACZC,YAAYC,SAAS,mBAAmB,CAAA,CAAE,EAAEC,KAAK,GAAA;EACnD;EACA,mBAAmB;IACjBC,OAAO;IACPC,eAAe;IACfC,UAAU;IACV,YAAY;MACVC,SAAS;MACTD,UAAU;MACVE,OAAO;IACT;EACF;EACA,wBAAwB;IACtB,YAAY;MACVC,YAAYP,SAAS,mCAAA;MACrBQ,cAAc;IAChB;EACF;EACA,uBAAuB;IACrB,YAAY;MACVD,YAAYP,SAAS,kCAAA;MACrBQ,cAAc;IAChB;EACF;EACA,yBAAyB;IACvBC,SAAS;IACT,YAAY;MACVC,qBAAqB;MACrBC,sBAAsB;IACxB;EACF;EACA,wBAAwB;IACtBF,SAAS;IACT,YAAY;MACVG,wBAAwB;MACxBC,yBAAyB;IAC3B;EACF;AACF,CAAA;AAGA,IAAMC,eAAe,CAACC,OAAoBC,MAAcC,OAAAA;AACtD,QAAMC,QAAQH,MAAMI,UAAU,CAACC,SAASA,KAAKJ,QAAQA,IAAAA;AACrD,QAAMK,MAAMN,MAAMI,UAAU,CAACC,SAASA,KAAKH,MAAMA,EAAAA;AACjD,SAAO;IAACC;IAAOG;;AACjB;AAGA,IAAMC,aAAN,cAAyBC,YAAAA;EACvBC,YAA6BC,YAAoB;AAC/C,UAAK;SADsBA,aAAAA;EAE7B;EAESC,QAAQ;AACf,UAAMC,KAAKC,SAASC,cAAc,MAAA;AAClCF,OAAGG,YAAY;AACfH,OAAGI,YAAYC,IAAG,wBAAwB,KAAKP,UAAU;AACzD,WAAOE;EACT;AACF;AAEA,IAAMM,MAAM,IAAIX,WAAW,oBAAA;AAC3B,IAAMY,SAAS,IAAIZ,WAAW,mBAAA;AAI9B,IAAMa,mBAAmB,CAACC,SAAAA;AACxB,QAAMC,UAAU,IAAIC,gBAAAA;AACpB,QAAM,EAAEC,MAAK,IAAKH;AAClB,QAAMI,SAASJ,KAAKK;AACpB,QAAMC,SAASH,MAAMI,UAAUC,KAAKC;AAEpC,aAAW,EAAE7B,MAAMC,GAAE,KAAMmB,KAAKU,eAAe;AAC7CC,eAAWR,KAAAA,EAAOS,QAAQ;MACxBC,OAAO,CAACC,SAAAA;AACN,YAAIA,KAAKC,SAAS,cAAc;AAE9B,gBAAMC,OAAO,CAAChB,KAAKG,MAAMc,YAAYX,UAAUQ,KAAKlC,QAAQ0B,UAAUQ,KAAKjC;AAC3E,gBAAMqC,QAAQxC,aAAa0B,QAAQU,KAAKlC,MAAMkC,KAAKjC,EAAE;AACrD,mBAASsC,IAAID,MAAM,CAAA,GAAIC,KAAKD,MAAM,CAAA,GAAIC,KAAK;AACzC,kBAAMC,QAAQhB,OAAOe,CAAAA;AACrB,gBAAI,CAACH,SAASG,MAAMD,MAAM,CAAA,KAAMC,MAAMD,MAAM,CAAA,IAAK;AAC/CjB,sBAAQoB,IAAID,MAAMxC,MAAMwC,MAAMvC,IAAIyC,YAAWC,QAAQ;gBAAEC,QAAQL,MAAMD,MAAM,CAAA,IAAKrB,MAAMC;cAAO,CAAA,CAAA;YAC/F,OAAO;AACLG,sBAAQoB,IACND,MAAMxC,MACNwC,MAAMxC,MACN0C,YAAWtC,KAAK;gBACdyC,OAAO7B,IACL,wBACAuB,MAAMD,MAAM,CAAA,KAAM,sBAClBC,MAAMD,MAAM,CAAA,KAAM,mBAAA;cAEtB,CAAA,CAAA;YAEJ;UACF;QACF;MACF;MACAtC;MACAC;IACF,CAAA;EACF;AAEA,SAAOoB,QAAQyB,OAAM;AACvB;AAEO,IAAMC,QAAO,MAAA;AAClB,SAAO;IACLC,YAAWC,UACT,MAAA;MAEEzC,YAAYY,MAAkB;AAC5B,aAAK8B,cAAc/B,iBAAiBC,IAAAA;MACtC;MAEA+B,OAAOA,SAAoB;AACzB,aAAKD,cAAc/B,iBAAiBgC,QAAO/B,IAAI;MACjD;IACF,GACA;MACE8B,aAAa,CAACE,UAAUA,MAAMF;IAChC,CAAA;IAEFtE;;AAEJ;;;ACjJA,SAASyE,eAAe;AACxB,SAASC,cAAAA,mBAAkB;AAC3B,SAGEC,mBAAAA,kBAIAC,uBAEK;AACP,SAASC,cAAAA,aAAgCC,cAAAA,cAAYC,UAAAA,SAAQC,cAAAA,mBAAmC;AAEhG,SAASC,UAAUC,eAAe;AAyC3B,IAAMC,oBAAoB,CAACC,GAAeC,MAC/CD,EAAEE,cAAcD,EAAEC,aAClBF,EAAEG,WAAWF,EAAEE,UACfH,EAAEI,aAAaH,EAAEG,YACjBJ,EAAEK,kBAAkBJ,EAAEI,iBACtBL,EAAEM,SAASL,EAAEK,QACbN,EAAEO,SAASN,EAAEM,QACbP,EAAEQ,cAAcP,EAAEO,aAClBR,EAAES,eAAeR,EAAEQ;;UAETC,SAAAA;;;;;GAAAA,WAAAA,SAAAA,CAAAA,EAAAA;;UAOAC,OAAAA;;;;GAAAA,SAAAA,OAAAA,CAAAA,EAAAA;AAUL,IAAMC,aACX,CAACC,UACD,CAAC,EAAEC,OAAOC,SAAQ,MAAE;AAClB,QAAM,EACJC,WAAW,EAAEC,OAAM,GACnBC,IAAG,IACDJ;AACJ,QAAMK,UAAwB,CAAA;AAC9B,MAAIC,YAAY;AAChB,aAAWC,SAASJ,QAAQ;AAC1BK,IAAAA,YAAWR,KAAAA,EAAOS,QAAQ;MACxBC,MAAMH,MAAMG;MACZC,IAAIJ,MAAMI;MACVC,OAAO,CAACC,SAAAA;AACN,YAAI,CAACC,OAAOC,OAAOC,YAAYH,KAAKI,IAAI,KAAKX,cAAcO,KAAKH,MAAM;AACpE;QACF;AACAJ,oBAAYO,KAAKH;AACjB,cAAMtB,YAAY4B,WAAWH,KAAKI,IAAI;AACtC,cAAMC,YAAY,cAAcC,KAAK/B,SAAAA;AACrC,cAAMgC,WAAWF,YAAY,CAACA,UAAU,CAAA,IAAKL,KAAKI,SAAS,cAAc,IAAI;AAC7E,YAAIG,WAAW,KAAKA,aAAarB,OAAO;AACtC;QACF;AACA,YAAIqB,aAAa,GAAG;AAClBf,kBAAQgB,KAAK;YAAEX,MAAMG,KAAKH;YAAMY,QAAQ,IAAIC,OAAOxB,KAAAA,IAAS;UAAI,CAAA;QAClE,WAAWc,KAAKI,SAAS,oBAAoBJ,KAAKI,SAAS,kBAAkB;AAE3E,gBAAMO,WAAWpB,IAAIqB,OAAOZ,KAAKF,EAAE;AACnC,cAAIZ,OAAO;AACTM,oBAAQgB,KAAK;cAAEX,MAAMG,KAAKH;cAAMY,QAAQ,IAAIC,OAAOxB,KAAAA,IAAS;YAAI,CAAA;UAClE;AACAM,kBAAQgB,KAAK;YAAEX,MAAMc,SAASd,OAAO;YAAGC,IAAIa,SAASb;UAAG,CAAA;QAC1D,OAAO;AAEL,cAAIZ,UAAU,GAAG;AACfM,oBAAQgB,KAAK;cAAEX,MAAMG,KAAKH;cAAMC,IAAIe,KAAKC,IAAId,KAAKF,IAAIE,KAAKH,OAAOU,WAAW,CAAA;YAAG,CAAA;UAClF,WAAWrB,QAAQqB,UAAU;AAC3Bf,oBAAQgB,KAAK;cAAEX,MAAMG,KAAKH;cAAMC,IAAIE,KAAKH,QAAQU,WAAWrB;YAAO,CAAA;UACrE,OAAO;AACLM,oBAAQgB,KAAK;cAAEX,MAAMG,KAAKH;cAAMY,QAAQ,IAAIC,OAAOxB,QAAQqB,QAAAA;YAAU,CAAA;UACvE;QACF;MACF;IACF,CAAA;EACF;AAEA,MAAI,CAACf,QAAQuB,QAAQ;AACnB,WAAO;EACT;AAEA3B,WAASD,MAAM6B,OAAO;IAAExB;IAASyB,WAAW;IAAqBC,gBAAgB;EAAK,CAAA,CAAA;AACtF,SAAO;AACT;AAMK,IAAMC,WACX,CAACC,MAAcC,WACf,CAAC,EAAElC,OAAOC,SAAQ,MAAE;AAClB,QAAMkC,SAASC,iBAAiBH,IAAAA;AAChC,QAAM5B,UAAUL,MAAMqC,cAAc,CAAC9B,UAAAA;AAEnC,QAAI,CAAC2B,UAAU3B,MAAM+B,OAAO;AAC1B,YAAMC,QAAQvC,MAAMI,IAAIoC,YAAYjC,MAAMkC,MAAMlC,MAAMkC,OAAO,CAAA;AAC7D,YAAMC,QAAQH,MAAMI,QAAQR,MAAAA;AAC5B,UAAIO,SAAS,KAAK,WAAWE,KAAKL,MAAMM,MAAM,GAAGH,KAAAA,CAAAA,GAAS;AACxD,cAAMI,SAAS9C,MAAMI,IAAIoC,YAAYjC,MAAMkC,OAAO,GAAGlC,MAAMkC,IAAI;AAC/D,YACEK,OAAOD,MAAMC,OAAOlB,SAASc,QAAQP,OAAOP,QAAQkB,OAAOlB,SAASc,KAAAA,MAAWP,UAC/E;aAAIW,OAAOD,MAAMC,OAAOlB,SAASc,KAAAA;UAAQK,QAAO,EAAGC,KAAK,EAAA,MAAQT,MAAMM,MAAM,GAAGH,KAAAA,GAC/E;AACA,iBAAO;YACLrC,SAAS;cACP;gBAAEK,MAAMH,MAAMkC,OAAON,OAAOP,SAASc;gBAAO/B,IAAIJ,MAAMkC,OAAOC;cAAM;cACnE;gBAAEhC,MAAMH,MAAMkC,OAAOC;gBAAO/B,IAAIJ,MAAMkC,OAAOC,QAAQP,OAAOP;cAAO;;YAErErB,OAAO0C,gBAAgBC,OAAO3C,MAAMG,OAAOyB,OAAOP,MAAM;UAC1D;QACF;MACF;IACF;AAEA,UAAMvB,WAAwB,CAAA;AAE9B,UAAM8C,eAA6B,CAAA;AACnC,QAAIC,aAAa;AACjB,QAAIC,WAAW;AACf,QAAIC,eAAqC;AACzC,QAAIC,aAAmC;AACvC,QAAI,EAAE7C,MAAMC,GAAE,IAAKJ;AAInBC,IAAAA,YAAWR,KAAAA,EAAOS,QAAQ;MACxBC;MACAC;MACAC,OAAO,CAACC,SAAAA;AACN,cAAM,EAAEI,KAAI,IAAKJ;AACjB,YAAIC,OAAOC,OAAOC,YAAYC,IAAAA,KAASD,WAAWC,IAAAA,MAAU,aAAa;AAEvEmC,uBAAaI,kBAAkB3C,IAAAA;AAC/BwC,qBAAWI,gBAAgB5C,MAAMb,MAAMI,GAAG;AAC1CkD,yBAAeC,aAAa;QAC9B,WAAWtC,SAAS,UAAWA,SAAS,WAAWiB,QAAS;AAE1D,cAAIxB,OAAOG,KAAKH,QAAQC,KAAKE,KAAKH,QAAQC,MAAME,KAAKF,IAAI;AACvDA,iBAAKE,KAAKF;UACZ,WAAWA,KAAKE,KAAKF,MAAMD,QAAQG,KAAKH,QAAQA,OAAOG,KAAKF,IAAI;AAC9DD,mBAAOG,KAAKH;UACd;QACF,WAAWgD,aAAaC,IAAI1C,IAAAA,KAASiB,QAAQ;AAE3C,cAAIrB,KAAKH,OAAOA,QAAQG,KAAKF,KAAKD,MAAM;AACtC,gBAAIC,OAAOD,MAAM;AACfC,mBAAKE,KAAKF;YACZ;AACAD,mBAAOG,KAAKF;UACd;AACA,cAAIE,KAAKH,OAAOC,MAAME,KAAKF,KAAKA,IAAI;AAClCA,iBAAKE,KAAKH;UACZ;QACF,WAAWI,OAAOC,OAAO6C,cAAc3C,IAAAA,GAAO;AAE5C,gBAAM4C,WAAWD,aAAa3C,IAAAA;AAC9B,gBAAM6C,OAAO1B,iBAAiByB,QAAAA,EAAUjC;AACxC,gBAAMmC,UAAUlD,KAAKH,OAAOoD;AAC5B,gBAAME,aAAanD,KAAKF,KAAKmD;AAG7B,cAAID,aAAa5B,MAAM;AACrB,gBAAI8B,WAAWrD,QAAQsD,cAActD,MAAM;AACzC4C,6BAAeS,YAAYrD,OAAO,aAAa;YACjD;AACA,gBAAIqD,WAAWpD,MAAMqD,cAAcrD,IAAI;AACrC4C,2BAAaS,eAAerD,KAAK,aAAa;YAChD;UACF;AAGA,cAAIkD,aAAa5B,QAASA,SAAAA,KAAwBC,QAAS;AACzD,gBAAIrB,KAAKH,QAAQA,QAAQqD,WAAWpD,IAAI;AACtCN,cAAAA,SAAQgB,KAAK;gBAAEX,MAAMG,KAAKH;gBAAMC,IAAIoD;cAAQ,CAAA;AAC5C,kBAAIF,aAAa5B,QAAQ+B,cAAcrD,IAAI;AAEzCwC,6BAAa9B,KAAK;kBAChBX,MAAMuD,WAAWvC,KAAKC,IAAIhB,IAAI0C,QAAAA,GAAWrD,MAAMI,KAAK,GAAGiD,QAAAA;kBACvD/B,QAAQc,iBAAiByB,QAAAA;gBAC3B,CAAA;cACF;YACF;AACA,gBAAIG,cAActD,QAAQG,KAAKF,MAAMA,IAAI;AACvCN,cAAAA,SAAQgB,KAAK;gBAAEX,MAAMsD;gBAAYrD,IAAIE,KAAKF;cAAG,CAAA;AAC7C,kBAAIkD,aAAa5B,QAAQ8B,WAAWrD,MAAM;AAExCL,gBAAAA,SAAQgB,KAAK;kBACXX,MAAMuD,WAAWvC,KAAKwC,IAAIxD,MAAM0C,UAAAA,GAAapD,MAAMI,KAAK,IAAIgD,UAAAA;kBAC5D9B,QAAQc,iBAAiByB,QAAAA;gBAC3B,CAAA;cACF;YACF;UACF;QACF;MACF;MACAM,OAAO,CAACtD,SAAAA;AACN,YAAIC,OAAOC,OAAOC,YAAYH,KAAKI,IAAI,KAAKD,WAAWH,KAAKI,IAAI,MAAM,aAAa;AAEjF,gBAAMmD,aAAa1C,KAAKwC,IAAIxD,MAAM0C,UAAAA;AAClC,gBAAMiB,WAAW3C,KAAKC,IAAIhB,IAAI0C,QAAAA;AAC9B,cAAInB,QAAQ;AACV,gBAAI,CAACoB,cAAc;AACjBjD,cAAAA,SAAQgB,KAAK;gBAAEX,MAAM0D;gBAAY9C,QAAQa;cAAO,CAAA;YAClD;AACA,gBAAI,CAACoB,YAAY;AACflD,cAAAA,SAAQgB,KAAK;gBAAEX,MAAM2D;gBAAU/C,QAAQa;cAAO,CAAA;YAChD;UACF,OAAO;AACL,gBAAImB,iBAAiB,YAAY;AAC/BjD,cAAAA,SAAQgB,KAAK;gBAAEX,MAAMA,OAAOyB,OAAOP;gBAAQjB,IAAID;cAAK,CAAA;YACtD,WAAW4C,cAAc;AACvBjD,cAAAA,SAAQgB,KAAK;gBAAEX,MAAMuD,WAAWG,YAAYpE,MAAMI,KAAK,IAAIgD,UAAAA;gBAAa9B,QAAQa;cAAO,CAAA;YACzF;AACA,gBAAIoB,eAAe,YAAY;AAC7BlD,cAAAA,SAAQgB,KAAK;gBAAEX,MAAMC;gBAAIA,IAAIA,KAAKwB,OAAOP;cAAO,CAAA;YAClD,WAAW2B,YAAY;AACrBlD,cAAAA,SAAQgB,KAAK;gBAAEX,MAAMuD,WAAWI,UAAUrE,MAAMI,KAAK,GAAGiD,QAAAA;gBAAW/B,QAAQa;cAAO,CAAA;YACpF;UACF;QACF;MACF;IACF,CAAA;AACA,UAAMmC,YAAYtE,MAAMK,QAAQA,SAAQkE,OAAOpB,YAAAA,CAAAA;AAC/C,WAAO;MACL9C,SAASiE;MACT/D,OACEA,MAAM+B,SAAS,CAACgC,UAAUhC,QACtBW,gBAAgBC,OAAO3C,MAAMkC,OAAON,OAAOP,MAAM,IACjDqB,gBAAgB1C,MAAM+D,UAAUE,OAAOjE,MAAMG,MAAM,CAAA,GAAI4D,UAAUE,OAAOjE,MAAMI,IAAI,EAAC,CAAA;IAC3F;EACF,CAAA;AAEAV,WACED,MAAM6B,OAAOxB,SAAS;IAAEyB,WAAWI,SAAS,qBAAqB;IAAuBH,gBAAgB;EAAK,CAAA,CAAA;AAE/G,SAAO;AACT;AAEK,IAAM0C,WAAW,CAACC,UAAgC1C,SAAS0C,OAAO,IAAA;AAElE,IAAMC,cAAc,CAACD,UAAgC1C,SAAS0C,OAAO,KAAA;AAErE,IAAME,cACX,CAACF,UACD,CAACG,QAAAA;AACC,QAAMC,OAAOC,cAAcF,IAAI7E,KAAK;AACpC,SAAOgC,SACL0C,OACAA,UAAAA,IACI,CAACI,KAAKzF,SACNqF,UAAAA,IACE,CAACI,KAAKxF,WACNoF,UAAAA,IACE,CAACI,KAAKvF,gBACN,CAACuF,KAAKtF,IAAI,EAClBqF,GAAAA;AACJ;AAEK,IAAMG,eAAeJ,YAAAA,CAAAA;AACrB,IAAMK,iBAAiBL,YAAAA,CAAAA;AACvB,IAAMM,sBAAsBN,YAAAA,CAAAA;AAC5B,IAAMO,mBAAmBP,YAAAA,CAAAA;AAEhC,IAAMxC,mBAAmB,CAACH,SACxBA,SAAAA,IAAyB,OAAOA,SAAAA,IAAgC,OAAOA,SAAAA,IAA2B,MAAM;AAM1G,IAAMuB,oBAAoB,CAAC3C,SAAAA;AACzB,QAAMuE,MAAM,kBAAkBjE,KAAKN,KAAKI,IAAI;AAC5C,MAAImE,KAAK;AACP,WAAO1D,KAAKC,IAAId,KAAKF,IAAIE,KAAKH,OAAO,CAAC0E,IAAI,CAAA,IAAK,CAAA;EACjD;AACA,SAAOvE,KAAKH;AACd;AAEA,IAAM+C,kBAAkB,CAAC5C,MAAqBT,QAAAA;AAC5C,QAAMiF,SAAS,qBAAqBlE,KAAKN,KAAKI,IAAI;AAClD,QAAMqE,WAAWlF,IAAIqB,OAAOZ,KAAKF,EAAE;AACnC,MAAI0E,UAAU,WAAWlE,KAAKmE,SAASC,IAAI,GAAG;AAC5C,WAAOD,SAAS5E,OAAO;EACzB;AACA,SAAOG,KAAKF;AACd;AAEA,IAAMsD,aAAa,CAACuB,KAAapF,KAAWqF,KAAaC,UAAAA;AACvD,QAAMC,OAAOvF,IAAIqB,OAAO+D,GAAAA;AACxB,SAAOA,QAAQE,SAASC,KAAKJ,KAAKC,MAAMG,KAAKjF,QAAQ+E,MAAM,IAAI,IAAI,EAAA,MAAQ,KAAK;AAC9ED,WAAOC;EACT;AACA,SAAOD;AACT;AAGA,IAAMI,WAAW;EACfC,WAAWC,QACT;;IAEE;IACA;IACA;IACA9C,KAAK,IAAA,CAAA;EAET+C,OAAOD,QACL;;IAEE;IACA;IACA;IACA;IACA;IACA9C,KAAK,IAAA,CAAA;AAEX;AAMO,IAAMgD,cAAc,CAACC,SAAAA;AAC1B,QAAM,EACJ/F,WAAW,EAAEgG,KAAI,GACjB9F,IAAG,IACD6F,KAAKjG;AACT,QAAM,EAAEmG,OAAM,IAAK/F,IAAIqB,OAAOyE,KAAKE,MAAM;AACzC,QAAM,EAAE1F,KAAI,IAAKN,IAAIuF,KAAKQ,MAAAA;AAE1BP,WAASG,MAAME,MAAM,MAAMvF,MAAMA,IAAAA;AACnC;AAOA,IAAM2F,kBAAkB,CAAC3F,MAAcC,IAAYN,SAAuBL,UAAAA;AACxEQ,EAAAA,YAAWR,KAAAA,EAAOS,QAAQ;IACxBC;IACAC;IACAC,OAAO,CAACC,SAAAA;AACN,UAAIA,KAAKI,SAAS,UAAUJ,KAAKH,OAAOC,MAAME,KAAKF,KAAKD,MAAM;AAC5DG,aAAKA,KAAKqC,OAAM,EAAGzC,QAAQ,CAACI,UAAAA;AAC1B,gBAAM,EAAEI,KAAI,IAAKJ;AACjB,cAAII,SAAS,cAAcA,SAAS,aAAa;AAC/CZ,oBAAQgB,KAAK;cAAEX,MAAMG,MAAKH;cAAMC,IAAIE,MAAKF;YAAG,CAAA;UAC9C,WAAWM,SAAS,eAAeA,SAAS,OAAO;AACjDZ,oBAAQgB,KAAK;cAAEX,MAAMuD,WAAWpD,MAAKH,MAAMV,MAAMI,KAAK,EAAC;cAAIO,IAAIsD,WAAWpD,MAAKF,IAAIX,MAAMI,KAAK,CAAA;YAAG,CAAA;UACnG;QACF,CAAA;AACA,eAAO;MACT;IACF;EACF,CAAA;AACF;AAGO,IAAMkG,aAA2B,CAAC,EAAEtG,OAAOC,SAAQ,MAAE;AAC1D,QAAMI,UAAwB,CAAA;AAC9B,aAAW,EAAEK,MAAMC,GAAE,KAAMX,MAAME,UAAUC,QAAQ;AACjDkG,oBAAgB3F,MAAMC,IAAIN,SAASL,KAAAA;EACrC;AACA,MAAI,CAACK,SAAS;AACZ,WAAO;EACT;AACAJ,WAASD,MAAM6B,OAAO;IAAExB;IAASyB,WAAW;IAAsBC,gBAAgB;EAAK,CAAA,CAAA;AACvF,SAAO;AACT;AAGO,IAAMwE,UAAwB,CAAC,EAAEvG,OAAOC,SAAQ,MAAE;AACvD,QAAMI,UAAUL,MAAMqC,cAAc,CAAC9B,UAAAA;AACnC,QAAI,EAAEG,MAAMC,GAAE,IAAKJ;AACnB,UAAMiG,YAA0B,CAAA;AAChC,QAAIC,OAAuB;AAE3BjG,IAAAA,YAAWR,KAAAA,EAAOS,QAAQ;MACxBC;MACAC;MACAC,OAAO,CAACC,SAAAA;AACN,YAAIC,OAAOC,OAAOC,YAAYH,KAAKI,IAAI,GAAG;AAGxCwF,iBACEzF,WAAWH,KAAKI,IAAI,MAAM,eAC1BP,QAAQ8C,kBAAkB3C,IAAAA,KAC1BF,MAAM8C,gBAAgB5C,MAAMb,MAAMI,GAAG;QACzC,WAAWU,OAAOC,OAAO6C,cAAc/C,KAAKI,IAAI,GAAG;AAIjD,gBAAMyF,QAAQ7F,KAAKA;AACnB,cAAIA,KAAKH,OAAOA,QAAQG,KAAKF,MAAMA,IAAI;AACrC,gBAAI+F,MAAMC,WAAYhG,OAAOD,MAAM;AACjCA,qBAAOG,KAAKH;YACd,OAAO;AACL8F,wBAAUnF,KAAKqF,KAAAA;YACjB;UACF,WAAW7F,KAAKH,QAAQA,QAAQG,KAAKF,KAAKA,IAAI;AAC5C,gBAAI+F,MAAME,UAAWlG,SAASC,IAAI;AAChCA,mBAAKE,KAAKF;YACZ,OAAO;AACL6F,wBAAUnF,KAAKqF,KAAAA;YACjB;UACF;QACF;MACF;IACF,CAAA;AAEA,QAAID,SAAS,MAAM;AAEjB,YAAMd,OAAO3F,MAAMI,IAAIqB,OAAOf,IAAAA;AAC9B+F,aAAO9F,MAAMgF,KAAKhF,MAAM,CAAC,KAAKiC,KAAK+C,KAAKJ,KAAK1C,MAAMnC,OAAOiF,KAAKjF,IAAI,CAAA;IACrE;AACA,QAAI,CAAC+F,MAAM;AACT,aAAO;QAAElG;MAAM;IACjB;AAEA,UAAMF,WAAwB,CAAA;AAE9B,UAAMwG,eAA6B,CAAA;AAEnCR,oBAAgB3F,MAAMC,IAAIkG,cAAc7G,KAAAA;AACxC,QAAI8G,eAAe;AAEnB,eAAWpC,SAAS8B,WAAW;AAC7B,YAAMvE,OAAO2B,aAAac,MAAMzD,IAAI;AACpC,YAAM8F,QAAO3E,iBAAiBH,IAAAA;AAC9B,UAAIyC,MAAMhE,OAAOA,MAAM;AAErBL,QAAAA,SAAQgB,KAAK;UAAEX,MAAMuD,WAAWvD,MAAMV,MAAMI,KAAK,EAAC;UAAIkB,QAAQyF;QAAK,CAAA;AACnEF,qBAAaxF,KAAK;UAAEX,MAAMuD,WAAWvD,MAAMV,MAAMI,KAAK,GAAGO,EAAAA;UAAKW,QAAQyF;QAAK,CAAA;MAC7E,OAAO;AACL1G,QAAAA,SAAQgB,KAAK;UAAEX,MAAMuD,WAAWtD,IAAIX,MAAMI,KAAK,IAAIM,IAAAA;UAAOY,QAAQyF;QAAK,CAAA;AACvE,cAAMxE,QAAQ0B,WAAWtD,IAAIX,MAAMI,KAAK,CAAA;AACxC,YAAImC,UAAU5B,IAAI;AAChBmG,0BAAgBC,MAAKnF;QACvB;AACAiF,qBAAaxF,KAAK;UAAEX,MAAM6B;UAAOjB,QAAQyF;QAAK,CAAA;MAChD;IACF;AAEA1G,IAAAA,SAAQgB,KAAK;MAAEX;MAAMY,QAAQ;IAAI,GAAG;MAAEZ,MAAMC;MAAIW,QAAQ;IAAM,CAAA;AAC9D,UAAMgD,YAAYtE,MAAMK,QAAQA,SAAQkE,OAAOsC,YAAAA,CAAAA;AAE/C,WAAO;MAAExG,SAASiE;MAAW/D,OAAO0C,gBAAgBC,OAAOoB,UAAUE,OAAO7D,IAAI,CAAA,IAAKmG,YAAAA;IAAc;EACrG,CAAA;AACA,MAAIzG,QAAQA,QAAQiC,OAAO;AACzB,WAAO;EACT;AAEArC,WAASD,MAAM6B,OAAOxB,SAAS;IAAEyB,WAAW;IAAmBC,gBAAgB;EAAK,CAAA,CAAA;AACpF,SAAO;AACT;AAMO,IAAMiF,UACX,CAAC/E,SACD,CAAC,EAAEjC,OAAOC,SAAQ,MAAE;AAClB,MAAIgH,YAAY;AAChB,MAAIC,UAAU;AACd,MAAIC,QAAQ;AACZ,MAAIC,eAA8B;AAClC,QAAMC,SAA+E,CAAA;AAGrF,aAAW,EAAE3G,MAAMC,GAAE,KAAMX,MAAME,UAAUC,QAAQ;AACjDK,IAAAA,YAAWR,KAAAA,EAAOS,QAAQ;MACxBC;MACAC;MACAC,OAAO,CAACC,SAAAA;AACN,YAAKC,OAAOC,OAAOC,YAAYH,KAAKI,IAAI,KAAKJ,KAAKI,SAAS,eAAgBJ,KAAKI,SAAS,SAAS;AAChG,cAAIkG,OAAO;AAGT,gBAAIrE,SAASjC,KAAKA,KAAKyG;AACvB,mBAAOxE,UAAU,QAAQF,KAAKE,OAAO7B,IAAI,GAAG;AAC1C6B,uBAASA,OAAOwE;YAClB;AACA,gBAAIxE,QAAQ7B,UAAUgB,SAAAA,IAAwB,gBAAgB,eAAe;AAC3E,oBAAMsF,OAAOzE,OAAO8D;AACpB,oBAAMY,WAAWxH,MAAMI,IAAIqB,OAAO8F,KAAK7G,IAAI;AAC3C,oBAAM+G,WAAWD,SAASjC,KAAK1C,MAAM0E,KAAK7G,OAAO8G,SAAS9G,IAAI;AAC9D0G,6BAAeG,KAAK7G,OAAO8G,SAAS9G,OAAO,OAAOS,KAAKsG,QAAAA,EAAW,CAAA,EAAG7F;AACrE,kBAAIK,SAAAA,GAAuB;AACzB,sBAAM8E,QAAO,gBAAgB5F,KAAKsG,QAAAA;AAClC,oBAAIV,OAAM;AACRK,kCAAgBL,MAAK,CAAA,EAAGnF;AACxBsF,4BAAU,CAACH,MAAK,CAAA,IAAK;gBACvB;cACF;YACF;AACAI,oBAAQ;UACV;AACA,cAAItG,KAAKH,SAASuG,WAAW;AAC3B;UACF;AACAA,sBAAYpG,KAAKH;AACjB2G,iBAAOhG,KAAK;YAAER,MAAMA,KAAKA;YAAMqG;YAASE;UAAa,CAAA;AACrDF;AACA,iBAAO;QACT;MACF;MACA/C,OAAO,CAACtD,SAAAA;AAEN,YAAIA,KAAKI,SAAS,gBAAgBJ,KAAKI,SAAS,iBAAiBJ,KAAKI,SAAS,cAAc;AAC3FiG,oBAAU;AACVE,yBAAe;QACjB;MACF;IACF,CAAA;EACF;AAEA,MAAI,CAACC,OAAOzF,QAAQ;AAElB,UAAM,EAAElB,MAAMC,GAAE,IAAKX,MAAMI,IAAIqB,OAAOzB,MAAME,UAAUgG,KAAKE,MAAM;AACjE,QAAI1F,SAASC,IAAI;AACfV,eACED,MAAM6B,OAAO;QACXxB,SAAS;UACP;YACEK;YACAY,QAAQW,SAAAA,IAAuB,OAAOA,SAAAA,IAAwB,QAAQ;UACxE;;QAEFH,WAAW;QACXC,gBAAgB;MAClB,CAAA,CAAA;AAEF,aAAO;IACT;AAEA,WAAO;EACT;AAEA,QAAM1B,UAAwB,CAAA;AAC9B,WAASqH,IAAI,GAAGA,IAAIL,OAAOzF,QAAQ8F,KAAK;AACtC,UAAM,EAAE7G,MAAMqG,SAAAA,UAASE,cAAAA,cAAY,IAAKC,OAAOK,CAAAA;AAC/C,UAAMC,WAAW9G,KAAKI,SAAS,cAAcJ,KAAKH,OAAO,IAAIG,KAAKH;AAElE,QAAIkH,UAAUD,WAAW,KAAK,CAAC,KAAK/E,KAAK5C,MAAMI,IAAIoC,YAAYmF,WAAW,GAAGA,QAAAA,CAAAA,IAAa,IAAI;AAE9F,QAAI1F,SAAAA,GAAuB;AACzB2F,iBAAWC,OAAOX,QAAAA,EAAStF;IAC7B;AACA,QAAI+D,OAAO3F,MAAMI,IAAIqB,OAAOkG,QAAAA;AAC5B,UAAMG,SAASH,WAAWhC,KAAKjF;AAE/B,QAAI0G,kBAAiB,QAAQA,gBAAeU,QAAQ;AAClDF,gBAAUlG,KAAKwC,IAAI0D,SAASR,gBAAeU,MAAAA;IAC7C;AAEA,QAAIf;AACJ,QAAI9E,SAAAA,GAAuB;AAEzB,UAAIiC,MAAMgD;AACV,eAASa,IAAIL,IAAI,GAAGK,IAAIV,OAAOzF,QAAQmG,KAAK;AAC1C,YAAIV,OAAOU,CAAAA,EAAGb,YAAYhD,MAAM,GAAG;AACjC;QACF;AACAA;MACF;AACA,YAAM8D,MAAMH,OAAOX,QAAAA;AACnBU,gBAAUlG,KAAKwC,IAAI2D,OAAO3D,GAAAA,EAAKtC,QAAQgG,OAAAA;AACvCb,MAAAA,QAAO,IAAIxF,OAAOG,KAAKwC,IAAI,GAAG0D,UAAUI,IAAIpG,MAAM,CAAA,IAAKoG,MAAM;IAC/D,OAAO;AACLjB,MAAAA,QAAO,IAAIxF,OAAOqG,OAAAA,IAAW,QAAQ3F,SAAAA,IAAqB,SAAS;IACrE;AAEA5B,YAAQgB,KAAK;MAAEX,MAAMiH;MAAUrG,QAAQyF;IAAK,CAAA;AAE5C,WAAOpB,KAAKhF,KAAKE,KAAKF,IAAI;AACxBgF,aAAO3F,MAAMI,IAAIqB,OAAOkE,KAAKhF,KAAK,CAAA;AAClC,YAAMsH,OAAO,UAAU9G,KAAKwE,KAAKJ,IAAI,EAAG,CAAA,EAAG3D;AAC3CvB,cAAQgB,KAAK;QAAEX,MAAMiF,KAAKjF,OAAOgB,KAAKC,IAAIsG,MAAMH,MAAAA;QAASxG,QAAQ,IAAIC,OAAOwF,MAAKnF,MAAM;MAAE,CAAA;IAC3F;EACF;AAIA,MAAIK,SAAAA,GAAuB;AACzB,UAAMiG,OAAOb,OAAOA,OAAOzF,SAAS,CAAA;AACpC,QAAIuG,OAAOD,KAAKrH,KAAKuH;AACrB,WAAOD,QAAQ,QAAQvF,KAAKuF,KAAKlH,IAAI,GAAG;AACtCkH,aAAOA,KAAKC;IACd;AACA,QAAID,MAAMlH,SAAS,eAAe;AAChCoH,wBAAkBF,KAAKxB,YAAYuB,KAAKhB,UAAU,GAAG7G,SAASL,MAAMI,GAAG;IACzE;EACF;AAEAH,WAASD,MAAM6B,OAAO;IAAExB;IAASyB,WAAW;IAAmBC,gBAAgB;EAAK,CAAA,CAAA;AACpF,SAAO;AACT;AAEK,IAAMuG,aACX,CAACrG,SACD,CAAC,EAAEjC,OAAOC,SAAQ,MAAE;AAClB,MAAIgH,YAAY;AAChB,QAAM5G,UAAwB,CAAA;AAC9B,QAAMkI,QAAkB,CAAA;AACxB,QAAMC,iBAAiBvG,SAAAA,IAAwB,gBAAgBA,SAAAA,IAAuB,eAAe;AAErG,aAAW,EAAEvB,MAAMC,GAAE,KAAMX,MAAME,UAAUC,QAAQ;AACjDK,IAAAA,YAAWR,KAAAA,EAAOS,QAAQ;MACxBC;MACAC;MACAC,OAAO,CAACC,SAAAA;AACN,cAAM,EAAEI,KAAI,IAAKJ;AACjB,YAAII,SAAS,gBAAgBA,SAAS,iBAAiBA,SAAS,cAAc;AAE5EsH,gBAAMlH,KAAKJ,IAAAA;QACb,WAAWA,SAAS,UAAUsH,MAAMA,MAAM3G,SAAS,CAAA,MAAO,cAAc;AACtE2G,gBAAMA,MAAM3G,SAAS,CAAA,IAAK;QAC5B;MACF;MACAuC,OAAO,CAACtD,SAAAA;AACN,cAAM,EAAEI,KAAI,IAAKJ;AACjB,YAAII,SAAS,gBAAgBA,SAAS,iBAAiBA,SAAS,cAAc;AAC5EsH,gBAAME,IAAG;QACX,WAAWxH,SAAS,cAAcsH,MAAMA,MAAM3G,SAAS,CAAA,MAAO4G,kBAAkB3H,KAAKH,SAASuG,WAAW;AACvGA,sBAAYpG,KAAKH;AACjB,cAAIiF,OAAO3F,MAAMI,IAAIqB,OAAOZ,KAAKH,IAAI;AACrC,gBAAMqG,QAAO,oCAAoC5F,KAAKwE,KAAKJ,KAAK1C,MAAMhC,KAAKH,OAAOiF,KAAKjF,IAAI,CAAA;AAC3F,cAAI,CAACqG,OAAM;AACT,mBAAO;UACT;AACA,gBAAMe,SAASjH,KAAKH,OAAOiF,KAAKjF;AAEhCL,kBAAQgB,KAAK;YAAEX,MAAMG,KAAKH;YAAMC,IAAIE,KAAKH,OAAOqG,MAAK,CAAA,EAAGnF;UAAO,CAAA;AAE/D,iBAAO+D,KAAKhF,KAAKE,KAAKF,IAAI;AACxBgF,mBAAO3F,MAAMI,IAAIqB,OAAOkE,KAAKhF,KAAK,CAAA;AAClC,kBAAMsH,OAAO,UAAU9G,KAAKwE,KAAKJ,IAAI,EAAG,CAAA,EAAG3D;AAC3C,gBAAIqG,OAAOH,QAAQ;AACjBzH,sBAAQgB,KAAK;gBAAEX,MAAMiF,KAAKjF,OAAOoH;gBAAQnH,IAAIgF,KAAKjF,OAAOgB,KAAKC,IAAImG,SAASf,MAAK,CAAA,EAAGnF,QAAQqG,IAAAA;cAAM,CAAA;YACnG;UACF;AACA,cAAIpH,KAAKF,MAAMA,IAAI;AACjB0H,8BAAkBxH,KAAKA,KAAKuH,aAAa,GAAG/H,SAASL,MAAMI,GAAG;UAChE;AACA,iBAAO;QACT;MACF;IACF,CAAA;EACF;AACA,MAAI,CAACC,QAAQuB,QAAQ;AACnB,WAAO;EACT;AAEA3B,WAASD,MAAM6B,OAAO;IAAExB;IAASyB,WAAW;IAAsBC,gBAAgB;EAAK,CAAA,CAAA;AACvF,SAAO;AACT;AAEK,IAAM2G,aACX,CAACzG,SACD,CAAC0G,WAAAA;AACC,QAAMC,cAAa7D,cAAc4D,OAAO3I,KAAK;AAC7C,QAAM6I,SACJD,YAAWlJ,eAAeuC,SAAAA,IAAuB,WAAWA,SAAAA,IAAwB,YAAY;AAClG,UAAQ4G,SAASP,WAAWrG,IAAAA,IAAQ+E,QAAQ/E,IAAAA,GAAO0G,MAAAA;AACrD;AAEF,IAAMN,oBAAoB,CAACd,MAAyBL,SAAiB7G,SAAuBD,QAAAA;AAC1F,SAAOmH,MAAMA,OAAOA,KAAKa,aAAa;AACpC,QAAIb,KAAKtG,SAAS,YAAY;AAC5B,YAAMkF,SAAS,iBAAiBhF,KAAKf,IAAIoC,YAAY+E,KAAK7G,MAAM6G,KAAK7G,OAAO,EAAA,CAAA;AAC5E,UAAI,CAACyF,UAAU,CAACA,OAAO,CAAA,MAAOe,SAAS;AACrC;MACF;AACA,YAAMpD,OAAOqC,OAAO,CAAA,EAAGvE,SAASuE,OAAO,CAAA,EAAGvE;AAC1C,YAAMkH,SAASjB,OAAOX,OAAAA;AACtB7G,cAAQgB,KAAK;QAAEX,MAAM6G,KAAK7G,OAAOgB,KAAKwC,IAAI,GAAGJ,OAAOgF,OAAOlH,MAAM;QAAGjB,IAAI4G,KAAK7G,OAAOoD;QAAMxC,QAAQwH;MAAO,CAAA;AACzG5B;IACF;EACF;AACF;AAMO,IAAM6B,gBACX,CAAC7G,WACD,CAAC,EAAElC,OAAOC,SAAQ,MAAE;AAClB,QAAM+I,QAAgB,CAAA;AACtB,MAAI/B,YAAY;AAChB,aAAW,EAAEvG,MAAMC,GAAE,KAAMX,MAAME,UAAUC,QAAQ;AACjDK,IAAAA,YAAWR,KAAAA,EAAOS,QAAQ;MACxBC;MACAC;MACAC,OAAO,CAACC,SAAAA;AACN,YAAIC,OAAOC,OAAOC,YAAYH,KAAKI,IAAI,KAAKJ,KAAKI,SAAS,SAAS;AACjE,cAAIJ,KAAKH,SAASuG,WAAW;AAC3B,mBAAO;UACT;AACAA,sBAAYpG,KAAKH;AACjB,cAAIiF,OAAO3F,MAAMI,IAAIqB,OAAOZ,KAAKH,IAAI;AACrC,cAAIiF,KAAKQ,SAAS,GAAG;AACnB,kBAAM8C,WAAWjJ,MAAMI,IAAIuF,KAAKA,KAAKQ,SAAS,CAAA;AAC9C,gBAAI,WAAWvD,KAAKqG,SAAS1D,IAAI,GAAG;AAClC,kBAAI,CAACrD,UAAW8G,MAAMpH,UAAUoH,MAAMA,MAAMpH,SAAS,CAAA,EAAGuE,WAAW8C,SAAS9C,SAAS,GAAI;AACvF6C,sBAAM3H,KAAK4H,QAAAA;cACb;YACF;UACF;AACA,qBAAS;AACPD,kBAAM3H,KAAKsE,IAAAA;AACX,gBAAIA,KAAKhF,MAAME,KAAKF,IAAI;AACtB;YACF;AACAgF,mBAAO3F,MAAMI,IAAIuF,KAAKA,KAAKQ,SAAS,CAAA;UACtC;AACA,cAAI,CAACjE,UAAUyD,KAAKQ,SAASnG,MAAMI,IAAI4I,OAAO;AAC5C,kBAAMxH,WAAWxB,MAAMI,IAAIuF,KAAKA,KAAKQ,SAAS,CAAA;AAC9C,gBAAI,WAAWvD,KAAKpB,SAAS+D,IAAI,GAAG;AAClCyD,oBAAM3H,KAAKG,QAAAA;YACb;UACF;AACA,iBAAO;QACT;MACF;IACF,CAAA;EACF;AAEA,QAAMnB,UAAwB,CAAA;AAC9B,aAAWsF,QAAQqD,OAAO;AACxB,QAAI9G,QAAQ;AACV7B,cAAQgB,KAAK;QAAEX,MAAMiF,KAAKjF;QAAMY,QAAQ,KAAKsB,KAAK+C,KAAKJ,IAAI,IAAI,OAAO;MAAI,CAAA;IAC5E,OAAO;AACL,YAAM2D,QAAQ,+BAA+B/H,KAAKwE,KAAKJ,IAAI;AAC3D,UAAI2D,OAAO;AACT7I,gBAAQgB,KAAK;UAAEX,MAAMiF,KAAKjF,OAAOwI,MAAM,CAAA,EAAGtH;UAAQjB,IAAIgF,KAAKjF,OAAOwI,MAAM,CAAA,EAAGtH;QAAO,CAAA;MACpF;IACF;EACF;AACA,MAAI,CAACvB,QAAQuB,QAAQ;AACnB,WAAO;EACT;AAEA3B,WACED,MAAM6B,OAAO;IACXxB;IACAyB,WAAWI,SAAS,0BAA0B;IAC9CH,gBAAgB;EAClB,CAAA,CAAA;AAEF,SAAO;AACT;AAEK,IAAMoH,gBAAgBJ,cAAc,IAAA;AAEpC,IAAMK,mBAAmBL,cAAc,KAAA;AAEvC,IAAMM,mBAAiC,CAACV,WAAAA;AAC7C,UAAQ5D,cAAc4D,OAAO3I,KAAK,EAAEL,aAAayJ,mBAAmBD,eAAeR,MAAAA;AACrF;AAMO,IAAMW,eAA6B,CAACX,WAAAA;AACzC,QAAM,EAAE3I,OAAOC,SAAQ,IAAK0I;AAC5B,QAAM,EAAEzI,UAAS,IAAKF;AAEtB,MAAIE,UAAUC,OAAOyB,WAAW,KAAK1B,UAAUgG,KAAK5D,OAAO;AACzD,UAAM,EAAEG,KAAI,IAAKvC,UAAUgG;AAC3B,UAAMP,OAAO3F,MAAMI,IAAIqB,OAAOgB,IAAAA;AAC9B,QAAI,CAAC,KAAKG,KAAK+C,KAAKJ,IAAI,KAAK9C,SAASkD,KAAKjF,MAAM;AAC/CkF,eAASC,UAAU8C,QAAQ,MAAMhD,KAAKjF,MAAMiF,KAAKhF,EAAE;AACnD,aAAO;IACT;EACF;AAGA,QAAMR,SAAyC,CAAA;AAC/C,aAAW,EAAEO,MAAMC,GAAE,KAAMT,UAAUC,QAAQ;AAC3C,QAAIoJ,YAAY7I;AAChB,QAAI8I,UAAU7I;AACdH,IAAAA,YAAWR,KAAAA,EAAOS,QAAQ;MACxBC;MACAC;MACAC,OAAO,CAACC,SAAAA;AACN,YAAIC,OAAOC,OAAOC,YAAYH,KAAKI,IAAI,GAAG;AACxC,cAAIP,QAAQG,KAAKH,QAAQC,MAAME,KAAKF,IAAI;AAEtC4I,wBAAY1I,KAAKH;AACjB8I,sBAAU3I,KAAKF;UACjB,OAAO;AAEL4I,wBAAY7H,KAAKC,IAAI4H,WAAWvJ,MAAMI,IAAIqB,OAAOZ,KAAKH,IAAI,EAAEA,IAAI;AAChE8I,sBAAU9H,KAAKwC,IAAIsF,SAASxJ,MAAMI,IAAIqB,OAAOZ,KAAKF,EAAE,EAAEA,EAAE;UAC1D;QACF;MACF;IACF,CAAA;AACA,QAAIR,OAAOyB,UAAUzB,OAAOA,OAAOyB,SAAS,CAAA,EAAGjB,MAAM4I,YAAY,GAAG;AAClEpJ,aAAOA,OAAOyB,SAAS,CAAA,EAAGjB,KAAK6I;IACjC,OAAO;AACLrJ,aAAOkB,KAAK;QAAEX,MAAM6I;QAAW5I,IAAI6I;MAAQ,CAAA;IAC7C;EACF;AACA,MAAI,CAACrJ,OAAOyB,QAAQ;AAClB,WAAO;EACT;AAEA,QAAMvB,UAAwBF,OAAOsJ,IAAI,CAAC,EAAE/I,MAAMC,GAAE,MAAE;AACpD,UAAMmH,SAASpH,OAAOV,MAAMI,IAAIqB,OAAOf,IAAAA,EAAMA;AAC7C,WAAO;MACL;QAAEA;QAAMY,QAAQ,UAAU,IAAIC,OAAOuG,MAAAA;MAAQ;MAC7C;QAAEpH,MAAMC;QAAIW,QAAQ,OAAO,IAAIC,OAAOuG,MAAAA,IAAU;MAAM;;EAE1D,CAAA;AACA7H,WAASD,MAAM6B,OAAO;IAAExB;IAASyB,WAAW;IAAwBC,gBAAgB;EAAK,CAAA,CAAA;AACzF,SAAO;AACT;AAEO,IAAM2H,kBAAgC,CAAC,EAAE1J,OAAOC,SAAQ,MAAE;AAC/D,QAAMI,UAAwB,CAAA;AAC9B,MAAI4G,YAAY;AAEhB,aAAW,EAAEvG,MAAMC,GAAE,KAAMX,MAAME,UAAUC,QAAQ;AACjDK,IAAAA,YAAWR,KAAAA,EAAOS,QAAQ;MACxBC;MACAC;MACAC,OAAO,CAACC,SAAAA;AACN,YAAIG,WAAWH,KAAKI,IAAI,MAAM,eAAegG,cAAcpG,KAAKH,MAAM;AACpEuG,sBAAYpG,KAAKH;AACjB,gBAAMiJ,YAAY3J,MAAMI,IAAIqB,OAAOZ,KAAKH,IAAI;AAC5C,cAAIG,KAAKI,SAAS,cAAc;AAC9BZ,oBAAQgB,KAAK;cAAEX,MAAMG,KAAKH;cAAMC,IAAIgJ,UAAUhJ,KAAK,IAAIE,KAAKH,OAAOiJ,UAAUjJ;YAAK,CAAA;AAClF,kBAAM4E,WAAWtF,MAAMI,IAAIqB,OAAOZ,KAAKF,EAAE;AACzC,gBAAI,8BAA8BiC,KAAK0C,SAASC,IAAI,GAAG;AACrDlF,sBAAQgB,KAAK;gBACXX,MAAM4E,SAAS5E,QAAQ4E,SAASa,WAAWwD,UAAUxD,SAAS,IAAI,IAAI;gBACtExF,IAAI2E,SAAS3E;cACf,CAAA;YACF;UACF,OAAO;AAEL,kBAAMmH,SAASjH,KAAKH,OAAOiJ,UAAUjJ;AACrC,qBAASiF,OAAOgE,aAAahE,OAAO3F,MAAMI,IAAIuF,KAAKA,KAAKQ,SAAS,CAAA,GAAI;AACnE9F,sBAAQgB,KAAK;gBAAEX,MAAMiF,KAAKjF,OAAOoH,SAAS;gBAAGnH,IAAIgF,KAAKjF,OAAOoH;cAAO,CAAA;AACpE,kBAAInC,KAAKhF,MAAME,KAAKF,IAAI;AACtB;cACF;YACF;UACF;QACF;MACF;IACF,CAAA;EACF;AACA,MAAI,CAACN,QAAQuB,QAAQ;AACnB,WAAO;EACT;AAEA3B,WAASD,MAAM6B,OAAO;IAAExB;IAASyB,WAAW;IAA2BC,gBAAgB;EAAK,CAAA,CAAA;AAC5F,SAAO;AACT;AAEO,IAAM6H,kBAAgC,CAACjB,WAAAA;AAC5C,UAAQ5D,cAAc4D,OAAO3I,KAAK,EAAEZ,cAAc,cAAcsK,kBAAkBJ,cAAcX,MAAAA;AAClG;AAQO,IAAMC,aAAa,CAACiB,UAA6B,CAAC,MAAC;AACxD,SAAO;IACLC,QAAOC,GAAG;MACR;QACEC,KAAK;QACLC,KAAKjF;MACP;KACD;IACDkF,QAAAA;;AAEJ;AAEA,IAAMA,UAAU,MAAA;AACd,QAAMC,oBAAmB,CAAClE,SAAAA;AACxB,UAAMmE,UAAU,IAAIC,iBAAAA;AACpB,UAAM,EAAErK,MAAK,IAAKiG;AAClB,UAAM/C,SAASlD,MAAME,UAAUgG,KAAKzD;AAIpC,UAAM6H,UAAU,CAACzJ,MAAqB0J,UAAAA;AACpC,UAAIrH,UAAUrC,KAAKH,QAAQwC,UAAUrC,KAAKF,IAAI;AAC5C,mBAAWoG,SAAQwD,OAAO;AACxBH,kBAAQI,IAAIzD,MAAKrG,MAAMqG,MAAKpG,IAAI8J,YAAWH,QAAQ,CAAC,CAAA,CAAA;QACtD;MACF;IACF;AAEA,eAAW,EAAE5J,MAAMC,GAAE,KAAMsF,KAAKyE,eAAe;AAC7ClK,MAAAA,YAAWR,KAAAA,EAAOS,QAAQ;QACxBG,OAAO,CAACC,SAAAA;AACN,kBAAQA,KAAKI,MAAI;YACf,KAAK;YACL,KAAK,kBAAkB;AACrB,oBAAMsJ,QAAQ1J,KAAKA,KAAK8J,YAAY,cAAA;AACpCL,sBAAQzJ,MAAM0J,KAAAA;AACd;YACF;YAEA,KAAK,iBAAiB;AACpB,oBAAMA,QAAQ1J,KAAKA,KAAK8J,YAAY,mBAAA;AACpCL,sBAAQzJ,MAAM0J,KAAAA;AACd;YACF;UACF;QACF;QACA7J;QACAC;MACF,CAAA;IACF;AAEA,WAAOyJ,QAAQQ,OAAM;EACvB;AAEA,SAAO;IACLC,YAAWC,UACT,MAAA;MAEEC,YAAY9E,MAAkB;AAC5B,aAAK+E,cAAcb,kBAAiBlE,IAAAA;MACtC;MAEApE,OAAOA,SAAoB;AACzB,aAAKmJ,cAAcb,kBAAiBtI,QAAOoE,IAAI;MACjD;IACF,GACA;MACE+E,aAAa,CAACC,UAAUA,MAAMD;IAChC,CAAA;;AAGN;AAEA,IAAMpH,eAA2C;EAC/CsH,UAAQ;EACRC,gBAAc;EACdC,YAAU;EACVC,eAAa;AACf;AAEA,IAAM3H,eAAe,oBAAI4H,IAAI;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD;AAED,IAAMtK,aAAuE;EAC3EuK,aAAa;EACbC,aAAa;EACbC,aAAa;EACbC,aAAa;EACbC,aAAa;EACbC,aAAa;EACbC,WAAW;EACXC,YAAY;EACZC,WAAW;EACXC,gBAAgB;EAChBC,gBAAgB;EAChBC,WAAW;EACXC,MAAM;AACR;AAKO,IAAMpH,gBAAgB,CAAC/E,UAAAA;AAG5B,MAAIZ,YAA6C;AAGjD,QAAMgN,SAA6B;IAAC;IAAM;IAAM;IAAM;;AACtD,MAAI3M,QAAgB;AACpB,MAAIE,aAA6B;AAEjC,MAAID,YAAoD;AAGxD,QAAM6I,QAAsE,CAAA;AAI5E,MAAI8D,eAAuE;AAE3E,QAAMC,gBAAgB,CAACC,SAAAA;AACrB,QAAI,CAACF,cAAc;AACjB;IACF;AACAE,WAAO7K,KAAKC,IAAI4K,MAAMF,aAAaG,GAAG;AACtC,QAAID,QAAQF,aAAa7G,KAAK;AAC5B;IACF;AACA,aAASkC,IAAI,GAAGA,IAAI2E,aAAaxD,OAAOjH,QAAQ8F,KAAK;AACnD,UAAI0E,OAAO1E,CAAAA,MAAO,OAAO;AACvB;MACF,WAAW2E,aAAaxD,OAAOnB,CAAAA,GAAI;AACjC0E,eAAO1E,CAAAA,IAAK;MACd,WAAW,KAAK9E,KAAK5C,MAAMI,IAAIoC,YAAY6J,aAAa7G,KAAK+G,IAAAA,CAAAA,GAAQ;AACnEH,eAAO1E,CAAAA,IAAK;MACd;IACF;AACA2E,iBAAa7G,MAAM+G;EACrB;AAGA,QAAME,aAAa,CAACF,SAAAA;AAClB,QAAIF,gBAAgBE,OAAOF,aAAa7G,KAAK;AAC3C6G,mBAAa7G,MAAM9D,KAAKC,IAAI4K,MAAMF,aAAaG,GAAG;IACpD;EACF;AAEA,QAAM,EAAEtM,UAAS,IAAKF;AACtB,aAAWO,SAASL,UAAUC,QAAQ;AACpC,QAAII,MAAM+B,SAAS8J,OAAOM,KAAK,CAACC,MAAMA,MAAM,IAAA,GAAO;AAEjD,YAAMC,cAAclL,KAAKC,IAAIpB,MAAMkC,MAAM,CAAA;AACzC,YAAMoK,gBAAgB7M,MAAMI,IAAIoC,YAAYjC,MAAMkC,OAAOmK,aAAarM,MAAMkC,IAAI;AAChF,UAAIqK,eAAe9M,MAAMI,IAAIoC,YAAYjC,MAAMkC,MAAMlC,MAAMkC,OAAOmK,WAAAA;AAClE,eAASlF,IAAI,GAAGA,IAAIkF,aAAalF,KAAK;AACpC,cAAMqF,KAAKD,aAAapF,CAAAA;AACxB,YAAIqF,OAAOF,cAAcA,cAAcjL,SAAS,IAAI8F,CAAAA,KAAM,CAAC,QAAQ9E,KAAKmK,EAAAA,GAAK;AAC3ED,yBAAeA,aAAajK,MAAM,GAAG6E,CAAAA;AACrC;QACF;MACF;AACA,eAASA,IAAI,GAAGA,IAAI0E,OAAOxK,QAAQ8F,KAAK;AACtC,cAAMX,QAAO3E,iBAAiBsF,CAAAA;AAC9B,cAAMhF,QAAQoK,aAAanK,QAAQoE,KAAAA;AACnC,YAAIrE,QAAQ,IAAI;AACdoK,yBAAeA,aAAajK,MAAM,GAAGH,KAAAA,IAASoK,aAAajK,MAAMH,QAAQqE,MAAKnF,MAAM;AACpF,cAAIwK,OAAO1E,CAAAA,MAAO,MAAM;AACtB0E,mBAAO1E,CAAAA,IAAK;UACd;QACF;MACF;IACF;AAEAlH,IAAAA,YAAWR,KAAAA,EAAOS,QAAQ;MACxBC,MAAMH,MAAMG;MACZC,IAAIJ,MAAMI;MACVC,OAAO,CAACC,SAAAA;AACNyL,sBAAczL,KAAKH,IAAI;AACvB,cAAM,EAAEO,KAAI,IAAKJ;AACjB,YAAII,SAAS,gBAAgBA,SAAS,iBAAiBA,SAAS,cAAc;AAE5EsH,gBAAMlH,KAAKJ,IAAAA;QACb,WAAWA,SAAS,QAAQ;AAC1BxB,UAAAA,QAAO;QACT,WAAWqB,OAAOC,OAAOC,YAAYC,IAAAA,MAAUV,MAAM+B,SAASzB,KAAKF,KAAKJ,MAAMG,QAAQG,KAAKH,OAAOH,MAAMI,KAAK;AAC3G,cAAIM,SAAS,UAAUsH,MAAMA,MAAM3G,SAAS,CAAA,MAAO,cAAc;AAC/D2G,kBAAMA,MAAM3G,SAAS,CAAA,IAAK;UAC5B;AACA,gBAAMoL,YAAYhM,WAAWC,IAAAA;AAC7B,cAAI7B,cAAc,MAAM;AACtBA,wBAAY4N;UACd,WAAW5N,cAAc4N,WAAW;AAClC5N,wBAAY;UACd;AACA,cAAI4N,cAAc,eAAeZ,OAAOM,KAAK,CAAChF,MAAMA,MAAM,KAAA,GAAQ;AAEhE2E,2BAAe;cACb7G,KAAK9D,KAAKwC,IAAI3D,MAAMG,MAAMG,KAAKH,IAAI;cACnC8L,KAAK9K,KAAKC,IAAIpB,MAAMI,IAAIE,KAAKF,EAAE;cAC/BkI,QAAQ;gBAAC;gBAAO;gBAAO;gBAAO;;YAChC;UACF;QACF,WAAW/H,OAAOC,OAAO6C,cAAc3C,IAAAA,KAASoL,cAAc;AAC5D,gBAAMY,QAAQrJ,aAAa3C,IAAAA;AAE3B,cAAIV,MAAM+B,SAAS8J,OAAOa,KAAAA,MAAW,MAAM;AACzCb,mBAAOa,KAAAA,IAAS;UAClB;AACAZ,uBAAaxD,OAAOoE,KAAAA,IAAS;QAC/B,WAAWvJ,aAAaC,IAAI1C,IAAAA,GAAO;AACjCwL,qBAAW5L,KAAKF,EAAE;QACpB;MACF;MACAwD,OAAO,CAACtD,SAAAA;AACNyL,sBAAczL,KAAKF,EAAE;AACrB,cAAM,EAAEM,KAAI,IAAKJ;AACjB,YAAII,SAAS,gBAAgBA,SAAS,iBAAiBA,SAAS,cAAc;AAE5EsH,gBAAME,IAAG;QACX,WAAW3H,OAAOC,OAAOC,YAAYC,IAAAA,GAAO;AAG1C,cAAIiM,UAA2C;AAC/C,cAAIC,WAAW;AACf,mBAASzF,IAAIa,MAAM3G,SAAS,GAAG8F,KAAK,GAAGA,KAAK;AAC1C,gBAAIa,MAAMb,CAAAA,MAAO,cAAc;AAC7ByF,yBAAW;YACb,WAAW,CAACD,SAAS;AACnBA,wBAAU3E,MAAMb,CAAAA,MAAO,aAAa,SAASa,MAAMb,CAAAA,MAAO,eAAe,WAAW;YACtF;UACF;AACA,cAAI/H,eAAe,MAAM;AACvBA,yBAAawN;UACf,WAAW,CAACA,YAAYxN,YAAY;AAClCA,yBAAa;UACf;AACA,cAAID,cAAc,MAAM;AACtBA,wBAAYwN;UACd,WAAWxN,cAAcwN,SAAS;AAChCxN,wBAAY;UACd;AAGA2M,yBAAe;QACjB,WAAWvL,OAAOC,OAAO6C,cAAc3C,IAAAA,KAASoL,cAAc;AAE5DA,uBAAaxD,OAAOjF,aAAa3C,IAAAA,CAAK,IAAI;QAC5C;MACF;IACF,CAAA;EACF;AAEA,QAAM,EAAEP,MAAMC,GAAE,IAAKX,MAAMI,IAAIqB,OAAOvB,UAAUgG,KAAKE,MAAM;AAC3D,QAAMgH,YAAY1M,SAASC;AAE3B,SAAO;IACLyM;IACAhO,WAAWA,aAAa;IACxBO,YAAYA,cAAc;IAC1BH,MAAM4M,OAAM,CAAA,KAAiB;IAC7B9M,UAAU8M,OAAM,CAAA,KAAqB;IACrC/M,QAAQ+M,OAAM,CAAA,KAAmB;IACjC7M,eAAe6M,OAAM,CAAA,KAA0B;IAC/C3M,MAAAA;IACAC,WAAWA,aAAa;EAC1B;AACF;AAKO,IAAM2N,qBAAqB,MAAA;AAChC,QAAM,CAACrN,OAAOsN,QAAAA,IAAYC,SAA4B,IAAA;AACtD,QAAMC,WAAWC,QACf,MACEC,aAAWC,eAAe5D,GAAG,CAAClI,YAAAA;AAC5B,QAAIA,QAAO+L,cAAc/L,QAAOgM,cAAc;AAC5C,YAAMC,WAAW/I,cAAclD,QAAO7B,KAAK;AAC3C,UAAI,CAACA,SAAS,CAACf,kBAAkBe,OAAO8N,QAAAA,GAAW;AACjDR,iBAASQ,QAAAA;MACX;IACF;EACF,CAAA,GACF,CAAA,CAAE;AAGJ,SAAO;IAAC9N;IAAOwN;;AACjB;;;AChtCA,SAASO,cAAAA,mBAAkB;AAC3B,SAASC,mBAAAA,wBAAuB;AAChC,SAASC,cAAAA,aAAiDC,cAAAA,mBAAmC;AAE7F,IAAMC,oBAAmB,CAACC,SAAAA;AACxB,QAAMC,UAAU,IAAIC,iBAAAA;AACpB,QAAM,EAAEC,MAAK,IAAKH;AAClB,QAAMI,SAASD,MAAME,UAAUC,KAAKC;AAEpC,aAAW,EAAEC,MAAMC,GAAE,KAAMT,KAAKU,eAAe;AAC7CC,IAAAA,YAAWR,KAAAA,EAAOS,QAAQ;MACxBC,OAAO,CAACC,SAAAA;AACN,gBAAQA,KAAKC,MAAI;UACf,KAAK;UACL,KAAK;UACL,KAAK;UACL,KAAK;UACL,KAAK;UACL,KAAK,eAAe;AAClB,kBAAMC,QAAOF,KAAKA,KAAKG,SAAS,YAAA;AAChC,gBAAID,OAAM;AACR,kBAAI,CAAChB,KAAKkB,YAAYlB,KAAKG,MAAMgB,YAAYf,SAASU,KAAKN,QAAQJ,SAASU,KAAKL,IAAI;AACnFR,wBAAQmB,IAAIJ,MAAKR,MAAMQ,MAAKP,KAAK,GAAGY,YAAWC,QAAQ,CAAC,CAAA,CAAA;cAC1D;YACF;UACF;QACF;MACF;MACAd;MACAC;IACF,CAAA;EACF;AAEA,SAAOR,QAAQsB,OAAM;AACvB;AAEO,IAAMC,WAAU,MAAA;AACrB,SAAO;IACLC,YAAWC,UACT,MAAA;MAEEC,YAAY3B,MAAkB;AAC5B,aAAK4B,cAAc7B,kBAAiBC,IAAAA;MACtC;MAEA6B,OAAOA,SAAoB;AACzB,aAAKD,cAAc7B,kBAAiB8B,QAAO7B,IAAI;MACjD;IACF,GACA;MACE4B,aAAa,CAACE,UAAUA,MAAMF;IAChC,CAAA;;AAGN;;;ACtDA,SAASG,cAAAA,mBAAkB;AAC3B,SAASC,mBAAAA,wBAAuB;AAChC,SAASC,cAAAA,aAAgCC,cAAAA,cAAYC,cAAAA,aAA6BC,cAAAA,mBAAkB;AAKpG,IAAMC,UAASC,aAAWC,UAAU;EAClC,YAAY;;IAEVC,WAAW,aAAaC,SAAS,2BAAA,CAAA;EACnC;AACF,CAAA;AAEA,IAAMC,uBAAN,cAAmCC,YAAAA;EACxBC,QAAQ;AACf,UAAMC,KAAKC,SAASC,cAAc,KAAA;AAClCF,OAAGG,YAAY;AACf,WAAOH;EACT;AACF;AAEA,IAAMI,aAAaC,YAAWC,QAAQ;EAAEC,QAAQ,IAAIV,qBAAAA;AAAuB,CAAA;AAE3E,IAAMW,oBAAmB,CAACC,SAAAA;AACxB,QAAMC,UAAU,IAAIC,iBAAAA;AACpB,QAAM,EAAEC,MAAK,IAAKH;AAClB,QAAMI,SAASD,MAAME,UAAUC,KAAKC;AAEpC,aAAW,EAAEC,MAAMC,GAAE,KAAMT,KAAKU,eAAe;AAC7CC,IAAAA,YAAWR,KAAAA,EAAOS,QAAQ;MACxBC,OAAO,CAACC,SAAAA;AACN,YAAIA,KAAKC,SAAS,kBAAkB;AAElC,cAAIX,UAAUU,KAAKN,QAAQJ,UAAUU,KAAKL,IAAI;AAC5CR,oBAAQe,IAAIF,KAAKN,MAAMM,KAAKL,IAAId,UAAAA;UAClC;QACF;MACF;MACAa;MACAC;IACF,CAAA;EACF;AAEA,SAAOR,QAAQgB,OAAM;AACvB;AAEO,IAAMC,KAAK,MAAA;AAChB,SAAO;IACLC,YAAWC,UACT,MAAA;MAEEC,YAAYrB,MAAkB;AAC5B,aAAKsB,cAAcvB,kBAAiBC,IAAAA;MACtC;MAEAuB,OAAOA,SAAoB;AACzB,aAAKD,cAAcvB,kBAAiBwB,QAAOvB,IAAI;MACjD;IACF,GACA;MACEsB,aAAa,CAACE,UAAUA,MAAMF;IAChC,CAAA;IAEFvC;;AAEJ;;;AClEA,SAAS0C,cAAAA,mBAAkB;AAC3B,SAA2CC,cAAAA,mBAAgD;AAC3F,SAASC,cAAAA,aAAgCC,cAAAA,cAAYC,cAAAA,mBAAkB;AAIhE,IAAMC,QAAQ,CAACC,UAAwB,CAAC,MAAC;AAC9C,SAAOC,YAAWC,OAAsB;IACtCC,QAAQ,CAACC,UAAAA;AACP,aAAOC,YAAWC,IAAIC,kBAAiB,GAAGH,MAAMI,IAAIC,QAAQL,KAAAA,CAAAA;IAC9D;IACAM,QAAQ,CAACC,OAAsBC,OAAAA;AAC7B,UAAI,CAACA,GAAGC,cAAc,CAACD,GAAGE,WAAW;AACnC,eAAOH;MACT;AAEA,YAAMI,SAASH,GAAGR,MAAMU,UAAUE,KAAKC;AACvC,YAAMC,YAAYN,GAAGO,QAAQC,OAAOR,GAAGS,WAAWP,UAAUE,KAAKC,IAAI;AACrE,UAAIK,OAAOC,KAAKC,IAAIT,QAAQG,SAAAA;AAC5B,UAAIO,KAAKF,KAAKG,IAAIX,QAAQG,SAAAA;AAC1BN,SAAGO,QAAQQ,kBAAkB,CAACC,OAAOC,KAAKC,OAAOC,QAAAA;AAC/CT,eAAOC,KAAKC,IAAIF,MAAMQ,KAAAA;AACtBL,aAAKF,KAAKG,IAAID,IAAIM,GAAAA;MACpB,CAAA;AAEAT,aAAOV,GAAGR,MAAMI,IAAIwB,OAAOV,IAAAA,EAAMA;AACjCG,WAAKb,GAAGR,MAAMI,IAAIwB,OAAOP,EAAAA,EAAIA;AAC7B,aAAOd,MAAMsB,IAAIrB,GAAGO,OAAO,EAAET,OAAO;QAClCwB,YAAYZ;QACZa,UAAUV;QACVW,QAAQ,MAAM;QACdC,KAAK9B,kBAAiBe,MAAMG,IAAIb,GAAGR,KAAK;MAC1C,CAAA;IACF;IACAkC,SAAS,CAACC,UAAUC,aAAWC,YAAYnB,KAAKiB,KAAAA;EAClD,CAAA;AACF;AAEA,IAAMhC,oBAAmB,CAACe,MAAcG,IAAYrB,UAAAA;AAClD,QAAMqC,cAAmC,CAAA;AACzC,QAAM1B,SAASX,MAAMU,UAAUE,KAAKC;AAEpCyB,EAAAA,YAAWtC,KAAAA,EAAOuC,QAAQ;IACxBC,OAAO,CAACC,SAAAA;AACN,UAAIA,KAAKC,SAAS,SAAS;AACzB,cAAMC,UAAUF,KAAKA,KAAKG,SAAS,KAAA;AACnC,YAAID,SAAS;AACX,gBAAME,OAAO7C,MAAM8C,YAAYnC,SAAS8B,KAAKvB,QAAQP,SAAS8B,KAAKpB;AACnE,gBAAM0B,MAAM/C,MAAMgD,SAASL,QAAQzB,MAAMyB,QAAQtB,EAAE;AACnDgB,sBAAYY,KACVhD,YAAWiD,QAAQ;YACjBC,OAAO;YACPC,QAAQ,IAAIC,YAAYN,GAAAA;UAC1B,CAAA,EAAGO,MAAMT,OAAOJ,KAAKvB,OAAOuB,KAAKpB,IAAIoB,KAAKpB,EAAE,CAAA;QAEhD;MACF;IACF;IACAH;IACAG;EACF,CAAA;AAEA,SAAOgB;AACT;AAEA,IAAMgB,cAAN,cAA0BE,YAAAA;EACxBC,YAAqBC,MAAc;AACjC,UAAK;SADcA,OAAAA;EAErB;EAESC,GAAGC,OAAa;AACvB,WAAO,KAAKF,SAAUE,MAA6BF;EACrD;EAESG,MAAMC,MAAkB;AAC/B,UAAMC,MAAMC,SAASC,cAAc,KAAA;AACnCF,QAAIG,aAAa,OAAO,KAAKR,IAAI;AACjCK,QAAIG,aAAa,SAAS,UAAA;AAE1BH,QAAII,SAAS,MAAMJ,IAAIK,UAAUlC,IAAI,iBAAA;AACrC,WAAO6B;EACT;AACF;;;ACjFA,SAASM,cAAAA,mBAAkB;AAC3B,SAAyBC,mBAAAA,wBAAuB;AAChD,SACEC,gBAAAA,eACAC,cAAAA,aAGAC,cAAAA,aAEAC,cAAAA,mBACK;AAGP,SAASC,sBAAsB;AAiBxB,IAAMC,OAAO,CAACC,UAAuB,CAAC,MAAC;AAC5C,QAAMC,aAA0B;IAC9BC,YAAWC,UACT,MAAA;MAEEC,YAAYC,MAAkB;AAC5B,aAAKC,cAAcC,kBAAiBF,MAAML,OAAAA;MAC5C;MAEAQ,OAAOA,SAAoB;AACzB,YAAIA,QAAOC,cAAcD,QAAOE,mBAAmBF,QAAOG,cAAc;AACtE,eAAKL,cAAcC,kBAAiBC,QAAOH,MAAML,OAAAA;QACnD;MACF;IACF,GACA;MACEM,aAAa,CAACM,UAAUA,MAAMN;IAChC,CAAA;;AAIJ,MAAIN,QAAQa,SAAS;AACnBZ,eAAWa;;;;MAITC,cAAa,CAACV,MAAMW,KAAKC,SAAAA;AACvB,cAAMC,SAASC,YAAWd,KAAKe,KAAK,EAAEC,aAAaL,KAAKC,IAAAA;AACxD,YAAIlB,QAAO;AACX,iBAASuB,IAAI,GAAGC,OAA0BL,QAAQ,CAACnB,SAAQwB,QAAQD,IAAI,GAAGC,OAAOA,KAAKC,QAAQF,KAAK;AACjGvB,UAAAA,QAAOwB,KAAKE,SAAS,SAASF,OAAO;QACvC;AAEA,cAAMG,MAAM3B,SAAQA,MAAK4B,SAAS,KAAA;AAClC,YAAI,CAACD,OAAO,CAAC3B,OAAM;AACjB,iBAAO;QACT;AAEA,cAAM6B,UAAUvB,KAAKe,MAAMS,SAASH,IAAII,MAAMJ,IAAIK,EAAE;AACpD,eAAO;UACLf,KAAKjB,MAAK+B;UACVE,KAAKjC,MAAKgC;UACVE,OAAO;UACPC,QAAQ,MAAA;AACN,kBAAMC,KAAKC,SAASC,cAAc,KAAA;AAClCF,eAAGG,YAAYC,eAAe,CAAC,GAAG,aAAA;AAClCvC,oBAAQa,QAASsB,IAAIP,OAAAA;AACrB,mBAAO;cAAEY,KAAKL;cAAIM,QAAQ;gBAAEC,GAAG;gBAAGC,GAAG;cAAE;YAAE;UAC3C;QACF;MACF,CAAA;IAAA;EAEJ;AAEA,SAAO1C;AACT;AAEA,IAAM2C,aAAN,cAAyBC,YAAAA;EACvBzC,YACmB0C,MACAC,WACjB;AACA,UAAK;SAHYD,OAAAA;SACAC,YAAAA;EAGnB;EAESC,GAAGC,OAAa;AACvB,WAAO,KAAKH,SAASG,MAAMH;EAC7B;EAESI,MAAM7C,MAAkB;AAC/B,UAAM8B,KAAKC,SAASC,cAAc,MAAA;AAClC,SAAKU,UAAWZ,IAAI,KAAKW,IAAI;AAC7B,WAAOX;EACT;AACF;AAEA,IAAMgB,WAAN,cAAuBN,YAAAA;EACrBzC,YACmBgD,OACAN,MACjB;AACA,UAAK;SAHYM,QAAAA;SACAN,OAAAA;EAGnB;EAESE,GAAGC,OAAa;AACvB,WAAO,KAAKH,SAASG,MAAMH;EAC7B;EAESI,MAAM7C,MAAkB;AAC/B,UAAMN,QAAOqC,SAASC,cAAc,GAAA;AACpCtC,IAAAA,MAAKsD,aAAa,SAAS,SAAA;AAC3BtD,IAAAA,MAAKuD,cAAc,KAAKF;AACxB,QAAI,KAAKN,MAAM;AACb/C,MAAAA,MAAKsD,aAAa,OAAO,YAAA;AACzBtD,MAAAA,MAAKsD,aAAa,UAAU,QAAA;AAC5BtD,MAAAA,MAAKwD,OAAO,KAAKT;IACnB,OAAO;AACL/C,MAAAA,MAAKyD,UAAU,MAAA;AACbnD,aAAKoD,SAAS;UACZC,WAAW;YACTC,QAAQtD,KAAKuD,SAAS7D,KAAAA;UACxB;QACF,CAAA;MACF;IACF;AAEA,WAAOA;EACT;AACF;AAOA,IAAMQ,oBAAmB,CAACF,MAAkBL,YAAAA;AAC1C,QAAM6D,UAAU,IAAIC,iBAAAA;AACpB,QAAM,EAAE1C,MAAK,IAAKf;AAClB,QAAM0D,SAAS3C,MAAMsC,UAAUM,KAAKC;AAEpC,aAAW,EAAEnC,MAAMC,GAAE,KAAM1B,KAAK6D,eAAe;AAC7C/C,IAAAA,YAAWC,KAAAA,EAAO+C,QAAQ;MACxBC,OAAO,CAAC7C,SAAAA;AAEN,YAAIA,KAAKE,SAAS,QAAQ;AACxB,gBAAM4C,QAAQ9C,KAAKA,KAAK+C,YAAY,UAAA;AACpC,gBAAMC,OAAOF,MAAMG,UAAU,IAAIpD,MAAMS,SAASwC,MAAM,CAAA,EAAGtC,IAAIsC,MAAM,CAAA,EAAGvC,IAAI,IAAI;AAC9E,gBAAM2C,UAAUlD,KAAKA,KAAKI,SAAS,KAAA;AACnC,gBAAMD,MAAM+C,UAAUrD,MAAMS,SAAS4C,QAAQ3C,MAAM2C,QAAQ1C,EAAE,IAAI;AACjE,cAAI,CAACL,KAAK;AACR,mBAAO;UACT;AAGA,cAAI,CAACrB,KAAKqE,YAAYtD,MAAMuD,YAAYZ,SAASxC,KAAKO,QAAQiC,SAASxC,KAAKQ,IAAI;AAC9E8B,oBAAQe,IACNrD,KAAKO,MACLP,KAAKQ,IACL8C,YAAWC,QAAQ;cACjBC,QAAQ,IAAI5B,SAASoB,MAAMvE,QAAQD,OAAO2B,MAAMsD,MAAAA;YAClD,CAAA,CAAA;UAEJ;AAEA,cAAIhF,QAAQiF,UAAU;AACpBpB,oBAAQe,IACNrD,KAAKQ,IACLR,KAAKQ,IACL8C,YAAWC,QAAQ;cACjBC,QAAQ,IAAInC,WAAWlB,KAAK1B,QAAQiF,QAAQ;YAC9C,CAAA,CAAA;UAEJ;AAEA,iBAAO;QACT;MACF;MACAnD;MACAC;IACF,CAAA;EACF;AAEA,SAAO8B,QAAQqB,OAAM;AACvB;;;AClMA,SAASC,cAAAA,mBAAkB;AAC3B,SAA0CC,mBAAAA,kBAAiBC,cAAAA,mBAAoC;AAC/F,SAASC,cAAAA,cAAYC,cAAAA,cAAYC,cAAAA,mBAAkB;AAc5C,IAAMC,QAAQ,CAACC,UAAwB,CAAC,MAAC;AAC9C,SAAOC,YAAWC,OAAsB;IACtCC,QAAQ,CAACC,UAAUC,OAAOD,OAAOJ,OAAAA;IACjCK,QAAQ,CAACC,GAAkBC,OAAoBF,OAAOE,GAAGH,OAAOJ,OAAAA;IAChEQ,SAAS,CAACC,UAAUC,aAAWC,YAAYC,KAAKH,KAAAA;EAClD,CAAA;AACF;AASA,IAAMJ,SAAS,CAACD,OAAoBJ,YAAAA;AAClC,QAAMa,UAAU,IAAIC,iBAAAA;AACpB,QAAMC,SAASX,MAAMY,UAAUC,KAAKC;AAEpC,QAAMC,SAAkB,CAAA;AACxB,QAAMC,WAAW,MAAMD,OAAOA,OAAOE,SAAS,CAAA;AAC9C,QAAMC,SAAS,MAAA;AACb,UAAMvB,SAAQqB,SAAAA;AACd,WAAOrB,OAAMwB,OAAOxB,OAAMwB,KAAKF,SAAS,CAAA;EAC1C;AAGAG,EAAAA,YAAWpB,KAAAA,EAAOqB,QAAQ;IACxBC,OAAO,CAACC,SAAAA;AAEN,cAAQA,KAAKC,MAAI;QACf,KAAK,SAAS;AACZT,iBAAOU,KAAK;YAAEjB,MAAMe,KAAKf;YAAMkB,IAAIH,KAAKG;UAAG,CAAA;AAC3C;QACF;QACA,KAAK,eAAe;AAClBV,mBAAAA,EAAWW,SAAS,CAAA;AACpB;QACF;QACA,KAAK,YAAY;AACdX,WAAAA,SAAAA,EAAWG,SAAS,CAAA,GAAIM,KAAK,CAAA,CAAE;AAChC;QACF;QACA,KAAK,aAAa;AAChB,gBAAMG,MAAMV,OAAAA;AACZ,cAAIU,KAAK;AACPA,gBAAIH,KAAKzB,MAAM6B,SAASN,KAAKf,MAAMe,KAAKG,EAAE,CAAA;UAC5C,OAAO;AACLV,qBAAAA,EAAWW,QAAQF,KAAKzB,MAAM6B,SAASN,KAAKf,MAAMe,KAAKG,EAAE,CAAA;UAC3D;AACA;QACF;MACF;IACF;EACF,CAAA;AAEAX,SAAOe,QAAQ,CAACnC,WAAAA;AACd,UAAMoC,OAAO/B,MAAMgC,YAAYrB,SAAShB,OAAMa,QAAQG,SAAShB,OAAM+B;AACrEK,YACEtB,QAAQwB,IACNtC,OAAMa,MACNb,OAAM+B,IACNQ,aAAWC,QAAQ;MACjBC,QAAQ,IAAIC,YAAY1C,MAAAA;IAC1B,CAAA,CAAA;AAIJc,YAAQwB,IAAItC,OAAMa,MAAMb,OAAM+B,IAAIQ,aAAWI,KAAK;MAAEC,OAAO;IAAW,CAAA,CAAA;EACxE,CAAA;AAEA,SAAO9B,QAAQ+B,OAAM;AACvB;AAEA,IAAMH,cAAN,cAA0BI,YAAAA;EACxBC,YAAqBC,QAAe;AAClC,UAAK;SADcA,SAAAA;EAErB;EAESC,GAAGC,OAAa;AACvB,WACE,KAAKF,OAAOhB,QAAQmB,KAAAA,MAAWD,MAAMF,OAAOhB,QAAQmB,KAAAA,KACpD,KAAKH,OAAOxB,MAAM2B,KAAAA,MAAWD,MAAMF,OAAOxB,MAAM2B,KAAAA;EAEpD;EAESC,MAAMC,MAAkB;AAC/B,UAAMrD,SAAQsD,SAASC,cAAc,OAAA;AAErC;AACE,YAAMvB,SAAShC,OAAMwD,YAAYF,SAASC,cAAc,OAAA,CAAA;AACxD,YAAM/C,KAAKwB,OAAOwB,YAAYF,SAASC,cAAc,IAAA,CAAA;AACrD,WAAKP,OAAOhB,QAAQG,QAAQ,CAACsB,SAAAA;AAC3B,cAAMC,KAAKJ,SAASC,cAAc,IAAA;AAClCG,WAAGC,aAAa,SAAS,eAAA;AACzBnD,WAAGgD,YAAYE,EAAAA,EAAIE,cAAcH;MACnC,CAAA;IACF;AAEA;AACE,YAAMI,OAAO7D,OAAMwD,YAAYF,SAASC,cAAc,OAAA,CAAA;AACtD,WAAKP,OAAOxB,MAAMW,QAAQ,CAACF,QAAAA;AACzB,cAAMzB,KAAKqD,KAAKL,YAAYF,SAASC,cAAc,IAAA,CAAA;AACnDtB,YAAIE,QAAQ,CAACsB,SAAAA;AACX,gBAAMK,KAAKR,SAASC,cAAc,IAAA;AAClCO,aAAGH,aAAa,SAAS,eAAA;AACzBnD,aAAGgD,YAAYM,EAAAA,EAAIF,cAAcH;QACnC,CAAA;MACF,CAAA;IACF;AAEA,WAAOzD;EACT;EAES+D,YAAYC,GAAU;AAC7B,WAAO,CAAC,SAASC,KAAKD,EAAEE,IAAI;EAC9B;AACF;;;ACrIA,SAASC,cAAAA,mBAAkB;AAC3B,SAASC,mBAAAA,wBAAuB;AAChC,SAASC,cAAAA,cAAYC,cAAAA,cAAYC,cAAAA,aAAYC,cAAAA,mBAAuD;AAKpG,IAAMC,UAASC,aAAWC,UAAU;EAClC,cAAc;IACZC,OAAOC,SAAS,wBAAA;EAClB;EACA,uBAAuB;IACrBC,YAAY;IACZC,aAAa;EACf;AACF,CAAA;AAEA,IAAMC,iBAAN,cAA6BC,YAAAA;EAC3BC,YAAoBC,UAAmB;AACrC,UAAK;SADaA,WAAAA;EAEpB;EAESC,GAAGC,OAAa;AACvB,WAAO,KAAKF,aAAaE,MAAMF;EACjC;EAESG,MAAMC,MAAkB;AAC/B,UAAMC,QAAQC,SAASC,cAAc,OAAA;AACrCF,UAAMG,YAAY;AAClBH,UAAMI,OAAO;AACbJ,UAAMK,UAAU,KAAKV;AACrB,QAAII,KAAKO,MAAMC,UAAU;AACvBP,YAAMQ,aAAa,YAAY,MAAA;IACjC,OAAO;AACLR,YAAMS,cAAc,CAACC,UAAAA;AACnB,cAAMC,MAAMZ,KAAKa,SAASZ,KAAAA;AAC1B,cAAMa,OAAOd,KAAKO,MAAMQ,SAASH,KAAKA,MAAM,CAAA;AAC5C,YAAIE,UAAU,KAAKlB,WAAW,QAAQ,QAAQ;AAC5CI,eAAKgB,SAAS;YACZC,SAAS;cAAEC,MAAMN,MAAM;cAAGO,IAAIP,MAAM;cAAGQ,QAAQ,KAAKxB,WAAW,MAAM;YAAI;UAC3E,CAAA;AACAe,gBAAMU,eAAc;QACtB;MACF;IACF;AAEA,WAAOpB;EACT;EAESqB,cAAc;AACrB,WAAO;EACT;AACF;AAEA,IAAMC,oBAAoBC,aAAWC,QAAQ;EAAEC,QAAQ,IAAIjC,eAAe,IAAA;AAAM,CAAA;AAChF,IAAMkC,sBAAsBH,aAAWC,QAAQ;EAAEC,QAAQ,IAAIjC,eAAe,KAAA;AAAO,CAAA;AAEnF,IAAMmC,oBAAmB,CAAC5B,SAAAA;AACxB,QAAM6B,UAAU,IAAIC,iBAAAA;AACpB,QAAM,EAAEvB,MAAK,IAAKP;AAClB,QAAM+B,SAASxB,MAAMyB,UAAUC,KAAKC;AAEpC,aAAW,EAAEhB,MAAMC,GAAE,KAAMnB,KAAKmC,eAAe;AAC7CC,IAAAA,YAAW7B,KAAAA,EAAO8B,QAAQ;MACxBC,OAAO,CAACC,SAAAA;AACN,YAAIA,KAAKC,SAAS,cAAc;AAE9B,cAAIT,SAASQ,KAAKrB,QAAQa,SAASQ,KAAKpB,IAAI;AAC1C,kBAAMb,UAAUC,MAAMkC,IAAIC,YAAYH,KAAKrB,OAAO,GAAGqB,KAAKpB,KAAK,CAAA,MAAO;AACtEU,oBAAQc,IAAIJ,KAAKrB,OAAO,GAAGqB,KAAKrB,OAAO,GAAGM,aAAWoB,KAAK;cAAEC,OAAO;YAAU,CAAA,CAAA;AAC7EhB,oBAAQc,IAAIJ,KAAKrB,MAAMqB,KAAKpB,IAAIb,UAAUiB,oBAAoBI,mBAAAA;UAChE;QACF;MACF;MACAT;MACAC;IACF,CAAA;EACF;AAEA,SAAOU,QAAQiB,OAAM;AACvB;AAIO,IAAMC,WAAW,CAACC,UAA2B,CAAC,MAAC;AACpD,SAAO;IACLC,YAAWC,UACT,MAAA;MAEEvD,YAAYK,MAAkB;AAC5B,aAAKmD,cAAcvB,kBAAiB5B,IAAAA;MACtC;MAEAoD,OAAOA,SAAoB;AACzB,YAAIA,QAAOC,cAAcD,QAAOE,mBAAmBF,QAAOG,cAAc;AACtE,eAAKJ,cAAcvB,kBAAiBwB,QAAOpD,IAAI;QACjD;MACF;IACF,GACA;MACEmD,aAAa,CAACK,UAAUA,MAAML;IAChC,CAAA;IAEFjE;;AAEJ;;;ACzGA,SAASuE,kBAAAA,uBAAqE;AAQvE,IAAMC,UAAU,CAAC,EAAEC,SAAQ,MAAkB;AAClD,SAAOC,gBAAe;;IAEpBC,kBAAkB;;;IAGlBC,aAAa;;IAEbC,OAAO;IACPC,UAAU;MACR,CAACC,YAAAA;AACCC,gBAAQC,IAAIF,OAAAA;AAEZ,cAAMG,QAAQH,QAAQI,YAAY,SAAA;AAClC,YAAI,CAACD,SAAUA,MAAME,SAASF,MAAMG,MAAM,CAACN,QAAQO,UAAW;AAC5D,iBAAO;QACT;AAEA,eAAO;UACLF,MAAMF,MAAME;UACZG,SAASd,SAASS,MAAMM,KAAKC,MAAM,CAAA,EAAGC,YAAW,CAAA,EAAIC,IAAI,CAACC,WAAW;YAAEC,OAAO,IAAID,KAAAA;UAAQ,EAAA;QAC5F;MACF;;EAEJ,CAAA;AACF;;;AC5BO,IAAME,WAAW,CAACC,UAA2B,CAAC,MAAC;AACpD,SAAO,CAAA;AACT;;;ACNA,SAASC,UAAAA,eAAc;AASvB,IAAMC,eAAe;EAAC;EAAgB;EAAmB;;AAKlD,IAAMC,aAAa,CAAC,EAAEC,QAAQ,IAAIC,QAAQH,aAAY,IAAkB,CAAC,MAAC;AAC/E,MAAII;AACJ,MAAIC,MAAM;AAEV,SAAO;IACLC,QAAOC,GAAG;MACR;;QAEEC,KAAK;QACLC,KAAK,CAACC,SAAAA;AACJC,uBAAaP,CAAAA;AACbC,gBAAM;AACN,iBAAO;QACT;MACF;MACA;;;QAGEG,KAAK;QACLC,KAAK,CAACC,SAAAA;AACJC,uBAAaP,CAAAA;AAEb,gBAAMQ,OAAOT,MAAME,KAAAA;AACnB,cAAIA,QAAQF,OAAOU,QAAQ;AACzBR,kBAAM;UACR;AAEA,cAAIS,IAAI;AACR,gBAAMC,SAAS,CAACC,IAAI,MAAC;AACnBZ,gBAAIa,WAAW,MAAA;AACb,oBAAMC,MAAMR,KAAKS,MAAMC,UAAUC,KAAKC;AACtCZ,mBAAKa,SAAS;gBACZC,SAAS;kBAAEC,MAAMP;kBAAKH,QAAQH,KAAKE,GAAAA;gBAAK;gBACxCM,WAAW;kBAAEM,QAAQR,MAAM;gBAAE;cAC/B,CAAA;AAEA,kBAAIJ,IAAIF,KAAKC,QAAQ;AACnBE,uBAAOY,KAAKC,OAAM,IAAK1B,SAASU,KAAKE,CAAAA,MAAO,MAAM,IAAI,EAAA;cACxD;YACF,GAAGE,CAAAA;UACL;AAEAD,iBAAAA;AACA,iBAAO;QACT;MACF;KACD;;AAEL;;;AC/DA,OAAOc,UAAS;AAkBT,IAAMC,eAA4B;;;;;;;;;;;;;;;;;;;;;;;;EAyBvC,KAAK,CAAC;EACN,gBAAgB;IACdC,SAAS;EACX;EAEA,gBAAgB;;IAEdC,YAAYC,KAAIC,QAAQ,mBAAmB,CAAA,CAAE,EAAEC,KAAK,GAAA;IACpDC,YAAY;EACd;EAEA,eAAe;IACbC,SAAS;;IAETC,UAAU;EACZ;EACA,sBAAsB;IACpBC,OAAON,KAAIC,QAAQ,uCAAuC,OAAA;IAC1DM,YAAY;EACd;EACA,qBAAqB;IACnBD,OAAON,KAAIC,QAAQ,sCAAsC,OAAA;IACzDM,YAAY;EACd;;;;EAKA,4CAA4C;IAC1CC,YAAY;EACd;EACA,0CAA0C;IACxCA,YAAY;EACd;EACA,0BAA0B;IACxBF,OAAON,KAAIC,QAAQ,2CAA2C,gBAAA;EAChE;EACA,yBAAyB;IACvBK,OAAON,KAAIC,QAAQ,0CAA0C,sBAAA;EAC/D;;;;EAKA,YAAY;IACVQ,eAAe;EACjB;EACA,kBAAkB;IAChBC,YAAY;EACd;;;;EAMA,kCAAkC;IAChCA,YAAYV,KAAIC,QAAQ,2BAAA;EAC1B;EACA,iFAAiF;IAC/ES,YAAYV,KAAIC,QAAQ,2BAAA;EAC1B;EACA,iCAAiC;IAC/BS,YAAYV,KAAIC,QAAQ,2BAAA;EAC1B;EACA,gFAAgF;IAC9ES,YAAYV,KAAIC,QAAQ,2BAAA;EAC1B;;;;EAMA,0BAA0B;IACxBU,iBAAiBX,KAAIC,QAAQ,0BAAA;EAC/B;EACA,yBAAyB;IACvBU,iBAAiBX,KAAIC,QAAQ,0BAAA;EAC/B;;;;EAKA,YAAY;IACVK,OAAON,KAAIC,QAAQ,2BAAA;IACnBW,oBAAoB;IACpBC,yBAAyB;IACzBC,qBAAqB;IACrBC,cAAc;IACdhB,YAAYC,KAAIC,QAAQ,mBAAmB,CAAA,CAAE,EAAEC,KAAK,GAAA;EACtD;;;;EAKA,eAAe;IACbc,QAAQ;EACV;EACA,qBAAqB,CAAC;;;;EAKtB,4BAA4B;IAC1BC,WAAW;IACXC,YAAY;EACd;EACA,kCAAkC,CAAC;EACnC,iDAAiD,CAAC;EAClD,sBAAsB;IACpBC,SAAS;EACX;EACA,uBAAuB;IACrBpB,YAAYC,KAAIC,QAAQ,mBAAmB,CAAA,CAAE,EAAEC,KAAK,GAAA;EACtD;EACA,6BAA6B;IAC3BkB,gBAAgB;EAClB;;;;EAKA,eAAe;IACbrB,YAAY,GAAGC,KAAIC,QAAQ,mBAAmB,CAAA,CAAE,EAAEC,KAAK,GAAA,CAAA;IACvDkB,gBAAgB;EAClB;EACA,kBAAkB;IAChBhB,SAAS;IACTiB,cAAc,aAAarB,KAAIC,QAAQ,2BAAA,CAAA;IACvCqB,YAAY;IACZC,WAAW;IACXjB,OAAON,KAAIC,QAAQ,2BAAA;EACrB;EACA,kBAAkB;IAChBG,SAAS;EACX;;;;EAKA,aAAa;IACXe,SAAS;IACTK,QAAQ;EACV;EACA,6BAA6B;IAC3BA,QAAQ;IACRC,WAAW;IACXJ,cAAc;EAChB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgCA,cAAc;IACZL,QAAQ,aAAahB,KAAIC,QAAQ,2BAAA,CAAA;EACnC;EACA,aAAa;IACXS,YAAYV,KAAIC,QAAQ,0BAAA;IACxBF,YAAYC,KAAIC,QAAQ,mBAAmB,CAAA,CAAE,EAAEC,KAAK,GAAA;EACtD;EACA,cAAc;IACZwB,QAAQ;IACR3B,YAAYC,KAAIC,QAAQ,mBAAmB,CAAA,CAAE,EAAEC,KAAK,GAAA;IACpDQ,YAAYV,KAAIC,QAAQ,2BAAA;IACxB0B,iBAAiB;IACjBX,QAAQ;IACR,WAAW;MACTN,YAAYV,KAAIC,QAAQ,2BAAA;IAC1B;IACA,YAAY;MACVS,YAAYV,KAAIC,QAAQ,2BAAA;MACxB0B,iBAAiB;IACnB;EACF;EACA,kCAAkC;IAChCC,aAAa;EACf;AACF;AAEO,IAAMC,YAAyB;EACpC,gBAAgB;IACd9B,YAAYC,KAAIC,QAAQ,mBAAmB,CAAA,CAAE,EAAEC,KAAK,GAAA;EACtD;EACA,mBAAmB;IACjBH,YAAYC,KAAIC,QAAQ,mBAAmB,CAAA,CAAE,EAAEC,KAAK,GAAA;EACtD;AACF;AAEO,IAAM4B,gBAA6B;EACxC,gBAAgB;IACd/B,YAAYC,KAAIC,QAAQ,mBAAmB,CAAA,CAAE,EAAEC,KAAK,GAAA;EACtD;EACA,mBAAmB;IACjBH,YAAYC,KAAIC,QAAQ,mBAAmB,CAAA,CAAE,EAAEC,KAAK,GAAA;EACtD;AACF;AAEO,IAAM6B,YAAyB;EACpC,gBAAgB;IACdhC,YAAYC,KAAIC,QAAQ,mBAAmB,CAAA,CAAE,EAAEC,KAAK,GAAA;EACtD;EACA,mBAAmB;IACjBH,YAAYC,KAAIC,QAAQ,mBAAmB,CAAA,CAAE,EAAEC,KAAK,GAAA;EACtD;AACF;;;;AhCrPO,IAAM8B,cAAc;EAAC;EAAW;;AA0ChC,IAAMC,iBAAiBC,2BAC5B,CACE,EACEC,OACAC,UACAC,WACAC,UACAC,WACAC,YACAC,OACAC,QAAQC,cACRC,aAAa,CAAA,GACbC,MAAK,GAEPC,iBAAAA;AAQA,QAAM,EAAEC,UAAS,IAAKC,gBAAAA;AAEtB,QAAMC,UAAUC,OAAuB,IAAA;AACvC,QAAM,CAACC,MAAMC,OAAAA,IAAWC,UAA4B,IAAA;AAIpDC,sBAA0DR,cAAc,MAAMK,MAAM;IAACA;GAAK;AAG1FI,EAAAA,WAAU,MAAA;AACR,QAAIlB,aAAa,CAACc,MAAMK,UAAU;AAChC,UAAIL,MAAMM,MAAMlB,UAAUmB,MAAMC,SAAS,GAAG;AAE1C,cAAM,EAAEC,GAAE,IAAKT,KAAKM,MAAMI,IAAIC,OAAO,CAAA;AACrCX,cAAMY,SAAS;UAAExB,WAAW;YAAEyB,QAAQJ;UAAG;QAAE,CAAA;MAC7C;AACAT,YAAMc,MAAAA;IACR;EACF,GAAG;IAACd;IAAMd;GAAU;AAIpBkB,EAAAA,WAAU,MAAA;AACR,QAAI,CAACpB,SAAS,CAACc,QAAQiB,SAAS;AAC9B;IACF;AAMA,UAAMT,QAAQU,aAAYC,OAAO;MAC/BP,KAAK1B,MAAMkC,KAAI;MACf9B;MACAK,YAAY;;QAEV0B,aAAWC,cAAcC,GAAG,CAACC,QAAAA;AAC3BC,UAAAA,KAAIC,MAAMF,KAAAA,QAAAA;;;;;;QACZ,CAAA;;;QAIAH,aAAWM,UAAUC,YAAAA;QACrBP,aAAW7B,MAAMA,SAAS,CAAC,CAAA;QAC3B6B,aAAWQ,UAAUN,GAAGzB,cAAc,MAAA;QACtCuB,aAAWS,iBAAiBP,GAAG;UAAEQ,OAAOtC,MAAMuC,QAAQC,aAAa;QAAG,CAAA;QACtEZ,aAAWa,kBAAkBX,GAAG;UAAEQ,OAAOtC,MAAM0C,SAASF,aAAa;QAAG,CAAA;;QAGxEZ,aAAWe,SAASb,GAAG,CAACpC,QAAAA;QACxB+B,aAAYmB,SAASd,GAAG,CAAC,CAACpC,QAAAA;;;QAI1BD,MAAMoD;;QAGN/C,eAAe,SAASgD,IAAAA;;WAGrB5C;QACH6C,OAAOC,WAAAA;IACX,CAAA;AAMA,UAAMC,UAAU,IAAIrB,aAAW;MAC7Bb;MACAmC,QAAQ3C,QAAQiB;MAChB5B;;;MAGAuD,sBAAsB,CAACC,KAAK3C,UAAAA;AAC1B,YAAIN,OAAO;AACTkD,qBAAWD,GAAAA;QACb;AACA3C,QAAAA,MAAK6C,OAAOF,GAAAA;MACd;IACF,CAAA;AAEA3C,UAAM8C,QAAAA;AACN7C,YAAQuC,OAAAA;AAER,WAAO,MAAA;AACLA,eAASM,QAAAA;AACT7C,cAAQ,IAAA;IACV;EACF,GAAG;IAACH;IAASd;IAAOC;IAAUI;IAAYO;GAAU;AAKpD,QAAMmD,cAAcC,YAClB,CAACC,UAAAA;AACC,UAAM,EAAEC,KAAKC,QAAQC,UAAUC,SAASC,QAAO,IAAKL;AACpD,YAAQC,KAAAA;MACN,KAAK,SAAS;AACZlD,cAAMc,MAAAA;AACN;MACF;MAEA,KAAK,UAAU;AACb,YAAIzB,eAAe,UAAU8D,UAAUC,YAAYC,WAAWC,UAAU;AACtEtD,gBAAMc,MAAAA;QACR;AACA;MACF;IACF;EACF,GACA;IAACd;IAAMX;GAAW;AAGpB,SACE,sBAAA,cAACkE,OAAAA;IACCL,KAAKlE,MAAMwE;IACXC,MAAK;IACLC,UAAU;IACT,GAAGnE,MAAMoE;;IAEVC,SAASb;IACTc,KAAK/D;;AAGX,CAAA;AAGK,IAAMgE,aAAa/E,2BACxB,CAAC,EAAEE,UAAU8E,aAAAA,cAAaC,cAAc1E,QAAQ2E,WAAW1E,OAAOE,aAAa,CAAA,GAAI,GAAGyE,MAAAA,GAASvE,iBAAAA;AAC7F,QAAM,EAAEC,UAAS,IAAKC,gBAAAA;AACtB,QAAMsE,eAAeC,cAAa,CAAC,GAAG7E,OAAO8E,gBAAAA;AAC7C,SACE,sBAAA,cAACvF,gBAAAA;IACC+E,KAAKlE;IACLV;IACAQ,YAAY;MAAC6E,kBAAkB;QAAE1E;QAAWmE,aAAAA;QAAaC;MAAa,CAAA;SAAOvE;;IAC7EH;IACAC,OAAO4E;IACN,GAAGD;;AAGV,CAAA;AAGK,IAAMK,iBAAiBxF,2BAC5B,CAAC,EAAEE,UAAU8E,aAAAA,cAAazE,QAAQkF,eAAejF,OAAOE,aAAa,CAAA,GAAI,GAAGyE,MAAAA,GAASvE,iBAAAA;AACnF,QAAM,EAAEC,UAAS,IAAKC,gBAAAA;AACtB,QAAMsE,eAAeC,cAAa,CAAC,GAAG7E,OAAOkF,oBAAAA;AAC7C,SACE,sBAAA,cAAC3F,gBAAAA;IACC+E,KAAKlE;IACLV;IACAQ,YAAY;MAACiF,yBAAyB;QAAE9E;QAAWmE,aAAAA;MAAY,CAAA;SAAOtE;;IACtEH;IACAC,OAAO4E;IACN,GAAGD;;AAGV,CAAA;AAGK,IAAM1E,eAAgC;EAC3CmE,MAAM;IACJ5B,WAAW4C,IAAG,QAAQC,SAAAA;EACxB;EACA9C,QAAQ;IACNC,WAAW;EACb;AACF;AAEO,IAAMsC,mBAAoC;EAC/C,GAAG7E;AACL;AAEO,IAAMiF,uBAAwC;EACnD,GAAGjF;AACL;;;AiC9QA,SAEEqF,YACAC,UACAC,MACAC,WACAC,MACAC,aACAC,YACAC,aACAC,WACAC,mBACAC,SAAAA,QACAC,OACAC,UACAC,UACAC,YACAC,WACAC,WACAC,UACAC,kBACK;AACP,SAASC,qBAAqB;AAC9B,OAAOC,YAAuC;AAE9C,SAASC,QAA0BC,iBAAiBC,cAAc;AAClE,SAASC,SAASC,MAAAA,WAAU;AAI5B,IAAMC,eAAwC;EAC5C,KAAKC;EACL,KAAKC;EACL,KAAKC;EACL,KAAKC;EACL,KAAKC;EACL,KAAKC;EACL,KAAKC;AACP;AA+BA,IAAM,CAACC,wBAAwBC,iBAAAA,IAAqBC,cAA4B,SAAA;AAEhF,IAAMC,cAAc,CAAC,EAAEC,UAAUC,UAAUC,MAAK,MAAgB;AAC9D,SACE,gBAAAC,OAAA,cAACP,wBAAAA;IAAuBK;IAAoBC;KAC1C,gBAAAC,OAAA,cAACC,iBAAAA;IAAgBC,SAAQ;KACvB,gBAAAF,OAAA,cAACG,OAAAA;IAAIC,MAAK;IAAUC,WAAU;KAC3BR,QAAAA,CAAAA,CAAAA;AAKX;AASA,IAAMS,gBAAgB,CAAC,EAAEC,MAAMC,SAASC,OAAOC,UAAUC,QAAO,MAAsB;AACpF,QAAM,EAAEb,UAAUC,MAAK,IAAKL,kBAAkB,eAAA;AAC9C,QAAMkB,SAASF,YAAYX,QAAQW,SAASX,KAAAA,IAAS;AACrD,QAAMc,WAAWF,WAAWZ,QAAQY,QAAQZ,KAAAA,IAAS;AAErD,QAAMe,cAAc,CAACC,UAAAA;AACnB,UAAMC,SAASR,QAAQT,KAAAA;AACvB,QAAIiB,QAAQ;AACVlB,iBAAWkB,MAAAA;AACXD,YAAME,eAAc;IACtB;EACF;AAEA,SACE,gBAAAjB,OAAA,cAACkB,QAAAA;IACCC,SAAQ;IACRC,YAAYC,IAAG,OAAOT,UAAU,YAAA;IAChCU,aAAaR;IACbL;IACAI;KAEA,gBAAAb,OAAA,cAACO,MAAAA;IAAKF,WAAWkB,QAAQ,CAAA;;AAG/B;AAEA,IAAMC,mBAAmB,MAAM,gBAAAxB,OAAA,cAACG,OAAAA;EAAIE,WAAU;;AAE9C,IAAMoB,kBAAkB,MAAA;AACtB,QAAM,EAAE3B,UAAUC,MAAK,IAAKL,kBAAkB,oBAAA;AAC9C,QAAMgC,YAAY3B,QAAQA,MAAM2B,YAAY;AAC5C,QAAMC,SAASD,aAAa,cAAcE,KAAKF,SAAAA;AAC/C,QAAMG,QAAQF,SAASA,OAAO,CAAA,IAAKD,cAAc,eAAe,CAACA,YAAY,MAAMI;AACnF,QAAMC,cAAc9C,aAAa4C,SAAS,GAAA;AAC1C,SACE,gBAAA7B,OAAA,cAACgC,OAAOC,MAAI;IACVpB,UAAUgB,UAAU;IACpBA,OAAOA,SAAS;IAChBK,eAAe,CAACL,WAAU/B,WAAW;MAAEqC,MAAM;MAAWC,MAAMC,SAASR,MAAAA;IAAO,CAAA;KAE9E,gBAAA7B,OAAA,cAACgC,OAAOM,eAAa,MACnB,gBAAAtC,OAAA,cAAC+B,aAAAA;IAAY1B,WAAWkB,QAAQ,CAAA;OAElC,gBAAAvB,OAAA,cAACgC,OAAOO,QAAM,MACZ,gBAAAvC,OAAA,cAACgC,OAAOQ,SAAO,MACb,gBAAAxC,OAAA,cAACgC,OAAOS,UAAQ,MACd,gBAAAzC,OAAA,cAACgC,OAAOU,QAAM;IAACb,OAAM;KAAI,WAAA,GACxB;IAAC;IAAG;IAAG;IAAG;IAAG;IAAG;IAAGc,IAAI,CAACC,UACvB,gBAAA5C,OAAA,cAACgC,OAAOU,QAAM;IAACG,KAAKD;IAAOf,OAAOiB,OAAOF,KAAAA;KAAQ,YACtCA,KAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AAQzB;AAEA,IAAMG,iBAAiB,MACrB,gBAAA/C,OAAA,cAACG,OAAAA;EAAIC,MAAK;GACR,gBAAAJ,OAAA,cAACM,eAAAA;EACCC,MAAMyC;EACNvC,OAAM;EACNE,SAAS,CAACsC,MAAMA,EAAEvB,cAAc;EAChChB,UAAU,CAACuC,MAAMA,EAAEC;EACnB1C,SAAS,CAACyC,OAAO;IAAEd,MAAM;IAAUC,MAAMa,IAAI,CAACA,EAAEC,SAAS;EAAK;IAEhE,gBAAAlD,OAAA,cAACM,eAAAA;EACCC,MAAM4C;EACN1C,OAAM;EACNE,SAAS,CAACsC,MAAMA,EAAEvB,cAAc;EAChChB,UAAU,CAACuC,MAAMA,EAAEG;EACnB5C,SAAS,CAACyC,OAAO;IAAEd,MAAM;IAAYC,MAAMa,IAAI,CAACA,EAAEG,WAAW;EAAK;IAEpE,gBAAApD,OAAA,cAACM,eAAAA;EACCC,MAAM8C;EACN5C,OAAM;EACNE,SAAS,CAACsC,MAAMA,EAAEvB,cAAc;EAChChB,UAAU,CAACuC,MAAMA,EAAEK;EACnB9C,SAAS,CAACyC,OAAO;IAAEd,MAAM;IAAiBC,MAAMa,IAAI,CAACA,EAAEK,gBAAgB;EAAK;IAE9E,gBAAAtD,OAAA,cAACM,eAAAA;EACCC,MAAMgD;EACN9C,OAAM;EACNE,SAAS,CAACsC,MAAMA,EAAEvB,cAAc;EAChChB,UAAU,CAACuC,MAAMA,EAAEO;EACnBhD,SAAS,CAACyC,OAAO;IAAEd,MAAM;IAAQC,MAAMa,IAAI,CAACA,EAAEO,OAAO;EAAK;;AAKhE,IAAMC,gBAAgB,MACpB,gBAAAzD,OAAA,cAACG,OAAAA;EAAIC,MAAK;GACR,gBAAAJ,OAAA,cAACM,eAAAA;EACCC,MAAMmD;EACNjD,OAAM;EACNC,UAAU,CAACuC,MAAMA,EAAEU,cAAc;EACjCnD,SAAS,CAACyC,OAAO;IAAEd,MAAM;IAAeC,MAAMa,IAAIA,EAAEU,cAAc,WAAW;EAAK;IAEpF,gBAAA3D,OAAA,cAACM,eAAAA;EACCC,MAAMqD;EACNnD,OAAM;EACNC,UAAU,CAACuC,MAAMA,EAAEU,cAAc;EACjCnD,SAAS,CAACyC,OAAO;IAAEd,MAAM;IAAgBC,MAAMa,IAAIA,EAAEU,cAAc,YAAY;EAAK;IAEtF,gBAAA3D,OAAA,cAACM,eAAAA;EACCC,MAAMsD;EACNpD,OAAM;EACNC,UAAU,CAACuC,MAAMA,EAAEU,cAAc;EACjCnD,SAAS,CAACyC,OAAO;IAAEd,MAAM;IAAcC,MAAMa,IAAIA,EAAEU,cAAc,SAAS;EAAK;;AAKrF,IAAMG,iBAAiB,MACrB,gBAAA9D,OAAA,cAACG,OAAAA;EAAIC,MAAK;GACR,gBAAAJ,OAAA,cAACM,eAAAA;EACCC,MAAMwD;EACNtD,OAAM;EACNC,UAAU,CAACuC,MAAMA,EAAEe;EACnBxD,SAAS,CAACyC,OAAO;IAAEd,MAAM;IAAcC,MAAMa,IAAI,CAACA,EAAEe,aAAa;EAAK;IAExE,gBAAAhE,OAAA,cAACM,eAAAA;EACCC,MAAM0D;EACNxD,OAAM;EACNE,SAAS,CAACsC,MAAM,CAACA,EAAEiB;EACnBxD,UAAU,CAACuC,MAAMA,EAAEvB,cAAc;EACjClB,SAAS,CAACyC,OAAO;IAAEd,MAAM;IAAaC,MAAMa,IAAIA,EAAEvB,cAAc,cAAc;EAAK;IAErF,gBAAA1B,OAAA,cAACM,eAAAA;EAAcC,MAAM4D;EAAO1D,OAAM;EAAQE,SAAS,CAACsC,MAAM,CAACA,EAAEiB;EAAW1D,SAAS,OAAO;IAAE2B,MAAM;EAAQ;;AAI5G,IAAMiC,gBAAgB,MACpB,gBAAApE,OAAA,cAACG,OAAAA;EAAIC,MAAK;GACR,gBAAAJ,OAAA,cAACM,eAAAA;EACCC,MAAM8D;EACN5D,OAAM;EACNC,UAAU,CAACuC,MAAMA,EAAEqB;EACnB9D,SAAS,CAACyC,OAAO;IAAEd,MAAM;IAAQC,MAAMa,IAAI,CAACA,EAAEqB,OAAO;EAAK;;AAOhE,IAAMC,mBAAmB,MACvB,gBAAAvE,OAAA,cAAAA,OAAA,UAAA,MACE,gBAAAA,OAAA,cAACyB,iBAAAA,IAAAA,GACD,gBAAAzB,OAAA,cAAC+C,gBAAAA,IAAAA,GACD,gBAAA/C,OAAA,cAACyD,eAAAA,IAAAA,GACD,gBAAAzD,OAAA,cAAC8D,gBAAAA,IAAAA,GACD,gBAAA9D,OAAA,cAACoE,eAAAA,IAAAA,CAAAA;AAIL,IAAMI,mBAAmB,MACvB,gBAAAxE,OAAA,cAACyE,QAAQvD,QAAM;EAACX,MAAMmE;EAAUjE,OAAM;EAAiBD,SAAS,OAAO;IAAE2B,MAAM;EAAU;;AAGpF,IAAMsC,UAAU;EACrBxC,MAAMrC;EACNsB,QAAQZ;EACRqE,WAAWnD;EACXoD,UAAUL;EACVM,UAAUL;AACZ;;;ACjQA,SAASM,cAAcC,SAAAA,QAAOC,aAAa;AAC3C,SAASC,WAAAA,gBAAe;AACxB,SAASC,aAAAA,kBAAiB;AAC1B,SAASC,OAAAA,YAAW;;AAepB,IAAMC,oBAAoB;AAYnB,IAAMC,yBAAN,MAAMA;EAcXC,YAAYC,QAAiC;AAb5BC,yBAAgB,oBAAIC,IAAAA;AAWrBC,6BAAoB,IAAIX,OAAAA;AAGtC,SAAKY,SAASJ,OAAOK;AACrB,SAAKC,WAAWN,OAAOO;AACvB,SAAKC,UAAUR,OAAOS;AACtB,SAAKC,QAAQV,OAAOW;EACtB;EAEAC,OAAO;AACL,SAAKC,OAAO,IAAInB,SAAAA;AAChB,SAAKoB,YAAY,IAAIvB,aAAa,KAAKsB,MAAM,YAAA;AAC3C,UAAI,KAAKE,aAAa;AACpB,cAAM,KAAKX,OAAOY,YAAY,KAAKV,UAAU;UAC3CW,MAAM;UACNC,OAAO,KAAKH;QACd,CAAA;AAEA,cAAMtB,MAAMI,iBAAAA;MACd;IACF,CAAA;AAEA,SAAKgB,KAAKM,UACR,KAAKf,OAAOgB,OAAO,KAAKd,UAAU,CAACe,YAAAA;AACjC,cAAQA,QAAQC,QAAQL,MAAI;QAC1B,KAAK,SAAS;AACZ,eAAKM,oBAAmB;AACxB;QACF;QACA,KAAK,QAAQ;AACX,eAAKC,mBAAmBH,QAAQC,OAAO;AACvC;QACF;MACF;IACF,CAAA,CAAA;AAGF,SAAK,KAAKlB,OACPY,YAAY,KAAKV,UAAU;MAC1BW,MAAM;IACR,CAAA,EACCQ,MAAM,CAACC,QAAAA;AACN9B,MAAAA,KAAI+B,MAAM,6BAA6B;QAAED;MAAI,GAAA;;;;;;IAC/C,CAAA;EACJ;EAEAE,QAAQ;AACN,SAAK,KAAKf,MAAMgB,QAAAA;AAChB,SAAKhB,OAAOiB;AACZ,SAAKhB,YAAYgB;EACnB;EAEAC,kBAAoC;AAClC,WAAOC,MAAMC,KAAK,KAAKhC,cAAciC,OAAM,CAAA;EAC7C;EAEAC,OAAOC,UAA+C;AACpDzC,IAAAA,WAAU,KAAKmB,WAAS,QAAA;;;;;;;;;AACxB,SAAKC,cAAc;MACjBN,QAAQ,KAAKD;MACb4B;MACAzB,MAAM,KAAKD;IACb;AAEA,SAAKI,UAAUuB,SAAQ;EACzB;EAEQd,sBAAsB;AAC5B5B,IAAAA,WAAU,KAAKmB,WAAS,QAAA;;;;;;;;;AACxB,SAAKA,UAAUuB,SAAQ;EACzB;EAEQb,mBAAmBH,SAA0B;AACnD1B,IAAAA,WAAU0B,QAAQJ,SAAS,QAAA,QAAA;;;;;;;;;AAC3B,SAAKhB,cAAcqC,IAAIjB,QAAQH,MAAMT,QAAQY,QAAQH,KAAK;AAC1D,SAAKf,kBAAkBoC,KAAI;EAC7B;AACF;;;ACvHA,SAAyBC,cAAAA,mBAAkB;AAkCpC,IAAMC,aAAaC,YAAWC,OAAgC;EACnEC,QAAQ,MAAMC;EACdC,QAAQ,CAACC,UAAUA;AACrB,CAAA;;;ACdO,IAAMC,mBAAmB,CAACC,SAAAA;AAC/B,SAAO,CAACC,WAAAA;AACN,QAAI,CAACD,MAAM;AACT;IACF;AAEA,QAAIE,YAAYC;AAChB,YAAQF,OAAOG,MAAI;MACjB,KAAK;AACHC,mBAAWC,SAASL,OAAOM,IAAI,CAAA,EAAGP,IAAAA;AAClC;MAEF,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;AACHE,qBACED,OAAOG,SAAS,WACZI,OAAOC,SACPR,OAAOG,SAAS,aACdI,OAAOE,WACPT,OAAOG,SAAS,kBACdI,OAAOG,gBACPH,OAAOI;AAChB,SAAA,OAAOX,OAAOM,SAAS,YAAYM,SAASX,YAAYD,OAAOM,IAAI,IAAIO,YAAYZ,UAAAA,GAAaF,IAAAA;AACjG;MAEF,KAAK;MACL,KAAK;MACL,KAAK;AACHG,mBACEF,OAAOG,SAAS,iBAAiBW,KAAKC,UAAUf,OAAOG,SAAS,gBAAgBW,KAAKE,SAASF,KAAKG;AACpGjB,SAAAA,OAAOM,SAAS,QACbY,WAAWhB,QAAAA,IACXF,OAAOM,SAAS,OACda,QAAQjB,QAAAA,IACRkB,WAAWlB,QAAAA,GAAWH,IAAAA;AAC5B;MAEF,KAAK;AACFC,SAAAA,OAAOM,SAAS,QAAQe,mBAAmBrB,OAAOM,SAAS,OAAOgB,gBAAgBC,kBAAkBxB,IAAAA;AACrG;MACF,KAAK;AACFC,SAAAA,OAAOM,SAAS,QAAQkB,kBAAkBC,cAAc1B,IAAAA;AACzD;MACF,KAAK;AACH2B,oBAAY3B,IAAAA;AACZ;MAEF,KAAK;AACFC,SAAAA,OAAOM,SAAS,QAAQqB,aAAaC,SAAS7B,IAAAA;AAC/C;MAEF,KAAK;AACH8B,sBAAc9B,IAAAA;AACd;IACJ;AAGA+B,eAAW,MAAA;AACT,UAAI,CAAC/B,KAAKgC,UAAU;AAClBhC,aAAKiC,MAAK;MACZ;IACF,CAAA;EACF;AACF;;;ACvFA,SAA2BC,YAAAA,iBAAgB;AAepC,IAAMC,gBAAgB,MAAA;AAC3B,QAAM,CAACC,MAAMC,OAAAA,IAAWC,UAA4B,IAAA;AACpD,SAAO;IACL,CAACC,QAAAA;AACCF,cAAQE,GAAAA;IACV;IACAH;;AAEJ;;;ACxBA,SACEI,mBAAAA,kBACAC,eAAAA,oBAIK;AACP,SAASC,cAAAA,oBAAkB;AAC3B,SAAyBC,aAAAA,YAAWC,UAAAA,SAAQC,YAAAA,iBAAgB;AAE5D,SAASC,OAAAA,YAAW;AAEpB,SAASC,cAAAA,mBAAkB;;AAoBpB,IAAMC,gBAAgB,CAAC,EAC5BC,WACAC,UACAC,OACAC,KACAC,WACAC,WAAU,IACc,CAAC,MAAC;AAC1B,QAAMC,WAAWC,QAAAA;AACjB,QAAM,CAACC,MAAMC,OAAAA,IAAWC,UAAAA;AACxB,QAAMC,YAAYJ,QAAuB,IAAA;AACzCK,EAAAA,WAAU,MAAA;AACR,QAAID,UAAUE,SAAS;AAErB,YAAMC,QAAQC,aAAYC,OAAO;QAC/Bb;QACAC;QACAC,YAAY;;UAEVY,aAAWC,cAAcC,GAAG,CAACC,QAAAA;AAC3BC,YAAAA,KAAIC,MAAMF,KAAAA,QAAAA;;;;;;UACZ,CAAA;UACAf;UACAY,aAAWM,eAAeJ,GAAG,MAAA;AAC3Bb,qBAASO,UAAO;UAClB,CAAA;UACAW,OAAOC,WAAAA;MACX,CAAA;AAGA,YAAMjB,QAAO,IAAIS,aAAW;QAC1BS,QAAQf,UAAUE;QAClBZ;QACAa;;;QAGAa,sBAAsB,CAACC,KAAKpB,UAAAA;AAC1B,cAAIN,OAAO;AACT2B,uBAAWD,GAAAA;UACb;AACApB,UAAAA,MAAKsB,OAAOF,GAAAA;QACd;MACF,CAAA;AAEAnB,cAAQD,KAAAA;IACV;AAEA,WAAO,MAAA;AACLA,YAAMuB,QAAAA;IACR;EACF,GAAG;IAACpB;GAAU;AAEdC,EAAAA,WAAU,MAAA;AACR,QAAIJ,MAAM;AAER,UAAI,CAACJ,aAAa,CAACI,KAAKM,MAAMV,UAAU4B,KAAKC,QAAQ;AACnD7B,oBAAY8B,iBAAgBC,OAAO3B,KAAKM,MAAMX,IAAIiC,KAAK,CAAA,EAAGC,EAAE;MAC9D;AAKA,UAAIjC,aAAaH,UAAU;AACzBK,iBAASO,UAAU,MAAA;AACjBP,mBAASO,UAAUyB;AACnB9B,eAAK+B,SAAS;YAAEnC;YAAWoC,SAASvC,YAAY;cAACA;;YAAWwC,gBAAgB,CAACxC;UAAS,CAAA;QACxF;MACF;AAEA,UAAID,WAAW;AACbQ,aAAKkC,MAAK;MACZ;IACF;EACF,GAAG;IAAClC;IAAMR;IAAWI;IAAWH;GAAS;AAEzC,SAAO;IAAEU;IAAWH;EAAK;AAC3B;AASO,IAAMmC,uBAAuB,CAAC,EAAEC,WAAW,MAAK,IAAK,CAAC,MAAC;AAC5D,SAAO;;IAEL7B,aAAY8B,SAAS1B,GAAGyB,QAAAA;IACxB3B,aAAW6B,SAAS3B,GAAG,CAACyB,QAAAA;;AAE5B;AAgBO,IAAMG,wBAAwB,CAAC,EAAEC,OAAOC,WAAWC,MAAK,IAA6B,CAAC,MAAC;AAC5F,SAAO;;IAELjC,aAAWkC,UAAUC,YAAAA;IACrBJ,SAAS/B,aAAW+B,MAAMA,KAAAA;IAC1B/B,aAAWoC,UAAUlC,GAAG8B,cAAc,MAAA;IACtChC,aAAWqC,iBAAiBnC,GAAG;MAAEoC,OAAOL,OAAOM,QAAQC,aAAa;IAAG,CAAA;IACvExC,aAAWyC,kBAAkBvC,GAAG;MAAEoC,OAAOL,OAAOS,SAASF,aAAa;IAAG,CAAA;IACzEjC,OAAOC,WAAAA;AACX;;;ACpJA,OAAOmC,UAAS;AAChB,SAA6CC,aAAAA,YAAWC,YAAAA,iBAAgB;AAExE,SAASC,oBAAoB;AAC7B,SAAmCC,iBAAiB;AACpD,SAASC,aAAAA,kBAAiB;AAC1B,SAASC,yBAAsD;;AAexD,IAAMC,eAAe,CAACC,UAAAA;AAC3B,QAAM,EAAEC,UAAUC,OAAOC,KAAI,IAAKH;AAClC,QAAM,CAACI,OAAOC,QAAAA,IAAYC,UAAAA;AAC1BC,EAAAA,WAAU,MAAMF,SAASG,YAAYR,KAAAA,CAAAA,GAAS;IAACC;IAAUC;IAAOC;GAAK;AACrE,SAAOC;AACT;AAOO,IAAMK,uBAAuB,CAAC,EACnCC,IACAC,eAAc,MAIf;AACC,QAAM,CAACC,SAASC,UAAAA,IAAcP,UAASK,kBAAkB,EAAA;AACzD,SAAO;IAAED;IAAIE;IAASC;IAAYV,MAAM,MAAMS;EAAQ;AACxD;AAEA,IAAMJ,cAAc,CAAC,EAAEN,OAAOD,UAAUE,KAAI,MAAqB;AAC/D,MAAI,CAACA,MAAM;AACT,WAAOW;EACT;AAEAC,EAAAA,WAAUC,kBAAkBb,IAAAA,GAAAA,QAAAA;;;;;;;;;AAC5B,QAAMc,MAAMd;AACZ,QAAMe,MAAMC,UAAUF,KAAK;IAACA,IAAIG;GAAM;AAEtC,QAAMC,qBACJnB,SACA,IAAIoB,uBAAuB;IACzBpB;IACAqB,SAAS,uBAAuBN,IAAIP,EAAE;IACtCc,MAAM;MACJC,aAAaxB,WAAWA,SAASyB,SAASD,eAAeE,aAAa1B,SAAS2B,YAAYC,MAAK,CAAA,IAAMf;MACtGgB,OAAOC,YAAYD;MACnBE,YAAYD,YAAYE;IAC1B;IACAC,QAAQjC,UAAU2B,YAAYC,MAAAA,KAAW;EAC3C,CAAA;AAEF,QAAMM,aAAa;IAACC,WAAWC,KAAK,MAAMjC,KAAAA;IAAQkC,UAAU;MAAEC,QAAQrB,IAAIqB;MAAQC,MAAMtB,IAAIsB;IAAK,CAAA;;AACjG,MAAInB,oBAAmB;AACrBc,eAAWM,KAAKC,UAAUrB,kBAAAA,CAAAA;EAC5B;AAEA,QAAMjB,QAAqB;IACzBM,IAAIO,IAAIP;IACRE,SAASM;IACTf,MAAM,MAAMwC,KAAIzB,IAAIqB,OAAOK,QAAO,GAAI1B,IAAIsB,IAAI;IAC9CK,WAAWV;IACXW,MAAM7C,WACF;MACES,IAAIT,SAAS2B,YAAYC,MAAK;MAC9BkB,MAAM9C,SAASyB,SAASD;IAC1B,IACAX;EACN;AAEA,SAAOV;AACT;",
6
+ "names": ["TextKind", "Doc", "YText", "YXmlFragment", "keymap", "tags", "EditorState", "EditorView", "vim", "defaultsDeep", "React", "forwardRef", "useCallback", "useEffect", "useImperativeHandle", "useRef", "useState", "log", "useThemeContext", "focusRing", "mx", "isNotFalsy", "StateField", "Decoration", "EditorView", "isNotFalsy", "Facet", "defaultCursorConverter", "toCursor", "position", "toString", "fromCursor", "cursor", "parseInt", "Cursor", "converter", "Facet", "define", "combine", "providers", "getCursorFromRange", "state", "range", "cursorConverter", "facet", "from", "to", "join", "getRangeFromCursor", "parts", "split", "undefined", "annotationMark", "Decoration", "mark", "class", "annotations", "options", "match", "state", "text", "doc", "toString", "matches", "matchAll", "from", "index", "to", "length", "cursor", "Cursor", "getCursorFromRange", "push", "annotationsState", "StateField", "define", "create", "update", "value", "tr", "changes", "empty", "EditorView", "decorations", "compute", "field", "map", "annotation", "range", "getRangeFromCursor", "filter", "isNotFalsy", "set", "styles", "baseTheme", "textDecoration", "textDecorationStyle", "textDecorationColor", "autocompletion", "completionKeymap", "markdownLanguage", "keymap", "autocomplete", "onSearch", "keymap", "of", "completionKeymap", "autocompletion", "activateOnTyping", "tooltipClass", "markdownLanguage", "data", "context", "match", "matchBefore", "from", "to", "explicit", "options", "text", "toLowerCase", "invertedEffects", "StateField", "EditorView", "ViewPlugin", "next", "A", "get", "next", "A", "cursorConverter", "handle", "path", "toCursor", "pos", "doc", "docSync", "value", "get", "length", "A", "getCursor", "slice", "fromCursor", "cursor", "getCursorPosition", "Annotation", "StateEffect", "getPath", "state", "field", "path", "getLastHeads", "lastHeads", "updateHeadsEffect", "StateEffect", "define", "updateHeads", "newHeads", "of", "reconcileAnnotation", "Annotation", "isReconcile", "tr", "annotation", "next", "A", "next", "A", "updateAutomerge", "field", "handle", "transactions", "state", "lastHeads", "path", "hasChanges", "tr", "changes", "iterChanges", "undefined", "newHeads", "changeAt", "doc", "invertedTransactions", "fromA", "toA", "_fromB", "_toB", "insert", "push", "from", "del", "reverse", "forEach", "A", "splice", "slice", "toString", "ChangeSet", "updateCodeMirror", "view", "selection", "target", "patches", "patch", "changeSpec", "handlePatch", "state", "changeSet", "ChangeSet", "of", "doc", "length", "map", "dispatch", "changes", "annotations", "reconcileAnnotation", "action", "handleInsert", "handleSplice", "handleDel", "handlePut", "index", "charPath", "path", "text", "values", "value", "toString", "join", "from", "to", "insert", "textPath", "candidatePath", "i", "PatchSemaphore", "constructor", "_handle", "_state", "_inReconcile", "reconcile", "view", "doReconcile", "path", "getPath", "state", "oldHeads", "getLastHeads", "selection", "transactions", "field", "unreconciledTransactions", "filter", "tx", "isReconcile", "toInvert", "slice", "reverse", "tr", "inverted", "changes", "invert", "startState", "doc", "map", "dispatch", "annotations", "reconcileAnnotation", "of", "newHeads", "updateAutomerge", "undefined", "A", "getHeads", "docSync", "diff", "equals", "updateCodeMirror", "effects", "updateHeads", "automerge", "handle", "path", "syncState", "StateField", "define", "create", "slice", "lastHeads", "A", "getHeads", "docSync", "unreconciledTransactions", "update", "value", "tr", "result", "clearUnreconciled", "effect", "effects", "is", "updateHeadsEffect", "newHeads", "isReconcile", "push", "semaphore", "PatchSemaphore", "Cursor", "converter", "of", "cursorConverter", "ViewPlugin", "fromClass", "constructor", "_view", "addListener", "_handleChange", "bind", "destroy", "removeListener", "reconcile", "EditorView", "updateListener", "view", "changes", "empty", "invertedEffects", "iterChanges", "fromA", "toA", "fromB", "toB", "inserted", "Annotation", "Facet", "RangeSet", "Decoration", "EditorView", "ViewPlugin", "WidgetType", "Event", "Context", "dummyProvider", "remoteStateChange", "Event", "open", "close", "getRemoteStates", "update", "awarenessProvider", "Facet", "define", "combine", "providers", "RemoteSelectionChangedAnnotation", "Annotation", "awareness", "provider", "of", "ViewPlugin", "fromClass", "RemoteSelectionsDecorator", "decorations", "value", "styles", "constructor", "view", "RangeSet", "_ctx", "Context", "_lastAnchor", "undefined", "_lastHead", "_cursorConverter", "state", "facet", "Cursor", "converter", "_provider", "on", "dispatch", "annotations", "destroy", "dispose", "_updateLocalSelection", "_updateRemoteSelections", "hasFocus", "dom", "ownerDocument", "anchor", "head", "selection", "main", "toCursor", "awarenessStates", "position", "fromCursor", "start", "Math", "min", "doc", "length", "end", "max", "startLine", "lineAt", "endLine", "color", "info", "lightColor", "number", "push", "from", "to", "Decoration", "mark", "attributes", "style", "class", "i", "linePos", "line", "widget", "side", "block", "RemoteCaretWidget", "displayName", "set", "WidgetType", "_name", "_color", "toDOM", "span", "document", "createElement", "className", "backgroundColor", "borderColor", "dot", "innerText", "appendChild", "createTextNode", "updateDOM", "eq", "estimatedHeight", "ignoreEvent", "EditorView", "baseTheme", "padding", "margin", "borderLeft", "borderRight", "marginLeft", "marginRight", "boxSizing", "display", "cursor", "borderRadius", "width", "height", "top", "left", "transition", "transform", "transformOrigin", "fontSize", "fontFamily", "fontStyle", "fontWeight", "lineHeight", "userSelect", "zIndex", "opacity", "transitionDelay", "whiteSpace", "closeBrackets", "history", "bracketMatching", "defaultHighlightStyle", "syntaxHighlighting", "oneDarkHighlightStyle", "drawSelection", "EditorView", "highlightActiveLine", "placeholder", "isNotFalsy", "createBasicBundle", "themeMode", "placeholder", "_placeholder", "lineWrapping", "EditorView", "bracketMatching", "closeBrackets", "drawSelection", "highlightActiveLine", "history", "syntaxHighlighting", "oneDarkHighlightStyle", "defaultHighlightStyle", "filter", "isNotFalsy", "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", "invertedEffects", "Facet", "StateEffect", "StateField", "hoverTooltip", "keymap", "Decoration", "EditorView", "sortBy", "useEffect", "debounce", "nonNullable", "random", "cursorColors", "color", "light", "cursorColor", "uint32", "length", "mx", "headings", "heading", "level", "light", "mark", "mx", "bold", "italic", "strikethrough", "code", "codeMark", "inlineUrl", "mx", "code", "blockquote", "light", "get", "tailwindConfig", "tokens", "tailwindConfig", "theme", "getToken", "path", "defaultValue", "undefined", "get", "log", "callbackWrapper", "fn", "args", "err", "catch", "logChanges", "trs", "changes", "flatMap", "tr", "empty", "undefined", "iterChanges", "fromA", "toA", "fromB", "toB", "inserted", "push", "JSON", "stringify", "toString", "filter", "Boolean", "length", "console", "styles", "EditorView", "baseTheme", "mixBlendMode", "backgroundColor", "getToken", "color", "commentMark", "Decoration", "mark", "class", "commentCurrentMark", "focusComment", "view", "id", "center", "comment", "state", "field", "commentsState", "comments", "find", "range", "cursor", "Cursor", "getRangeFromCursor", "dispatch", "selection", "anchor", "from", "effects", "scrollIntoView", "y", "undefined", "setSelection", "of", "current", "setComments", "StateEffect", "define", "setCommentState", "StateField", "create", "update", "value", "tr", "effect", "is", "map", "filter", "nonNullable", "commentsDecorations", "decorations", "compute", "sortBy", "flatMap", "to", "console", "warn", "set", "trackPastedComments", "onUpdate", "tracked", "handleTrack", "event", "main", "selectedRanges", "length", "text", "doc", "slice", "domEventHandlers", "cut", "copy", "invertedEffects", "startState", "changes", "iterChangedRanges", "fromA", "toA", "push", "restoreCommentEffect", "updateListener", "restore", "i", "transactions", "j", "mapTrackedComment", "paste", "isUserEvent", "found", "iterChanges", "fromB", "toB", "eq", "indexOf", "mapPos", "moved", "exists", "some", "c", "getCursorFromRange", "optionsFacet", "Facet", "combine", "providers", "createComment", "options", "facet", "insert", "onCreate", "location", "coordsAtPos", "key", "shortcut", "handleSelect", "debounce", "onSelect", "keymap", "run", "callbackWrapper", "onHover", "hoverTooltip", "pos", "end", "above", "el", "document", "createElement", "dom", "offset", "x", "hoverTime", "mod", "from2", "to2", "forEach", "newRange", "onDelete", "Object", "assign", "min", "Infinity", "closest", "head", "d", "Math", "abs", "useComments", "useEffect", "EditorView", "listener", "onFocus", "onChange", "extensions", "push", "EditorView", "focusChangeEffect", "of", "_", "focused", "updateListener", "update", "state", "doc", "toString", "closeBrackets", "closeBracketsKeymap", "history", "historyKeymap", "indentWithTab", "standardKeymap", "markdownLanguage", "markdown", "bracketMatching", "defaultHighlightStyle", "indentOnInput", "syntaxHighlighting", "languages", "searchKeymap", "EditorState", "oneDarkHighlightStyle", "crosshairCursor", "drawSelection", "dropCursor", "EditorView", "highlightActiveLine", "keymap", "placeholder", "isNotFalsy", "markdownLanguage", "HighlightStyle", "tags", "styleTags", "Tag", "Table", "markdownTags", "Blockquote", "Tag", "define", "CodeMark", "CodeText", "EmphasisMark", "HeaderMark", "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", "scope", "markdownLanguage", "all", "fontFamily", "getToken", "join", "createMarkdownExtensions", "themeMode", "placeholder", "_placeholder", "lineWrapping", "EditorView", "EditorState", "allowMultipleSelections", "of", "tabSize", "bracketMatching", "closeBrackets", "crosshairCursor", "dropCursor", "drawSelection", "highlightActiveLine", "history", "indentOnInput", "markdown", "base", "markdownLanguage", "codeLanguages", "languages", "extensions", "markdownTagsExtensions", "syntaxHighlighting", "oneDarkHighlightStyle", "defaultHighlightStyle", "markdownHighlightStyle", "keymap", "indentWithTab", "closeBracketsKeymap", "historyKeymap", "searchKeymap", "standardKeymap", "filter", "isNotFalsy", "syntaxTree", "RangeSetBuilder", "ViewPlugin", "EditorView", "Decoration", "WidgetType", "mx", "styles", "EditorView", "baseTheme", "fontFamily", "getToken", "join", "width", "paddingInline", "position", "content", "inset", "background", "mixBlendMode", "display", "borderTopLeftRadius", "borderTopRightRadius", "borderBottomLeftRadius", "borderBottomRightRadius", "getLineRange", "lines", "from", "to", "start", "findIndex", "line", "end", "LineWidget", "WidgetType", "constructor", "_className", "toDOM", "el", "document", "createElement", "innerHTML", "className", "mx", "top", "bottom", "buildDecorations", "view", "builder", "RangeSetBuilder", "state", "blocks", "viewportLineBlocks", "cursor", "selection", "main", "head", "visibleRanges", "syntaxTree", "iterate", "enter", "node", "name", "edit", "readOnly", "range", "i", "block", "add", "Decoration", "replace", "widget", "class", "finish", "code", "ViewPlugin", "fromClass", "decorations", "update", "value", "snippet", "syntaxTree", "RangeSetBuilder", "EditorSelection", "Decoration", "EditorView", "keymap", "ViewPlugin", "useState", "useMemo", "compareFormatting", "a", "b", "blockType", "strong", "emphasis", "strikethrough", "code", "link", "listStyle", "blockQuote", "Inline", "List", "setHeading", "level", "state", "dispatch", "selection", "ranges", "doc", "changes", "prevBlock", "range", "syntaxTree", "iterate", "from", "to", "enter", "node", "Object", "hasOwn", "Textblocks", "name", "isHeading", "exec", "curLevel", "push", "insert", "repeat", "nextLine", "lineAt", "Math", "min", "length", "update", "userEvent", "scrollIntoView", "setStyle", "type", "enable", "marker", "inlineMarkerText", "changeByRange", "empty", "after", "sliceString", "head", "found", "indexOf", "test", "slice", "before", "reverse", "join", "EditorSelection", "cursor", "changesAtEnd", "blockStart", "blockEnd", "startCovered", "endCovered", "blockContentStart", "blockContentEnd", "IgnoreInline", "has", "InlineMarker", "markType", "size", "openEnd", "closeStart", "skipSpaces", "max", "leave", "rangeStart", "rangeEnd", "changeSet", "concat", "mapPos", "addStyle", "style", "removeStyle", "toggleStyle", "arg", "form", "getFormatting", "toggleStrong", "toggleEmphasis", "toggleStrikethrough", "toggleInlineCode", "atx", "setext", "lastLine", "text", "pos", "dir", "limit", "line", "snippets", "codeblock", "snippet", "table", "insertTable", "view", "main", "number", "anchor", "removeLinkInner", "removeLink", "addLink", "cutStyles", "okay", "sNode", "firstChild", "lastChild", "changesAfter", "cursorOffset", "mark", "addList", "lastBlock", "counter", "first", "parentColumn", "blocks", "prevSibling", "item", "itemLine", "itemText", "i", "nodeFrom", "padding", "String", "column", "j", "num", "open", "last", "next", "nextSibling", "renumberListItems", "removeList", "stack", "targetNodeType", "pop", "toggleList", "target", "formatting", "active", "newNum", "setBlockquote", "lines", "prevLine", "quote", "addBlockquote", "removeBlockquote", "toggleBlockquote", "addCodeblock", "blockFrom", "blockTo", "map", "removeCodeblock", "firstLine", "toggleCodeblock", "options", "keymap", "of", "key", "run", "styling", "buildDecorations", "builder", "RangeSetBuilder", "replace", "marks", "add", "Decoration", "visibleRanges", "getChildren", "finish", "ViewPlugin", "fromClass", "constructor", "decorations", "value", "Emphasis", "StrongEmphasis", "InlineCode", "Strikethrough", "Set", "ATXHeading1", "ATXHeading2", "ATXHeading3", "ATXHeading4", "ATXHeading5", "ATXHeading6", "CodeBlock", "FencedCode", "Paragraph", "SetextHeading1", "SetextHeading2", "TableCell", "Task", "inline", "currentBlock", "advanceInline", "upto", "end", "skipInline", "some", "v", "contextSize", "contextBefore", "contextAfter", "ch", "blockCode", "index", "hasList", "hasQuote", "blankLine", "useFormattingState", "setState", "useState", "observer", "useMemo", "EditorView", "updateListener", "docChanged", "selectionSet", "newState", "syntaxTree", "RangeSetBuilder", "Decoration", "ViewPlugin", "buildDecorations", "view", "builder", "RangeSetBuilder", "state", "cursor", "selection", "main", "head", "from", "to", "visibleRanges", "syntaxTree", "iterate", "enter", "node", "name", "mark", "getChild", "hasFocus", "readOnly", "add", "Decoration", "replace", "finish", "heading", "ViewPlugin", "fromClass", "constructor", "decorations", "update", "value", "syntaxTree", "RangeSetBuilder", "Decoration", "EditorView", "ViewPlugin", "WidgetType", "styles", "EditorView", "baseTheme", "borderTop", "getToken", "HorizontalRuleWidget", "WidgetType", "toDOM", "el", "document", "createElement", "className", "decoration", "Decoration", "replace", "widget", "buildDecorations", "view", "builder", "RangeSetBuilder", "state", "cursor", "selection", "main", "head", "from", "to", "visibleRanges", "syntaxTree", "iterate", "enter", "node", "name", "add", "finish", "hr", "ViewPlugin", "fromClass", "constructor", "decorations", "update", "value", "syntaxTree", "StateField", "Decoration", "EditorView", "WidgetType", "image", "options", "StateField", "define", "create", "state", "Decoration", "set", "buildDecorations", "doc", "length", "update", "value", "tr", "docChanged", "selection", "cursor", "main", "head", "oldCursor", "changes", "mapPos", "startState", "from", "Math", "min", "to", "max", "iterChangedRanges", "fromA", "toA", "fromB", "toB", "lineAt", "map", "filterFrom", "filterTo", "filter", "add", "provide", "field", "EditorView", "decorations", "syntaxTree", "iterate", "enter", "node", "name", "urlNode", "getChild", "hide", "readOnly", "url", "sliceDoc", "push", "replace", "block", "widget", "ImageWidget", "range", "WidgetType", "constructor", "_url", "eq", "other", "toDOM", "view", "img", "document", "createElement", "setAttribute", "onload", "classList", "syntaxTree", "RangeSetBuilder", "hoverTooltip", "Decoration", "ViewPlugin", "WidgetType", "tooltipContent", "link", "options", "extensions", "ViewPlugin", "fromClass", "constructor", "view", "decorations", "buildDecorations", "update", "docChanged", "viewportChanged", "selectionSet", "value", "onHover", "push", "hoverTooltip", "pos", "side", "syntax", "syntaxTree", "state", "resolveInner", "i", "node", "parent", "name", "url", "getChild", "urlText", "sliceDoc", "from", "to", "end", "above", "create", "el", "document", "createElement", "className", "tooltipContent", "dom", "offset", "x", "y", "LinkButton", "WidgetType", "_url", "_onAttach", "eq", "other", "toDOM", "LinkText", "_text", "setAttribute", "textContent", "href", "onclick", "dispatch", "selection", "anchor", "posAtDOM", "builder", "RangeSetBuilder", "cursor", "main", "head", "visibleRanges", "iterate", "enter", "marks", "getChildren", "text", "length", "urlNode", "hasFocus", "readOnly", "add", "Decoration", "replace", "widget", "undefined", "onRender", "finish", "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", "join", "toDOM", "view", "document", "createElement", "appendChild", "cell", "th", "setAttribute", "textContent", "body", "td", "ignoreEvent", "e", "test", "type", "syntaxTree", "RangeSetBuilder", "EditorView", "Decoration", "WidgetType", "ViewPlugin", "styles", "EditorView", "baseTheme", "color", "getToken", "marginLeft", "marginRight", "CheckboxWidget", "WidgetType", "constructor", "_checked", "eq", "other", "toDOM", "view", "input", "document", "createElement", "className", "type", "checked", "state", "readOnly", "setAttribute", "onmousedown", "event", "pos", "posAtDOM", "text", "sliceDoc", "dispatch", "changes", "from", "to", "insert", "preventDefault", "ignoreEvent", "checkedDecoration", "Decoration", "replace", "widget", "uncheckedDecoration", "buildDecorations", "builder", "RangeSetBuilder", "cursor", "selection", "main", "head", "visibleRanges", "syntaxTree", "iterate", "enter", "node", "name", "doc", "sliceString", "add", "mark", "class", "finish", "tasklist", "options", "ViewPlugin", "fromClass", "decorations", "update", "docChanged", "viewportChanged", "selectionSet", "value", "autocompletion", "mention", "onSearch", "autocompletion", "activateOnTyping", "closeOnBlur", "icons", "override", "context", "console", "log", "match", "matchBefore", "from", "to", "explicit", "options", "text", "slice", "toLowerCase", "map", "value", "label", "outliner", "options", "keymap", "defaultItems", "typewriter", "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", "get", "defaultTheme", "outline", "fontFamily", "get", "tokens", "join", "lineHeight", "padding", "fontSize", "color", "caretColor", "borderLeft", "paddingInline", "background", "backgroundColor", "textDecorationLine", "textDecorationThickness", "textUnderlineOffset", "borderRadius", "border", "marginTop", "marginLeft", "display", "textDecoration", "borderBottom", "fontWeight", "textAlign", "height", "borderTop", "margin", "backgroundImage", "marginRight", "textTheme", "markdownTheme", "codeTheme", "EditorModes", "BaseTextEditor", "forwardRef", "model", "readonly", "autoFocus", "scrollTo", "selection", "editorMode", "theme", "slots", "defaultSlots", "extensions", "debug", "forwardedRef", "themeMode", "useThemeContext", "rootRef", "useRef", "view", "setView", "useState", "useImperativeHandle", "useEffect", "hasFocus", "state", "main", "from", "to", "doc", "lineAt", "dispatch", "anchor", "focus", "current", "EditorState", "create", "text", "EditorView", "exceptionSink", "of", "err", "log", "catch", "baseTheme", "defaultTheme", "darkTheme", "editorAttributes", "class", "editor", "className", "contentAttributes", "content", "editable", "readOnly", "extension", "vim", "filter", "isNotFalsy", "newView", "parent", "dispatchTransactions", "trs", "logChanges", "update", "destroy", "handleKeyUp", "useCallback", "event", "key", "altKey", "shiftKey", "metaKey", "ctrlKey", "div", "id", "role", "tabIndex", "root", "onKeyUp", "ref", "TextEditor", "placeholder", "lineWrapping", "textTheme", "props", "updatedSlots", "defaultsDeep", "defaultTextSlots", "createBasicBundle", "MarkdownEditor", "markdownTheme", "defaultMarkdownSlots", "createMarkdownExtensions", "mx", "focusRing", "CaretRight", "ChatText", "Code", "CodeBlock", "Link", "ListBullets", "ListChecks", "ListNumbers", "Paragraph", "TextStrikethrough", "Table", "TextB", "TextHOne", "TextHTwo", "TextHThree", "TextHFour", "TextHFive", "TextHSix", "TextItalic", "createContext", "React", "Button", "DensityProvider", "Select", "getSize", "mx", "HeadingIcons", "Paragraph", "TextHOne", "TextHTwo", "TextHThree", "TextHFour", "TextHFive", "TextHSix", "ToolbarContextProvider", "useToolbarContext", "createContext", "ToolbarRoot", "children", "onAction", "state", "React", "DensityProvider", "density", "div", "role", "className", "ToolbarButton", "Icon", "onClick", "title", "getState", "disable", "active", "disabled", "handleClick", "event", "action", "preventDefault", "Button", "variant", "classNames", "mx", "onMouseDown", "getSize", "ToolbarSeparator", "MarkdownHeading", "blockType", "header", "exec", "value", "undefined", "HeadingIcon", "Select", "Root", "onValueChange", "type", "data", "parseInt", "TriggerButton", "Portal", "Content", "Viewport", "Option", "map", "level", "key", "String", "MarkdownStyles", "TextB", "s", "strong", "TextItalic", "emphasis", "TextStrikethrough", "strikethrough", "Code", "code", "MarkdownLists", "ListBullets", "listStyle", "ListNumbers", "ListChecks", "MarkdownBlocks", "CaretRight", "blockQuote", "CodeBlock", "blankLine", "Table", "MarkdownLinks", "Link", "link", "MarkdownStandard", "MarkdownExtended", "Toolbar", "ChatText", "Separator", "Markdown", "Extended", "DeferredTask", "Event", "sleep", "Context", "invariant", "log", "DEBOUNCE_INTERVAL", "SpaceAwarenessProvider", "constructor", "params", "_remoteStates", "Map", "remoteStateChange", "_space", "space", "_channel", "channel", "_peerId", "peerId", "_info", "info", "open", "_ctx", "_postTask", "_localState", "postMessage", "kind", "state", "onDispose", "listen", "message", "payload", "_handleQueryMessage", "_handlePostMessage", "catch", "err", "debug", "close", "dispose", "undefined", "getRemoteStates", "Array", "from", "values", "update", "position", "schedule", "set", "emit", "StateField", "modelState", "StateField", "define", "create", "undefined", "update", "model", "useActionHandler", "view", "action", "inlineType", "listType", "type", "setHeading", "parseInt", "data", "Inline", "Strong", "Emphasis", "Strikethrough", "Code", "setStyle", "toggleStyle", "List", "Ordered", "Bullet", "Task", "removeList", "addList", "toggleList", "removeBlockquote", "addBlockquote", "toggleBlockquote", "removeCodeblock", "addCodeblock", "insertTable", "removeLink", "addLink", "createComment", "setTimeout", "hasFocus", "focus", "useState", "useEditorView", "view", "setView", "useState", "ref", "EditorSelection", "EditorState", "EditorView", "useEffect", "useRef", "useState", "log", "isNotFalsy", "useTextEditor", "autoFocus", "scrollTo", "debug", "doc", "selection", "extensions", "onUpdate", "useRef", "view", "setView", "useState", "parentRef", "useEffect", "current", "state", "EditorState", "create", "EditorView", "exceptionSink", "of", "err", "log", "catch", "updateListener", "filter", "isNotFalsy", "parent", "dispatchTransactions", "trs", "logChanges", "update", "destroy", "main", "anchor", "EditorSelection", "single", "line", "to", "undefined", "dispatch", "effects", "scrollIntoView", "focus", "createDataExtensions", "readonly", "readOnly", "editable", "createThemeExtensions", "theme", "themeMode", "slots", "baseTheme", "defaultTheme", "darkTheme", "editorAttributes", "class", "editor", "className", "contentAttributes", "content", "get", "useEffect", "useState", "generateName", "getRawDoc", "invariant", "isAutomergeObject", "useTextModel", "props", "identity", "space", "text", "model", "setModel", "useState", "useEffect", "createModel", "useInMemoryTextModel", "id", "defaultContent", "content", "setContent", "undefined", "invariant", "isAutomergeObject", "obj", "doc", "getRawDoc", "field", "awarenessProvider", "SpaceAwarenessProvider", "channel", "info", "displayName", "profile", "generateName", "identityKey", "toHex", "color", "cursorColor", "lightColor", "light", "peerId", "extensions", "modelState", "init", "automerge", "handle", "path", "push", "awareness", "get", "docSync", "extension", "peer", "name"]
7
7
  }