@dxos/react-ui-editor 0.8.4-main.bc674ce → 0.8.4-main.bcb3aa67d6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/index.mjs +298 -377
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +298 -377
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
- package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts +1 -3
- package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts.map +1 -1
- package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts.map +1 -1
- package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts.map +1 -1
- package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/blocks.d.ts +3 -17
- package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/formatting.d.ts +3 -17
- package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/headings.d.ts +3 -17
- package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/image.d.ts +3 -8
- package/dist/types/src/components/EditorToolbar/image.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/index.d.ts +0 -1
- package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/lists.d.ts +6 -0
- package/dist/types/src/components/EditorToolbar/lists.d.ts.map +1 -0
- package/dist/types/src/components/EditorToolbar/search.d.ts +3 -8
- package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/view-mode.d.ts +3 -17
- package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
- package/dist/types/src/stories/Automerge.stories.d.ts +25 -24
- package/dist/types/src/stories/Automerge.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Comments.stories.d.ts +1 -1
- package/dist/types/src/stories/EditorToolbar.stories.d.ts +26 -26
- package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Experimental.stories.d.ts +1 -1
- package/dist/types/src/stories/Markdown.stories.d.ts +1 -1
- package/dist/types/src/stories/Outliner.stories.d.ts +2 -2
- package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Popover.stories.d.ts +2 -2
- package/dist/types/src/stories/Popover.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Preview.stories.d.ts +1 -1
- package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
- package/dist/types/src/stories/TextEditor.stories.d.ts +1 -1
- package/dist/types/src/stories/components/EditorStory.d.ts +3 -3
- package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
- package/dist/types/src/stories/components/util.d.ts +3 -3
- package/dist/types/src/stories/components/util.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +24 -24
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/util/react.d.ts +1 -4
- package/dist/types/src/util/react.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +45 -45
- package/src/components/Editor/Editor.stories.tsx +2 -2
- package/src/components/Editor/Editor.tsx +12 -6
- package/src/components/EditorContent/EditorContent.tsx +1 -1
- package/src/components/EditorMenuProvider/EditorMenuProvider.tsx +21 -28
- package/src/components/EditorMenuProvider/menu-presets.ts +1 -0
- package/src/components/EditorMenuProvider/useEditorMenu.ts +8 -1
- package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +5 -7
- package/src/components/EditorToolbar/EditorToolbar.tsx +24 -61
- package/src/components/EditorToolbar/blocks.ts +54 -46
- package/src/components/EditorToolbar/formatting.ts +43 -44
- package/src/components/EditorToolbar/headings.ts +42 -48
- package/src/components/EditorToolbar/image.ts +16 -21
- package/src/components/EditorToolbar/index.ts +0 -1
- package/src/components/EditorToolbar/lists.ts +57 -0
- package/src/components/EditorToolbar/search.ts +16 -21
- package/src/components/EditorToolbar/view-mode.ts +34 -40
- package/src/stories/Automerge.stories.tsx +8 -10
- package/src/stories/Comments.stories.tsx +4 -4
- package/src/stories/EditorToolbar.stories.tsx +32 -17
- package/src/stories/Experimental.stories.tsx +3 -3
- package/src/stories/Markdown.stories.tsx +2 -2
- package/src/stories/Outliner.stories.tsx +4 -4
- package/src/stories/Popover.stories.tsx +6 -6
- package/src/stories/Preview.stories.tsx +58 -48
- package/src/stories/Tags.stories.tsx +5 -5
- package/src/stories/TextEditor.stories.tsx +2 -2
- package/src/stories/Theme.stories.tsx +2 -2
- package/src/stories/components/EditorStory.tsx +17 -12
- package/src/stories/components/util.tsx +19 -22
- package/src/translations.ts +29 -24
- package/src/util/react.tsx +2 -11
- package/dist/types/src/components/EditorToolbar/actions.d.ts +0 -24
- package/dist/types/src/components/EditorToolbar/actions.d.ts.map +0 -1
- package/dist/types/src/stories/CommandDialog.stories.d.ts +0 -14
- package/dist/types/src/stories/CommandDialog.stories.d.ts.map +0 -1
- package/src/components/EditorToolbar/actions.ts +0 -87
- package/src/stories/CommandDialog.stories.tsx +0 -81
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../src/translations.ts", "../../../src/components/Editor/Editor.tsx", "../../../src/components/EditorContent/controller.ts", "../../../src/components/EditorContent/EditorContent.tsx", "../../../src/hooks/useTextEditor.ts", "../../../src/components/EditorMenuProvider/menu.ts", "../../../src/components/EditorMenuProvider/menu-presets.ts", "../../../src/components/EditorMenuProvider/popover.ts", "../../../src/components/EditorMenuProvider/EditorMenuProvider.tsx", "../../../src/components/EditorMenuProvider/useEditorMenu.ts", "../../../src/components/EditorToolbar/EditorToolbar.tsx", "../../../src/components/EditorToolbar/
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Resource } from '@dxos/react-ui';\n\nexport const translationKey = '@dxos/react-ui-editor';\n\nexport const translations = [\n {\n 'en-US': {\n [translationKey]: {\n 'strong label': 'Bold',\n 'emphasis label': 'Italics',\n 'strikethrough label': 'Strikethrough',\n 'code label': 'Code',\n 'link label': 'Link',\n 'list-bullet label': 'Bullet list',\n 'list-ordered label': 'Numbered list',\n 'list-task label': 'Task list',\n 'blockquote label': 'Block quote',\n 'codeblock label': 'Code block',\n 'comment label': 'Create comment',\n 'selection overlaps existing comment label': 'Selection overlaps existing comment',\n 'select text to comment label': 'Select text to comment',\n 'image label': 'Insert image',\n 'table label': 'Create table',\n 'heading label': 'Heading level',\n 'heading level label_zero': 'Paragraph',\n 'heading level label_one': 'Heading level {{count}}',\n 'heading level label_other': 'Heading level {{count}}',\n 'search label': 'Search',\n 'view mode label': 'Editor view',\n 'preview mode label': 'Markdown',\n 'readonly mode label': 'Read only',\n 'source mode label': 'Plain text',\n },\n },\n },\n] as const satisfies Resource[];\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren, forwardRef, useCallback, useImperativeHandle, useMemo, useState } from 'react';\n\nimport { invariant } from '@dxos/invariant';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\nimport { isNonNullable } from '@dxos/util';\n\nimport {\n type EditorController,\n EditorContent as NaturalEditorContent,\n type EditorContentProps as NaturalEditorContentProps,\n noopController,\n} from '../EditorContent';\nimport { EditorMenuProvider, type UseEditorMenuProps, useEditorMenu } from '../EditorMenuProvider';\nimport {\n type EditorToolbarState,\n EditorToolbar as NaturalEditorToolbar,\n type EditorToolbarProps as NaturalEditorToolbarProps,\n useEditorToolbar,\n} from '../EditorToolbar';\n\n//\n// Context\n//\n\ntype EditorContextValue = {\n controller?: EditorController;\n setController: (controller: EditorController) => void;\n extensions?: Extension[];\n} & Pick<NaturalEditorToolbarProps, 'state'>;\n\nconst [EditorContextProvider, useEditorContext] = createContext<EditorContextValue>('Editor');\n\n//\n// Root\n//\n\ntype EditorRootProps = PropsWithChildren<\n Pick<EditorContextValue, 'extensions'> & Omit<UseEditorMenuProps, 'viewRef'> & Pick<EditorToolbarState, 'viewMode'>\n>;\n\n/**\n * Root component for the Editor compound component.\n * Provides context for all child components and manages the editor controller state.\n */\nconst EditorRoot = forwardRef<EditorController | null, EditorRootProps>(\n ({ children, extensions: extensionsProp, viewMode, ...props }, forwardedRef) => {\n const state = useEditorToolbar({ viewMode });\n\n const [controller, setController] = useState<EditorController>();\n useImperativeHandle(forwardedRef, () => controller ?? noopController, [controller]);\n\n // TODO(burdon): Consider lighter-weight approach if EditorMenuProvider is not needed.\n const { groupsRef, extension, ...menuProps } = useEditorMenu(props);\n const extensions = useMemo(\n () => [extension, extensionsProp].filter(isNonNullable).flat(),\n [extension, extensionsProp],\n );\n\n return (\n <EditorContextProvider\n controller={controller}\n setController={setController}\n extensions={extensions}\n state={state}\n >\n <EditorMenuProvider view={controller?.view} groups={groupsRef.current} {...menuProps}>\n {children}\n </EditorMenuProvider>\n </EditorContextProvider>\n );\n },\n);\n\nEditorRoot.displayName = 'Editor.Root';\n\n//\n// Viewport\n//\n\ntype EditorViewportProps = ThemedClassName<PropsWithChildren<{}>>;\n\n/**\n * Viewport component that wraps the toolbar and editor content area.\n */\nconst EditorViewport = ({ classNames, children }: EditorViewportProps) => {\n return (\n <div role='none' className={mx('grid grid-rows-[min-content_1fr] bs-full overflow-hidden', classNames)}>\n {children}\n </div>\n );\n};\n\nEditorViewport.displayName = 'Editor.Viewport';\n\n//\n// Content\n//\n\ntype EditorContentProps = Omit<NaturalEditorContentProps, 'ref'>;\n\n/**\n * Content component that renders the actual CodeMirror editor.\n * Automatically registers the editor controller with the context.\n */\nconst EditorContent = ({ extensions: providedExtensions, ...props }: EditorContentProps) => {\n const { extensions: additionalExtensions = [], setController } = useEditorContext(EditorContent.displayName);\n\n const extensions = useMemo(\n () => [additionalExtensions, providedExtensions].filter(isNonNullable).flat(),\n [providedExtensions, additionalExtensions],\n );\n\n return <NaturalEditorContent {...props} extensions={extensions} ref={setController} />;\n};\n\nEditorContent.displayName = 'Editor.Content';\n\n//\n// Toolbar\n//\n\ntype EditorToolbarProps = Omit<NaturalEditorToolbarProps, 'getView' | 'state'>;\n\n/**\n * Toolbar component that provides editor formatting and control actions.\n * Automatically connects to the editor view through context.\n */\nconst EditorToolbar = (props: EditorToolbarProps) => {\n const { controller, state } = useEditorContext(EditorToolbar.displayName);\n\n // TODO(burdon): Fix invariant.\n const getView = useCallback(() => {\n invariant(controller?.view);\n return controller?.view;\n }, [controller]);\n\n return <NaturalEditorToolbar {...props} getView={getView} state={state} />;\n};\n\nEditorToolbar.displayName = 'Editor.Toolbar';\n\n//\n// Editor\n//\n\n/**\n * Compound editor component following the Radix UI pattern.\n *\n * @example\n * ```tsx\n * EditorMenuGroup.Root>\n * EditorMenuGroup.Toolbar />\n * EditorMenuGroup.Viewport>\n * EditorMenuGroup.Content extensions={[...]} />\n * </Editor.Viewport>\n * </Editor.Root>\n * ```\n */\nexport const Editor = {\n Root: EditorRoot,\n Viewport: EditorViewport,\n Content: EditorContent,\n Toolbar: EditorToolbar,\n};\n\nexport type {\n EditorController,\n EditorRootProps,\n EditorViewportProps,\n EditorContentProps,\n // EditorToolbarProps, // TODO(burdon): Restore once removed deprecated props.\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\n\nexport interface EditorController {\n get view(): EditorView | null;\n getText: () => string;\n setText: (text: string, focus?: boolean) => void;\n focus: () => void;\n}\n\nexport const noopController: EditorController = {\n get view() {\n return null;\n },\n getText: () => '',\n setText: () => {},\n focus: () => {},\n};\n\nexport const createEditorController = (view: EditorView | null): EditorController => {\n return {\n get view() {\n return view;\n },\n getText: () => {\n return view?.state.doc.toString() ?? '';\n },\n setText: (text: string, focus?: boolean) => {\n view?.dispatch({\n changes: {\n from: 0,\n to: view?.state.doc.length ?? 0,\n insert: text,\n },\n selection: {\n anchor: text.length,\n head: text.length,\n },\n });\n\n if (focus) {\n view?.focus();\n }\n },\n focus: () => view?.focus(),\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Transaction } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport React, { forwardRef, useEffect, useImperativeHandle } from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { initialSync } from '@dxos/ui-editor';\nimport { mx } from '@dxos/ui-theme';\n\nimport { type UseTextEditorProps, useTextEditor } from '../../hooks';\n\nimport { type EditorController, createEditorController } from './controller';\n\nexport type EditorContentProps = ThemedClassName<\n {\n focusable?: boolean;\n value?: string;\n onChange?: (value: string) => void;\n } & UseTextEditorProps\n>;\n\n/**\n * Minimal text editor.\n * NOTE: This shouold not be used with the automerge extension.\n * @deprecated Use Editor.Content\n */\nexport const EditorContent = forwardRef<EditorController, EditorContentProps>(\n ({ classNames, id, extensions, selectionEnd, focusable = true, value, onChange, ...props }, forwardedRef) => {\n const { parentRef, focusAttributes, view } = useTextEditor(\n () => ({\n id,\n initialValue: value,\n selectionEnd,\n extensions: [\n extensions ?? [],\n EditorView.updateListener.of(({ view, docChanged, transactions }) => {\n const isInitialSync = transactions.some((tr) => tr.annotation(Transaction.userEvent) === initialSync.value);\n if (!isInitialSync && docChanged) {\n onChange?.(view.state.doc.toString());\n }\n }),\n ],\n ...props,\n }),\n [id, extensions, selectionEnd, onChange],\n );\n\n // External controller.\n useImperativeHandle(forwardedRef, () => {\n return createEditorController(view);\n }, [id, view]);\n\n // Set initial value and cursor position.\n useEffect(() => {\n requestAnimationFrame(() => {\n view?.dispatch({\n annotations: initialSync,\n changes: value ? [{ from: 0, to: view?.state.doc.length ?? 0, insert: value ?? '' }] : [],\n selection: selectionEnd ? { anchor: view?.state.doc.length ?? 0 } : undefined,\n });\n\n if (selectionEnd) {\n view?.focus();\n }\n });\n }, [view, value, selectionEnd]);\n\n return (\n <div\n role='none'\n className={mx(\n 'is-full outline-none focus:border-accentSurface focus-within:border-neutralFocusIndicator',\n classNames,\n )}\n ref={parentRef}\n {...(focusable ? focusAttributes : {})}\n />\n );\n },\n);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { EditorState, type EditorStateConfig, type Text } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport {\n type ComponentPropsWithoutRef,\n type DependencyList,\n type KeyboardEventHandler,\n type RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { log } from '@dxos/log';\nimport {\n type EditorSelection,\n createEditorStateTransaction,\n debugDispatcher,\n documentId,\n modalStateField,\n} from '@dxos/ui-editor';\nimport { type MaybeProvider, getProviderValue, isTruthy } from '@dxos/util';\n\nlet instanceCount = 0;\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 UseTextEditor = {\n parentRef: RefObject<HTMLDivElement | null>;\n view: EditorView | null;\n focusAttributes?: ComponentPropsWithoutRef<'div'>;\n};\n\nexport type UseTextEditorProps = Pick<EditorStateConfig, 'extensions'> & {\n id?: string;\n doc?: Text;\n initialValue?: string;\n autoFocus?: boolean;\n scrollTo?: number;\n selection?: EditorSelection;\n selectionEnd?: boolean;\n debug?: boolean;\n};\n\n/**\n * Creates codemirror text editor.\n */\nexport const useTextEditor = (\n props: MaybeProvider<UseTextEditorProps> = {},\n deps: DependencyList = [],\n): UseTextEditor => {\n const { id, doc, initialValue, extensions, autoFocus, scrollTo, selection, selectionEnd, debug } =\n useMemo<UseTextEditorProps>(() => getProviderValue(props), deps ?? []);\n\n // NOTE: Increments by 2 in strict mode.\n const [instanceId] = useState(() => `text-editor-${++instanceCount}`);\n const [view, setView] = useState<EditorView | null>(null);\n const parentRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n let view: EditorView | null = null;\n if (parentRef.current) {\n log('create', { id, instanceId, doc: initialValue?.length ?? 0 });\n\n let initialSelection;\n if (selection?.anchor && initialValue?.length) {\n if (selection.anchor <= initialValue.length && (selection?.head ?? 0) <= initialValue.length) {\n initialSelection = selection;\n }\n } else if (selectionEnd && selection === undefined) {\n const index = initialValue?.indexOf('\\n');\n const anchor = !index || index === -1 ? 0 : index;\n initialSelection = { anchor };\n }\n\n // https://codemirror.net/docs/ref/#state.EditorStateConfig\n const state = EditorState.create({\n doc: doc ?? initialValue,\n // selection: initialSelection,\n extensions: [\n id && documentId.of(id),\n extensions,\n // NOTE: This doesn't catch errors in keymap functions.\n EditorView.exceptionSink.of((err) => {\n log.catch(err);\n }),\n ].filter(isTruthy),\n });\n\n // https://codemirror.net/docs/ref/#view.EditorViewConfig\n view = new EditorView({\n parent: parentRef.current,\n state,\n scrollTo: scrollTo ? EditorView.scrollIntoView(scrollTo, { yMargin: 96 }) : undefined, // TODO(burdon): Const.\n dispatchTransactions: debug ? debugDispatcher : undefined,\n });\n\n // Move to end of line after document loaded (unless selection is specified).\n if (selectionEnd && !initialSelection) {\n const { to } = view.state.doc.lineAt(0);\n if (to) {\n view.dispatch({ selection: { anchor: to } });\n }\n }\n\n setView(view);\n }\n\n return () => {\n log('destroy', { id });\n view?.destroy();\n };\n }, deps);\n\n useEffect(() => {\n if (view) {\n if (scrollTo || selection) {\n if (selection && selection.anchor > view.state.doc.length) {\n log.warn('invalid selection', { length: view.state.doc.length, scrollTo, selection });\n return;\n }\n\n view.dispatch(createEditorStateTransaction({ scrollTo, selection }));\n }\n }\n }, [view, scrollTo, selection]);\n\n useEffect(() => {\n if (view && autoFocus) {\n view.focus();\n }\n }, [autoFocus, view]);\n\n // Focus editor on Enter (e.g., when tabbing to this component).\n const handleKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(\n (event) => {\n const { key, target, currentTarget } = event;\n switch (key) {\n case 'Escape': {\n // Check if popover is open.\n const modal = view?.state.field(modalStateField, false);\n if (modal) {\n return;\n }\n\n // Focus the closest focusable parent.\n const element = view?.contentDOM.closest('[tabindex=\"0\"]') as HTMLDivElement | null;\n element?.focus();\n break;\n }\n\n case 'Enter': {\n event.preventDefault();\n if (target === currentTarget) {\n view?.focus();\n }\n break;\n }\n }\n },\n [view],\n );\n\n return {\n parentRef,\n view,\n focusAttributes: {\n tabIndex: 0 as const,\n onKeyDown: handleKeyDown,\n },\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\n\nimport { type Label } from '@dxos/react-ui';\nimport { insertAtCursor } from '@dxos/ui-editor';\nimport { type MaybePromise } from '@dxos/util';\n\nexport type EditorMenuGroup = {\n id: string;\n label?: Label;\n items: EditorMenuItem[];\n};\n\nexport type EditorMenuItem = {\n id: string;\n label: Label;\n icon?: string;\n onSelect?: (event: { view: EditorView; head: number }) => MaybePromise<void>;\n};\n\nexport const getMenuItem = (groups: EditorMenuGroup[], id?: string): EditorMenuItem | undefined => {\n return groups.flatMap((group) => group.items).find((item) => item.id === id);\n};\n\nexport const getNextMenuItem = (groups: EditorMenuGroup[], id?: string): EditorMenuItem => {\n const items = groups.flatMap((group) => group.items);\n const index = items.findIndex((item) => item.id === id);\n return index < items.length - 1 ? items[index + 1] : items[index];\n};\n\nexport const getPreviousMenuItem = (groups: EditorMenuGroup[], id?: string): EditorMenuItem => {\n const items = groups.flatMap((group) => group.items);\n const index = items.findIndex((item) => item.id === id);\n return index > 0 ? items[index - 1] : items[index];\n};\n\nexport const createMenuGroup = ({\n id = 'menu',\n label,\n filter,\n items,\n}: {\n id?: string;\n label?: Label;\n filter?: string;\n items: string[];\n}): EditorMenuGroup => ({\n id,\n label,\n items: items\n .filter((item) => !filter || item.toLowerCase().includes(filter.toLowerCase()))\n .map((item, i) => ({\n id: `${id}-${i}`,\n label: item,\n onSelect: ({ view, head }) => insertAtCursor(view, head, item),\n })),\n});\n\nexport const filterMenuGroups = (\n groups: EditorMenuGroup[],\n filter: (item: EditorMenuItem) => boolean,\n): EditorMenuGroup[] => {\n return groups.map((group) => ({\n ...group,\n items: group.items.filter(filter),\n }));\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { insertAtLineStart } from '@dxos/ui-editor';\n\nimport { type EditorMenuGroup } from './menu';\nimport { popoverRangeEffect } from './popover';\n\nexport const formattingCommands: EditorMenuGroup = {\n id: 'markdown',\n label: 'Markdown',\n items: [\n {\n id: 'heading-1',\n label: 'Heading 1',\n icon: 'ph--text-h-one--regular',\n onSelect: ({ view, head }) => insertAtLineStart(view, head, '# '),\n },\n {\n id: 'heading-2',\n label: 'Heading 2',\n icon: 'ph--text-h-two--regular',\n onSelect: ({ view, head }) => insertAtLineStart(view, head, '## '),\n },\n {\n id: 'heading-3',\n label: 'Heading 3',\n icon: 'ph--text-h-three--regular',\n onSelect: ({ view, head }) => insertAtLineStart(view, head, '### '),\n },\n {\n id: 'heading-4',\n label: 'Heading 4',\n icon: 'ph--text-h-four--regular',\n onSelect: ({ view, head }) => insertAtLineStart(view, head, '#### '),\n },\n {\n id: 'heading-5',\n label: 'Heading 5',\n icon: 'ph--text-h-five--regular',\n onSelect: ({ view, head }) => insertAtLineStart(view, head, '##### '),\n },\n {\n id: 'heading-6',\n label: 'Heading 6',\n icon: 'ph--text-h-six--regular',\n onSelect: ({ view, head }) => insertAtLineStart(view, head, '###### '),\n },\n {\n id: 'bullet-list',\n label: 'Bullet List',\n icon: 'ph--list-bullets--regular',\n onSelect: ({ view, head }) => insertAtLineStart(view, head, '- '),\n },\n {\n id: 'numbered-list',\n label: 'Numbered List',\n icon: 'ph--list-numbers--regular',\n onSelect: ({ view, head }) => insertAtLineStart(view, head, '1. '),\n },\n {\n id: 'task-list',\n label: 'Task List',\n icon: 'ph--list-checks--regular',\n onSelect: ({ view, head }) => insertAtLineStart(view, head, '- [ ] '),\n },\n {\n id: 'quote',\n label: 'Quote',\n icon: 'ph--quotes--regular',\n onSelect: ({ view, head }) => insertAtLineStart(view, head, '> '),\n },\n {\n id: 'code-block',\n label: 'Code Block',\n icon: 'ph--code-block--regular',\n onSelect: ({ view, head }) => insertAtLineStart(view, head, '```\\n\\n```'),\n },\n {\n id: 'table',\n label: 'Table',\n icon: 'ph--table--regular',\n onSelect: ({ view, head }) => insertAtLineStart(view, head, '| | | |\\n|---|---|---|\\n| | | |'),\n },\n ],\n};\n\nexport const linkSlashCommands: EditorMenuGroup = {\n id: 'link',\n label: 'Link',\n items: [\n {\n id: 'inline-link',\n label: 'Inline link',\n icon: 'ph--link--regular',\n onSelect: ({ view, head }) => {\n view.dispatch({\n changes: { from: head, insert: '@' },\n selection: { anchor: head + 1, head: head + 1 },\n effects: popoverRangeEffect.of({\n trigger: '@',\n range: { from: head, to: head + 1 },\n }),\n });\n },\n },\n {\n id: 'block-embed',\n label: 'Block embed',\n icon: 'ph--lego--regular',\n onSelect: ({ view, head }) => {\n view.dispatch({\n changes: { from: head, insert: '@@' },\n selection: { anchor: head + 2, head: head + 2 },\n effects: popoverRangeEffect.of({\n trigger: '@',\n range: { from: head, to: head + 2 },\n }),\n });\n },\n },\n ],\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Extension, Prec, RangeSetBuilder, StateEffect, StateField } from '@codemirror/state';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n type KeyBinding,\n ViewPlugin,\n type ViewUpdate,\n keymap,\n} from '@codemirror/view';\n\nimport { type PlaceholderOptions, type Range, modalStateField, placeholder } from '@dxos/ui-editor';\nimport { isNonNullable, isTruthy } from '@dxos/util';\n\nconst DELIMITERS = [' ', ':'];\n\nexport type PopoverOptions = {\n trigger?: string | string[];\n triggerKey?: string;\n placeholder?: Partial<PlaceholderOptions>;\n delimiters?: string[];\n\n // TODO(burdon): Auto.\n // activateOnTyping?: boolean;\n\n // Trigger update.\n onTextChange?: (event: { view: EditorView; pos: number; text: string; trigger?: string }) => void;\n onClose?: (event: { view: EditorView }) => void;\n\n // Menu specific.\n onEnter?: (event: { view: EditorView }) => void;\n onArrowUp?: (event: { view: EditorView }) => void;\n onArrowDown?: (event: { view: EditorView }) => void;\n};\n\n/**\n * Creates a popover that appears when the trigger character is inserted.\n * This can be used for context menus or autocompletion.\n */\nexport const popover = (options: PopoverOptions = {}): Extension => {\n return [\n Prec.highest(popoverKeymap(options)),\n popoverStateField,\n popoverTriggerListener(options),\n popoverAnchorDecoration(options),\n modalStateField,\n options.trigger &&\n placeholder({\n // TODO(burdon): Translations.\n content: `Press '${Array.isArray(options.trigger) ? options.trigger[0] : options.trigger}' for commands`,\n ...options.placeholder,\n }),\n ].filter(isTruthy);\n};\n\n/**\n * Listen for selection and document changes.\n */\nconst popoverTriggerListener = (options: PopoverOptions) =>\n EditorView.updateListener.of(({ view, docChanged }) => {\n const { range: activeRange, trigger } = view.state.field(popoverStateField) ?? {};\n if (!activeRange) {\n return;\n }\n\n const text = view.state.doc.sliceString(activeRange.from, activeRange.to);\n const selection = view.state.selection.main;\n const shouldClose =\n // Trigger deleted.\n (trigger ? trigger !== text[0] : false) ||\n // Whitespace in text.\n /\\s/.test(trigger ? text.slice(1) : text) ||\n // Cursor moved before the range.\n selection.head < activeRange.from ||\n // Cursor moved after the range (+1 to handle selection changing before doc).\n selection.head > activeRange.to + 1;\n\n const nextRange = shouldClose ? null : docChanged ? { from: activeRange.from, to: selection.head } : activeRange;\n if (nextRange !== activeRange) {\n view.dispatch({\n effects: popoverRangeEffect.of(nextRange ? { range: nextRange, trigger } : null),\n });\n }\n\n if (shouldClose) {\n options.onClose?.({ view });\n }\n });\n\n/**\n * Popover navigation.\n */\nconst popoverKeymap = (options: PopoverOptions) => {\n const triggers = Array.isArray(options.trigger) ? options.trigger : [options.trigger];\n return keymap.of(\n [\n // Prefix triggers.\n ...triggers.filter(isNonNullable).map((trigger) => ({\n key: trigger,\n run: (view: EditorView) => {\n // Determine if we should trigger the popover:\n // 1. Empty lines or at the beginning of a line.\n // 2. When there's a preceding space.\n const selection = view.state.selection.main;\n const line = view.state.doc.lineAt(selection.head);\n if (\n line.text.trim() === '' ||\n selection.head === line.from ||\n (selection.head > line.from && line.text[selection.head - line.from - 1] === ' ')\n ) {\n // Insert and select the trigger.\n view.dispatch({\n changes: { from: selection.head, insert: trigger },\n selection: { anchor: selection.head + 1, head: selection.head + 1 },\n effects: popoverRangeEffect.of({ trigger, range: { from: selection.head, to: selection.head + 1 } }),\n });\n\n return true;\n }\n\n return false;\n },\n })),\n\n //\n // Custom trigger.\n //\n options.triggerKey &&\n ({\n key: options.triggerKey,\n run: (view: EditorView) => {\n const selection = view.state.selection.main;\n const line = view.state.doc.lineAt(selection.head);\n\n // Get last word.\n let str = line.text.slice(0, selection.head - line.from);\n const idx = getLastIndexOf(str, options.delimiters ?? DELIMITERS);\n if (idx !== -1) {\n str = str.slice(idx + 1);\n }\n\n // Create anchor even if zero length (append space).\n const from = line.from + idx;\n view.dispatch({\n effects: popoverRangeEffect.of({ range: { from: from + 1, to: selection.head } }),\n changes:\n selection.head === view.state.doc.length\n ? { from: from + 1, to: selection.head, insert: ' ' }\n : undefined,\n });\n return true;\n },\n } satisfies KeyBinding),\n\n //\n // Nav keys.\n //\n {\n key: 'ArrowUp',\n run: (view: EditorView) => {\n const range = view.state.field(popoverStateField)?.range;\n if (range) {\n options.onArrowUp?.({ view });\n return true;\n }\n\n return false;\n },\n },\n {\n key: 'ArrowDown',\n run: (view: EditorView) => {\n const range = view.state.field(popoverStateField)?.range;\n if (range) {\n options.onArrowDown?.({ view });\n return true;\n }\n\n return false;\n },\n },\n {\n key: 'Enter',\n run: (view: EditorView) => {\n const range = view.state.field(popoverStateField)?.range;\n if (range) {\n view.dispatch({ changes: { from: range.from, to: range.to, insert: '' } });\n options.onEnter?.({ view });\n return true;\n }\n\n return false;\n },\n },\n ].filter(isTruthy),\n );\n};\n\n/**\n * Creates a <dx-anchor> tag, which is used to anchor the Popver.\n */\nconst popoverAnchorDecoration = (options: PopoverOptions) => {\n return ViewPlugin.fromClass(\n class {\n _decorations: DecorationSet = Decoration.none;\n\n constructor(readonly view: EditorView) {}\n\n // TODO(wittjosiah): The decorations are repainted on every update, this occasionally causes menu to flicker.\n update({ view, transactions }: ViewUpdate) {\n const builder = new RangeSetBuilder<Decoration>();\n const { range, trigger } = view.state.field(popoverStateField) ?? {};\n if (range) {\n // Check if we should show the widget (only if cursor is within the active command range).\n const selection = view.state.selection.main;\n const showWidget = selection.head >= range.from && selection.head <= range.to;\n if (showWidget) {\n builder.add(\n range.from,\n range.to + 1,\n Decoration.mark({\n tagName: 'dx-anchor',\n class: 'cm-popover-trigger',\n attributes: {\n 'data-visible-focus': 'false',\n 'data-auto-trigger': 'true',\n 'data-trigger': trigger ?? options.triggerKey ?? '',\n },\n }),\n );\n }\n\n const rangeChanged = transactions.some((tr) => tr.effects.some((effect) => effect.is(popoverRangeEffect)));\n if (rangeChanged) {\n // NOTE: Content skips the trigger character.\n const content = view.state.sliceDoc(range.from + (trigger ? trigger.length : 0), range.to);\n options.onTextChange?.({ view, pos: selection.head, text: content, trigger });\n }\n }\n\n this._decorations = builder.finish();\n }\n },\n {\n decorations: (v) => v._decorations,\n },\n );\n};\n\ntype PopoverState = {\n /**\n * Trigger prefix (in document).\n */\n trigger?: string;\n\n /**\n * Current document completion range.\n */\n range: Range;\n};\n\n// State effects for managing popover state.\nexport const popoverRangeEffect = StateEffect.define<PopoverState | null>();\n\n// State field to track the active popover trigger range.\nexport const popoverStateField = StateField.define<PopoverState | null>({\n create: () => null,\n update: (value, tr) => {\n let newValue = value;\n for (const effect of tr.effects) {\n if (effect.is(popoverRangeEffect)) {\n newValue = effect.value;\n }\n }\n\n return newValue;\n },\n});\n\nconst getLastIndexOf = (str: string, delimiters: string[]) =>\n Math.max(...delimiters.map((delim) => str.lastIndexOf(delim)));\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport React, { Fragment, type PropsWithChildren, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { addEventListener } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport {\n DX_ANCHOR_ACTIVATE,\n type DxAnchorActivate,\n Icon,\n Popover,\n toLocalizedString,\n useDynamicRef,\n useThemeContext,\n useTranslation,\n} from '@dxos/react-ui';\n\nimport { type EditorMenuGroup, type EditorMenuItem } from './menu';\n\nexport type EditorMenuProviderProps = PropsWithChildren<{\n view?: EditorView | null;\n groups?: EditorMenuGroup[];\n currentItem?: string;\n open?: boolean;\n defaultOpen?: boolean;\n numItems?: number;\n onOpenChange?: (event: { view: EditorView; open: boolean; trigger?: string }) => void;\n onActivate?: (event: { view: EditorView; trigger?: string }) => void;\n onSelect?: (event: { view: EditorView; item: EditorMenuItem }) => void;\n onCancel?: (event: { view: EditorView }) => void;\n}>;\n\n/**\n * Implements the Popover and listens for the `dx-anchor-activate` event from the\n * `popover` extension's decoration.\n *\n * NOTE: We don't use DropdownMenu because the command menu needs to manage focus explicitly.\n * I.e., focus must remain in the editor while displaying the menu (for type-ahead).\n */\nexport const EditorMenuProvider = ({\n children,\n view,\n groups,\n currentItem,\n open: openProp,\n defaultOpen,\n numItems = 8,\n onOpenChange,\n onActivate,\n onSelect,\n onCancel,\n}: EditorMenuProviderProps) => {\n const { tx } = useThemeContext();\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n\n const viewRef = useDynamicRef(view);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: (open) => {\n invariant(viewRef.current);\n onOpenChange?.({ view: viewRef.current, open });\n },\n });\n\n const [root, setRoot] = useState<HTMLDivElement | null>(null);\n useEffect(() => {\n if (!root) {\n return;\n }\n\n // Listen for trigger.\n return addEventListener(\n root,\n DX_ANCHOR_ACTIVATE as any,\n (event: DxAnchorActivate) => {\n const { trigger, refId } = event;\n\n // If this has a `refId`, then it’s probably a URL or DXN and out of scope for this component.\n if (!refId) {\n triggerRef.current = trigger as HTMLButtonElement;\n if (onActivate) {\n onActivate({ view: viewRef.current!, trigger: trigger.getAttribute('data-trigger') ?? undefined });\n } else {\n requestAnimationFrame(() => setOpen(true));\n }\n }\n },\n {\n capture: true,\n passive: false,\n },\n );\n }, [root, onActivate]);\n\n const handleSelect = useCallback<NonNullable<MenuProps['onSelect']>>(\n (item) => {\n invariant(viewRef.current);\n onSelect?.({ view: viewRef.current, item });\n },\n [viewRef, onSelect],\n );\n\n const menuGroups = groups?.filter((group) => group.items.length > 0) ?? [];\n\n return (\n <Popover.Root modal={false} open={open} onOpenChange={setOpen}>\n <Popover.VirtualTrigger virtualRef={triggerRef} />\n\n {/* Menu. */}\n <Popover.Portal>\n <Popover.Content\n align='start'\n classNames={tx('menu.content', 'menu--exotic-unfocusable', { elevation: 'positioned' }, [\n 'overflow-y-auto',\n !menuGroups.length && 'hidden',\n ])}\n style={{\n maxBlockSize: 36 * numItems + 10,\n }}\n /**\n * NOTE: We keep the focus in the editor, but Radix routes escape key.\n */\n onEscapeKeyDown={() => {\n // NOTE: Able to cancel if not in valid state.\n // event.preventDefault();\n onCancel?.({ view: view! });\n }}\n onOpenAutoFocus={(event) => event.preventDefault()}\n >\n <Popover.Viewport classNames={tx('menu.viewport', 'menu__viewport--exotic-unfocusable', {})}>\n <Menu groups={menuGroups} currentItem={currentItem} onSelect={handleSelect} />\n </Popover.Viewport>\n <Popover.Arrow />\n </Popover.Content>\n </Popover.Portal>\n\n {/* Content */}\n <div ref={setRoot} role='none' className='contents'>\n {children}\n </div>\n </Popover.Root>\n );\n};\n\n//\n// Menu\n//\n\ntype MenuProps = {\n groups: EditorMenuGroup[];\n} & Pick<MenuGroupProps, 'currentItem' | 'onSelect'>;\n\nconst Menu = ({ groups, currentItem, onSelect }: MenuProps) => {\n const { tx } = useThemeContext();\n return (\n <ul>\n {groups.map((group, index) => (\n <Fragment key={group.id}>\n <MenuGroup group={group} currentItem={currentItem} onSelect={onSelect} />\n {index < groups.length - 1 && <div className={tx('menu.separator', 'menu__item', {})} />}\n </Fragment>\n ))}\n </ul>\n );\n};\n\n//\n// Menu Group\n//\n\ntype MenuGroupProps = {\n group: EditorMenuGroup;\n currentItem?: string;\n} & Pick<MenuItemProps, 'onSelect'>;\n\nconst MenuGroup = ({ group, currentItem, onSelect }: MenuGroupProps) => {\n const { tx } = useThemeContext();\n const { t } = useTranslation();\n\n return (\n <>\n {group.label && (\n <div className={tx('menu.groupLabel', 'menu__group__label', {})}>\n <span>{toLocalizedString(group.label, t)}</span>\n </div>\n )}\n\n {group.items.map((item) => (\n <MenuItem key={item.id} item={item} current={currentItem === item.id} onSelect={onSelect} />\n ))}\n </>\n );\n};\n\n//\n// Menu Item\n//\n\ntype MenuItemProps = {\n item: EditorMenuItem;\n current: boolean;\n onSelect?: (item: EditorMenuItem) => void;\n};\n\nconst MenuItem = ({ item, current, onSelect }: MenuItemProps) => {\n const { tx } = useThemeContext();\n const { t } = useTranslation();\n\n const listRef = useRef<HTMLLIElement>(null);\n useEffect(() => {\n if (current && listRef.current) {\n listRef.current.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n }, [current]);\n\n const handleSelect = useCallback(() => onSelect?.(item), [item, onSelect]);\n\n return (\n <li\n ref={listRef}\n className={tx('menu.item', 'menu__item--exotic-unfocusable', {}, [current && 'bg-hoverSurface'])}\n onClick={handleSelect}\n >\n {item.icon && <Icon icon={item.icon} size={5} />}\n <span className='grow truncate'>{toLocalizedString(item.label, t)}</span>\n </li>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport { type EditorState } from '@codemirror/state';\nimport { type RefObject, useCallback, useMemo, useRef, useState } from 'react';\n\nimport { invariant } from '@dxos/invariant';\nimport { modalStateEffect } from '@dxos/ui-editor';\nimport { type MaybePromise } from '@dxos/util';\n\nimport { type EditorMenuProviderProps } from './EditorMenuProvider';\nimport { type EditorMenuGroup, type EditorMenuItem } from './menu';\nimport { filterMenuGroups, getMenuItem, getNextMenuItem, getPreviousMenuItem } from './menu';\nimport { type PopoverOptions, popover, popoverRangeEffect, popoverStateField } from './popover';\n\nexport type GetMenuContext = {\n state: EditorState;\n pos: number;\n text: string;\n trigger?: string;\n};\n\nexport type UseEditorMenuProps = {\n filter?: boolean;\n getMenu?: (context: GetMenuContext) => MaybePromise<EditorMenuGroup[]>;\n} & Pick<PopoverOptions, 'trigger' | 'triggerKey' | 'placeholder'>;\n\nexport type UseEditorMenu = {\n groupsRef: RefObject<EditorMenuGroup[]>;\n extension: Extension;\n} & Pick<EditorMenuProviderProps, 'currentItem' | 'open' | 'onOpenChange' | 'onActivate' | 'onSelect' | 'onCancel'>;\n\n/**\n * ```tsx\n * const { groupsRef, extension, ...menuProps } = useEditorMenu();\n * const { parentRef, viewRef } = useTextEditor({ extensions: [extension] });\n * return (\n * <EditorMenuProvider view={viewRef.current} groups={groupsRef.current} {...menuProps}>\n * <div ref={parentRef} />\n * </EditorMenuProvider>\n * );\n * ```\n */\nexport const useEditorMenu = ({\n trigger,\n triggerKey,\n placeholder,\n filter = true,\n getMenu,\n}: UseEditorMenuProps): UseEditorMenu => {\n const groupsRef = useRef<EditorMenuGroup[]>([]);\n const currentRef = useRef<EditorMenuItem | null>(null);\n const [currentItem, setCurrentItem] = useState<string>();\n const [open, setOpen] = useState(false);\n const [_, refresh] = useState({});\n\n /**\n * Get filtered options.\n */\n const getMenuOptions = useCallback<NonNullable<UseEditorMenuProps['getMenu']>>(\n async ({ text, trigger, ...props }) => {\n const groups = (await getMenu?.({ text, trigger, ...props })) ?? [];\n return filter\n ? filterMenuGroups(groups, (item) =>\n text ? (item.label as string).toLowerCase().startsWith(text.toLowerCase()) : true,\n )\n : groups;\n },\n [getMenu, filter],\n );\n\n const handleOpenChange = useCallback<NonNullable<UseEditorMenu['onOpenChange']>>(\n async ({ view, open }) => {\n invariant(view);\n setOpen(open);\n if (!open) {\n setCurrentItem(undefined);\n view.dispatch({\n effects: [popoverRangeEffect.of(null)],\n });\n }\n\n // TODO(burdon): Possible race condition.\n // useTextEditor.handleKeyDown will get called after this handler completes.\n requestAnimationFrame(() => {\n view.dispatch({\n effects: [modalStateEffect.of(open)],\n });\n });\n },\n [getMenuOptions],\n );\n\n const handleActivate = useCallback<NonNullable<UseEditorMenu['onActivate']>>(\n async ({ view, trigger }) => {\n const item = getMenuItem(groupsRef.current, currentItem);\n if (item) {\n currentRef.current = item;\n }\n\n if (!open) {\n handleOpenChange({ view, open: true, trigger });\n }\n },\n [open, handleOpenChange],\n );\n\n const handleSelect = useCallback<NonNullable<UseEditorMenu['onSelect']>>(({ view, item }) => {\n void item.onSelect?.({ view, head: view.state.selection.main.head });\n }, []);\n\n const handleCancel = useCallback<NonNullable<UseEditorMenu['onCancel']>>(({ view }) => {\n // Delete trigger.\n const { range, trigger } = view.state.field(popoverStateField) ?? {};\n if (range && trigger) {\n view.dispatch({\n changes: { ...range, insert: '' },\n });\n }\n }, []);\n\n const serializedTrigger = Array.isArray(trigger) ? trigger.join(',') : trigger;\n const extension = useMemo<Extension>(() => {\n return popover({\n trigger,\n triggerKey,\n placeholder,\n onClose: ({ view }) => handleOpenChange({ view, open: false }),\n onEnter: ({ view }) => {\n if (currentRef.current) {\n handleSelect({ view, item: currentRef.current });\n }\n },\n onArrowUp: () => {\n setCurrentItem((currentItem) => {\n const previous = getPreviousMenuItem(groupsRef.current, currentItem);\n currentRef.current = previous;\n return previous.id;\n });\n },\n onArrowDown: () => {\n setCurrentItem((currentItem) => {\n const next = getNextMenuItem(groupsRef.current, currentItem);\n currentRef.current = next;\n return next.id;\n });\n },\n onTextChange: async ({ view, pos, text, trigger }) => {\n groupsRef.current = (await getMenuOptions({ state: view.state, pos, text, trigger })) ?? [];\n const firstItem = groupsRef.current.filter((group) => group.items.length > 0)[0]?.items[0];\n if (firstItem) {\n setCurrentItem(firstItem.id);\n currentRef.current = firstItem;\n }\n\n refresh({});\n },\n });\n }, [handleOpenChange, getMenuOptions, serializedTrigger, placeholder]);\n\n return {\n groupsRef,\n extension,\n currentItem,\n open,\n onOpenChange: handleOpenChange,\n onActivate: handleActivate,\n onSelect: handleSelect,\n onCancel: handleCancel,\n };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\nimport { Atom } from '@effect-atom/atom-react';\nimport React, { memo, useMemo } from 'react';\n\nimport { type Node } from '@dxos/app-graph';\nimport { ElevationProvider, type ThemedClassName } from '@dxos/react-ui';\nimport {\n type ActionGraphProps,\n type MenuAction,\n MenuProvider,\n ToolbarMenu,\n createGapSeparator,\n useMenuActions,\n} from '@dxos/react-ui-menu';\nimport { type EditorViewMode } from '@dxos/ui-editor';\n\nimport { createLists } from './actions';\nimport { createBlocks } from './blocks';\nimport { createFormatting } from './formatting';\nimport { createHeadings } from './headings';\nimport { createImageUpload } from './image';\nimport { createSearch } from './search';\nimport { type EditorToolbarState } from './useEditorToolbar';\nimport { createViewMode } from './view-mode';\n\nexport type EditorToolbarFeatureFlags = Partial<{\n showHeadings: boolean;\n showFormatting: boolean;\n showLists: boolean;\n showBlocks: boolean;\n showSearch: boolean;\n\n // TODO(wittjosiah): Factor out (depends on plugin-level capabilities.)\n onImageUpload: () => void;\n onViewModeChange: (mode: EditorViewMode) => void;\n}>;\n\nexport type EditorToolbarActionGraphProps = {\n state: Atom.Atom<EditorToolbarState>;\n getView: () => EditorView;\n // TODO(wittjosiah): Control positioning.\n customActions?: Atom.Atom<ActionGraphProps>;\n};\n\nexport type EditorToolbarProps = ThemedClassName<\n {\n role?: string;\n attendableId?: string;\n /** Handler for executing actions. Required when customActions use Operation.invoke. */\n onAction?: (action: MenuAction, params: Node.InvokeProps) => void;\n } & (EditorToolbarActionGraphProps & EditorToolbarFeatureFlags)\n>;\n\n// TODO(burdon): Remove role dependency.\nexport const EditorToolbar = memo(({ classNames, role, attendableId, onAction, ...props }: EditorToolbarProps) => {\n const menuProps = useEditorToolbarActionGraph(props);\n\n return (\n <ElevationProvider elevation={role === 'section' ? 'positioned' : 'base'}>\n <MenuProvider {...menuProps} attendableId={attendableId} onAction={onAction}>\n <ToolbarMenu classNames={classNames} textBlockWidth />\n </MenuProvider>\n </ElevationProvider>\n );\n});\n\ntype ToolbarActionsProps = Pick<EditorToolbarActionGraphProps, 'state' | 'getView' | 'customActions'> &\n EditorToolbarFeatureFlags;\n\n// TODO(wittjosiah): Toolbar re-rendering is causing this graph to be recreated and breaking reactivity in some cases.\n// E.g. for toolbar dropdowns which use active icon, the icon is not updated when the active item changes.\n// This is currently only happening in the markdown plugin usage and should be reproduced in an editor story.\nconst useEditorToolbarActionGraph = ({ state, getView, customActions, ...features }: ToolbarActionsProps) => {\n const menuCreator = useMemo(\n () => createToolbarActions({ state, getView, customActions, ...features }),\n [\n state,\n getView,\n customActions,\n features?.showHeadings,\n features?.showFormatting,\n features?.showLists,\n features?.showBlocks,\n features?.showSearch,\n features?.onImageUpload,\n features?.onViewModeChange,\n ],\n );\n\n return useMenuActions(menuCreator);\n};\n\nconst createToolbarActions = ({\n state,\n getView,\n customActions,\n ...features\n}: ToolbarActionsProps): Atom.Atom<ActionGraphProps> => {\n return Atom.make((get) => {\n const graph: ActionGraphProps = {\n nodes: [],\n edges: [],\n };\n\n // TODO(burdon): Builder pattern?\n const addSubGraph = (graph: ActionGraphProps, subGraph: ActionGraphProps) => {\n graph.nodes.push(...subGraph.nodes);\n graph.edges.push(...subGraph.edges);\n };\n\n // Subscribe to state changes.\n const stateSnapshot = get(state);\n\n if (features?.showHeadings ?? true) {\n addSubGraph(graph, createHeadings(stateSnapshot, getView));\n }\n if (features?.showFormatting ?? true) {\n addSubGraph(graph, createFormatting(stateSnapshot, getView));\n }\n if (features?.showLists ?? true) {\n addSubGraph(graph, createLists(stateSnapshot, getView));\n }\n if (features?.showBlocks ?? true) {\n addSubGraph(graph, createBlocks(stateSnapshot, getView));\n }\n if (features?.onImageUpload) {\n addSubGraph(graph, createImageUpload(features.onImageUpload!));\n }\n\n addSubGraph(graph, createGapSeparator());\n\n if (customActions) {\n addSubGraph(graph, get(customActions));\n }\n if (features?.showSearch ?? true) {\n addSubGraph(graph, createSearch(getView));\n }\n if (features?.onViewModeChange) {\n addSubGraph(graph, createViewMode(stateSnapshot, features.onViewModeChange!));\n }\n\n return graph;\n });\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\n\nimport { type Node } from '@dxos/app-graph';\nimport {\n type MenuItemGroup,\n type ToolbarMenuActionGroupProperties,\n createMenuAction,\n createMenuItemGroup,\n} from '@dxos/react-ui-menu';\nimport { List, addList, removeList } from '@dxos/ui-editor';\nimport { type MenuActionProperties } from '@dxos/ui-types';\n\nimport { translationKey } from '../../translations';\n\nimport { type EditorToolbarState } from './useEditorToolbar';\n\nconst listStyles = {\n bullet: 'ph--list-bullets--regular',\n ordered: 'ph--list-numbers--regular',\n task: 'ph--list-checks--regular',\n};\n\nexport const createLists = (state: EditorToolbarState, getView: () => EditorView) => {\n const value = state.listStyle ?? '';\n const listGroupAction = createListGroupAction(value);\n const listActionsMap = createListActions(value, getView);\n return {\n nodes: [listGroupAction as Node.NodeArg<any>, ...listActionsMap],\n edges: [\n { source: 'root', target: 'list' },\n ...listActionsMap.map(({ id }) => ({ source: listGroupAction.id, target: id })),\n ],\n };\n};\n\nexport const createEditorAction = (id: string, props: Partial<MenuActionProperties>, invoke: () => void) => {\n const { label = [`${id} label`, { ns: translationKey }], ...rest } = props;\n\n return createMenuAction(id, invoke, {\n label,\n ...rest,\n }) as Node.Action<MenuActionProperties>;\n};\n\nexport const createEditorActionGroup = (\n id: string,\n props: Omit<ToolbarMenuActionGroupProperties, 'icon'>,\n icon?: string,\n): MenuItemGroup<ToolbarMenuActionGroupProperties> => {\n const { label = [`${id} label`, { ns: translationKey }], ...rest } = props;\n\n return createMenuItemGroup(id, {\n label,\n icon,\n iconOnly: true,\n ...rest,\n }) as MenuItemGroup<ToolbarMenuActionGroupProperties>;\n};\n\nconst createListGroupAction = (value: string) =>\n createEditorActionGroup('list', {\n variant: 'toggleGroup',\n selectCardinality: 'single',\n value,\n } as ToolbarMenuActionGroupProperties);\n\nconst createListActions = (value: string, getView: () => EditorView) =>\n Object.entries(listStyles).map(([listStyle, icon]) => {\n const checked = value === listStyle;\n return createEditorAction(`list-${listStyle}`, { checked, icon }, () => {\n const view = getView();\n if (!view) {\n return;\n }\n\n const listType = listStyle === 'ordered' ? List.Ordered : listStyle === 'bullet' ? List.Bullet : List.Task;\n if (checked) {\n removeList(listType)(view);\n } else {\n addList(listType)(view);\n }\n });\n });\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\n\nimport { type Node } from '@dxos/app-graph';\nimport { type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';\nimport { addBlockquote, addCodeblock, insertTable, removeBlockquote, removeCodeblock } from '@dxos/ui-editor';\n\nimport { createEditorAction, createEditorActionGroup } from './actions';\nimport { type EditorToolbarState } from './useEditorToolbar';\n\nconst createBlockGroupAction = (value: string) =>\n createEditorActionGroup('block', {\n variant: 'toggleGroup',\n selectCardinality: 'single',\n value,\n } as ToolbarMenuActionGroupProperties);\n\nconst createBlockActions = (value: string, getView: () => EditorView, blankLine?: boolean) =>\n Object.entries({\n blockquote: 'ph--quotes--regular',\n codeblock: 'ph--code-block--regular',\n table: 'ph--table--regular',\n }).map(([type, icon]) => {\n const checked = type === value;\n return createEditorAction(type, { checked, ...(type === 'table' && { disabled: !!blankLine }), icon }, () => {\n const view = getView();\n if (!view) {\n return;\n }\n\n switch (type) {\n case 'blockquote':\n checked ? removeBlockquote(view) : addBlockquote(view);\n break;\n case 'codeblock':\n checked ? removeCodeblock(view) : addCodeblock(view);\n break;\n case 'table':\n insertTable(view);\n break;\n }\n });\n });\n\nexport const createBlocks = (state: EditorToolbarState, getView: () => EditorView) => {\n const value = state?.blockQuote ? 'blockquote' : (state.blockType ?? '');\n const blockGroupAction = createBlockGroupAction(value);\n const blockActions = createBlockActions(value, getView, state.blankLine);\n return {\n nodes: [blockGroupAction as Node.NodeArg<any>, ...blockActions],\n edges: [\n { source: 'root', target: 'block' },\n ...blockActions.map(({ id }) => ({ source: blockGroupAction.id, target: id })),\n ],\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\n\nimport { type Node } from '@dxos/app-graph';\nimport { type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';\nimport { type Formatting, Inline, addLink, removeLink, setStyle } from '@dxos/ui-editor';\n\nimport { createEditorAction, createEditorActionGroup } from './actions';\nimport { type EditorToolbarState } from './useEditorToolbar';\n\nconst formats = {\n strong: 'ph--text-b--regular',\n emphasis: 'ph--text-italic--regular',\n strikethrough: 'ph--text-strikethrough--regular',\n code: 'ph--code--regular',\n link: 'ph--link--regular',\n};\n\nconst createFormattingGroup = (formatting: Formatting) =>\n createEditorActionGroup('formatting', {\n variant: 'toggleGroup',\n selectCardinality: 'multiple',\n value: Object.keys(formats).filter((key) => !!formatting[key as keyof Formatting]),\n } as ToolbarMenuActionGroupProperties);\n\nconst createFormattingActions = (formatting: Formatting, getView: () => EditorView) =>\n Object.entries(formats).map(([type, icon]) => {\n const checked = !!formatting[type as keyof Formatting];\n return createEditorAction(type, { checked, icon }, () => {\n const view = getView();\n if (!view) {\n return;\n }\n\n if (type === 'link') {\n checked ? removeLink(view) : addLink()(view);\n return;\n }\n\n const inlineType =\n type === 'strong'\n ? Inline.Strong\n : type === 'emphasis'\n ? Inline.Emphasis\n : type === 'strikethrough'\n ? Inline.Strikethrough\n : Inline.Code;\n setStyle(inlineType, !checked)(view);\n });\n });\n\nexport const createFormatting = (state: EditorToolbarState, getView: () => EditorView) => {\n const formattingGroupAction = createFormattingGroup(state);\n const formattingActions = createFormattingActions(state, getView);\n return {\n nodes: [formattingGroupAction as Node.NodeArg<any>, ...formattingActions],\n edges: [\n { source: 'root', target: 'formatting' },\n ...formattingActions.map(({ id }) => ({ source: formattingGroupAction.id, target: id })),\n ],\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\n\nimport { type Node } from '@dxos/app-graph';\nimport { type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';\nimport { setHeading } from '@dxos/ui-editor';\n\nimport { translationKey } from '../../translations';\n\nimport { createEditorAction, createEditorActionGroup } from './actions';\nimport { type EditorToolbarState } from './useEditorToolbar';\n\nconst createHeadingGroupAction = (value: string) =>\n createEditorActionGroup(\n 'heading',\n {\n variant: 'dropdownMenu',\n applyActive: true,\n selectCardinality: 'single',\n // TODO(wittjosiah): Remove? Not sure this does anything.\n value,\n } as ToolbarMenuActionGroupProperties,\n 'ph--text-h--regular',\n );\n\nconst createHeadingActions = (currentLevel: string, getView: () => EditorView) =>\n Object.entries({\n '0': 'ph--paragraph--regular',\n '1': 'ph--text-h-one--regular',\n '2': 'ph--text-h-two--regular',\n '3': 'ph--text-h-three--regular',\n '4': 'ph--text-h-four--regular',\n '5': 'ph--text-h-five--regular',\n '6': 'ph--text-h-six--regular',\n }).map(([levelStr, icon]) => {\n const level = parseInt(levelStr);\n return createEditorAction(\n `heading--${levelStr}`,\n {\n label: ['heading level label', { count: level, ns: translationKey }],\n icon,\n checked: levelStr === currentLevel,\n },\n () => setHeading(level)(getView()),\n );\n });\n\nconst computeHeadingValue = (state: EditorToolbarState) => {\n const blockType = state ? state.blockType : 'paragraph';\n const heading = blockType && /heading(\\d)/.exec(blockType);\n return heading ? heading[1] : blockType === 'paragraph' || !blockType ? '0' : '';\n};\n\nexport const createHeadings = (state: EditorToolbarState, getView: () => EditorView) => {\n const headingValue = computeHeadingValue(state);\n const headingGroupAction = createHeadingGroupAction(headingValue);\n const headingActions = createHeadingActions(headingValue, getView);\n return {\n nodes: [headingGroupAction as Node.NodeArg<any>, ...headingActions],\n edges: [\n { source: 'root', target: 'heading' },\n ...headingActions.map(({ id }) => ({ source: headingGroupAction.id, target: id })),\n ],\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Node } from '@dxos/app-graph';\n\nimport { createEditorAction } from './actions';\n\nconst createImageUploadAction = (onImageUpload: () => void) =>\n createEditorAction(\n 'image',\n {\n testId: 'editor.toolbar.image',\n icon: 'ph--image-square--regular',\n },\n onImageUpload,\n );\n\nexport const createImageUpload = (\n onImageUpload: () => void,\n): {\n nodes: Node.NodeArg<any>[];\n edges: Array<{ source: string; target: string }>;\n} => ({\n nodes: [createImageUploadAction(onImageUpload)],\n edges: [{ source: 'root', target: 'image' }],\n});\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { openSearchPanel } from '@codemirror/search';\nimport { type EditorView } from '@codemirror/view';\n\nimport { type Node } from '@dxos/app-graph';\n\nimport { createEditorAction } from './actions';\n\nconst createSearchAction = (getView: () => EditorView) =>\n createEditorAction(\n 'search',\n {\n testId: 'editor.toolbar.search',\n icon: 'ph--magnifying-glass--regular',\n },\n () => openSearchPanel(getView()),\n );\n\nexport const createSearch = (\n getView: () => EditorView,\n): {\n nodes: Node.NodeArg<any>[];\n edges: Array<{ source: string; target: string }>;\n} => ({\n nodes: [createSearchAction(getView)],\n edges: [{ source: 'root', target: 'search' }],\n});\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Node } from '@dxos/app-graph';\nimport { type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';\nimport { type EditorViewMode } from '@dxos/ui-editor';\n\nimport { translationKey } from '../../translations';\n\nimport { createEditorAction, createEditorActionGroup } from './actions';\nimport { type EditorToolbarState } from './useEditorToolbar';\n\nconst createViewModeGroupAction = (value: string) =>\n createEditorActionGroup(\n 'viewMode',\n {\n variant: 'dropdownMenu',\n applyActive: true,\n selectCardinality: 'single',\n value,\n } as ToolbarMenuActionGroupProperties,\n 'ph--eye--regular',\n );\n\nconst createViewModeActions = (value: string, onViewModeChange: (mode: EditorViewMode) => void) =>\n Object.entries({\n preview: 'ph--eye--regular',\n source: 'ph--pencil-simple--regular',\n readonly: 'ph--pencil-slash--regular',\n }).map(([viewMode, icon]) => {\n const checked = viewMode === value;\n return createEditorAction(\n `view-mode--${viewMode}`,\n {\n label: [`${viewMode} mode label`, { ns: translationKey }],\n checked,\n icon,\n },\n () => onViewModeChange(viewMode as EditorViewMode),\n );\n });\n\nexport const createViewMode = (state: EditorToolbarState, onViewModeChange: (mode: EditorViewMode) => void) => {\n const value = state.viewMode ?? 'source';\n const viewModeGroupAction = createViewModeGroupAction(value);\n const viewModeActions = createViewModeActions(value, onViewModeChange);\n return {\n nodes: [viewModeGroupAction as Node.NodeArg<any>, ...viewModeActions],\n edges: [\n { source: 'root', target: 'viewMode' },\n ...viewModeActions.map(({ id }) => ({ source: viewModeGroupAction.id, target: id })),\n ],\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom } from '@effect-atom/atom-react';\nimport { useMemo } from 'react';\n\nimport { type EditorViewMode, type Formatting } from '@dxos/ui-editor';\n\n// TODO(burdon): Move to extensions.\nexport type EditorToolbarState = { viewMode?: EditorViewMode } & Formatting;\n\n/**\n * Creates an atom for editor toolbar state.\n * @deprecated Use Editor.Root\n */\nexport const useEditorToolbar = (initialState: EditorToolbarState = {}): Atom.Writable<EditorToolbarState> => {\n // TODO(wittjosiah): Including initialState in the deps causes reactivity issues.\n return useMemo(() => Atom.make<EditorToolbarState>(initialState), []);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren, type RefObject, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { addEventListener } from '@dxos/async';\nimport { DX_ANCHOR_ACTIVATE, type DxAnchorActivate, Popover } from '@dxos/react-ui';\nimport { type PreviewLinkRef, type PreviewLinkTarget } from '@dxos/ui-editor';\n\ntype EditorPreviewPopoverValue = Partial<{\n link: PreviewLinkRef;\n target: PreviewLinkTarget;\n pending: boolean;\n}>;\n\nconst [EditorPreviewContextProvider, useEditorPreview] = createContext<EditorPreviewPopoverValue>('PreviewPopover', {});\n\nexport type EditorPreviewProviderProps = PropsWithChildren<{\n onLookup?: (link: PreviewLinkRef) => Promise<PreviewLinkTarget | null | undefined>;\n}>;\n\n/**\n * NOTE: In Composer, the DeckPlugin provides the Popover.Root as part of the DeckLayout.\n */\n// TOOD(burdon): Reconcile with PreviewPlugin.\nexport const EditorPreviewProvider = ({ children, onLookup }: EditorPreviewProviderProps) => {\n const triggerRef = useRef<HTMLElement | null>(null);\n const [value, setValue] = useState<EditorPreviewPopoverValue>({});\n const [open, setOpen] = useState(false);\n\n const handleActivate = useCallback(\n (event: DxAnchorActivate) => {\n const { refId, label, trigger: dxTrigger } = event;\n setValue((value) => ({\n ...value,\n link: { label, ref: refId },\n pending: true,\n }));\n\n triggerRef.current = dxTrigger;\n queueMicrotask(() => setOpen(true));\n void onLookup?.({ label, ref: refId }).then((target) =>\n setValue((value) => ({\n ...value,\n target: target ?? undefined,\n pending: false,\n })),\n );\n },\n [onLookup],\n );\n\n const [root, setRoot] = useState<HTMLDivElement | null>(null);\n useEffect(() => {\n if (!root || !handleActivate) {\n return;\n }\n\n return addEventListener(root, DX_ANCHOR_ACTIVATE as any, handleActivate, {\n capture: true,\n passive: false,\n });\n }, [root, handleActivate]);\n\n return (\n <EditorPreviewContextProvider pending={value.pending} link={value.link} target={value.target}>\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.VirtualTrigger virtualRef={triggerRef as unknown as RefObject<HTMLButtonElement>} />\n\n {/* Content */}\n <div ref={setRoot} role='none' className='contents'>\n {children}\n </div>\n </Popover.Root>\n </EditorPreviewContextProvider>\n );\n};\n\nexport { useEditorPreview };\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["translationKey", "translations", "createContext", "React", "forwardRef", "useCallback", "useImperativeHandle", "useMemo", "useState", "invariant", "mx", "isNonNullable", "noopController", "view", "getText", "setText", "focus", "createEditorController", "state", "doc", "toString", "text", "dispatch", "changes", "from", "to", "length", "insert", "selection", "anchor", "head", "Transaction", "EditorView", "React", "forwardRef", "useEffect", "useImperativeHandle", "initialSync", "mx", "EditorState", "EditorView", "useCallback", "useEffect", "useMemo", "useRef", "useState", "log", "createEditorStateTransaction", "debugDispatcher", "documentId", "modalStateField", "getProviderValue", "isTruthy", "instanceCount", "useTextEditor", "props", "deps", "id", "doc", "initialValue", "extensions", "autoFocus", "scrollTo", "selection", "selectionEnd", "debug", "instanceId", "view", "setView", "parentRef", "current", "length", "initialSelection", "anchor", "head", "undefined", "index", "indexOf", "state", "create", "of", "exceptionSink", "err", "catch", "filter", "parent", "scrollIntoView", "yMargin", "dispatchTransactions", "to", "lineAt", "dispatch", "destroy", "warn", "focus", "handleKeyDown", "event", "key", "target", "currentTarget", "modal", "field", "element", "contentDOM", "closest", "preventDefault", "focusAttributes", "tabIndex", "onKeyDown", "EditorContent", "forwardRef", "classNames", "id", "extensions", "selectionEnd", "focusable", "value", "onChange", "props", "forwardedRef", "parentRef", "focusAttributes", "view", "useTextEditor", "initialValue", "EditorView", "updateListener", "of", "docChanged", "transactions", "isInitialSync", "some", "tr", "annotation", "Transaction", "userEvent", "initialSync", "state", "doc", "toString", "useImperativeHandle", "createEditorController", "useEffect", "requestAnimationFrame", "dispatch", "annotations", "changes", "from", "to", "length", "insert", "selection", "anchor", "undefined", "focus", "div", "role", "className", "mx", "ref", "insertAtCursor", "getMenuItem", "groups", "id", "flatMap", "group", "items", "find", "item", "getNextMenuItem", "index", "findIndex", "length", "getPreviousMenuItem", "createMenuGroup", "label", "filter", "toLowerCase", "includes", "map", "i", "onSelect", "view", "head", "insertAtCursor", "filterMenuGroups", "insertAtLineStart", "Prec", "RangeSetBuilder", "StateEffect", "StateField", "Decoration", "EditorView", "ViewPlugin", "keymap", "modalStateField", "placeholder", "isNonNullable", "isTruthy", "DELIMITERS", "popover", "options", "Prec", "highest", "popoverKeymap", "popoverStateField", "popoverTriggerListener", "popoverAnchorDecoration", "modalStateField", "trigger", "placeholder", "content", "Array", "isArray", "filter", "isTruthy", "EditorView", "updateListener", "of", "view", "docChanged", "range", "activeRange", "state", "field", "text", "doc", "sliceString", "from", "to", "selection", "main", "shouldClose", "test", "slice", "head", "nextRange", "dispatch", "effects", "popoverRangeEffect", "onClose", "triggers", "keymap", "isNonNullable", "map", "key", "run", "line", "lineAt", "trim", "changes", "insert", "anchor", "triggerKey", "str", "idx", "getLastIndexOf", "delimiters", "length", "undefined", "onArrowUp", "onArrowDown", "onEnter", "ViewPlugin", "fromClass", "_decorations", "Decoration", "none", "update", "transactions", "builder", "RangeSetBuilder", "showWidget", "add", "mark", "tagName", "class", "attributes", "rangeChanged", "some", "tr", "effect", "is", "sliceDoc", "onTextChange", "pos", "finish", "decorations", "v", "StateEffect", "define", "StateField", "create", "value", "newValue", "Math", "max", "delim", "lastIndexOf", "formattingCommands", "id", "label", "items", "icon", "onSelect", "view", "head", "insertAtLineStart", "linkSlashCommands", "dispatch", "changes", "from", "insert", "selection", "anchor", "effects", "popoverRangeEffect", "of", "trigger", "range", "to", "useControllableState", "React", "Fragment", "useCallback", "useEffect", "useRef", "useState", "addEventListener", "invariant", "DX_ANCHOR_ACTIVATE", "Icon", "Popover", "toLocalizedString", "useDynamicRef", "useThemeContext", "useTranslation", "EditorMenuProvider", "children", "view", "groups", "currentItem", "open", "openProp", "defaultOpen", "numItems", "onOpenChange", "onActivate", "onSelect", "onCancel", "tx", "triggerRef", "viewRef", "setOpen", "prop", "defaultProp", "onChange", "current", "root", "setRoot", "event", "trigger", "refId", "getAttribute", "undefined", "requestAnimationFrame", "capture", "passive", "handleSelect", "item", "menuGroups", "filter", "group", "items", "length", "Root", "modal", "VirtualTrigger", "virtualRef", "Portal", "Content", "align", "classNames", "elevation", "style", "maxBlockSize", "onEscapeKeyDown", "onOpenAutoFocus", "preventDefault", "Viewport", "Menu", "Arrow", "div", "ref", "role", "className", "ul", "map", "index", "key", "id", "MenuGroup", "t", "label", "span", "MenuItem", "listRef", "scrollIntoView", "behavior", "block", "li", "onClick", "icon", "size", "useCallback", "useMemo", "useRef", "useState", "invariant", "modalStateEffect", "useEditorMenu", "trigger", "triggerKey", "placeholder", "filter", "getMenu", "groupsRef", "useRef", "currentRef", "currentItem", "setCurrentItem", "useState", "open", "setOpen", "_", "refresh", "getMenuOptions", "useCallback", "text", "props", "groups", "filterMenuGroups", "item", "label", "toLowerCase", "startsWith", "handleOpenChange", "view", "invariant", "undefined", "dispatch", "effects", "popoverRangeEffect", "of", "requestAnimationFrame", "modalStateEffect", "handleActivate", "getMenuItem", "current", "handleSelect", "onSelect", "head", "state", "selection", "main", "handleCancel", "range", "field", "popoverStateField", "changes", "insert", "serializedTrigger", "Array", "isArray", "join", "extension", "useMemo", "popover", "onClose", "onEnter", "onArrowUp", "previous", "getPreviousMenuItem", "id", "onArrowDown", "next", "getNextMenuItem", "onTextChange", "pos", "firstItem", "group", "items", "length", "onOpenChange", "onActivate", "onCancel", "Atom", "React", "memo", "useMemo", "ElevationProvider", "MenuProvider", "ToolbarMenu", "createGapSeparator", "useMenuActions", "createMenuAction", "createMenuItemGroup", "List", "addList", "removeList", "listStyles", "bullet", "ordered", "task", "createLists", "state", "getView", "value", "listStyle", "listGroupAction", "createListGroupAction", "listActionsMap", "createListActions", "nodes", "edges", "source", "target", "map", "id", "createEditorAction", "props", "invoke", "label", "ns", "translationKey", "rest", "createMenuAction", "createEditorActionGroup", "icon", "createMenuItemGroup", "iconOnly", "variant", "selectCardinality", "Object", "entries", "checked", "view", "listType", "List", "Ordered", "Bullet", "Task", "removeList", "addList", "addBlockquote", "addCodeblock", "insertTable", "removeBlockquote", "removeCodeblock", "createBlockGroupAction", "value", "createEditorActionGroup", "variant", "selectCardinality", "createBlockActions", "getView", "blankLine", "Object", "entries", "blockquote", "codeblock", "table", "map", "type", "icon", "checked", "createEditorAction", "disabled", "view", "removeBlockquote", "addBlockquote", "removeCodeblock", "addCodeblock", "insertTable", "createBlocks", "state", "blockQuote", "blockType", "blockGroupAction", "blockActions", "nodes", "edges", "source", "target", "id", "Inline", "addLink", "removeLink", "setStyle", "formats", "strong", "emphasis", "strikethrough", "code", "link", "createFormattingGroup", "formatting", "createEditorActionGroup", "variant", "selectCardinality", "value", "Object", "keys", "filter", "key", "createFormattingActions", "getView", "entries", "map", "type", "icon", "checked", "createEditorAction", "view", "removeLink", "addLink", "inlineType", "Inline", "Strong", "Emphasis", "Strikethrough", "Code", "setStyle", "createFormatting", "state", "formattingGroupAction", "formattingActions", "nodes", "edges", "source", "target", "id", "setHeading", "createHeadingGroupAction", "value", "createEditorActionGroup", "variant", "applyActive", "selectCardinality", "createHeadingActions", "currentLevel", "getView", "Object", "entries", "map", "levelStr", "icon", "level", "parseInt", "createEditorAction", "label", "count", "ns", "translationKey", "checked", "setHeading", "computeHeadingValue", "state", "blockType", "heading", "exec", "createHeadings", "headingValue", "headingGroupAction", "headingActions", "nodes", "edges", "source", "target", "id", "createImageUploadAction", "onImageUpload", "createEditorAction", "testId", "icon", "createImageUpload", "nodes", "edges", "source", "target", "openSearchPanel", "createSearchAction", "getView", "createEditorAction", "testId", "icon", "openSearchPanel", "createSearch", "nodes", "edges", "source", "target", "createViewModeGroupAction", "value", "createEditorActionGroup", "variant", "applyActive", "selectCardinality", "createViewModeActions", "onViewModeChange", "Object", "entries", "preview", "source", "readonly", "map", "viewMode", "icon", "checked", "createEditorAction", "label", "ns", "translationKey", "createViewMode", "state", "viewModeGroupAction", "viewModeActions", "nodes", "edges", "target", "id", "EditorToolbar", "memo", "classNames", "role", "attendableId", "onAction", "props", "menuProps", "useEditorToolbarActionGraph", "React", "ElevationProvider", "elevation", "MenuProvider", "ToolbarMenu", "textBlockWidth", "state", "getView", "customActions", "features", "menuCreator", "useMemo", "createToolbarActions", "showHeadings", "showFormatting", "showLists", "showBlocks", "showSearch", "onImageUpload", "onViewModeChange", "useMenuActions", "Atom", "make", "get", "graph", "nodes", "edges", "addSubGraph", "subGraph", "push", "stateSnapshot", "createHeadings", "createFormatting", "createLists", "createBlocks", "createImageUpload", "createGapSeparator", "createSearch", "createViewMode", "Atom", "useMemo", "useEditorToolbar", "initialState", "useMemo", "Atom", "make", "EditorContextProvider", "useEditorContext", "createContext", "EditorRoot", "forwardRef", "children", "extensions", "extensionsProp", "viewMode", "props", "forwardedRef", "state", "useEditorToolbar", "controller", "setController", "useState", "useImperativeHandle", "noopController", "groupsRef", "extension", "menuProps", "useEditorMenu", "useMemo", "filter", "isNonNullable", "flat", "React", "EditorMenuProvider", "view", "groups", "current", "displayName", "EditorViewport", "classNames", "div", "role", "className", "mx", "EditorContent", "providedExtensions", "additionalExtensions", "NaturalEditorContent", "ref", "EditorToolbar", "getView", "useCallback", "invariant", "NaturalEditorToolbar", "Editor", "Root", "Viewport", "Content", "Toolbar", "createContext", "React", "useCallback", "useEffect", "useRef", "useState", "addEventListener", "DX_ANCHOR_ACTIVATE", "Popover", "EditorPreviewContextProvider", "useEditorPreview", "createContext", "EditorPreviewProvider", "children", "onLookup", "triggerRef", "useRef", "value", "setValue", "useState", "open", "setOpen", "handleActivate", "useCallback", "event", "refId", "label", "trigger", "dxTrigger", "link", "ref", "pending", "current", "queueMicrotask", "then", "target", "undefined", "root", "setRoot", "useEffect", "addEventListener", "DX_ANCHOR_ACTIVATE", "capture", "passive", "React", "Popover", "Root", "onOpenChange", "VirtualTrigger", "virtualRef", "div", "role", "className"]
|
|
3
|
+
"sources": ["../../../src/translations.ts", "../../../src/components/Editor/Editor.tsx", "../../../src/components/EditorContent/controller.ts", "../../../src/components/EditorContent/EditorContent.tsx", "../../../src/hooks/useTextEditor.ts", "../../../src/components/EditorMenuProvider/menu.ts", "../../../src/components/EditorMenuProvider/menu-presets.ts", "../../../src/components/EditorMenuProvider/popover.ts", "../../../src/components/EditorMenuProvider/EditorMenuProvider.tsx", "../../../src/components/EditorMenuProvider/useEditorMenu.ts", "../../../src/components/EditorToolbar/EditorToolbar.tsx", "../../../src/components/EditorToolbar/lists.ts", "../../../src/components/EditorToolbar/blocks.ts", "../../../src/components/EditorToolbar/formatting.ts", "../../../src/components/EditorToolbar/headings.ts", "../../../src/components/EditorToolbar/image.ts", "../../../src/components/EditorToolbar/search.ts", "../../../src/components/EditorToolbar/view-mode.ts", "../../../src/components/EditorToolbar/useEditorToolbar.ts", "../../../src/components/EditorPreviewProvider/EditorPreviewProvider.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Resource } from '@dxos/react-ui';\n\nexport const translationKey = '@dxos/react-ui-editor';\n\nexport const translations = [\n {\n 'en-US': {\n [translationKey]: {\n 'comment.label': 'Create comment',\n 'image.label': 'Insert image',\n 'search.label': 'Search',\n\n 'block.label': 'Block',\n 'block.blockquote.label': 'Block quote',\n 'block.codeblock.label': 'Code block',\n 'block.table.label': 'Create table',\n\n 'formatting.label': 'Formatting',\n 'formatting.strong.label': 'Bold',\n 'formatting.emphasis.label': 'Italics',\n 'formatting.strikethrough.label': 'Strikethrough',\n 'formatting.code.label': 'Code',\n 'formatting.link.label': 'Link',\n\n 'list.bullet.label': 'Bullet list',\n 'list.ordered.label': 'Numbered list',\n 'list.task.label': 'Task list',\n\n 'heading.label': 'Heading level',\n 'heading-level.label_zero': 'Paragraph',\n 'heading-level.label_one': 'Heading level {{count}}',\n 'heading-level.label_other': 'Heading level {{count}}',\n\n 'view-mode.label': 'Editor view',\n 'view-mode.preview.label': 'Markdown',\n 'view-mode.source.label': 'Plain text',\n 'view-mode.readonly.label': 'Read only',\n },\n },\n },\n] as const satisfies Resource[];\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren, forwardRef, useCallback, useImperativeHandle, useMemo, useState } from 'react';\n\nimport { invariant } from '@dxos/invariant';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\nimport { isNonNullable } from '@dxos/util';\n\nimport {\n type EditorController,\n EditorContent as NaturalEditorContent,\n type EditorContentProps as NaturalEditorContentProps,\n noopController,\n} from '../EditorContent';\nimport { EditorMenuProvider, type UseEditorMenuProps, useEditorMenu } from '../EditorMenuProvider';\nimport {\n type EditorToolbarState,\n EditorToolbar as NaturalEditorToolbar,\n type EditorToolbarProps as NaturalEditorToolbarProps,\n useEditorToolbar,\n} from '../EditorToolbar';\n\n//\n// Context\n//\n\ntype EditorContextValue = {\n controller?: EditorController;\n setController: (controller: EditorController) => void;\n extensions?: Extension[];\n} & Pick<NaturalEditorToolbarProps, 'state'>;\n\nconst [EditorContextProvider, useEditorContext] = createContext<EditorContextValue>('Editor');\n\n//\n// Root\n//\n\ntype EditorRootProps = PropsWithChildren<\n Pick<EditorContextValue, 'extensions'> & Omit<UseEditorMenuProps, 'viewRef'> & Pick<EditorToolbarState, 'viewMode'>\n>;\n\n/**\n * Root component for the Editor compound component.\n * Provides context for all child components and manages the editor controller state.\n */\nconst EditorRoot = forwardRef<EditorController | null, EditorRootProps>(\n ({ children, extensions: extensionsProp, viewMode, ...props }, forwardedRef) => {\n const state = useEditorToolbar({ viewMode });\n\n const [controller, setController] = useState<EditorController>();\n useImperativeHandle(forwardedRef, () => controller ?? noopController, [controller]);\n\n // TODO(burdon): Consider lighter-weight approach if EditorMenuProvider is not needed.\n const { groupsRef, extension, ...menuProps } = useEditorMenu(props);\n const extensions = useMemo(\n () => [extension, extensionsProp].filter(isNonNullable).flat(),\n [extension, extensionsProp],\n );\n\n return (\n <EditorContextProvider\n controller={controller}\n setController={setController}\n extensions={extensions}\n state={state}\n >\n <EditorMenuProvider view={controller?.view} groups={groupsRef.current} {...menuProps}>\n {children}\n </EditorMenuProvider>\n </EditorContextProvider>\n );\n },\n);\n\nEditorRoot.displayName = 'Editor.Root';\n\n//\n// Viewport\n//\n\nconst EDITOR_VIEWPORT_NAME = 'Editor.Viewport';\n\ntype EditorViewportProps = ThemedClassName<PropsWithChildren<{}>>;\n\n/**\n * Viewport component that wraps the toolbar and editor content area.\n */\nconst EditorViewport = ({ classNames, children }: EditorViewportProps) => {\n return (\n <div role='none' className={mx('grid grid-rows-[min-content_1fr] h-full overflow-hidden', classNames)}>\n {children}\n </div>\n );\n};\n\nEditorViewport.displayName = EDITOR_VIEWPORT_NAME;\n\n//\n// Content\n//\n\nconst EDITOR_CONTENT_NAME = 'Editor.Content';\n\ntype EditorContentProps = Omit<NaturalEditorContentProps, 'ref'>;\n\n/**\n * Content component that renders the actual CodeMirror editor.\n * Automatically registers the editor controller with the context.\n */\nconst EditorContent = ({ extensions: providedExtensions, ...props }: EditorContentProps) => {\n const { extensions: additionalExtensions = [], setController } = useEditorContext(EDITOR_CONTENT_NAME);\n\n const extensions = useMemo(\n () => [additionalExtensions, providedExtensions].filter(isNonNullable).flat(),\n [providedExtensions, additionalExtensions],\n );\n\n return <NaturalEditorContent {...props} extensions={extensions} ref={setController} />;\n};\n\nEditorContent.displayName = EDITOR_CONTENT_NAME;\n\n//\n// Toolbar\n//\n\nconst EDITOR_TOOLBAR_NAME = 'Editor.Toolbar';\n\ntype EditorToolbarProps = Omit<NaturalEditorToolbarProps, 'getView' | 'state'>;\n\n/**\n * Toolbar component that provides editor formatting and control actions.\n * Automatically connects to the editor view through context.\n */\nconst EditorToolbar = (props: EditorToolbarProps) => {\n const { controller, state } = useEditorContext(EDITOR_TOOLBAR_NAME);\n\n // TODO(burdon): Fix invariant.\n const getView = useCallback(() => {\n invariant(controller?.view);\n return controller?.view;\n }, [controller]);\n\n return <NaturalEditorToolbar {...props} getView={getView} state={state} />;\n};\n\nEditorToolbar.displayName = EDITOR_TOOLBAR_NAME;\n\n//\n// Editor\n//\n\n/**\n * Compound editor component following the Radix UI pattern.\n *\n * @example\n * ```tsx\n * EditorMenuGroup.Root>\n * EditorMenuGroup.Toolbar />\n * EditorMenuGroup.Viewport>\n * EditorMenuGroup.Content extensions={[...]} />\n * </Editor.Viewport>\n * </Editor.Root>\n * ```\n */\nexport const Editor = {\n Root: EditorRoot,\n Viewport: EditorViewport,\n Content: EditorContent,\n Toolbar: EditorToolbar,\n};\n\nexport type {\n EditorController,\n EditorRootProps,\n EditorViewportProps,\n EditorContentProps,\n // EditorToolbarProps, // TODO(burdon): Restore once removed deprecated props.\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\n\nexport interface EditorController {\n get view(): EditorView | null;\n getText: () => string;\n setText: (text: string, focus?: boolean) => void;\n focus: () => void;\n}\n\nexport const noopController: EditorController = {\n get view() {\n return null;\n },\n getText: () => '',\n setText: () => {},\n focus: () => {},\n};\n\nexport const createEditorController = (view: EditorView | null): EditorController => {\n return {\n get view() {\n return view;\n },\n getText: () => {\n return view?.state.doc.toString() ?? '';\n },\n setText: (text: string, focus?: boolean) => {\n view?.dispatch({\n changes: {\n from: 0,\n to: view?.state.doc.length ?? 0,\n insert: text,\n },\n selection: {\n anchor: text.length,\n head: text.length,\n },\n });\n\n if (focus) {\n view?.focus();\n }\n },\n focus: () => view?.focus(),\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Transaction } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport React, { forwardRef, useEffect, useImperativeHandle } from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { initialSync } from '@dxos/ui-editor';\nimport { mx } from '@dxos/ui-theme';\n\nimport { type UseTextEditorProps, useTextEditor } from '../../hooks';\n\nimport { type EditorController, createEditorController } from './controller';\n\nexport type EditorContentProps = ThemedClassName<\n {\n focusable?: boolean;\n value?: string;\n onChange?: (value: string) => void;\n } & UseTextEditorProps\n>;\n\n/**\n * Minimal text editor.\n * NOTE: This shouold not be used with the automerge extension.\n * @deprecated Use Editor.Content\n */\nexport const EditorContent = forwardRef<EditorController, EditorContentProps>(\n ({ classNames, id, extensions, selectionEnd, focusable = true, value, onChange, ...props }, forwardedRef) => {\n const { parentRef, focusAttributes, view } = useTextEditor(\n () => ({\n id,\n initialValue: value,\n selectionEnd,\n extensions: [\n extensions ?? [],\n EditorView.updateListener.of(({ view, docChanged, transactions }) => {\n const isInitialSync = transactions.some((tr) => tr.annotation(Transaction.userEvent) === initialSync.value);\n if (!isInitialSync && docChanged) {\n onChange?.(view.state.doc.toString());\n }\n }),\n ],\n ...props,\n }),\n [id, extensions, selectionEnd, onChange],\n );\n\n // External controller.\n useImperativeHandle(forwardedRef, () => {\n return createEditorController(view);\n }, [id, view]);\n\n // Set initial value and cursor position.\n useEffect(() => {\n requestAnimationFrame(() => {\n view?.dispatch({\n annotations: initialSync,\n changes: value ? [{ from: 0, to: view?.state.doc.length ?? 0, insert: value ?? '' }] : [],\n selection: selectionEnd ? { anchor: view?.state.doc.length ?? 0 } : undefined,\n });\n\n if (selectionEnd) {\n view?.focus();\n }\n });\n }, [view, value, selectionEnd]);\n\n return (\n <div\n role='none'\n className={mx(\n 'w-full outline-hidden focus:border-accent-surface focus-within:border-neutral-focus-indicator',\n classNames,\n )}\n ref={parentRef}\n {...(focusable ? focusAttributes : {})}\n />\n );\n },\n);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { EditorState, type EditorStateConfig, type Text } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport {\n type ComponentPropsWithoutRef,\n type DependencyList,\n type KeyboardEventHandler,\n type RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { log } from '@dxos/log';\nimport {\n type EditorSelection,\n createEditorStateTransaction,\n debugDispatcher,\n documentId,\n modalStateField,\n} from '@dxos/ui-editor';\nimport { type MaybeProvider, getProviderValue, isTruthy } from '@dxos/util';\n\nlet instanceCount = 0;\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 UseTextEditor = {\n parentRef: RefObject<HTMLDivElement | null>;\n view: EditorView | null;\n focusAttributes?: ComponentPropsWithoutRef<'div'>;\n};\n\nexport type UseTextEditorProps = Pick<EditorStateConfig, 'extensions'> & {\n id?: string;\n doc?: Text;\n initialValue?: string;\n autoFocus?: boolean;\n scrollTo?: number;\n selection?: EditorSelection;\n selectionEnd?: boolean;\n debug?: boolean;\n};\n\n/**\n * Creates codemirror text editor.\n */\nexport const useTextEditor = (\n props: MaybeProvider<UseTextEditorProps> = {},\n deps: DependencyList = [],\n): UseTextEditor => {\n const { id, doc, initialValue, extensions, autoFocus, scrollTo, selection, selectionEnd, debug } =\n useMemo<UseTextEditorProps>(() => getProviderValue(props), deps ?? []);\n\n // NOTE: Increments by 2 in strict mode.\n const [instanceId] = useState(() => `text-editor-${++instanceCount}`);\n const [view, setView] = useState<EditorView | null>(null);\n const parentRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n let view: EditorView | null = null;\n if (parentRef.current) {\n log('create', { id, instanceId, doc: initialValue?.length ?? 0 });\n\n let initialSelection;\n if (selection?.anchor && initialValue?.length) {\n if (selection.anchor <= initialValue.length && (selection?.head ?? 0) <= initialValue.length) {\n initialSelection = selection;\n }\n } else if (selectionEnd && selection === undefined) {\n const index = initialValue?.indexOf('\\n');\n const anchor = !index || index === -1 ? 0 : index;\n initialSelection = { anchor };\n }\n\n // https://codemirror.net/docs/ref/#state.EditorStateConfig\n const state = EditorState.create({\n doc: doc ?? initialValue,\n // selection: initialSelection,\n extensions: [\n id && documentId.of(id),\n extensions,\n // NOTE: This doesn't catch errors in keymap functions.\n EditorView.exceptionSink.of((err) => {\n log.catch(err);\n }),\n ].filter(isTruthy),\n });\n\n // https://codemirror.net/docs/ref/#view.EditorViewConfig\n view = new EditorView({\n parent: parentRef.current,\n state,\n scrollTo: scrollTo ? EditorView.scrollIntoView(scrollTo, { yMargin: 96 }) : undefined, // TODO(burdon): Const.\n dispatchTransactions: debug ? debugDispatcher : undefined,\n });\n\n // Move to end of line after document loaded (unless selection is specified).\n if (selectionEnd && !initialSelection) {\n const { to } = view.state.doc.lineAt(0);\n if (to) {\n view.dispatch({ selection: { anchor: to } });\n }\n }\n\n setView(view);\n }\n\n return () => {\n log('destroy', { id });\n view?.destroy();\n };\n }, deps);\n\n useEffect(() => {\n if (view) {\n if (scrollTo || selection) {\n if (selection && selection.anchor > view.state.doc.length) {\n log.warn('invalid selection', { length: view.state.doc.length, scrollTo, selection });\n return;\n }\n\n view.dispatch(createEditorStateTransaction({ scrollTo, selection }));\n }\n }\n }, [view, scrollTo, selection]);\n\n useEffect(() => {\n if (view && autoFocus) {\n view.focus();\n }\n }, [autoFocus, view]);\n\n // Focus editor on Enter (e.g., when tabbing to this component).\n const handleKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(\n (event) => {\n const { key, target, currentTarget } = event;\n switch (key) {\n case 'Escape': {\n // Check if popover is open.\n const modal = view?.state.field(modalStateField, false);\n if (modal) {\n return;\n }\n\n // Focus the closest focusable parent.\n const element = view?.contentDOM.closest('[tabindex=\"0\"]') as HTMLDivElement | null;\n element?.focus();\n break;\n }\n\n case 'Enter': {\n event.preventDefault();\n if (target === currentTarget) {\n view?.focus();\n }\n break;\n }\n }\n },\n [view],\n );\n\n return {\n parentRef,\n view,\n focusAttributes: {\n tabIndex: 0 as const,\n onKeyDown: handleKeyDown,\n },\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\n\nimport { type Label } from '@dxos/react-ui';\nimport { insertAtCursor } from '@dxos/ui-editor';\nimport { type MaybePromise } from '@dxos/util';\n\nexport type EditorMenuGroup = {\n id: string;\n label?: Label;\n items: EditorMenuItem[];\n};\n\nexport type EditorMenuItem = {\n id: string;\n label: Label;\n icon?: string;\n onSelect?: (event: { view: EditorView; head: number }) => MaybePromise<void>;\n};\n\nexport const getMenuItem = (groups: EditorMenuGroup[], id?: string): EditorMenuItem | undefined => {\n return groups.flatMap((group) => group.items).find((item) => item.id === id);\n};\n\nexport const getNextMenuItem = (groups: EditorMenuGroup[], id?: string): EditorMenuItem => {\n const items = groups.flatMap((group) => group.items);\n const index = items.findIndex((item) => item.id === id);\n return index < items.length - 1 ? items[index + 1] : items[index];\n};\n\nexport const getPreviousMenuItem = (groups: EditorMenuGroup[], id?: string): EditorMenuItem => {\n const items = groups.flatMap((group) => group.items);\n const index = items.findIndex((item) => item.id === id);\n return index > 0 ? items[index - 1] : items[index];\n};\n\nexport const createMenuGroup = ({\n id = 'menu',\n label,\n filter,\n items,\n}: {\n id?: string;\n label?: Label;\n filter?: string;\n items: string[];\n}): EditorMenuGroup => ({\n id,\n label,\n items: items\n .filter((item) => !filter || item.toLowerCase().includes(filter.toLowerCase()))\n .map((item, i) => ({\n id: `${id}-${i}`,\n label: item,\n onSelect: ({ view, head }) => insertAtCursor(view, head, item),\n })),\n});\n\nexport const filterMenuGroups = (\n groups: EditorMenuGroup[],\n filter: (item: EditorMenuItem) => boolean,\n): EditorMenuGroup[] => {\n return groups.map((group) => ({\n ...group,\n items: group.items.filter(filter),\n }));\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { insertAtLineStart } from '@dxos/ui-editor';\n\nimport { type EditorMenuGroup } from './menu';\nimport { popoverRangeEffect } from './popover';\n\nexport const formattingCommands: EditorMenuGroup = {\n id: 'markdown',\n label: 'Markdown',\n items: [\n {\n id: 'heading-1',\n label: 'Heading 1',\n icon: 'ph--text-h-one--regular',\n onSelect: ({ view, head }) => insertAtLineStart(view, head, '# '),\n },\n {\n id: 'heading-2',\n label: 'Heading 2',\n icon: 'ph--text-h-two--regular',\n onSelect: ({ view, head }) => insertAtLineStart(view, head, '## '),\n },\n {\n id: 'heading-3',\n label: 'Heading 3',\n icon: 'ph--text-h-three--regular',\n onSelect: ({ view, head }) => insertAtLineStart(view, head, '### '),\n },\n {\n id: 'heading-4',\n label: 'Heading 4',\n icon: 'ph--text-h-four--regular',\n onSelect: ({ view, head }) => insertAtLineStart(view, head, '#### '),\n },\n {\n id: 'heading-5',\n label: 'Heading 5',\n icon: 'ph--text-h-five--regular',\n onSelect: ({ view, head }) => insertAtLineStart(view, head, '##### '),\n },\n {\n id: 'heading-6',\n label: 'Heading 6',\n icon: 'ph--text-h-six--regular',\n onSelect: ({ view, head }) => insertAtLineStart(view, head, '###### '),\n },\n {\n id: 'bullet-list',\n label: 'Bullet List',\n icon: 'ph--list-bullets--regular',\n onSelect: ({ view, head }) => insertAtLineStart(view, head, '- '),\n },\n {\n id: 'numbered-list',\n label: 'Numbered List',\n icon: 'ph--list-numbers--regular',\n onSelect: ({ view, head }) => insertAtLineStart(view, head, '1. '),\n },\n {\n id: 'task-list',\n label: 'Task List',\n icon: 'ph--list-checks--regular',\n onSelect: ({ view, head }) => insertAtLineStart(view, head, '- [ ] '),\n },\n {\n id: 'quote',\n label: 'Quote',\n icon: 'ph--quotes--regular',\n onSelect: ({ view, head }) => insertAtLineStart(view, head, '> '),\n },\n {\n id: 'code-block',\n label: 'Code Block',\n icon: 'ph--code-block--regular',\n onSelect: ({ view, head }) => insertAtLineStart(view, head, '```\\n\\n```'),\n },\n {\n id: 'table',\n label: 'Table',\n icon: 'ph--table--regular',\n onSelect: ({ view, head }) => insertAtLineStart(view, head, '| | | |\\n|---|---|---|\\n| | | |'),\n },\n ],\n};\n\nexport const linkSlashCommands: EditorMenuGroup = {\n id: 'link',\n label: 'Link',\n items: [\n {\n id: 'inline-link',\n label: 'Inline link',\n icon: 'ph--link--regular',\n onSelect: ({ view, head }) => {\n view.dispatch({\n changes: { from: head, insert: '@' },\n selection: { anchor: head + 1, head: head + 1 },\n effects: popoverRangeEffect.of({\n trigger: '@',\n range: { from: head, to: head + 1 },\n }),\n });\n },\n },\n {\n id: 'block-embed',\n label: 'Block embed',\n icon: 'ph--lego--regular',\n onSelect: ({ view, head }) => {\n // Seed the same query shape as typing \"@@\" manually.\n view.dispatch({\n changes: { from: head, insert: '@@' },\n selection: { anchor: head + 2, head: head + 2 },\n effects: popoverRangeEffect.of({\n trigger: '@',\n range: { from: head, to: head + 2 },\n }),\n });\n },\n },\n ],\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Extension, Prec, RangeSetBuilder, StateEffect, StateField } from '@codemirror/state';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n type KeyBinding,\n ViewPlugin,\n type ViewUpdate,\n keymap,\n} from '@codemirror/view';\n\nimport { type PlaceholderOptions, type Range, modalStateField, placeholder } from '@dxos/ui-editor';\nimport { isNonNullable, isTruthy } from '@dxos/util';\n\nconst DELIMITERS = [' ', ':'];\n\nexport type PopoverOptions = {\n trigger?: string | string[];\n triggerKey?: string;\n placeholder?: Partial<PlaceholderOptions>;\n delimiters?: string[];\n\n // TODO(burdon): Auto.\n // activateOnTyping?: boolean;\n\n // Trigger update.\n onTextChange?: (event: { view: EditorView; pos: number; text: string; trigger?: string }) => void;\n onClose?: (event: { view: EditorView }) => void;\n\n // Menu specific.\n onEnter?: (event: { view: EditorView }) => void;\n onArrowUp?: (event: { view: EditorView }) => void;\n onArrowDown?: (event: { view: EditorView }) => void;\n};\n\n/**\n * Creates a popover that appears when the trigger character is inserted.\n * This can be used for context menus or autocompletion.\n */\nexport const popover = (options: PopoverOptions = {}): Extension => {\n return [\n Prec.highest(popoverKeymap(options)),\n popoverStateField,\n popoverTriggerListener(options),\n popoverAnchorDecoration(options),\n modalStateField,\n options.trigger &&\n placeholder({\n // TODO(burdon): Translations.\n content: `Press '${Array.isArray(options.trigger) ? options.trigger[0] : options.trigger}' for commands`,\n ...options.placeholder,\n }),\n ].filter(isTruthy);\n};\n\n/**\n * Listen for selection and document changes.\n */\nconst popoverTriggerListener = (options: PopoverOptions) =>\n EditorView.updateListener.of(({ view, docChanged }) => {\n const { range: activeRange, trigger } = view.state.field(popoverStateField) ?? {};\n if (!activeRange) {\n return;\n }\n\n const text = view.state.doc.sliceString(activeRange.from, activeRange.to);\n const selection = view.state.selection.main;\n const shouldClose =\n // Trigger deleted.\n (trigger ? trigger !== text[0] : false) ||\n // Whitespace in text.\n /\\s/.test(trigger ? text.slice(1) : text) ||\n // Cursor moved before the range.\n selection.head < activeRange.from ||\n // Cursor moved after the range (+1 to handle selection changing before doc).\n selection.head > activeRange.to + 1;\n\n const nextRange = shouldClose ? null : docChanged ? { from: activeRange.from, to: selection.head } : activeRange;\n if (nextRange !== activeRange) {\n view.dispatch({\n effects: popoverRangeEffect.of(nextRange ? { range: nextRange, trigger } : null),\n });\n }\n\n if (shouldClose) {\n options.onClose?.({ view });\n }\n });\n\n/**\n * Popover navigation.\n */\nconst popoverKeymap = (options: PopoverOptions) => {\n const triggers = Array.isArray(options.trigger) ? options.trigger : [options.trigger];\n return keymap.of(\n [\n // Prefix triggers.\n ...triggers.filter(isNonNullable).map((trigger) => ({\n key: trigger,\n run: (view: EditorView) => {\n // Determine if we should trigger the popover:\n // 1. Empty lines or at the beginning of a line.\n // 2. When there's a preceding space.\n const selection = view.state.selection.main;\n const line = view.state.doc.lineAt(selection.head);\n if (\n line.text.trim() === '' ||\n selection.head === line.from ||\n (selection.head > line.from && line.text[selection.head - line.from - 1] === ' ')\n ) {\n // Insert and select the trigger.\n view.dispatch({\n changes: { from: selection.head, insert: trigger },\n selection: { anchor: selection.head + 1, head: selection.head + 1 },\n effects: popoverRangeEffect.of({ trigger, range: { from: selection.head, to: selection.head + 1 } }),\n });\n\n return true;\n }\n\n return false;\n },\n })),\n\n //\n // Custom trigger.\n //\n options.triggerKey &&\n ({\n key: options.triggerKey,\n run: (view: EditorView) => {\n const selection = view.state.selection.main;\n const line = view.state.doc.lineAt(selection.head);\n\n // Get last word.\n let str = line.text.slice(0, selection.head - line.from);\n const idx = getLastIndexOf(str, options.delimiters ?? DELIMITERS);\n if (idx !== -1) {\n str = str.slice(idx + 1);\n }\n\n // Create anchor even if zero length (append space).\n const from = line.from + idx;\n view.dispatch({\n effects: popoverRangeEffect.of({ range: { from: from + 1, to: selection.head } }),\n changes:\n selection.head === view.state.doc.length\n ? { from: from + 1, to: selection.head, insert: ' ' }\n : undefined,\n });\n return true;\n },\n } satisfies KeyBinding),\n\n //\n // Nav keys.\n //\n {\n key: 'ArrowUp',\n run: (view: EditorView) => {\n const range = view.state.field(popoverStateField)?.range;\n if (range) {\n options.onArrowUp?.({ view });\n return true;\n }\n\n return false;\n },\n },\n {\n key: 'ArrowDown',\n run: (view: EditorView) => {\n const range = view.state.field(popoverStateField)?.range;\n if (range) {\n options.onArrowDown?.({ view });\n return true;\n }\n\n return false;\n },\n },\n {\n key: 'Enter',\n run: (view: EditorView) => {\n const range = view.state.field(popoverStateField)?.range;\n if (range) {\n view.dispatch({ changes: { from: range.from, to: range.to, insert: '' } });\n options.onEnter?.({ view });\n return true;\n }\n\n return false;\n },\n },\n ].filter(isTruthy),\n );\n};\n\n/**\n * Creates a <dx-anchor> tag, which is used to anchor the Popver.\n */\nconst popoverAnchorDecoration = (options: PopoverOptions) => {\n return ViewPlugin.fromClass(\n class {\n _decorations: DecorationSet = Decoration.none;\n\n constructor(readonly view: EditorView) {}\n\n // TODO(wittjosiah): The decorations are repainted on every update, this occasionally causes menu to flicker.\n update({ view, transactions }: ViewUpdate) {\n const builder = new RangeSetBuilder<Decoration>();\n const { range, trigger } = view.state.field(popoverStateField) ?? {};\n if (range) {\n // Check if we should show the widget (only if cursor is within the active command range).\n const selection = view.state.selection.main;\n const showWidget = selection.head >= range.from && selection.head <= range.to;\n if (showWidget) {\n builder.add(\n range.from,\n range.to + 1,\n Decoration.mark({\n tagName: 'dx-anchor',\n class: 'cm-popover-trigger',\n attributes: {\n 'data-visible-focus': 'false',\n 'data-auto-trigger': 'true',\n 'data-trigger': trigger ?? options.triggerKey ?? '',\n },\n }),\n );\n }\n\n const rangeChanged = transactions.some((tr) => tr.effects.some((effect) => effect.is(popoverRangeEffect)));\n if (rangeChanged) {\n // NOTE: Content skips the trigger character.\n const content = view.state.sliceDoc(range.from + (trigger ? trigger.length : 0), range.to);\n options.onTextChange?.({ view, pos: selection.head, text: content, trigger });\n }\n }\n\n this._decorations = builder.finish();\n }\n },\n {\n decorations: (v) => v._decorations,\n },\n );\n};\n\ntype PopoverState = {\n /**\n * Trigger prefix (in document).\n */\n trigger?: string;\n\n /**\n * Current document completion range.\n */\n range: Range;\n};\n\n// State effects for managing popover state.\nexport const popoverRangeEffect = StateEffect.define<PopoverState | null>();\n\n// State field to track the active popover trigger range.\nexport const popoverStateField = StateField.define<PopoverState | null>({\n create: () => null,\n update: (value, tr) => {\n let newValue = value;\n for (const effect of tr.effects) {\n if (effect.is(popoverRangeEffect)) {\n newValue = effect.value;\n }\n }\n\n return newValue;\n },\n});\n\nconst getLastIndexOf = (str: string, delimiters: string[]) =>\n Math.max(...delimiters.map((delim) => str.lastIndexOf(delim)));\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport React, { Fragment, type PropsWithChildren, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { addEventListener } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport {\n DX_ANCHOR_ACTIVATE,\n type DxAnchorActivate,\n Icon,\n Popover,\n ScrollArea,\n toLocalizedString,\n useDynamicRef,\n useThemeContext,\n useTranslation,\n} from '@dxos/react-ui';\n\nimport { type EditorMenuGroup, type EditorMenuItem } from './menu';\n\nexport type EditorMenuProviderProps = PropsWithChildren<{\n view?: EditorView | null;\n groups?: EditorMenuGroup[];\n currentItem?: string;\n open?: boolean;\n defaultOpen?: boolean;\n numItems?: number;\n onOpenChange?: (event: { view: EditorView; open: boolean; trigger?: string }) => void;\n onActivate?: (event: { view: EditorView; trigger?: string }) => void;\n onSelect?: (event: { view: EditorView; item: EditorMenuItem }) => void;\n onCancel?: (event: { view: EditorView }) => void;\n}>;\n\n/**\n * Implements the Popover and listens for the `dx-anchor-activate` event from the `popover` extension's decoration.\n * NOTE: We don't use DropdownMenu because the command menu needs to manage focus explicitly.\n * I.e., focus must remain in the editor while displaying the menu (for type-ahead).\n */\nexport const EditorMenuProvider = ({\n children,\n view,\n groups,\n currentItem,\n open: openProp,\n defaultOpen,\n numItems = 8,\n onOpenChange,\n onActivate,\n onSelect,\n onCancel,\n}: EditorMenuProviderProps) => {\n const { tx } = useThemeContext();\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n\n const viewRef = useDynamicRef(view);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: (open) => {\n invariant(viewRef.current);\n onOpenChange?.({ view: viewRef.current, open });\n },\n });\n\n const [root, setRoot] = useState<HTMLDivElement | null>(null);\n useEffect(() => {\n if (!root) {\n return;\n }\n\n // Listen for trigger.\n return addEventListener(\n root,\n DX_ANCHOR_ACTIVATE as any,\n (event: DxAnchorActivate) => {\n const { trigger, dxn } = event;\n if (!dxn) {\n triggerRef.current = trigger as HTMLButtonElement;\n if (onActivate) {\n onActivate({ view: viewRef.current!, trigger: trigger.getAttribute('data-trigger') ?? undefined });\n } else {\n requestAnimationFrame(() => setOpen(true));\n }\n }\n },\n {\n capture: true,\n passive: false,\n },\n );\n }, [root, onActivate]);\n\n const handleSelect = useCallback<NonNullable<MenuProps['onSelect']>>(\n (item) => {\n invariant(viewRef.current);\n onSelect?.({ view: viewRef.current, item });\n },\n [viewRef, onSelect],\n );\n\n const menuGroups = groups?.filter((group) => group.items.length > 0) ?? [];\n\n return (\n <Popover.Root modal={false} open={open} onOpenChange={setOpen}>\n <Popover.VirtualTrigger virtualRef={triggerRef} />\n\n {/* Menu. */}\n <Popover.Portal>\n <Popover.Content\n align='start'\n classNames={['flex flex-col', !menuGroups.length && 'hidden']}\n style={{\n maxBlockSize: 36 * numItems + 10,\n }}\n // NOTE: We keep the focus in the editor, but Radix routes escape key.\n onEscapeKeyDown={() => {\n const currentView = viewRef.current;\n if (currentView) {\n onCancel?.({ view: currentView });\n }\n }}\n onOpenAutoFocus={(event) => event.preventDefault()}\n >\n <Popover.Viewport asChild classNames='dx-container'>\n <ScrollArea.Root thin>\n <ScrollArea.Viewport>\n <Menu groups={menuGroups} currentItem={currentItem} onSelect={handleSelect} />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </Popover.Viewport>\n <Popover.Arrow />\n </Popover.Content>\n </Popover.Portal>\n\n {/* Content */}\n <div role='none' className='contents' ref={setRoot}>\n {children}\n </div>\n </Popover.Root>\n );\n};\n\n//\n// Menu\n//\n\ntype MenuProps = {\n groups: EditorMenuGroup[];\n} & Pick<MenuGroupProps, 'currentItem' | 'onSelect'>;\n\nconst Menu = ({ groups, currentItem, onSelect }: MenuProps) => {\n const { tx } = useThemeContext();\n return (\n <ul>\n {groups.map((group, index) => (\n <Fragment key={group.id}>\n <MenuGroup group={group} currentItem={currentItem} onSelect={onSelect} />\n {index < groups.length - 1 && <div className={tx('menu.separator', {})} />}\n </Fragment>\n ))}\n </ul>\n );\n};\n\n//\n// Menu Group\n//\n\ntype MenuGroupProps = {\n group: EditorMenuGroup;\n currentItem?: string;\n} & Pick<MenuItemProps, 'onSelect'>;\n\nconst MenuGroup = ({ group, currentItem, onSelect }: MenuGroupProps) => {\n const { tx } = useThemeContext();\n const { t } = useTranslation();\n\n return (\n <>\n {group.label && (\n <div className={tx('menu.groupLabel', {})}>\n <span>{toLocalizedString(group.label, t)}</span>\n </div>\n )}\n\n {group.items.map((item) => (\n <MenuItem key={item.id} item={item} current={currentItem === item.id} onSelect={onSelect} />\n ))}\n </>\n );\n};\n\n//\n// Menu Item\n//\n\ntype MenuItemProps = {\n item: EditorMenuItem;\n current: boolean;\n onSelect?: (item: EditorMenuItem) => void;\n};\n\nconst MenuItem = ({ item, current, onSelect }: MenuItemProps) => {\n const { tx } = useThemeContext();\n const { t } = useTranslation();\n\n const listRef = useRef<HTMLLIElement>(null);\n useEffect(() => {\n if (current && listRef.current) {\n listRef.current.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n }, [current]);\n\n const handleSelect = useCallback(() => onSelect?.(item), [item, onSelect]);\n\n return (\n <li ref={listRef} className={tx('menu.item', {}, [current && 'bg-hover-surface'])} onClick={handleSelect}>\n {item.icon && <Icon icon={item.icon} />}\n <span className='grow truncate'>{toLocalizedString(item.label, t)}</span>\n </li>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport { type EditorState } from '@codemirror/state';\nimport { type RefObject, useCallback, useMemo, useRef, useState } from 'react';\n\nimport { invariant } from '@dxos/invariant';\nimport { modalStateEffect } from '@dxos/ui-editor';\nimport { type MaybePromise } from '@dxos/util';\n\nimport { type EditorMenuProviderProps } from './EditorMenuProvider';\nimport { type EditorMenuGroup, type EditorMenuItem } from './menu';\nimport { filterMenuGroups, getMenuItem, getNextMenuItem, getPreviousMenuItem } from './menu';\nimport { type PopoverOptions, popover, popoverRangeEffect, popoverStateField } from './popover';\n\nexport type GetMenuContext = {\n state: EditorState;\n pos: number;\n text: string;\n trigger?: string;\n};\n\nexport type UseEditorMenuProps = {\n filter?: boolean;\n getMenu?: (context: GetMenuContext) => MaybePromise<EditorMenuGroup[]>;\n} & Pick<PopoverOptions, 'trigger' | 'triggerKey' | 'placeholder'>;\n\nexport type UseEditorMenu = {\n groupsRef: RefObject<EditorMenuGroup[]>;\n extension: Extension;\n} & Pick<EditorMenuProviderProps, 'currentItem' | 'open' | 'onOpenChange' | 'onActivate' | 'onSelect' | 'onCancel'>;\n\n/**\n * ```tsx\n * const { groupsRef, extension, ...menuProps } = useEditorMenu();\n * const { parentRef, viewRef } = useTextEditor({ extensions: [extension] });\n * return (\n * <EditorMenuProvider view={viewRef.current} groups={groupsRef.current} {...menuProps}>\n * <div ref={parentRef} />\n * </EditorMenuProvider>\n * );\n * ```\n */\nexport const useEditorMenu = ({\n trigger,\n triggerKey,\n placeholder,\n filter = true,\n getMenu,\n}: UseEditorMenuProps): UseEditorMenu => {\n const groupsRef = useRef<EditorMenuGroup[]>([]);\n const currentRef = useRef<EditorMenuItem | null>(null);\n const [currentItem, setCurrentItem] = useState<string>();\n const [open, setOpen] = useState(false);\n const [_, refresh] = useState({});\n\n /**\n * Get filtered options.\n */\n const getMenuOptions = useCallback<NonNullable<UseEditorMenuProps['getMenu']>>(\n async ({ text, trigger, ...props }) => {\n const groups = (await getMenu?.({ text, trigger, ...props })) ?? [];\n // The \"@\" menu can use \"@@\" as syntax for block embeds, so it owns its own query filtering.\n return filter && trigger !== '@'\n ? filterMenuGroups(groups, (item) =>\n text ? (item.label as string).toLowerCase().startsWith(text.toLowerCase()) : true,\n )\n : groups;\n },\n [getMenu, filter],\n );\n\n const handleOpenChange = useCallback<NonNullable<UseEditorMenu['onOpenChange']>>(\n async ({ view, open }) => {\n invariant(view);\n setOpen(open);\n if (!open) {\n setCurrentItem(undefined);\n view.dispatch({\n effects: [popoverRangeEffect.of(null)],\n });\n }\n\n // TODO(burdon): Possible race condition.\n // useTextEditor.handleKeyDown will get called after this handler completes.\n requestAnimationFrame(() => {\n view.dispatch({\n effects: [modalStateEffect.of(open)],\n });\n });\n },\n [getMenuOptions],\n );\n\n const handleActivate = useCallback<NonNullable<UseEditorMenu['onActivate']>>(\n async ({ view, trigger }) => {\n const item = getMenuItem(groupsRef.current, currentItem);\n if (item) {\n currentRef.current = item;\n }\n\n if (!open) {\n handleOpenChange({ view, open: true, trigger });\n }\n },\n [open, handleOpenChange],\n );\n\n const handleSelect = useCallback<NonNullable<UseEditorMenu['onSelect']>>(({ view, item }) => {\n // Delete trigger range (e.g., \"/\" and any typed filter text).\n const { range } = view.state.field(popoverStateField) ?? {};\n if (range) {\n view.dispatch({ changes: { from: range.from, to: range.to, insert: '' } });\n }\n void item.onSelect?.({ view, head: view.state.selection.main.head });\n view.focus();\n }, []);\n\n const handleCancel = useCallback<NonNullable<UseEditorMenu['onCancel']>>(({ view }) => {\n // Delete trigger.\n const { range, trigger } = view.state.field(popoverStateField) ?? {};\n if (range && trigger) {\n view.dispatch({\n changes: { ...range, insert: '' },\n });\n }\n }, []);\n\n const serializedTrigger = Array.isArray(trigger) ? trigger.join(',') : trigger;\n const extension = useMemo<Extension>(() => {\n return popover({\n trigger,\n triggerKey,\n placeholder,\n onClose: ({ view }) => handleOpenChange({ view, open: false }),\n onEnter: ({ view }) => {\n if (currentRef.current) {\n handleSelect({ view, item: currentRef.current });\n }\n },\n onArrowUp: () => {\n setCurrentItem((currentItem) => {\n const previous = getPreviousMenuItem(groupsRef.current, currentItem);\n currentRef.current = previous;\n return previous.id;\n });\n },\n onArrowDown: () => {\n setCurrentItem((currentItem) => {\n const next = getNextMenuItem(groupsRef.current, currentItem);\n currentRef.current = next;\n return next.id;\n });\n },\n onTextChange: async ({ view, pos, text, trigger }) => {\n groupsRef.current = (await getMenuOptions({ state: view.state, pos, text, trigger })) ?? [];\n const firstItem = groupsRef.current.filter((group) => group.items.length > 0)[0]?.items[0];\n if (firstItem) {\n setCurrentItem(firstItem.id);\n currentRef.current = firstItem;\n }\n\n refresh({});\n },\n });\n }, [handleOpenChange, getMenuOptions, serializedTrigger, placeholder]);\n\n return {\n groupsRef,\n extension,\n currentItem,\n open,\n onOpenChange: handleOpenChange,\n onActivate: handleActivate,\n onSelect: handleSelect,\n onCancel: handleCancel,\n };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\nimport { Atom } from '@effect-atom/atom-react';\nimport React, { memo, useMemo } from 'react';\n\nimport { type Node } from '@dxos/app-graph';\nimport { ElevationProvider, type ThemedClassName } from '@dxos/react-ui';\nimport { type ActionGraphProps, Menu, type MenuAction, MenuBuilder, useMenuActions } from '@dxos/react-ui-menu';\nimport { type EditorViewMode } from '@dxos/ui-editor';\n\nimport { addLists } from './lists';\nimport { addBlocks } from './blocks';\nimport { addFormatting } from './formatting';\nimport { addHeadings } from './headings';\nimport { addImageUpload } from './image';\nimport { addSearch } from './search';\nimport { type EditorToolbarState } from './useEditorToolbar';\nimport { addViewMode } from './view-mode';\n\nexport type EditorToolbarFeatureFlags = Partial<{\n showHeadings: boolean;\n showFormatting: boolean;\n showLists: boolean;\n showBlocks: boolean;\n showSearch: boolean;\n\n // TODO(wittjosiah): Factor out (depends on plugin-level capabilities.)\n onImageUpload: () => void;\n onViewModeChange: (mode: EditorViewMode) => void;\n}>;\n\nexport type EditorToolbarActionGraphProps = {\n state: Atom.Atom<EditorToolbarState>;\n getView: () => EditorView;\n // TODO(wittjosiah): Control positioning.\n customActions?: Atom.Atom<ActionGraphProps>;\n};\n\nexport type EditorToolbarProps = ThemedClassName<\n {\n role?: string;\n attendableId?: string;\n /** Handler for executing actions. Required when customActions use Operation.invoke. */\n onAction?: (action: MenuAction, params: Node.InvokeProps) => void;\n } & (EditorToolbarActionGraphProps & EditorToolbarFeatureFlags)\n>;\n\nexport const EditorToolbar = memo(({ classNames, role, attendableId, onAction, ...props }: EditorToolbarProps) => {\n const menuActions = useEditorToolbarActionGraph(props);\n\n return (\n <ElevationProvider elevation={role === 'section' ? 'positioned' : 'base'}>\n <Menu.Root {...menuActions} attendableId={attendableId} onAction={onAction}>\n <Menu.Toolbar classNames={classNames} />\n </Menu.Root>\n </ElevationProvider>\n );\n});\n\ntype ToolbarActionsProps = Pick<EditorToolbarActionGraphProps, 'state' | 'getView' | 'customActions'> &\n EditorToolbarFeatureFlags;\n\n// TODO(wittjosiah): Toolbar re-rendering is causing this graph to be recreated and breaking reactivity in some cases.\n// E.g. for toolbar dropdowns which use active icon, the icon is not updated when the active item changes.\n// This is currently only happening in the markdown plugin usage and should be reproduced in an editor story.\n// TODO(burdon): Some actions should toggle the state (e.g., toggle bullets on/off depending on the current state).\nconst useEditorToolbarActionGraph = ({ state, getView, customActions, ...features }: ToolbarActionsProps) => {\n const menuCreator = useMemo(\n () => createToolbarActions({ state, getView, customActions, ...features }),\n [\n state,\n getView,\n customActions,\n features?.showHeadings,\n features?.showFormatting,\n features?.showLists,\n features?.showBlocks,\n features?.showSearch,\n features?.onImageUpload,\n features?.onViewModeChange,\n ],\n );\n\n return useMenuActions(menuCreator);\n};\n\nconst createToolbarActions = ({\n state,\n getView,\n customActions,\n ...features\n}: ToolbarActionsProps): Atom.Atom<ActionGraphProps> => {\n return Atom.make((get) => {\n // Subscribe to state changes.\n const stateSnapshot = get(state);\n return MenuBuilder.make()\n .subgraph(features?.showHeadings !== false && addHeadings(stateSnapshot, getView))\n .subgraph(features?.showFormatting !== false && addFormatting(stateSnapshot, getView))\n .subgraph(features?.showLists !== false && addLists(stateSnapshot, getView))\n .subgraph(features?.showBlocks !== false && addBlocks(stateSnapshot, getView))\n .subgraph(features?.onImageUpload && addImageUpload(features.onImageUpload))\n .separator('gap')\n .subgraph(customActions && get(customActions))\n .subgraph(features?.showSearch !== false && addSearch(getView))\n .subgraph(features?.onViewModeChange && addViewMode(stateSnapshot, features.onViewModeChange))\n .build();\n });\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\n\nimport { type ActionGroupBuilderFn, type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';\nimport { List, addList, removeList } from '@dxos/ui-editor';\n\nimport { translationKey } from '../../translations';\nimport { type EditorToolbarState } from './useEditorToolbar';\n\nconst listStyles = {\n bullet: 'ph--list-bullets--regular',\n ordered: 'ph--list-numbers--regular',\n task: 'ph--list-checks--regular',\n};\n\n/** Add list actions to the builder. */\nexport const addLists =\n (state: EditorToolbarState, getView: () => EditorView): ActionGroupBuilderFn =>\n (builder) => {\n const value = state.listStyle ?? '';\n builder.group(\n 'list',\n {\n label: ['list.label', { ns: translationKey }],\n iconOnly: true,\n variant: 'toggleGroup',\n selectCardinality: 'single',\n value,\n } as ToolbarMenuActionGroupProperties,\n (group) => {\n for (const [listStyle, icon] of Object.entries(listStyles)) {\n const checked = value === listStyle;\n group.action(\n `list-${listStyle}`,\n { label: [`list.${listStyle}.label`, { ns: translationKey }], checked, icon },\n () => {\n const view = getView();\n if (!view) {\n return;\n }\n\n const listType =\n listStyle === 'ordered' ? List.Ordered : listStyle === 'bullet' ? List.Bullet : List.Task;\n if (checked) {\n removeList(listType)(view);\n } else {\n addList(listType)(view);\n }\n },\n );\n }\n },\n );\n };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\n\nimport { type ActionGroupBuilderFn, type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';\nimport { addBlockquote, addCodeblock, insertTable, removeBlockquote, removeCodeblock } from '@dxos/ui-editor';\n\nimport { translationKey } from '../../translations';\n\nimport { type EditorToolbarState } from './useEditorToolbar';\n\nconst blockTypes = {\n blockquote: 'ph--quotes--regular',\n codeblock: 'ph--code-block--regular',\n table: 'ph--table--regular',\n};\n\n/** Add block actions to the builder. */\nexport const addBlocks =\n (state: EditorToolbarState, getView: () => EditorView): ActionGroupBuilderFn =>\n (builder) => {\n const value = state?.blockQuote ? 'blockquote' : (state.blockType ?? '');\n builder.group(\n 'block',\n {\n label: ['block.label', { ns: translationKey }],\n iconOnly: true,\n variant: 'toggleGroup',\n selectCardinality: 'single',\n value,\n } as ToolbarMenuActionGroupProperties,\n (group) => {\n for (const [type, icon] of Object.entries(blockTypes)) {\n const checked = type === value;\n group.action(\n type,\n {\n label: [`block.${type}.label`, { ns: translationKey }],\n checked,\n ...(type === 'table' && { disabled: !!state.blankLine }),\n icon,\n },\n () => {\n const view = getView();\n if (!view) {\n return;\n }\n\n switch (type) {\n case 'blockquote':\n checked ? removeBlockquote(view) : addBlockquote(view);\n break;\n case 'codeblock':\n checked ? removeCodeblock(view) : addCodeblock(view);\n break;\n case 'table':\n insertTable(view);\n break;\n }\n },\n );\n }\n },\n );\n };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\n\nimport { type ActionGroupBuilderFn, type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';\nimport { type Formatting, Inline, addLink, removeLink, setStyle } from '@dxos/ui-editor';\n\nimport { translationKey } from '../../translations';\n\nimport { type EditorToolbarState } from './useEditorToolbar';\n\nconst formats = {\n strong: 'ph--text-b--regular',\n emphasis: 'ph--text-italic--regular',\n strikethrough: 'ph--text-strikethrough--regular',\n code: 'ph--code--regular',\n link: 'ph--link--regular',\n};\n\n/** Add formatting actions to the builder. */\nexport const addFormatting =\n (state: EditorToolbarState, getView: () => EditorView): ActionGroupBuilderFn =>\n (builder) => {\n const formatting: Formatting = state;\n builder.group(\n 'formatting',\n {\n label: ['formatting.label', { ns: translationKey }],\n iconOnly: true,\n variant: 'toggleGroup',\n selectCardinality: 'multiple',\n value: Object.keys(formats).filter((key) => !!formatting[key as keyof Formatting]),\n } as ToolbarMenuActionGroupProperties,\n (group) => {\n for (const [type, icon] of Object.entries(formats)) {\n const checked = !!formatting[type as keyof Formatting];\n group.action(type, { label: [`formatting.${type}.label`, { ns: translationKey }], checked, icon }, () => {\n const view = getView();\n if (!view) {\n return;\n }\n\n if (type === 'link') {\n checked ? removeLink(view) : addLink()(view);\n return;\n }\n\n setStyle(\n type === 'strong'\n ? Inline.Strong\n : type === 'emphasis'\n ? Inline.Emphasis\n : type === 'strikethrough'\n ? Inline.Strikethrough\n : Inline.Code,\n !checked,\n )(view);\n });\n }\n },\n );\n };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\n\nimport { type ActionGroupBuilderFn, type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';\nimport { setHeading } from '@dxos/ui-editor';\n\nimport { translationKey } from '../../translations';\n\nimport { type EditorToolbarState } from './useEditorToolbar';\n\nconst headingIcons: Record<string, string> = {\n 0: 'ph--paragraph--regular',\n 1: 'ph--text-h-one--regular',\n 2: 'ph--text-h-two--regular',\n 3: 'ph--text-h-three--regular',\n 4: 'ph--text-h-four--regular',\n 5: 'ph--text-h-five--regular',\n 6: 'ph--text-h-six--regular',\n};\n\nconst computeHeadingValue = (state: EditorToolbarState) => {\n const blockType = state ? state.blockType : 'paragraph';\n const heading = blockType && /heading(\\d)/.exec(blockType);\n return heading ? heading[1] : blockType === 'paragraph' || !blockType ? '0' : '';\n};\n\n/** Add heading actions to the builder. */\nexport const addHeadings =\n (state: EditorToolbarState, getView: () => EditorView): ActionGroupBuilderFn =>\n (builder) => {\n const headingValue = computeHeadingValue(state);\n builder.group(\n 'heading',\n {\n label: ['heading.label', { ns: translationKey }],\n icon: 'ph--text-h--regular',\n iconOnly: true,\n variant: 'dropdownMenu',\n applyActive: true,\n selectCardinality: 'single',\n // TODO(wittjosiah): Remove? Not sure this does anything.\n value: headingValue,\n } as ToolbarMenuActionGroupProperties,\n (group) => {\n for (const [levelStr, icon] of Object.entries(headingIcons)) {\n const level = parseInt(levelStr);\n group.action(\n `heading--${levelStr}`,\n {\n label: ['heading-level.label', { count: level, ns: translationKey }],\n icon,\n checked: levelStr === headingValue,\n },\n () => setHeading(level)(getView()),\n );\n }\n },\n );\n };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ActionGroupBuilderFn } from '@dxos/react-ui-menu';\n\nimport { translationKey } from '../../translations';\n\n/** Add image upload action to the builder. */\nexport const addImageUpload =\n (onImageUpload: () => void): ActionGroupBuilderFn =>\n (builder) => {\n builder.action(\n 'image',\n {\n label: ['image.label', { ns: translationKey }],\n testId: 'editor.toolbar.image',\n icon: 'ph--image-square--regular',\n },\n onImageUpload,\n );\n };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { openSearchPanel } from '@codemirror/search';\nimport { type EditorView } from '@codemirror/view';\n\nimport { type ActionGroupBuilderFn } from '@dxos/react-ui-menu';\n\nimport { translationKey } from '../../translations';\n\n/** Add search action to the builder. */\nexport const addSearch =\n (getView: () => EditorView): ActionGroupBuilderFn =>\n (builder) => {\n builder.action(\n 'search',\n {\n label: ['search.label', { ns: translationKey }],\n testId: 'editor.toolbar.search',\n icon: 'ph--magnifying-glass--regular',\n },\n () => openSearchPanel(getView()),\n );\n };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ActionGroupBuilderFn, type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';\nimport { type EditorViewMode } from '@dxos/ui-editor';\n\nimport { translationKey } from '../../translations';\n\nimport { type EditorToolbarState } from './useEditorToolbar';\n\nconst viewModes = {\n preview: 'ph--eye--regular',\n source: 'ph--pencil-simple--regular',\n readonly: 'ph--pencil-slash--regular',\n};\n\n/** Add view mode actions to the builder. */\nexport const addViewMode =\n (state: EditorToolbarState, onViewModeChange: (mode: EditorViewMode) => void): ActionGroupBuilderFn =>\n (builder) => {\n const value = state.viewMode ?? 'source';\n builder.group(\n 'viewMode',\n {\n label: ['view-mode.label', { ns: translationKey }],\n icon: 'ph--eye--regular',\n iconOnly: true,\n variant: 'dropdownMenu',\n applyActive: true,\n selectCardinality: 'single',\n value,\n } as ToolbarMenuActionGroupProperties,\n (group) => {\n for (const [viewMode, icon] of Object.entries(viewModes)) {\n const checked = viewMode === value;\n group.action(\n `view-mode--${viewMode}`,\n {\n label: [`view-mode.${viewMode}.label`, { ns: translationKey }],\n checked,\n icon,\n },\n () => onViewModeChange(viewMode as EditorViewMode),\n );\n }\n },\n );\n };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom } from '@effect-atom/atom-react';\nimport { useMemo } from 'react';\n\nimport { type EditorViewMode, type Formatting } from '@dxos/ui-editor';\n\n// TODO(burdon): Move to extensions.\nexport type EditorToolbarState = { viewMode?: EditorViewMode } & Formatting;\n\n/**\n * Creates an atom for editor toolbar state.\n * @deprecated Use Editor.Root\n */\nexport const useEditorToolbar = (initialState: EditorToolbarState = {}): Atom.Writable<EditorToolbarState> => {\n // TODO(wittjosiah): Including initialState in the deps causes reactivity issues.\n return useMemo(() => Atom.make<EditorToolbarState>(initialState), []);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren, type RefObject, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { addEventListener } from '@dxos/async';\nimport { DX_ANCHOR_ACTIVATE, type DxAnchorActivate, Popover } from '@dxos/react-ui';\nimport { type PreviewLinkRef, type PreviewLinkTarget } from '@dxos/ui-editor';\n\ntype EditorPreviewPopoverValue = Partial<{\n link: PreviewLinkRef;\n target: PreviewLinkTarget;\n pending: boolean;\n}>;\n\nconst [EditorPreviewContextProvider, useEditorPreview] = createContext<EditorPreviewPopoverValue>('PreviewPopover', {});\n\nexport type EditorPreviewProviderProps = PropsWithChildren<{\n onLookup?: (link: PreviewLinkRef) => Promise<PreviewLinkTarget | null | undefined>;\n}>;\n\n/**\n * NOTE: In Composer, the DeckPlugin provides the Popover.Root as part of the DeckLayout.\n */\n// TOOD(burdon): Reconcile with PreviewPlugin.\nexport const EditorPreviewProvider = ({ children, onLookup }: EditorPreviewProviderProps) => {\n const triggerRef = useRef<HTMLElement | null>(null);\n const [value, setValue] = useState<EditorPreviewPopoverValue>({});\n const [open, setOpen] = useState(false);\n\n const handleActivate = useCallback(\n (event: DxAnchorActivate) => {\n const { dxn, label, trigger } = event;\n setValue((value) => ({\n ...value,\n link: { label, dxn },\n pending: true,\n }));\n\n triggerRef.current = trigger;\n queueMicrotask(() => setOpen(true));\n void onLookup?.({ label, dxn }).then((target) =>\n setValue((value) => ({\n ...value,\n target: target ?? undefined,\n pending: false,\n })),\n );\n },\n [onLookup],\n );\n\n const [root, setRoot] = useState<HTMLDivElement | null>(null);\n useEffect(() => {\n if (!root || !handleActivate) {\n return;\n }\n\n return addEventListener(root, DX_ANCHOR_ACTIVATE as any, handleActivate, {\n capture: true,\n passive: false,\n });\n }, [root, handleActivate]);\n\n return (\n <EditorPreviewContextProvider pending={value.pending} link={value.link} target={value.target}>\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.VirtualTrigger virtualRef={triggerRef as unknown as RefObject<HTMLButtonElement>} />\n <div role='none' className='contents' ref={setRoot}>\n {children}\n </div>\n </Popover.Root>\n </EditorPreviewContextProvider>\n );\n};\n\nexport { useEditorPreview };\n"],
|
|
5
|
+
"mappings": ";AAMO,IAAMA,iBAAiB;AAEvB,IAAMC,eAAe;EAC1B;IACE,SAAS;MACP,CAACD,cAAAA,GAAiB;QAChB,iBAAiB;QACjB,eAAe;QACf,gBAAgB;QAEhB,eAAe;QACf,0BAA0B;QAC1B,yBAAyB;QACzB,qBAAqB;QAErB,oBAAoB;QACpB,2BAA2B;QAC3B,6BAA6B;QAC7B,kCAAkC;QAClC,yBAAyB;QACzB,yBAAyB;QAEzB,qBAAqB;QACrB,sBAAsB;QACtB,mBAAmB;QAEnB,iBAAiB;QACjB,4BAA4B;QAC5B,2BAA2B;QAC3B,6BAA6B;QAE7B,mBAAmB;QACnB,2BAA2B;QAC3B,0BAA0B;QAC1B,4BAA4B;MAC9B;IACF;EACF;;;;ACtCF,SAASE,qBAAqB;AAC9B,OAAOC,UAAiCC,cAAAA,aAAYC,eAAAA,cAAaC,uBAAAA,sBAAqBC,WAAAA,UAASC,YAAAA,iBAAgB;AAE/G,SAASC,aAAAA,kBAAiB;AAE1B,SAASC,MAAAA,WAAU;AACnB,SAASC,iBAAAA,sBAAqB;;;ACEvB,IAAMC,iBAAmC;EAC9C,IAAIC,OAAO;AACT,WAAO;EACT;EACAC,SAAS,MAAM;EACfC,SAAS,MAAA;EAAO;EAChBC,OAAO,MAAA;EAAO;AAChB;AAEO,IAAMC,yBAAyB,CAACJ,SAAAA;AACrC,SAAO;IACL,IAAIA,OAAO;AACT,aAAOA;IACT;IACAC,SAAS,MAAA;AACP,aAAOD,MAAMK,MAAMC,IAAIC,SAAAA,KAAc;IACvC;IACAL,SAAS,CAACM,MAAcL,UAAAA;AACtBH,YAAMS,SAAS;QACbC,SAAS;UACPC,MAAM;UACNC,IAAIZ,MAAMK,MAAMC,IAAIO,UAAU;UAC9BC,QAAQN;QACV;QACAO,WAAW;UACTC,QAAQR,KAAKK;UACbI,MAAMT,KAAKK;QACb;MACF,CAAA;AAEA,UAAIV,OAAO;AACTH,cAAMG,MAAAA;MACR;IACF;IACAA,OAAO,MAAMH,MAAMG,MAAAA;EACrB;AACF;;;AC7CA,SAASe,mBAAmB;AAC5B,SAASC,cAAAA,mBAAkB;AAC3B,OAAOC,SAASC,YAAYC,aAAAA,YAAWC,2BAA2B;AAGlE,SAASC,mBAAmB;AAC5B,SAASC,UAAU;;;ACNnB,SAASC,mBAAsD;AAC/D,SAASC,kBAAkB;AAC3B,SAKEC,aACAC,WACAC,SACAC,QACAC,gBACK;AAEP,SAASC,WAAW;AACpB,SAEEC,8BACAC,iBACAC,YACAC,uBACK;AACP,SAA6BC,kBAAkBC,gBAAgB;;AAE/D,IAAIC,gBAAgB;AA+Bb,IAAMC,gBAAgB,CAC3BC,QAA2C,CAAC,GAC5CC,OAAuB,CAAA,MAAE;AAEzB,QAAM,EAAEC,IAAIC,KAAKC,cAAcC,YAAYC,WAAWC,UAAUC,WAAWC,cAAcC,MAAK,IAC5FtB,QAA4B,MAAMQ,iBAAiBI,KAAAA,GAAQC,QAAQ,CAAA,CAAE;AAGvE,QAAM,CAACU,UAAAA,IAAcrB,SAAS,MAAM,eAAe,EAAEQ,aAAAA,EAAe;AACpE,QAAM,CAACc,MAAMC,OAAAA,IAAWvB,SAA4B,IAAA;AACpD,QAAMwB,YAAYzB,OAAuB,IAAA;AAEzCF,YAAU,MAAA;AACR,QAAIyB,QAA0B;AAC9B,QAAIE,UAAUC,SAAS;AACrBxB,UAAI,UAAU;QAAEW;QAAIS;QAAYR,KAAKC,cAAcY,UAAU;MAAE,GAAA;;;;;;AAE/D,UAAIC;AACJ,UAAIT,WAAWU,UAAUd,cAAcY,QAAQ;AAC7C,YAAIR,UAAUU,UAAUd,aAAaY,WAAWR,WAAWW,QAAQ,MAAMf,aAAaY,QAAQ;AAC5FC,6BAAmBT;QACrB;MACF,WAAWC,gBAAgBD,cAAcY,QAAW;AAClD,cAAMC,QAAQjB,cAAckB,QAAQ,IAAA;AACpC,cAAMJ,SAAS,CAACG,SAASA,UAAU,KAAK,IAAIA;AAC5CJ,2BAAmB;UAAEC;QAAO;MAC9B;AAGA,YAAMK,QAAQvC,YAAYwC,OAAO;QAC/BrB,KAAKA,OAAOC;;QAEZC,YAAY;UACVH,MAAMR,WAAW+B,GAAGvB,EAAAA;UACpBG;;UAEApB,WAAWyC,cAAcD,GAAG,CAACE,QAAAA;AAC3BpC,gBAAIqC,MAAMD,KAAAA,QAAAA;;;;;;UACZ,CAAA;UACAE,OAAOhC,QAAAA;MACX,CAAA;AAGAe,MAAAA,QAAO,IAAI3B,WAAW;QACpB6C,QAAQhB,UAAUC;QAClBQ;QACAhB,UAAUA,WAAWtB,WAAW8C,eAAexB,UAAU;UAAEyB,SAAS;QAAG,CAAA,IAAKZ;QAC5Ea,sBAAsBvB,QAAQjB,kBAAkB2B;MAClD,CAAA;AAGA,UAAIX,gBAAgB,CAACQ,kBAAkB;AACrC,cAAM,EAAEiB,GAAE,IAAKtB,MAAKW,MAAMpB,IAAIgC,OAAO,CAAA;AACrC,YAAID,IAAI;AACNtB,UAAAA,MAAKwB,SAAS;YAAE5B,WAAW;cAAEU,QAAQgB;YAAG;UAAE,CAAA;QAC5C;MACF;AAEArB,cAAQD,KAAAA;IACV;AAEA,WAAO,MAAA;AACLrB,UAAI,WAAW;QAAEW;MAAG,GAAA;;;;;;AACpBU,MAAAA,OAAMyB,QAAAA;IACR;EACF,GAAGpC,IAAAA;AAEHd,YAAU,MAAA;AACR,QAAIyB,MAAM;AACR,UAAIL,YAAYC,WAAW;AACzB,YAAIA,aAAaA,UAAUU,SAASN,KAAKW,MAAMpB,IAAIa,QAAQ;AACzDzB,cAAI+C,KAAK,qBAAqB;YAAEtB,QAAQJ,KAAKW,MAAMpB,IAAIa;YAAQT;YAAUC;UAAU,GAAA;;;;;;AACnF;QACF;AAEAI,aAAKwB,SAAS5C,6BAA6B;UAAEe;UAAUC;QAAU,CAAA,CAAA;MACnE;IACF;EACF,GAAG;IAACI;IAAML;IAAUC;GAAU;AAE9BrB,YAAU,MAAA;AACR,QAAIyB,QAAQN,WAAW;AACrBM,WAAK2B,MAAK;IACZ;EACF,GAAG;IAACjC;IAAWM;GAAK;AAGpB,QAAM4B,gBAAgBtD,YACpB,CAACuD,UAAAA;AACC,UAAM,EAAEC,KAAKC,QAAQC,cAAa,IAAKH;AACvC,YAAQC,KAAAA;MACN,KAAK,UAAU;AAEb,cAAMG,QAAQjC,MAAMW,MAAMuB,MAAMnD,iBAAiB,KAAA;AACjD,YAAIkD,OAAO;AACT;QACF;AAGA,cAAME,UAAUnC,MAAMoC,WAAWC,QAAQ,gBAAA;AACzCF,iBAASR,MAAAA;AACT;MACF;MAEA,KAAK,SAAS;AACZE,cAAMS,eAAc;AACpB,YAAIP,WAAWC,eAAe;AAC5BhC,gBAAM2B,MAAAA;QACR;AACA;MACF;IACF;EACF,GACA;IAAC3B;GAAK;AAGR,SAAO;IACLE;IACAF;IACAuC,iBAAiB;MACfC,UAAU;MACVC,WAAWb;IACb;EACF;AACF;;;AD1JO,IAAMc,gBAAgBC,2BAC3B,CAAC,EAAEC,YAAYC,IAAIC,YAAYC,cAAcC,YAAY,MAAMC,OAAOC,UAAU,GAAGC,MAAAA,GAASC,iBAAAA;AAC1F,QAAM,EAAEC,WAAWC,iBAAiBC,KAAI,IAAKC,cAC3C,OAAO;IACLX;IACAY,cAAcR;IACdF;IACAD,YAAY;MACVA,cAAc,CAAA;MACdY,YAAWC,eAAeC,GAAG,CAAC,EAAEL,MAAAA,OAAMM,YAAYC,aAAY,MAAE;AAC9D,cAAMC,gBAAgBD,aAAaE,KAAK,CAACC,OAAOA,GAAGC,WAAWC,YAAYC,SAAS,MAAMC,YAAYpB,KAAK;AAC1G,YAAI,CAACc,iBAAiBF,YAAY;AAChCX,qBAAWK,MAAKe,MAAMC,IAAIC,SAAQ,CAAA;QACpC;MACF,CAAA;;IAEF,GAAGrB;EACL,IACA;IAACN;IAAIC;IAAYC;IAAcG;GAAS;AAI1CuB,sBAAoBrB,cAAc,MAAA;AAChC,WAAOsB,uBAAuBnB,IAAAA;EAChC,GAAG;IAACV;IAAIU;GAAK;AAGboB,EAAAA,WAAU,MAAA;AACRC,0BAAsB,MAAA;AACpBrB,YAAMsB,SAAS;QACbC,aAAaT;QACbU,SAAS9B,QAAQ;UAAC;YAAE+B,MAAM;YAAGC,IAAI1B,MAAMe,MAAMC,IAAIW,UAAU;YAAGC,QAAQlC,SAAS;UAAG;YAAK,CAAA;QACvFmC,WAAWrC,eAAe;UAAEsC,QAAQ9B,MAAMe,MAAMC,IAAIW,UAAU;QAAE,IAAII;MACtE,CAAA;AAEA,UAAIvC,cAAc;AAChBQ,cAAMgC,MAAAA;MACR;IACF,CAAA;EACF,GAAG;IAAChC;IAAMN;IAAOF;GAAa;AAE9B,SACE,sBAAA,cAACyC,OAAAA;IACCC,MAAK;IACLC,WAAWC,GACT,iGACA/C,UAAAA;IAEFgD,KAAKvC;IACJ,GAAIL,YAAYM,kBAAkB,CAAC;;AAG1C,CAAA;;;AE1EF,SAASuC,sBAAsB;AAgBxB,IAAMC,cAAc,CAACC,QAA2BC,OAAAA;AACrD,SAAOD,OAAOE,QAAQ,CAACC,UAAUA,MAAMC,KAAK,EAAEC,KAAK,CAACC,SAASA,KAAKL,OAAOA,EAAAA;AAC3E;AAEO,IAAMM,kBAAkB,CAACP,QAA2BC,OAAAA;AACzD,QAAMG,QAAQJ,OAAOE,QAAQ,CAACC,UAAUA,MAAMC,KAAK;AACnD,QAAMI,QAAQJ,MAAMK,UAAU,CAACH,SAASA,KAAKL,OAAOA,EAAAA;AACpD,SAAOO,QAAQJ,MAAMM,SAAS,IAAIN,MAAMI,QAAQ,CAAA,IAAKJ,MAAMI,KAAAA;AAC7D;AAEO,IAAMG,sBAAsB,CAACX,QAA2BC,OAAAA;AAC7D,QAAMG,QAAQJ,OAAOE,QAAQ,CAACC,UAAUA,MAAMC,KAAK;AACnD,QAAMI,QAAQJ,MAAMK,UAAU,CAACH,SAASA,KAAKL,OAAOA,EAAAA;AACpD,SAAOO,QAAQ,IAAIJ,MAAMI,QAAQ,CAAA,IAAKJ,MAAMI,KAAAA;AAC9C;AAEO,IAAMI,kBAAkB,CAAC,EAC9BX,KAAK,QACLY,OACAC,QACAV,MAAK,OAMiB;EACtBH;EACAY;EACAT,OAAOA,MACJU,OAAO,CAACR,SAAS,CAACQ,UAAUR,KAAKS,YAAW,EAAGC,SAASF,OAAOC,YAAW,CAAA,CAAA,EAC1EE,IAAI,CAACX,MAAMY,OAAO;IACjBjB,IAAI,GAAGA,EAAAA,IAAMiB,CAAAA;IACbL,OAAOP;IACPa,UAAU,CAAC,EAAEC,MAAMC,KAAI,MAAOC,eAAeF,MAAMC,MAAMf,IAAAA;EAC3D,EAAA;AACJ;AAEO,IAAMiB,mBAAmB,CAC9BvB,QACAc,WAAAA;AAEA,SAAOd,OAAOiB,IAAI,CAACd,WAAW;IAC5B,GAAGA;IACHC,OAAOD,MAAMC,MAAMU,OAAOA,MAAAA;EAC5B,EAAA;AACF;;;ACjEA,SAASU,yBAAyB;;;ACAlC,SAAyBC,MAAMC,iBAAiBC,aAAaC,kBAAkB;AAC/E,SACEC,YAEAC,cAAAA,aAEAC,YAEAC,cACK;AAEP,SAA8CC,mBAAAA,kBAAiBC,mBAAmB;AAClF,SAASC,eAAeC,YAAAA,iBAAgB;AAExC,IAAMC,aAAa;EAAC;EAAK;;AAyBlB,IAAMC,UAAU,CAACC,UAA0B,CAAC,MAAC;AAClD,SAAO;IACLC,KAAKC,QAAQC,cAAcH,OAAAA,CAAAA;IAC3BI;IACAC,uBAAuBL,OAAAA;IACvBM,wBAAwBN,OAAAA;IACxBO;IACAP,QAAQQ,WACNC,YAAY;;MAEVC,SAAS,UAAUC,MAAMC,QAAQZ,QAAQQ,OAAO,IAAIR,QAAQQ,QAAQ,CAAA,IAAKR,QAAQQ,OAAO;MACxF,GAAGR,QAAQS;IACb,CAAA;IACFI,OAAOC,SAAAA;AACX;AAKA,IAAMT,yBAAyB,CAACL,YAC9Be,YAAWC,eAAeC,GAAG,CAAC,EAAEC,MAAMC,WAAU,MAAE;AAChD,QAAM,EAAEC,OAAOC,aAAab,QAAO,IAAKU,KAAKI,MAAMC,MAAMnB,iBAAAA,KAAsB,CAAC;AAChF,MAAI,CAACiB,aAAa;AAChB;EACF;AAEA,QAAMG,OAAON,KAAKI,MAAMG,IAAIC,YAAYL,YAAYM,MAAMN,YAAYO,EAAE;AACxE,QAAMC,YAAYX,KAAKI,MAAMO,UAAUC;AACvC,QAAMC;;KAEHvB,UAAUA,YAAYgB,KAAK,CAAA,IAAK;IAEjC,KAAKQ,KAAKxB,UAAUgB,KAAKS,MAAM,CAAA,IAAKT,IAAAA;IAEpCK,UAAUK,OAAOb,YAAYM;IAE7BE,UAAUK,OAAOb,YAAYO,KAAK;;AAEpC,QAAMO,YAAYJ,cAAc,OAAOZ,aAAa;IAAEQ,MAAMN,YAAYM;IAAMC,IAAIC,UAAUK;EAAK,IAAIb;AACrG,MAAIc,cAAcd,aAAa;AAC7BH,SAAKkB,SAAS;MACZC,SAASC,mBAAmBrB,GAAGkB,YAAY;QAAEf,OAAOe;QAAW3B;MAAQ,IAAI,IAAA;IAC7E,CAAA;EACF;AAEA,MAAIuB,aAAa;AACf/B,YAAQuC,UAAU;MAAErB;IAAK,CAAA;EAC3B;AACF,CAAA;AAKF,IAAMf,gBAAgB,CAACH,YAAAA;AACrB,QAAMwC,WAAW7B,MAAMC,QAAQZ,QAAQQ,OAAO,IAAIR,QAAQQ,UAAU;IAACR,QAAQQ;;AAC7E,SAAOiC,OAAOxB,GACZ;;OAEKuB,SAAS3B,OAAO6B,aAAAA,EAAeC,IAAI,CAACnC,aAAa;MAClDoC,KAAKpC;MACLqC,KAAK,CAAC3B,SAAAA;AAIJ,cAAMW,YAAYX,KAAKI,MAAMO,UAAUC;AACvC,cAAMgB,OAAO5B,KAAKI,MAAMG,IAAIsB,OAAOlB,UAAUK,IAAI;AACjD,YACEY,KAAKtB,KAAKwB,KAAI,MAAO,MACrBnB,UAAUK,SAASY,KAAKnB,QACvBE,UAAUK,OAAOY,KAAKnB,QAAQmB,KAAKtB,KAAKK,UAAUK,OAAOY,KAAKnB,OAAO,CAAA,MAAO,KAC7E;AAEAT,eAAKkB,SAAS;YACZa,SAAS;cAAEtB,MAAME,UAAUK;cAAMgB,QAAQ1C;YAAQ;YACjDqB,WAAW;cAAEsB,QAAQtB,UAAUK,OAAO;cAAGA,MAAML,UAAUK,OAAO;YAAE;YAClEG,SAASC,mBAAmBrB,GAAG;cAAET;cAASY,OAAO;gBAAEO,MAAME,UAAUK;gBAAMN,IAAIC,UAAUK,OAAO;cAAE;YAAE,CAAA;UACpG,CAAA;AAEA,iBAAO;QACT;AAEA,eAAO;MACT;IACF,EAAA;;;;IAKAlC,QAAQoD,cACL;MACCR,KAAK5C,QAAQoD;MACbP,KAAK,CAAC3B,SAAAA;AACJ,cAAMW,YAAYX,KAAKI,MAAMO,UAAUC;AACvC,cAAMgB,OAAO5B,KAAKI,MAAMG,IAAIsB,OAAOlB,UAAUK,IAAI;AAGjD,YAAImB,MAAMP,KAAKtB,KAAKS,MAAM,GAAGJ,UAAUK,OAAOY,KAAKnB,IAAI;AACvD,cAAM2B,MAAMC,eAAeF,KAAKrD,QAAQwD,cAAc1D,UAAAA;AACtD,YAAIwD,QAAQ,IAAI;AACdD,gBAAMA,IAAIpB,MAAMqB,MAAM,CAAA;QACxB;AAGA,cAAM3B,OAAOmB,KAAKnB,OAAO2B;AACzBpC,aAAKkB,SAAS;UACZC,SAASC,mBAAmBrB,GAAG;YAAEG,OAAO;cAAEO,MAAMA,OAAO;cAAGC,IAAIC,UAAUK;YAAK;UAAE,CAAA;UAC/Ee,SACEpB,UAAUK,SAAShB,KAAKI,MAAMG,IAAIgC,SAC9B;YAAE9B,MAAMA,OAAO;YAAGC,IAAIC,UAAUK;YAAMgB,QAAQ;UAAI,IAClDQ;QACR,CAAA;AACA,eAAO;MACT;IACF;;;;IAKF;MACEd,KAAK;MACLC,KAAK,CAAC3B,SAAAA;AACJ,cAAME,QAAQF,KAAKI,MAAMC,MAAMnB,iBAAAA,GAAoBgB;AACnD,YAAIA,OAAO;AACTpB,kBAAQ2D,YAAY;YAAEzC;UAAK,CAAA;AAC3B,iBAAO;QACT;AAEA,eAAO;MACT;IACF;IACA;MACE0B,KAAK;MACLC,KAAK,CAAC3B,SAAAA;AACJ,cAAME,QAAQF,KAAKI,MAAMC,MAAMnB,iBAAAA,GAAoBgB;AACnD,YAAIA,OAAO;AACTpB,kBAAQ4D,cAAc;YAAE1C;UAAK,CAAA;AAC7B,iBAAO;QACT;AAEA,eAAO;MACT;IACF;IACA;MACE0B,KAAK;MACLC,KAAK,CAAC3B,SAAAA;AACJ,cAAME,QAAQF,KAAKI,MAAMC,MAAMnB,iBAAAA,GAAoBgB;AACnD,YAAIA,OAAO;AACTF,eAAKkB,SAAS;YAAEa,SAAS;cAAEtB,MAAMP,MAAMO;cAAMC,IAAIR,MAAMQ;cAAIsB,QAAQ;YAAG;UAAE,CAAA;AACxElD,kBAAQ6D,UAAU;YAAE3C;UAAK,CAAA;AACzB,iBAAO;QACT;AAEA,eAAO;MACT;IACF;IACAL,OAAOC,SAAAA,CAAAA;AAEb;AAKA,IAAMR,0BAA0B,CAACN,YAAAA;AAC/B,SAAO8D,WAAWC,UAChB,MAAA;;IACEC,eAA8BC,WAAWC;IAEzC,YAAqBhD,MAAkB;WAAlBA,OAAAA;IAAmB;;IAGxCiD,OAAO,EAAEjD,MAAMkD,aAAY,GAAgB;AACzC,YAAMC,UAAU,IAAIC,gBAAAA;AACpB,YAAM,EAAElD,OAAOZ,QAAO,IAAKU,KAAKI,MAAMC,MAAMnB,iBAAAA,KAAsB,CAAC;AACnE,UAAIgB,OAAO;AAET,cAAMS,YAAYX,KAAKI,MAAMO,UAAUC;AACvC,cAAMyC,aAAa1C,UAAUK,QAAQd,MAAMO,QAAQE,UAAUK,QAAQd,MAAMQ;AAC3E,YAAI2C,YAAY;AACdF,kBAAQG,IACNpD,MAAMO,MACNP,MAAMQ,KAAK,GACXqC,WAAWQ,KAAK;YACdC,SAAS;YACTC,OAAO;YACPC,YAAY;cACV,sBAAsB;cACtB,qBAAqB;cACrB,gBAAgBpE,WAAWR,QAAQoD,cAAc;YACnD;UACF,CAAA,CAAA;QAEJ;AAEA,cAAMyB,eAAeT,aAAaU,KAAK,CAACC,OAAOA,GAAG1C,QAAQyC,KAAK,CAACE,WAAWA,OAAOC,GAAG3C,kBAAAA,CAAAA,CAAAA;AACrF,YAAIuC,cAAc;AAEhB,gBAAMnE,UAAUQ,KAAKI,MAAM4D,SAAS9D,MAAMO,QAAQnB,UAAUA,QAAQiD,SAAS,IAAIrC,MAAMQ,EAAE;AACzF5B,kBAAQmF,eAAe;YAAEjE;YAAMkE,KAAKvD,UAAUK;YAAMV,MAAMd;YAASF;UAAQ,CAAA;QAC7E;MACF;AAEA,WAAKwD,eAAeK,QAAQgB,OAAM;IACpC;EACF,GACA;IACEC,aAAa,CAACC,MAAMA,EAAEvB;EACxB,CAAA;AAEJ;AAeO,IAAM1B,qBAAqBkD,YAAYC,OAAM;AAG7C,IAAMrF,oBAAoBsF,WAAWD,OAA4B;EACtEE,QAAQ,MAAM;EACdxB,QAAQ,CAACyB,OAAOb,OAAAA;AACd,QAAIc,WAAWD;AACf,eAAWZ,UAAUD,GAAG1C,SAAS;AAC/B,UAAI2C,OAAOC,GAAG3C,kBAAAA,GAAqB;AACjCuD,mBAAWb,OAAOY;MACpB;IACF;AAEA,WAAOC;EACT;AACF,CAAA;AAEA,IAAMtC,iBAAiB,CAACF,KAAaG,eACnCsC,KAAKC,IAAG,GAAIvC,WAAWb,IAAI,CAACqD,UAAU3C,IAAI4C,YAAYD,KAAAA,CAAAA,CAAAA;;;ADnRjD,IAAME,qBAAsC;EACjDC,IAAI;EACJC,OAAO;EACPC,OAAO;IACL;MACEF,IAAI;MACJC,OAAO;MACPE,MAAM;MACNC,UAAU,CAAC,EAAEC,MAAMC,KAAI,MAAOC,kBAAkBF,MAAMC,MAAM,IAAA;IAC9D;IACA;MACEN,IAAI;MACJC,OAAO;MACPE,MAAM;MACNC,UAAU,CAAC,EAAEC,MAAMC,KAAI,MAAOC,kBAAkBF,MAAMC,MAAM,KAAA;IAC9D;IACA;MACEN,IAAI;MACJC,OAAO;MACPE,MAAM;MACNC,UAAU,CAAC,EAAEC,MAAMC,KAAI,MAAOC,kBAAkBF,MAAMC,MAAM,MAAA;IAC9D;IACA;MACEN,IAAI;MACJC,OAAO;MACPE,MAAM;MACNC,UAAU,CAAC,EAAEC,MAAMC,KAAI,MAAOC,kBAAkBF,MAAMC,MAAM,OAAA;IAC9D;IACA;MACEN,IAAI;MACJC,OAAO;MACPE,MAAM;MACNC,UAAU,CAAC,EAAEC,MAAMC,KAAI,MAAOC,kBAAkBF,MAAMC,MAAM,QAAA;IAC9D;IACA;MACEN,IAAI;MACJC,OAAO;MACPE,MAAM;MACNC,UAAU,CAAC,EAAEC,MAAMC,KAAI,MAAOC,kBAAkBF,MAAMC,MAAM,SAAA;IAC9D;IACA;MACEN,IAAI;MACJC,OAAO;MACPE,MAAM;MACNC,UAAU,CAAC,EAAEC,MAAMC,KAAI,MAAOC,kBAAkBF,MAAMC,MAAM,IAAA;IAC9D;IACA;MACEN,IAAI;MACJC,OAAO;MACPE,MAAM;MACNC,UAAU,CAAC,EAAEC,MAAMC,KAAI,MAAOC,kBAAkBF,MAAMC,MAAM,KAAA;IAC9D;IACA;MACEN,IAAI;MACJC,OAAO;MACPE,MAAM;MACNC,UAAU,CAAC,EAAEC,MAAMC,KAAI,MAAOC,kBAAkBF,MAAMC,MAAM,QAAA;IAC9D;IACA;MACEN,IAAI;MACJC,OAAO;MACPE,MAAM;MACNC,UAAU,CAAC,EAAEC,MAAMC,KAAI,MAAOC,kBAAkBF,MAAMC,MAAM,IAAA;IAC9D;IACA;MACEN,IAAI;MACJC,OAAO;MACPE,MAAM;MACNC,UAAU,CAAC,EAAEC,MAAMC,KAAI,MAAOC,kBAAkBF,MAAMC,MAAM,YAAA;IAC9D;IACA;MACEN,IAAI;MACJC,OAAO;MACPE,MAAM;MACNC,UAAU,CAAC,EAAEC,MAAMC,KAAI,MAAOC,kBAAkBF,MAAMC,MAAM,iCAAA;IAC9D;;AAEJ;AAEO,IAAME,oBAAqC;EAChDR,IAAI;EACJC,OAAO;EACPC,OAAO;IACL;MACEF,IAAI;MACJC,OAAO;MACPE,MAAM;MACNC,UAAU,CAAC,EAAEC,MAAMC,KAAI,MAAE;AACvBD,aAAKI,SAAS;UACZC,SAAS;YAAEC,MAAML;YAAMM,QAAQ;UAAI;UACnCC,WAAW;YAAEC,QAAQR,OAAO;YAAGA,MAAMA,OAAO;UAAE;UAC9CS,SAASC,mBAAmBC,GAAG;YAC7BC,SAAS;YACTC,OAAO;cAAER,MAAML;cAAMc,IAAId,OAAO;YAAE;UACpC,CAAA;QACF,CAAA;MACF;IACF;IACA;MACEN,IAAI;MACJC,OAAO;MACPE,MAAM;MACNC,UAAU,CAAC,EAAEC,MAAMC,KAAI,MAAE;AAEvBD,aAAKI,SAAS;UACZC,SAAS;YAAEC,MAAML;YAAMM,QAAQ;UAAK;UACpCC,WAAW;YAAEC,QAAQR,OAAO;YAAGA,MAAMA,OAAO;UAAE;UAC9CS,SAASC,mBAAmBC,GAAG;YAC7BC,SAAS;YACTC,OAAO;cAAER,MAAML;cAAMc,IAAId,OAAO;YAAE;UACpC,CAAA;QACF,CAAA;MACF;IACF;;AAEJ;;;AEvHA,SAASe,4BAA4B;AACrC,OAAOC,UAASC,UAAkCC,eAAAA,cAAaC,aAAAA,YAAWC,UAAAA,SAAQC,YAAAA,iBAAgB;AAElG,SAASC,wBAAwB;AACjC,SAASC,iBAAiB;AAC1B,SACEC,oBAEAC,MACAC,SACAC,YACAC,mBACAC,eACAC,iBACAC,sBACK;;AAsBA,IAAMC,qBAAqB,CAAC,EACjCC,UACAC,MACAC,QACAC,aACAC,MAAMC,UACNC,aACAC,WAAW,GACXC,cACAC,YACAC,UACAC,SAAQ,MACgB;AACxB,QAAM,EAAEC,GAAE,IAAKf,gBAAAA;AACf,QAAMgB,aAAa1B,QAAiC,IAAA;AAEpD,QAAM2B,UAAUlB,cAAcK,IAAAA;AAC9B,QAAM,CAACG,MAAMW,OAAAA,IAAWjC,qBAAqB;IAC3CkC,MAAMX;IACNY,aAAaX;IACbY,UAAU,CAACd,UAAAA;AACTd,gBAAUwB,QAAQK,SAAO,QAAA;;;;;;;;;AACzBX,qBAAe;QAAEP,MAAMa,QAAQK;QAASf,MAAAA;MAAK,CAAA;IAC/C;EACF,CAAA;AAEA,QAAM,CAACgB,MAAMC,OAAAA,IAAWjC,UAAgC,IAAA;AACxDF,EAAAA,WAAU,MAAA;AACR,QAAI,CAACkC,MAAM;AACT;IACF;AAGA,WAAO/B,iBACL+B,MACA7B,oBACA,CAAC+B,UAAAA;AACC,YAAM,EAAEC,SAASC,IAAG,IAAKF;AACzB,UAAI,CAACE,KAAK;AACRX,mBAAWM,UAAUI;AACrB,YAAId,YAAY;AACdA,qBAAW;YAAER,MAAMa,QAAQK;YAAUI,SAASA,QAAQE,aAAa,cAAA,KAAmBC;UAAU,CAAA;QAClG,OAAO;AACLC,gCAAsB,MAAMZ,QAAQ,IAAA,CAAA;QACtC;MACF;IACF,GACA;MACEa,SAAS;MACTC,SAAS;IACX,CAAA;EAEJ,GAAG;IAACT;IAAMX;GAAW;AAErB,QAAMqB,eAAe7C,aACnB,CAAC8C,SAAAA;AACCzC,cAAUwB,QAAQK,SAAO,QAAA;;;;;;;;;AACzBT,eAAW;MAAET,MAAMa,QAAQK;MAASY;IAAK,CAAA;EAC3C,GACA;IAACjB;IAASJ;GAAS;AAGrB,QAAMsB,aAAa9B,QAAQ+B,OAAO,CAACC,UAAUA,MAAMC,MAAMC,SAAS,CAAA,KAAM,CAAA;AAExE,SACE,gBAAArD,OAAA,cAACU,QAAQ4C,MAAI;IAACC,OAAO;IAAOlC;IAAYI,cAAcO;KACpD,gBAAAhC,OAAA,cAACU,QAAQ8C,gBAAc;IAACC,YAAY3B;MAGpC,gBAAA9B,OAAA,cAACU,QAAQgD,QAAM,MACb,gBAAA1D,OAAA,cAACU,QAAQiD,SAAO;IACdC,OAAM;IACNC,YAAY;MAAC;MAAiB,CAACZ,WAAWI,UAAU;;IACpDS,OAAO;MACLC,cAAc,KAAKvC,WAAW;IAChC;;IAEAwC,iBAAiB,MAAA;AACf,YAAMC,cAAclC,QAAQK;AAC5B,UAAI6B,aAAa;AACfrC,mBAAW;UAAEV,MAAM+C;QAAY,CAAA;MACjC;IACF;IACAC,iBAAiB,CAAC3B,UAAUA,MAAM4B,eAAc;KAEhD,gBAAAnE,OAAA,cAACU,QAAQ0D,UAAQ;IAACC,SAAAA;IAAQR,YAAW;KACnC,gBAAA7D,OAAA,cAACW,WAAW2C,MAAI;IAACgB,MAAAA;KACf,gBAAAtE,OAAA,cAACW,WAAWyD,UAAQ,MAClB,gBAAApE,OAAA,cAACuE,MAAAA;IAAKpD,QAAQ8B;IAAY7B;IAA0BO,UAAUoB;SAIpE,gBAAA/C,OAAA,cAACU,QAAQ8D,OAAK,IAAA,CAAA,CAAA,GAKlB,gBAAAxE,OAAA,cAACyE,OAAAA;IAAIC,MAAK;IAAOC,WAAU;IAAWC,KAAKtC;KACxCrB,QAAAA,CAAAA;AAIT;AAUA,IAAMsD,OAAO,CAAC,EAAEpD,QAAQC,aAAaO,SAAQ,MAAa;AACxD,QAAM,EAAEE,GAAE,IAAKf,gBAAAA;AACf,SACE,gBAAAd,OAAA,cAAC6E,MAAAA,MACE1D,OAAO2D,IAAI,CAAC3B,OAAO4B,UAClB,gBAAA/E,OAAA,cAACC,UAAAA;IAAS+E,KAAK7B,MAAM8B;KACnB,gBAAAjF,OAAA,cAACkF,WAAAA;IAAU/B;IAAc/B;IAA0BO;MAClDoD,QAAQ5D,OAAOkC,SAAS,KAAK,gBAAArD,OAAA,cAACyE,OAAAA;IAAIE,WAAW9C,GAAG,kBAAkB,CAAC,CAAA;;AAK9E;AAWA,IAAMqD,YAAY,CAAC,EAAE/B,OAAO/B,aAAaO,SAAQ,MAAkB;AACjE,QAAM,EAAEE,GAAE,IAAKf,gBAAAA;AACf,QAAM,EAAEqE,EAAC,IAAKpE,eAAAA;AAEd,SACE,gBAAAf,OAAA,cAAAA,OAAA,UAAA,MACGmD,MAAMiC,SACL,gBAAApF,OAAA,cAACyE,OAAAA;IAAIE,WAAW9C,GAAG,mBAAmB,CAAC,CAAA;KACrC,gBAAA7B,OAAA,cAACqF,QAAAA,MAAMzE,kBAAkBuC,MAAMiC,OAAOD,CAAAA,CAAAA,CAAAA,GAIzChC,MAAMC,MAAM0B,IAAI,CAAC9B,SAChB,gBAAAhD,OAAA,cAACsF,UAAAA;IAASN,KAAKhC,KAAKiC;IAAIjC;IAAYZ,SAAShB,gBAAgB4B,KAAKiC;IAAItD;;AAI9E;AAYA,IAAM2D,WAAW,CAAC,EAAEtC,MAAMZ,SAAST,SAAQ,MAAiB;AAC1D,QAAM,EAAEE,GAAE,IAAKf,gBAAAA;AACf,QAAM,EAAEqE,EAAC,IAAKpE,eAAAA;AAEd,QAAMwE,UAAUnF,QAAsB,IAAA;AACtCD,EAAAA,WAAU,MAAA;AACR,QAAIiC,WAAWmD,QAAQnD,SAAS;AAC9BmD,cAAQnD,QAAQoD,eAAe;QAAEC,UAAU;QAAUC,OAAO;MAAU,CAAA;IACxE;EACF,GAAG;IAACtD;GAAQ;AAEZ,QAAMW,eAAe7C,aAAY,MAAMyB,WAAWqB,IAAAA,GAAO;IAACA;IAAMrB;GAAS;AAEzE,SACE,gBAAA3B,OAAA,cAAC2F,MAAAA;IAAGf,KAAKW;IAASZ,WAAW9C,GAAG,aAAa,CAAC,GAAG;MAACO,WAAW;KAAmB;IAAGwD,SAAS7C;KACzFC,KAAK6C,QAAQ,gBAAA7F,OAAA,cAACS,MAAAA;IAAKoF,MAAM7C,KAAK6C;MAC/B,gBAAA7F,OAAA,cAACqF,QAAAA;IAAKV,WAAU;KAAiB/D,kBAAkBoC,KAAKoC,OAAOD,CAAAA,CAAAA,CAAAA;AAGrE;;;AC3NA,SAAyBW,eAAAA,cAAaC,WAAAA,UAASC,UAAAA,SAAQC,YAAAA,iBAAgB;AAEvE,SAASC,aAAAA,kBAAiB;AAC1B,SAASC,wBAAwB;;AAoC1B,IAAMC,gBAAgB,CAAC,EAC5BC,SACAC,YACAC,aAAAA,cACAC,SAAS,MACTC,QAAO,MACY;AACnB,QAAMC,YAAYC,QAA0B,CAAA,CAAE;AAC9C,QAAMC,aAAaD,QAA8B,IAAA;AACjD,QAAM,CAACE,aAAaC,cAAAA,IAAkBC,UAAAA;AACtC,QAAM,CAACC,MAAMC,OAAAA,IAAWF,UAAS,KAAA;AACjC,QAAM,CAACG,GAAGC,OAAAA,IAAWJ,UAAS,CAAC,CAAA;AAK/B,QAAMK,iBAAiBC,aACrB,OAAO,EAAEC,MAAMjB,SAAAA,UAAS,GAAGkB,MAAAA,MAAO;AAChC,UAAMC,SAAU,MAAMf,UAAU;MAAEa;MAAMjB,SAAAA;MAAS,GAAGkB;IAAM,CAAA,KAAO,CAAA;AAEjE,WAAOf,UAAUH,aAAY,MACzBoB,iBAAiBD,QAAQ,CAACE,SACxBJ,OAAQI,KAAKC,MAAiBC,YAAW,EAAGC,WAAWP,KAAKM,YAAW,CAAA,IAAM,IAAA,IAE/EJ;EACN,GACA;IAACf;IAASD;GAAO;AAGnB,QAAMsB,mBAAmBT,aACvB,OAAO,EAAEU,MAAMf,MAAAA,MAAI,MAAE;AACnBgB,IAAAA,WAAUD,MAAAA,QAAAA;;;;;;;;;AACVd,YAAQD,KAAAA;AACR,QAAI,CAACA,OAAM;AACTF,qBAAemB,MAAAA;AACfF,WAAKG,SAAS;QACZC,SAAS;UAACC,mBAAmBC,GAAG,IAAA;;MAClC,CAAA;IACF;AAIAC,0BAAsB,MAAA;AACpBP,WAAKG,SAAS;QACZC,SAAS;UAACI,iBAAiBF,GAAGrB,KAAAA;;MAChC,CAAA;IACF,CAAA;EACF,GACA;IAACI;GAAe;AAGlB,QAAMoB,iBAAiBnB,aACrB,OAAO,EAAEU,MAAM1B,SAAAA,SAAO,MAAE;AACtB,UAAMqB,OAAOe,YAAY/B,UAAUgC,SAAS7B,WAAAA;AAC5C,QAAIa,MAAM;AACRd,iBAAW8B,UAAUhB;IACvB;AAEA,QAAI,CAACV,MAAM;AACTc,uBAAiB;QAAEC;QAAMf,MAAM;QAAMX,SAAAA;MAAQ,CAAA;IAC/C;EACF,GACA;IAACW;IAAMc;GAAiB;AAG1B,QAAMa,eAAetB,aAAoD,CAAC,EAAEU,MAAML,KAAI,MAAE;AAEtF,UAAM,EAAEkB,MAAK,IAAKb,KAAKc,MAAMC,MAAMC,iBAAAA,KAAsB,CAAC;AAC1D,QAAIH,OAAO;AACTb,WAAKG,SAAS;QAAEc,SAAS;UAAEC,MAAML,MAAMK;UAAMC,IAAIN,MAAMM;UAAIC,QAAQ;QAAG;MAAE,CAAA;IAC1E;AACA,SAAKzB,KAAK0B,WAAW;MAAErB;MAAMsB,MAAMtB,KAAKc,MAAMS,UAAUC,KAAKF;IAAK,CAAA;AAClEtB,SAAKyB,MAAK;EACZ,GAAG,CAAA,CAAE;AAEL,QAAMC,eAAepC,aAAoD,CAAC,EAAEU,KAAI,MAAE;AAEhF,UAAM,EAAEa,OAAOvC,SAAAA,SAAO,IAAK0B,KAAKc,MAAMC,MAAMC,iBAAAA,KAAsB,CAAC;AACnE,QAAIH,SAASvC,UAAS;AACpB0B,WAAKG,SAAS;QACZc,SAAS;UAAE,GAAGJ;UAAOO,QAAQ;QAAG;MAClC,CAAA;IACF;EACF,GAAG,CAAA,CAAE;AAEL,QAAMO,oBAAoBC,MAAMC,QAAQvD,OAAAA,IAAWA,QAAQwD,KAAK,GAAA,IAAOxD;AACvE,QAAMyD,YAAYC,SAAmB,MAAA;AACnC,WAAOC,QAAQ;MACb3D;MACAC;MACAC,aAAAA;MACA0D,SAAS,CAAC,EAAElC,KAAI,MAAOD,iBAAiB;QAAEC;QAAMf,MAAM;MAAM,CAAA;MAC5DkD,SAAS,CAAC,EAAEnC,KAAI,MAAE;AAChB,YAAInB,WAAW8B,SAAS;AACtBC,uBAAa;YAAEZ;YAAML,MAAMd,WAAW8B;UAAQ,CAAA;QAChD;MACF;MACAyB,WAAW,MAAA;AACTrD,uBAAe,CAACD,iBAAAA;AACd,gBAAMuD,WAAWC,oBAAoB3D,UAAUgC,SAAS7B,YAAAA;AACxDD,qBAAW8B,UAAU0B;AACrB,iBAAOA,SAASE;QAClB,CAAA;MACF;MACAC,aAAa,MAAA;AACXzD,uBAAe,CAACD,iBAAAA;AACd,gBAAM2D,OAAOC,gBAAgB/D,UAAUgC,SAAS7B,YAAAA;AAChDD,qBAAW8B,UAAU8B;AACrB,iBAAOA,KAAKF;QACd,CAAA;MACF;MACAI,cAAc,OAAO,EAAE3C,MAAM4C,KAAKrD,MAAMjB,SAAAA,SAAO,MAAE;AAC/CK,kBAAUgC,UAAW,MAAMtB,eAAe;UAAEyB,OAAOd,KAAKc;UAAO8B;UAAKrD;UAAMjB,SAAAA;QAAQ,CAAA,KAAO,CAAA;AACzF,cAAMuE,YAAYlE,UAAUgC,QAAQlC,OAAO,CAACqE,UAAUA,MAAMC,MAAMC,SAAS,CAAA,EAAG,CAAA,GAAID,MAAM,CAAA;AACxF,YAAIF,WAAW;AACb9D,yBAAe8D,UAAUN,EAAE;AAC3B1D,qBAAW8B,UAAUkC;QACvB;AAEAzD,gBAAQ,CAAC,CAAA;MACX;IACF,CAAA;EACF,GAAG;IAACW;IAAkBV;IAAgBsC;IAAmBnD;GAAY;AAErE,SAAO;IACLG;IACAoD;IACAjD;IACAG;IACAgE,cAAclD;IACdmD,YAAYzC;IACZY,UAAUT;IACVuC,UAAUzB;EACZ;AACF;;;AC9KA,SAAS0B,YAAY;AACrB,OAAOC,UAASC,MAAMC,WAAAA,gBAAe;AAGrC,SAASC,yBAA+C;AACxD,SAAgCC,QAAAA,OAAuBC,aAAaC,sBAAsB;;;ACH1F,SAASC,MAAMC,SAASC,kBAAkB;AAK1C,IAAMC,aAAa;EACjBC,QAAQ;EACRC,SAAS;EACTC,MAAM;AACR;AAGO,IAAMC,WACX,CAACC,OAA2BC,YAC5B,CAACC,YAAAA;AACC,QAAMC,QAAQH,MAAMI,aAAa;AACjCF,UAAQG,MACN,QACA;IACEC,OAAO;MAAC;MAAc;QAAEC,IAAIC;MAAe;;IAC3CC,UAAU;IACVC,SAAS;IACTC,mBAAmB;IACnBR;EACF,GACA,CAACE,UAAAA;AACC,eAAW,CAACD,WAAWQ,IAAAA,KAASC,OAAOC,QAAQnB,UAAAA,GAAa;AAC1D,YAAMoB,UAAUZ,UAAUC;AAC1BC,YAAMW,OACJ,QAAQZ,SAAAA,IACR;QAAEE,OAAO;UAAC,QAAQF,SAAAA;UAAmB;YAAEG,IAAIC;UAAe;;QAAIO;QAASH;MAAK,GAC5E,MAAA;AACE,cAAMK,OAAOhB,QAAAA;AACb,YAAI,CAACgB,MAAM;AACT;QACF;AAEA,cAAMC,WACJd,cAAc,YAAYe,KAAKC,UAAUhB,cAAc,WAAWe,KAAKE,SAASF,KAAKG;AACvF,YAAIP,SAAS;AACXQ,qBAAWL,QAAAA,EAAUD,IAAAA;QACvB,OAAO;AACLO,kBAAQN,QAAAA,EAAUD,IAAAA;QACpB;MACF,CAAA;IAEJ;EACF,CAAA;AAEJ;;;ACjDF,SAASQ,eAAeC,cAAcC,aAAaC,kBAAkBC,uBAAuB;AAM5F,IAAMC,aAAa;EACjBC,YAAY;EACZC,WAAW;EACXC,OAAO;AACT;AAGO,IAAMC,YACX,CAACC,OAA2BC,YAC5B,CAACC,YAAAA;AACC,QAAMC,QAAQH,OAAOI,aAAa,eAAgBJ,MAAMK,aAAa;AACrEH,UAAQI,MACN,SACA;IACEC,OAAO;MAAC;MAAe;QAAEC,IAAIC;MAAe;;IAC5CC,UAAU;IACVC,SAAS;IACTC,mBAAmB;IACnBT;EACF,GACA,CAACG,UAAAA;AACC,eAAW,CAACO,MAAMC,IAAAA,KAASC,OAAOC,QAAQrB,UAAAA,GAAa;AACrD,YAAMsB,UAAUJ,SAASV;AACzBG,YAAMY,OACJL,MACA;QACEN,OAAO;UAAC,SAASM,IAAAA;UAAc;YAAEL,IAAIC;UAAe;;QACpDQ;QACA,GAAIJ,SAAS,WAAW;UAAEM,UAAU,CAAC,CAACnB,MAAMoB;QAAU;QACtDN;MACF,GACA,MAAA;AACE,cAAMO,OAAOpB,QAAAA;AACb,YAAI,CAACoB,MAAM;AACT;QACF;AAEA,gBAAQR,MAAAA;UACN,KAAK;AACHI,sBAAUK,iBAAiBD,IAAAA,IAAQE,cAAcF,IAAAA;AACjD;UACF,KAAK;AACHJ,sBAAUO,gBAAgBH,IAAAA,IAAQI,aAAaJ,IAAAA;AAC/C;UACF,KAAK;AACHK,wBAAYL,IAAAA;AACZ;QACJ;MACF,CAAA;IAEJ;EACF,CAAA;AAEJ;;;AC3DF,SAA0BM,QAAQC,SAASC,YAAYC,gBAAgB;AAMvE,IAAMC,UAAU;EACdC,QAAQ;EACRC,UAAU;EACVC,eAAe;EACfC,MAAM;EACNC,MAAM;AACR;AAGO,IAAMC,gBACX,CAACC,OAA2BC,YAC5B,CAACC,YAAAA;AACC,QAAMC,aAAyBH;AAC/BE,UAAQE,MACN,cACA;IACEC,OAAO;MAAC;MAAoB;QAAEC,IAAIC;MAAe;;IACjDC,UAAU;IACVC,SAAS;IACTC,mBAAmB;IACnBC,OAAOC,OAAOC,KAAKpB,OAAAA,EAASqB,OAAO,CAACC,QAAQ,CAAC,CAACZ,WAAWY,GAAAA,CAAwB;EACnF,GACA,CAACX,UAAAA;AACC,eAAW,CAACY,MAAMC,IAAAA,KAASL,OAAOM,QAAQzB,OAAAA,GAAU;AAClD,YAAM0B,UAAU,CAAC,CAAChB,WAAWa,IAAAA;AAC7BZ,YAAMgB,OAAOJ,MAAM;QAAEX,OAAO;UAAC,cAAcW,IAAAA;UAAc;YAAEV,IAAIC;UAAe;;QAAIY;QAASF;MAAK,GAAG,MAAA;AACjG,cAAMI,OAAOpB,QAAAA;AACb,YAAI,CAACoB,MAAM;AACT;QACF;AAEA,YAAIL,SAAS,QAAQ;AACnBG,oBAAUG,WAAWD,IAAAA,IAAQE,QAAAA,EAAUF,IAAAA;AACvC;QACF;AAEAG,iBACER,SAAS,WACLS,OAAOC,SACPV,SAAS,aACPS,OAAOE,WACPX,SAAS,kBACPS,OAAOG,gBACPH,OAAOI,MACf,CAACV,OAAAA,EACDE,IAAAA;MACJ,CAAA;IACF;EACF,CAAA;AAEJ;;;ACxDF,SAASS,kBAAkB;AAM3B,IAAMC,eAAuC;EAC3C,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;AACL;AAEA,IAAMC,sBAAsB,CAACC,UAAAA;AAC3B,QAAMC,YAAYD,QAAQA,MAAMC,YAAY;AAC5C,QAAMC,UAAUD,aAAa,cAAcE,KAAKF,SAAAA;AAChD,SAAOC,UAAUA,QAAQ,CAAA,IAAKD,cAAc,eAAe,CAACA,YAAY,MAAM;AAChF;AAGO,IAAMG,cACX,CAACJ,OAA2BK,YAC5B,CAACC,YAAAA;AACC,QAAMC,eAAeR,oBAAoBC,KAAAA;AACzCM,UAAQE,MACN,WACA;IACEC,OAAO;MAAC;MAAiB;QAAEC,IAAIC;MAAe;;IAC9CC,MAAM;IACNC,UAAU;IACVC,SAAS;IACTC,aAAa;IACbC,mBAAmB;;IAEnBC,OAAOV;EACT,GACA,CAACC,UAAAA;AACC,eAAW,CAACU,UAAUN,IAAAA,KAASO,OAAOC,QAAQtB,YAAAA,GAAe;AAC3D,YAAMuB,QAAQC,SAASJ,QAAAA;AACvBV,YAAMe,OACJ,YAAYL,QAAAA,IACZ;QACET,OAAO;UAAC;UAAuB;YAAEe,OAAOH;YAAOX,IAAIC;UAAe;;QAClEC;QACAa,SAASP,aAAaX;MACxB,GACA,MAAMmB,WAAWL,KAAAA,EAAOhB,QAAAA,CAAAA,CAAAA;IAE5B;EACF,CAAA;AAEJ;;;ACpDK,IAAMsB,iBACX,CAACC,kBACD,CAACC,YAAAA;AACCA,UAAQC,OACN,SACA;IACEC,OAAO;MAAC;MAAe;QAAEC,IAAIC;MAAe;;IAC5CC,QAAQ;IACRC,MAAM;EACR,GACAP,aAAAA;AAEJ;;;ACjBF,SAASQ,uBAAuB;AAQzB,IAAMC,YACX,CAACC,YACD,CAACC,YAAAA;AACCA,UAAQC,OACN,UACA;IACEC,OAAO;MAAC;MAAgB;QAAEC,IAAIC;MAAe;;IAC7CC,QAAQ;IACRC,MAAM;EACR,GACA,MAAMC,gBAAgBR,QAAAA,CAAAA,CAAAA;AAE1B;;;ACbF,IAAMS,YAAY;EAChBC,SAAS;EACTC,QAAQ;EACRC,UAAU;AACZ;AAGO,IAAMC,cACX,CAACC,OAA2BC,qBAC5B,CAACC,YAAAA;AACC,QAAMC,QAAQH,MAAMI,YAAY;AAChCF,UAAQG,MACN,YACA;IACEC,OAAO;MAAC;MAAmB;QAAEC,IAAIC;MAAe;;IAChDC,MAAM;IACNC,UAAU;IACVC,SAAS;IACTC,aAAa;IACbC,mBAAmB;IACnBV;EACF,GACA,CAACE,UAAAA;AACC,eAAW,CAACD,UAAUK,IAAAA,KAASK,OAAOC,QAAQpB,SAAAA,GAAY;AACxD,YAAMqB,UAAUZ,aAAaD;AAC7BE,YAAMY,OACJ,cAAcb,QAAAA,IACd;QACEE,OAAO;UAAC,aAAaF,QAAAA;UAAkB;YAAEG,IAAIC;UAAe;;QAC5DQ;QACAP;MACF,GACA,MAAMR,iBAAiBG,QAAAA,CAAAA;IAE3B;EACF,CAAA;AAEJ;;;APEK,IAAMc,gBAAgBC,qBAAK,CAAC,EAAEC,YAAYC,MAAMC,cAAcC,UAAU,GAAGC,MAAAA,MAA2B;AAC3G,QAAMC,cAAcC,4BAA4BF,KAAAA;AAEhD,SACE,gBAAAG,OAAA,cAACC,mBAAAA;IAAkBC,WAAWR,SAAS,YAAY,eAAe;KAChE,gBAAAM,OAAA,cAACG,MAAKC,MAAI;IAAE,GAAGN;IAAaH;IAA4BC;KACtD,gBAAAI,OAAA,cAACG,MAAKE,SAAO;IAACZ;;AAItB,CAAA;AASA,IAAMM,8BAA8B,CAAC,EAAEO,OAAOC,SAASC,eAAe,GAAGC,SAAAA,MAA+B;AACtG,QAAMC,cAAcC,SAClB,MAAMC,qBAAqB;IAAEN;IAAOC;IAASC;IAAe,GAAGC;EAAS,CAAA,GACxE;IACEH;IACAC;IACAC;IACAC,UAAUI;IACVJ,UAAUK;IACVL,UAAUM;IACVN,UAAUO;IACVP,UAAUQ;IACVR,UAAUS;IACVT,UAAUU;GACX;AAGH,SAAOC,eAAeV,WAAAA;AACxB;AAEA,IAAME,uBAAuB,CAAC,EAC5BN,OACAC,SACAC,eACA,GAAGC,SAAAA,MACiB;AACpB,SAAOY,KAAKC,KAAK,CAACC,QAAAA;AAEhB,UAAMC,gBAAgBD,IAAIjB,KAAAA;AAC1B,WAAOmB,YAAYH,KAAI,EACpBI,SAASjB,UAAUI,iBAAiB,SAASc,YAAYH,eAAejB,OAAAA,CAAAA,EACxEmB,SAASjB,UAAUK,mBAAmB,SAASc,cAAcJ,eAAejB,OAAAA,CAAAA,EAC5EmB,SAASjB,UAAUM,cAAc,SAASc,SAASL,eAAejB,OAAAA,CAAAA,EAClEmB,SAASjB,UAAUO,eAAe,SAASc,UAAUN,eAAejB,OAAAA,CAAAA,EACpEmB,SAASjB,UAAUS,iBAAiBa,eAAetB,SAASS,aAAa,CAAA,EACzEc,UAAU,KAAA,EACVN,SAASlB,iBAAiBe,IAAIf,aAAAA,CAAAA,EAC9BkB,SAASjB,UAAUQ,eAAe,SAASgB,UAAU1B,OAAAA,CAAAA,EACrDmB,SAASjB,UAAUU,oBAAoBe,YAAYV,eAAef,SAASU,gBAAgB,CAAA,EAC3FgB,MAAK;EACV,CAAA;AACF;;;AQ1GA,SAASC,QAAAA,aAAY;AACrB,SAASC,WAAAA,gBAAe;AAWjB,IAAMC,mBAAmB,CAACC,eAAmC,CAAC,MAAC;AAEpE,SAAOC,SAAQ,MAAMC,MAAKC,KAAyBH,YAAAA,GAAe,CAAA,CAAE;AACtE;;;;AjBkBA,IAAM,CAACI,uBAAuBC,gBAAAA,IAAoBC,cAAkC,QAAA;AAcpF,IAAMC,aAAaC,gBAAAA,YACjB,CAAC,EAAEC,UAAUC,YAAYC,gBAAgBC,UAAU,GAAGC,MAAAA,GAASC,iBAAAA;AAC7D,QAAMC,QAAQC,iBAAiB;IAAEJ;EAAS,CAAA;AAE1C,QAAM,CAACK,YAAYC,aAAAA,IAAiBC,UAAAA;AACpCC,EAAAA,qBAAoBN,cAAc,MAAMG,cAAcI,gBAAgB;IAACJ;GAAW;AAGlF,QAAM,EAAEK,WAAWC,WAAW,GAAGC,UAAAA,IAAcC,cAAcZ,KAAAA;AAC7D,QAAMH,aAAagB,SACjB,MAAM;IAACH;IAAWZ;IAAgBgB,OAAOC,cAAAA,EAAeC,KAAI,GAC5D;IAACN;IAAWZ;GAAe;AAG7B,SACE,gBAAAmB,OAAA,cAAC1B,uBAAAA;IACCa;IACAC;IACAR;IACAK;KAEA,gBAAAe,OAAA,cAACC,oBAAAA;IAAmBC,MAAMf,YAAYe;IAAMC,QAAQX,UAAUY;IAAU,GAAGV;KACxEf,QAAAA,CAAAA;AAIT,CAAA;AAGFF,WAAW4B,cAAc;AAMzB,IAAMC,uBAAuB;AAO7B,IAAMC,iBAAiB,CAAC,EAAEC,YAAY7B,SAAQ,MAAuB;AACnE,SACE,gBAAAqB,OAAA,cAACS,OAAAA;IAAIC,MAAK;IAAOC,WAAWC,IAAG,2DAA2DJ,UAAAA;KACvF7B,QAAAA;AAGP;AAEA4B,eAAeF,cAAcC;AAM7B,IAAMO,sBAAsB;AAQ5B,IAAMC,iBAAgB,CAAC,EAAElC,YAAYmC,oBAAoB,GAAGhC,MAAAA,MAA2B;AACrF,QAAM,EAAEH,YAAYoC,uBAAuB,CAAA,GAAI5B,cAAa,IAAKb,iBAAiBsC,mBAAAA;AAElF,QAAMjC,aAAagB,SACjB,MAAM;IAACoB;IAAsBD;IAAoBlB,OAAOC,cAAAA,EAAeC,KAAI,GAC3E;IAACgB;IAAoBC;GAAqB;AAG5C,SAAO,gBAAAhB,OAAA,cAACiB,eAAAA;IAAsB,GAAGlC;IAAOH;IAAwBsC,KAAK9B;;AACvE;AAEA0B,eAAcT,cAAcQ;AAM5B,IAAMM,sBAAsB;AAQ5B,IAAMC,iBAAgB,CAACrC,UAAAA;AACrB,QAAM,EAAEI,YAAYF,MAAK,IAAKV,iBAAiB4C,mBAAAA;AAG/C,QAAME,UAAUC,aAAY,MAAA;AAC1BC,IAAAA,WAAUpC,YAAYe,MAAAA,QAAAA;;;;;;;;;AACtB,WAAOf,YAAYe;EACrB,GAAG;IAACf;GAAW;AAEf,SAAO,gBAAAa,OAAA,cAACwB,eAAAA;IAAsB,GAAGzC;IAAOsC;IAAkBpC;;AAC5D;AAEAmC,eAAcf,cAAcc;AAmBrB,IAAMM,SAAS;EACpBC,MAAMjD;EACNkD,UAAUpB;EACVqB,SAASd;EACTe,SAAST;AACX;;;AkB5KA,SAASU,iBAAAA,sBAAqB;AAC9B,OAAOC,UAAiDC,eAAAA,cAAaC,aAAAA,YAAWC,UAAAA,SAAQC,YAAAA,iBAAgB;AAExG,SAASC,oBAAAA,yBAAwB;AACjC,SAASC,sBAAAA,qBAA2CC,WAAAA,gBAAe;AASnE,IAAM,CAACC,8BAA8BC,gBAAAA,IAAoBC,eAAyC,kBAAkB,CAAC,CAAA;AAU9G,IAAMC,wBAAwB,CAAC,EAAEC,UAAUC,SAAQ,MAA8B;AACtF,QAAMC,aAAaC,QAA2B,IAAA;AAC9C,QAAM,CAACC,OAAOC,QAAAA,IAAYC,UAAoC,CAAC,CAAA;AAC/D,QAAM,CAACC,MAAMC,OAAAA,IAAWF,UAAS,KAAA;AAEjC,QAAMG,iBAAiBC,aACrB,CAACC,UAAAA;AACC,UAAM,EAAEC,KAAKC,OAAOC,QAAO,IAAKH;AAChCN,aAAS,CAACD,YAAW;MACnB,GAAGA;MACHW,MAAM;QAAEF;QAAOD;MAAI;MACnBI,SAAS;IACX,EAAA;AAEAd,eAAWe,UAAUH;AACrBI,mBAAe,MAAMV,QAAQ,IAAA,CAAA;AAC7B,SAAKP,WAAW;MAAEY;MAAOD;IAAI,CAAA,EAAGO,KAAK,CAACC,WACpCf,SAAS,CAACD,YAAW;MACnB,GAAGA;MACHgB,QAAQA,UAAUC;MAClBL,SAAS;IACX,EAAA,CAAA;EAEJ,GACA;IAACf;GAAS;AAGZ,QAAM,CAACqB,MAAMC,OAAAA,IAAWjB,UAAgC,IAAA;AACxDkB,EAAAA,WAAU,MAAA;AACR,QAAI,CAACF,QAAQ,CAACb,gBAAgB;AAC5B;IACF;AAEA,WAAOgB,kBAAiBH,MAAMI,qBAA2BjB,gBAAgB;MACvEkB,SAAS;MACTC,SAAS;IACX,CAAA;EACF,GAAG;IAACN;IAAMb;GAAe;AAEzB,SACE,gBAAAoB,OAAA,cAACjC,8BAAAA;IAA6BoB,SAASZ,MAAMY;IAASD,MAAMX,MAAMW;IAAMK,QAAQhB,MAAMgB;KACpF,gBAAAS,OAAA,cAACC,SAAQC,MAAI;IAACxB;IAAYyB,cAAcxB;KACtC,gBAAAqB,OAAA,cAACC,SAAQG,gBAAc;IAACC,YAAYhC;MACpC,gBAAA2B,OAAA,cAACM,OAAAA;IAAIC,MAAK;IAAOC,WAAU;IAAWC,KAAKf;KACxCvB,QAAAA,CAAAA,CAAAA;AAKX;",
|
|
6
|
+
"names": ["translationKey", "translations", "createContext", "React", "forwardRef", "useCallback", "useImperativeHandle", "useMemo", "useState", "invariant", "mx", "isNonNullable", "noopController", "view", "getText", "setText", "focus", "createEditorController", "state", "doc", "toString", "text", "dispatch", "changes", "from", "to", "length", "insert", "selection", "anchor", "head", "Transaction", "EditorView", "React", "forwardRef", "useEffect", "useImperativeHandle", "initialSync", "mx", "EditorState", "EditorView", "useCallback", "useEffect", "useMemo", "useRef", "useState", "log", "createEditorStateTransaction", "debugDispatcher", "documentId", "modalStateField", "getProviderValue", "isTruthy", "instanceCount", "useTextEditor", "props", "deps", "id", "doc", "initialValue", "extensions", "autoFocus", "scrollTo", "selection", "selectionEnd", "debug", "instanceId", "view", "setView", "parentRef", "current", "length", "initialSelection", "anchor", "head", "undefined", "index", "indexOf", "state", "create", "of", "exceptionSink", "err", "catch", "filter", "parent", "scrollIntoView", "yMargin", "dispatchTransactions", "to", "lineAt", "dispatch", "destroy", "warn", "focus", "handleKeyDown", "event", "key", "target", "currentTarget", "modal", "field", "element", "contentDOM", "closest", "preventDefault", "focusAttributes", "tabIndex", "onKeyDown", "EditorContent", "forwardRef", "classNames", "id", "extensions", "selectionEnd", "focusable", "value", "onChange", "props", "forwardedRef", "parentRef", "focusAttributes", "view", "useTextEditor", "initialValue", "EditorView", "updateListener", "of", "docChanged", "transactions", "isInitialSync", "some", "tr", "annotation", "Transaction", "userEvent", "initialSync", "state", "doc", "toString", "useImperativeHandle", "createEditorController", "useEffect", "requestAnimationFrame", "dispatch", "annotations", "changes", "from", "to", "length", "insert", "selection", "anchor", "undefined", "focus", "div", "role", "className", "mx", "ref", "insertAtCursor", "getMenuItem", "groups", "id", "flatMap", "group", "items", "find", "item", "getNextMenuItem", "index", "findIndex", "length", "getPreviousMenuItem", "createMenuGroup", "label", "filter", "toLowerCase", "includes", "map", "i", "onSelect", "view", "head", "insertAtCursor", "filterMenuGroups", "insertAtLineStart", "Prec", "RangeSetBuilder", "StateEffect", "StateField", "Decoration", "EditorView", "ViewPlugin", "keymap", "modalStateField", "placeholder", "isNonNullable", "isTruthy", "DELIMITERS", "popover", "options", "Prec", "highest", "popoverKeymap", "popoverStateField", "popoverTriggerListener", "popoverAnchorDecoration", "modalStateField", "trigger", "placeholder", "content", "Array", "isArray", "filter", "isTruthy", "EditorView", "updateListener", "of", "view", "docChanged", "range", "activeRange", "state", "field", "text", "doc", "sliceString", "from", "to", "selection", "main", "shouldClose", "test", "slice", "head", "nextRange", "dispatch", "effects", "popoverRangeEffect", "onClose", "triggers", "keymap", "isNonNullable", "map", "key", "run", "line", "lineAt", "trim", "changes", "insert", "anchor", "triggerKey", "str", "idx", "getLastIndexOf", "delimiters", "length", "undefined", "onArrowUp", "onArrowDown", "onEnter", "ViewPlugin", "fromClass", "_decorations", "Decoration", "none", "update", "transactions", "builder", "RangeSetBuilder", "showWidget", "add", "mark", "tagName", "class", "attributes", "rangeChanged", "some", "tr", "effect", "is", "sliceDoc", "onTextChange", "pos", "finish", "decorations", "v", "StateEffect", "define", "StateField", "create", "value", "newValue", "Math", "max", "delim", "lastIndexOf", "formattingCommands", "id", "label", "items", "icon", "onSelect", "view", "head", "insertAtLineStart", "linkSlashCommands", "dispatch", "changes", "from", "insert", "selection", "anchor", "effects", "popoverRangeEffect", "of", "trigger", "range", "to", "useControllableState", "React", "Fragment", "useCallback", "useEffect", "useRef", "useState", "addEventListener", "invariant", "DX_ANCHOR_ACTIVATE", "Icon", "Popover", "ScrollArea", "toLocalizedString", "useDynamicRef", "useThemeContext", "useTranslation", "EditorMenuProvider", "children", "view", "groups", "currentItem", "open", "openProp", "defaultOpen", "numItems", "onOpenChange", "onActivate", "onSelect", "onCancel", "tx", "triggerRef", "viewRef", "setOpen", "prop", "defaultProp", "onChange", "current", "root", "setRoot", "event", "trigger", "dxn", "getAttribute", "undefined", "requestAnimationFrame", "capture", "passive", "handleSelect", "item", "menuGroups", "filter", "group", "items", "length", "Root", "modal", "VirtualTrigger", "virtualRef", "Portal", "Content", "align", "classNames", "style", "maxBlockSize", "onEscapeKeyDown", "currentView", "onOpenAutoFocus", "preventDefault", "Viewport", "asChild", "thin", "Menu", "Arrow", "div", "role", "className", "ref", "ul", "map", "index", "key", "id", "MenuGroup", "t", "label", "span", "MenuItem", "listRef", "scrollIntoView", "behavior", "block", "li", "onClick", "icon", "useCallback", "useMemo", "useRef", "useState", "invariant", "modalStateEffect", "useEditorMenu", "trigger", "triggerKey", "placeholder", "filter", "getMenu", "groupsRef", "useRef", "currentRef", "currentItem", "setCurrentItem", "useState", "open", "setOpen", "_", "refresh", "getMenuOptions", "useCallback", "text", "props", "groups", "filterMenuGroups", "item", "label", "toLowerCase", "startsWith", "handleOpenChange", "view", "invariant", "undefined", "dispatch", "effects", "popoverRangeEffect", "of", "requestAnimationFrame", "modalStateEffect", "handleActivate", "getMenuItem", "current", "handleSelect", "range", "state", "field", "popoverStateField", "changes", "from", "to", "insert", "onSelect", "head", "selection", "main", "focus", "handleCancel", "serializedTrigger", "Array", "isArray", "join", "extension", "useMemo", "popover", "onClose", "onEnter", "onArrowUp", "previous", "getPreviousMenuItem", "id", "onArrowDown", "next", "getNextMenuItem", "onTextChange", "pos", "firstItem", "group", "items", "length", "onOpenChange", "onActivate", "onCancel", "Atom", "React", "memo", "useMemo", "ElevationProvider", "Menu", "MenuBuilder", "useMenuActions", "List", "addList", "removeList", "listStyles", "bullet", "ordered", "task", "addLists", "state", "getView", "builder", "value", "listStyle", "group", "label", "ns", "translationKey", "iconOnly", "variant", "selectCardinality", "icon", "Object", "entries", "checked", "action", "view", "listType", "List", "Ordered", "Bullet", "Task", "removeList", "addList", "addBlockquote", "addCodeblock", "insertTable", "removeBlockquote", "removeCodeblock", "blockTypes", "blockquote", "codeblock", "table", "addBlocks", "state", "getView", "builder", "value", "blockQuote", "blockType", "group", "label", "ns", "translationKey", "iconOnly", "variant", "selectCardinality", "type", "icon", "Object", "entries", "checked", "action", "disabled", "blankLine", "view", "removeBlockquote", "addBlockquote", "removeCodeblock", "addCodeblock", "insertTable", "Inline", "addLink", "removeLink", "setStyle", "formats", "strong", "emphasis", "strikethrough", "code", "link", "addFormatting", "state", "getView", "builder", "formatting", "group", "label", "ns", "translationKey", "iconOnly", "variant", "selectCardinality", "value", "Object", "keys", "filter", "key", "type", "icon", "entries", "checked", "action", "view", "removeLink", "addLink", "setStyle", "Inline", "Strong", "Emphasis", "Strikethrough", "Code", "setHeading", "headingIcons", "computeHeadingValue", "state", "blockType", "heading", "exec", "addHeadings", "getView", "builder", "headingValue", "group", "label", "ns", "translationKey", "icon", "iconOnly", "variant", "applyActive", "selectCardinality", "value", "levelStr", "Object", "entries", "level", "parseInt", "action", "count", "checked", "setHeading", "addImageUpload", "onImageUpload", "builder", "action", "label", "ns", "translationKey", "testId", "icon", "openSearchPanel", "addSearch", "getView", "builder", "action", "label", "ns", "translationKey", "testId", "icon", "openSearchPanel", "viewModes", "preview", "source", "readonly", "addViewMode", "state", "onViewModeChange", "builder", "value", "viewMode", "group", "label", "ns", "translationKey", "icon", "iconOnly", "variant", "applyActive", "selectCardinality", "Object", "entries", "checked", "action", "EditorToolbar", "memo", "classNames", "role", "attendableId", "onAction", "props", "menuActions", "useEditorToolbarActionGraph", "React", "ElevationProvider", "elevation", "Menu", "Root", "Toolbar", "state", "getView", "customActions", "features", "menuCreator", "useMemo", "createToolbarActions", "showHeadings", "showFormatting", "showLists", "showBlocks", "showSearch", "onImageUpload", "onViewModeChange", "useMenuActions", "Atom", "make", "get", "stateSnapshot", "MenuBuilder", "subgraph", "addHeadings", "addFormatting", "addLists", "addBlocks", "addImageUpload", "separator", "addSearch", "addViewMode", "build", "Atom", "useMemo", "useEditorToolbar", "initialState", "useMemo", "Atom", "make", "EditorContextProvider", "useEditorContext", "createContext", "EditorRoot", "forwardRef", "children", "extensions", "extensionsProp", "viewMode", "props", "forwardedRef", "state", "useEditorToolbar", "controller", "setController", "useState", "useImperativeHandle", "noopController", "groupsRef", "extension", "menuProps", "useEditorMenu", "useMemo", "filter", "isNonNullable", "flat", "React", "EditorMenuProvider", "view", "groups", "current", "displayName", "EDITOR_VIEWPORT_NAME", "EditorViewport", "classNames", "div", "role", "className", "mx", "EDITOR_CONTENT_NAME", "EditorContent", "providedExtensions", "additionalExtensions", "NaturalEditorContent", "ref", "EDITOR_TOOLBAR_NAME", "EditorToolbar", "getView", "useCallback", "invariant", "NaturalEditorToolbar", "Editor", "Root", "Viewport", "Content", "Toolbar", "createContext", "React", "useCallback", "useEffect", "useRef", "useState", "addEventListener", "DX_ANCHOR_ACTIVATE", "Popover", "EditorPreviewContextProvider", "useEditorPreview", "createContext", "EditorPreviewProvider", "children", "onLookup", "triggerRef", "useRef", "value", "setValue", "useState", "open", "setOpen", "handleActivate", "useCallback", "event", "dxn", "label", "trigger", "link", "pending", "current", "queueMicrotask", "then", "target", "undefined", "root", "setRoot", "useEffect", "addEventListener", "DX_ANCHOR_ACTIVATE", "capture", "passive", "React", "Popover", "Root", "onOpenChange", "VirtualTrigger", "virtualRef", "div", "role", "className", "ref"]
|
|
7
7
|
}
|