diff --git a/packages/docs/package.json b/packages/docs/package.json index be8feea9..e72d7c49 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -16,6 +16,8 @@ "dependencies": { "@emoji-mart/data": "^1.2.1", "@floating-ui/dom": "^1.7.2", + "@logicflow/core": "^2.0.16", + "@logicflow/extension": "^2.0.21", "@opentiny/fluent-editor": "workspace:^", "emoji-mart": "^5.6.0", "highlight.js": "^10.2.0", @@ -26,6 +28,7 @@ "quill-markdown-shortcuts": "^0.0.10", "quill-table-up": "^2.1.7", "quill-toolbar-tip": "^0.0.13", + "simple-mind-map": "0.14.0-fix.1", "vue": "^3.5.13", "vue-toastification": "2.0.0-rc.5" }, diff --git a/packages/fluent-editor/package.json b/packages/fluent-editor/package.json index 104da133..1cb562ab 100644 --- a/packages/fluent-editor/package.json +++ b/packages/fluent-editor/package.json @@ -40,6 +40,8 @@ "devDependencies": { "@emoji-mart/data": "^1.2.1", "@floating-ui/dom": "^1.7.2", + "@logicflow/core": "^2.0.16", + "@logicflow/extension": "^2.0.21", "@types/jest": "^26.0.23", "@types/lodash-es": "^4.17.12", "commander": "^6.2.0", @@ -51,6 +53,7 @@ "parchment": "^3.0.0", "sass": "^1.47.0", "shelljs": "^0.8.4", + "simple-mind-map": "0.14.0-fix.1", "ts-jest": "^26.5.6", "ts-node": "^9.1.1", "typescript": "^4.9.5", diff --git a/packages/fluent-editor/src/config/i18n/en-us.ts b/packages/fluent-editor/src/config/i18n/en-us.ts index 4b55b343..ec7b915b 100644 --- a/packages/fluent-editor/src/config/i18n/en-us.ts +++ b/packages/fluent-editor/src/config/i18n/en-us.ts @@ -72,6 +72,7 @@ export const EN_US = { 'strike': 'Strikethrough', 'image': 'Image', 'file': 'File', + 'mind-map': 'Mind Map', 'link': 'Hyperlink', 'code': 'Inline Code', 'table': 'Table', diff --git a/packages/fluent-editor/src/config/i18n/zh-cn.ts b/packages/fluent-editor/src/config/i18n/zh-cn.ts index 2dd8f0f7..43f65e37 100644 --- a/packages/fluent-editor/src/config/i18n/zh-cn.ts +++ b/packages/fluent-editor/src/config/i18n/zh-cn.ts @@ -70,6 +70,7 @@ export const ZH_CN = { 'strike': '删除线', 'image': '图片', 'file': '文件', + 'mind-map': '思维导图', 'link': '超链接', 'divider': '分割线', 'code': '行内代码', @@ -133,5 +134,4 @@ export const ZH_CN = { 'DeleteTable': '删除当前表格', 'BackgroundColor': '设置背景颜色', 'BorderColor': '设置边框颜色', - } diff --git a/packages/fluent-editor/src/config/types/editor-modules.interface.ts b/packages/fluent-editor/src/config/types/editor-modules.interface.ts index 9534d8db..cf311290 100644 --- a/packages/fluent-editor/src/config/types/editor-modules.interface.ts +++ b/packages/fluent-editor/src/config/types/editor-modules.interface.ts @@ -44,4 +44,5 @@ export interface IEditorModules { 'file'?: boolean 'mathlive'?: boolean 'image'?: boolean | Partial + 'mind-map'?: boolean } diff --git a/packages/fluent-editor/src/fluent-editor.ts b/packages/fluent-editor/src/fluent-editor.ts index 933fabdf..067f57e6 100644 --- a/packages/fluent-editor/src/fluent-editor.ts +++ b/packages/fluent-editor/src/fluent-editor.ts @@ -14,6 +14,7 @@ import I18N from './modules/i18n' import { LinkBlot } from './modules/link' // 超链接 import { MathliveModule } from './modules/mathlive' // latex公式 import { Mention } from './modules/mention' // @提醒 +import { MindMapModule } from './modules/mind-map' // 思维导图 import { ShortCutKey } from './modules/shortcut-key' import Syntax from './modules/syntax' // 代码块高亮 import { BetterToolbar } from './modules/toolbar' // 工具栏 @@ -57,6 +58,7 @@ FluentEditor.register( 'modules/toolbar': BetterToolbar, 'modules/uploader': FileUploader, 'modules/shortcut-key': ShortCutKey, + 'modules/mind-map': MindMapModule, 'themes/snow': SnowTheme, diff --git a/packages/fluent-editor/src/modules/index.ts b/packages/fluent-editor/src/modules/index.ts index 99e44b14..363bef2d 100644 --- a/packages/fluent-editor/src/modules/index.ts +++ b/packages/fluent-editor/src/modules/index.ts @@ -9,6 +9,7 @@ export * from './i18n' export * from './link' export * from './mathlive' export * from './mention' +export * from './mind-map' export * from './shortcut-key' export * from './syntax' export * from './table-up' diff --git a/packages/fluent-editor/src/modules/mind-map/formats/mind-map-blot.ts b/packages/fluent-editor/src/modules/mind-map/formats/mind-map-blot.ts new file mode 100644 index 00000000..b1ddd371 --- /dev/null +++ b/packages/fluent-editor/src/modules/mind-map/formats/mind-map-blot.ts @@ -0,0 +1,106 @@ +import type { Root } from 'parchment' +import type { BlockEmbed as TypeBlockEmbed } from 'quill/blots/block' +import type FluentEditor from '../../../core/fluent-editor' +import Quill from 'quill' +import SimpleMindMap from 'simple-mind-map' +import Drag from 'simple-mind-map/src/plugins/Drag.js' +import Export from 'simple-mind-map/src/plugins/Export.js' +import { initContextMenu } from '../modules/context-menu' +import { createControlPanel } from '../modules/control-panel' +import '../style/mind-map.scss' + +const BlockEmbed = Quill.import('blots/embed') as typeof TypeBlockEmbed + +class MindMapPlaceholderBlot extends BlockEmbed { + static blotName = 'mind-map-placeholder' + static tagName = 'div' + static className = 'ql-mind-map' + mindMap: SimpleMindMap | null = null + data: any + zoomCount = 0 + contextMenu: HTMLElement | null = null + currentNode: any = null + + constructor(scroll: Root, domNode: HTMLElement) { + super(scroll, domNode) + this.domNode.classList.add('ql-mind-map-container') + this.domNode.style.height = '500px' + this.domNode.style.border = '1px solid #e8e8e8' + this.data = MindMapPlaceholderBlot.value(this.domNode) + this.initMindMap() + } + + static value(domNode: HTMLElement): any { + const dataStr = JSON.parse(domNode.getAttribute('data-mind-map')) + return dataStr.root ? dataStr.root : dataStr + } + + static create(value: any): HTMLElement { + const node = super.create() as HTMLElement + if (value) { + node.setAttribute('data-mind-map', JSON.stringify(value)) + } + return node + } + + initMindMap(): void { + if (this.domNode.isConnected) { + this.insertMindMapEditor() + } + else { + const observer = new MutationObserver(() => { + if (this.domNode.isConnected) { + this.insertMindMapEditor() + observer.disconnect() + } + }) + observer.observe(document.body, { childList: true, subtree: true }) + } + } + + insertMindMapEditor(): void { + this.domNode.style.width = '100%' + this.domNode.style.height = '500px' + while (this.domNode.firstChild) { + this.domNode.removeChild(this.domNode.firstChild) + } + SimpleMindMap.usePlugin(Drag).usePlugin(Export) + this.mindMap = new SimpleMindMap ({ + el: this.domNode, + mousewheelAction: 'zoom', + disableMouseWheelZoom: true, + data: this.data, + } as any) + + const handleScroll = () => { + if (this.mindMap && this.domNode && this.domNode.isConnected) { + this.mindMap.getElRectInfo() + } + } + + window.addEventListener('scroll', handleScroll, { passive: true }) + + this.domNode.addEventListener('remove', () => { + window.removeEventListener('scroll', handleScroll) + }) + const quill = this.scroll as unknown as FluentEditor + createControlPanel(this, quill) // 创建控制面板 + initContextMenu(this, quill) // 初始化右键菜单 + this.mindMap.on('node_tree_render_end', () => { + this.data = this.mindMap.getData({}) + this.domNode.setAttribute('data-mind-map', JSON.stringify(this.data)) + this.scroll.update([], {}) + }) + if (this.mindMap) { + this.mindMap.setData(this.data) + } + } + + value(): any { + return this.data + } +} + +Quill.register(MindMapPlaceholderBlot) + +export default MindMapPlaceholderBlot diff --git a/packages/fluent-editor/src/modules/mind-map/i18n/en-us.ts b/packages/fluent-editor/src/modules/mind-map/i18n/en-us.ts new file mode 100644 index 00000000..45969568 --- /dev/null +++ b/packages/fluent-editor/src/modules/mind-map/i18n/en-us.ts @@ -0,0 +1,28 @@ +export const MIND_MAP_EN_US = { + 'mindMap.contextMenu.copy': 'Copy', + 'mindMap.contextMenu.cut': 'Cut', + 'mindMap.contextMenu.paste': 'Paste', + 'mindMap.contextMenu.deleteContent': 'Delete', + 'mindMap.controlPanel.zoomOut': 'Out', + 'mindMap.controlPanel.zoomIn': 'In', + 'mindMap.controlPanel.fit': 'Fit', + 'mindMap.controlPanel.back': 'Back', + 'mindMap.controlPanel.forward': 'Forward', + 'mindMap.controlPanel.export': 'Export', + 'mindMap.controlPanel.import': 'Import', + 'mindMap.controlPanel.inserChildNode': 'Child', + 'mindMap.controlPanel.inserNode': 'Node', + 'mindMap.controlPanel.inserParentNode': 'Parent', + 'mindMap.controlPanel.removeNode': 'Remove', + 'mindMap.controlPanel.zoomOutTitle': 'Zoom Out View', + 'mindMap.controlPanel.zoomInTitle': 'Zoom In View', + 'mindMap.controlPanel.fitTitle': 'Fit View Size', + 'mindMap.controlPanel.backTitle': 'Step Back', + 'mindMap.controlPanel.forwardTitle': 'Step Forward', + 'mindMap.controlPanel.exportTitle': 'Export Mind Map', + 'mindMap.controlPanel.importTitle': 'Import Mind Map', + 'mindMap.controlPanel.inserChildNodeTitle': 'Insert Child Node', + 'mindMap.controlPanel.inserNodeTitle': 'Insert Sibling Node', + 'mindMap.controlPanel.inserParentNodeTitle': 'Insert Parent Node', + 'mindMap.controlPanel.removeNodeTitle': 'Delete Current Node', +} diff --git a/packages/fluent-editor/src/modules/mind-map/i18n/index.ts b/packages/fluent-editor/src/modules/mind-map/i18n/index.ts new file mode 100644 index 00000000..1bdc6e9d --- /dev/null +++ b/packages/fluent-editor/src/modules/mind-map/i18n/index.ts @@ -0,0 +1,9 @@ +import { MIND_MAP_EN_US } from './en-us' +import { MIND_MAP_ZH_CN } from './zh-cn' + +export function registerMindMapI18N(I18N: any) { + I18N.register({ + 'en-US': MIND_MAP_EN_US, + 'zh-CN': MIND_MAP_ZH_CN, + }, false) +} diff --git a/packages/fluent-editor/src/modules/mind-map/i18n/zh-cn.ts b/packages/fluent-editor/src/modules/mind-map/i18n/zh-cn.ts new file mode 100644 index 00000000..f48617f5 --- /dev/null +++ b/packages/fluent-editor/src/modules/mind-map/i18n/zh-cn.ts @@ -0,0 +1,28 @@ +export const MIND_MAP_ZH_CN = { + 'mindMap.contextMenu.copy': '复制', + 'mindMap.contextMenu.cut': '剪切', + 'mindMap.contextMenu.paste': '粘贴', + 'mindMap.contextMenu.deleteContent': '删除', + 'mindMap.controlPanel.zoomOut': '缩小', + 'mindMap.controlPanel.zoomIn': '放大', + 'mindMap.controlPanel.fit': '适应', + 'mindMap.controlPanel.back': '上一步', + 'mindMap.controlPanel.forward': '下一步', + 'mindMap.controlPanel.export': '导出', + 'mindMap.controlPanel.import': '导入', + 'mindMap.controlPanel.inserChildNode': '子节点', + 'mindMap.controlPanel.inserNode': '同级节点', + 'mindMap.controlPanel.inserParentNode': '父节点', + 'mindMap.controlPanel.removeNode': '删除', + 'mindMap.controlPanel.zoomOutTitle': '缩小视图', + 'mindMap.controlPanel.zoomInTitle': '放大视图', + 'mindMap.controlPanel.fitTitle': '适应视图大小', + 'mindMap.controlPanel.backTitle': '后退一步', + 'mindMap.controlPanel.forwardTitle': '前进一步', + 'mindMap.controlPanel.exportTitle': '导出思维导图', + 'mindMap.controlPanel.importTitle': '导入思维导图', + 'mindMap.controlPanel.inserChildNodeTitle': '插入子节点', + 'mindMap.controlPanel.inserNodeTitle': '插入同级节点', + 'mindMap.controlPanel.inserParentNodeTitle': '插入父节点', + 'mindMap.controlPanel.removeNodeTitle': '删除当前节点', +} diff --git a/packages/fluent-editor/src/modules/mind-map/icons/backIcon.png b/packages/fluent-editor/src/modules/mind-map/icons/backIcon.png new file mode 100644 index 00000000..f5a61aa2 Binary files /dev/null and b/packages/fluent-editor/src/modules/mind-map/icons/backIcon.png differ diff --git a/packages/fluent-editor/src/modules/mind-map/icons/childNodeIcon.png b/packages/fluent-editor/src/modules/mind-map/icons/childNodeIcon.png new file mode 100644 index 00000000..3f0027b9 Binary files /dev/null and b/packages/fluent-editor/src/modules/mind-map/icons/childNodeIcon.png differ diff --git a/packages/fluent-editor/src/modules/mind-map/icons/deleteNodeIcon.png b/packages/fluent-editor/src/modules/mind-map/icons/deleteNodeIcon.png new file mode 100644 index 00000000..0c0fe803 Binary files /dev/null and b/packages/fluent-editor/src/modules/mind-map/icons/deleteNodeIcon.png differ diff --git a/packages/fluent-editor/src/modules/mind-map/icons/exportIcon.png b/packages/fluent-editor/src/modules/mind-map/icons/exportIcon.png new file mode 100644 index 00000000..2d81fb6a Binary files /dev/null and b/packages/fluent-editor/src/modules/mind-map/icons/exportIcon.png differ diff --git a/packages/fluent-editor/src/modules/mind-map/icons/fitIcon.png b/packages/fluent-editor/src/modules/mind-map/icons/fitIcon.png new file mode 100644 index 00000000..2e6097df Binary files /dev/null and b/packages/fluent-editor/src/modules/mind-map/icons/fitIcon.png differ diff --git a/packages/fluent-editor/src/modules/mind-map/icons/forwardIcon.png b/packages/fluent-editor/src/modules/mind-map/icons/forwardIcon.png new file mode 100644 index 00000000..185f44a0 Binary files /dev/null and b/packages/fluent-editor/src/modules/mind-map/icons/forwardIcon.png differ diff --git a/packages/fluent-editor/src/modules/mind-map/icons/importIcon.png b/packages/fluent-editor/src/modules/mind-map/icons/importIcon.png new file mode 100644 index 00000000..894b1715 Binary files /dev/null and b/packages/fluent-editor/src/modules/mind-map/icons/importIcon.png differ diff --git a/packages/fluent-editor/src/modules/mind-map/icons/levelNodeIcon.png b/packages/fluent-editor/src/modules/mind-map/icons/levelNodeIcon.png new file mode 100644 index 00000000..75b1ef16 Binary files /dev/null and b/packages/fluent-editor/src/modules/mind-map/icons/levelNodeIcon.png differ diff --git a/packages/fluent-editor/src/modules/mind-map/icons/parentNodeIcon.png b/packages/fluent-editor/src/modules/mind-map/icons/parentNodeIcon.png new file mode 100644 index 00000000..32db9482 Binary files /dev/null and b/packages/fluent-editor/src/modules/mind-map/icons/parentNodeIcon.png differ diff --git a/packages/fluent-editor/src/modules/mind-map/icons/zoomInIcon.png b/packages/fluent-editor/src/modules/mind-map/icons/zoomInIcon.png new file mode 100644 index 00000000..617973a9 Binary files /dev/null and b/packages/fluent-editor/src/modules/mind-map/icons/zoomInIcon.png differ diff --git a/packages/fluent-editor/src/modules/mind-map/icons/zoomOutIcon.png b/packages/fluent-editor/src/modules/mind-map/icons/zoomOutIcon.png new file mode 100644 index 00000000..de814487 Binary files /dev/null and b/packages/fluent-editor/src/modules/mind-map/icons/zoomOutIcon.png differ diff --git a/packages/fluent-editor/src/modules/mind-map/index.ts b/packages/fluent-editor/src/modules/mind-map/index.ts new file mode 100644 index 00000000..039a693d --- /dev/null +++ b/packages/fluent-editor/src/modules/mind-map/index.ts @@ -0,0 +1,48 @@ +import type Quill from 'quill' +import './formats/mind-map-blot' + +export class MindMapModule { + quill: Quill + toolbar: any + + constructor(quill: Quill, options: any) { + this.quill = quill + this.toolbar = quill.getModule('toolbar') + const domNode = document.querySelector('.ql-mind-map') + + if (domNode) { + domNode.addEventListener('click', () => { + this.insertMindMapEditor() + }) + } + } + + public insertMindMapEditor(): void { + const range = this.quill.getSelection() + if (range) { + const defaultData = { + data: { + text: '根节点', + expand: true, + uid: '36bae545-da0b-4c08-be14-ff05f7f05d0a', + isActive: false, + }, + children: [ + { + data: { + text: '二级节点', + uid: 'ef0895d2-b5cc-4214-b0ee-e29f8f02420d', + expand: true, + richText: false, + isActive: false, + }, + children: [], + }, + ], + smmVersion: '0.14.0-fix.1', + } + this.quill.insertEmbed(range.index, 'mind-map-placeholder', defaultData, 'user') + this.quill.setSelection(range.index + 1, 0) + } + } +} diff --git a/packages/fluent-editor/src/modules/mind-map/modules/context-menu.ts b/packages/fluent-editor/src/modules/mind-map/modules/context-menu.ts new file mode 100644 index 00000000..80f01cf1 --- /dev/null +++ b/packages/fluent-editor/src/modules/mind-map/modules/context-menu.ts @@ -0,0 +1,151 @@ +import type FluentEditor from '../../../core/fluent-editor' +import type MindMapPlaceholderBlot from '../formats/mind-map-blot' +import { CHANGE_LANGUAGE_EVENT } from '../../../config' +import { I18N } from '../../../modules/i18n' +import { registerMindMapI18N } from '../i18n/index' + +class MindMapContextMenuHandler { + private texts: Record + private lang: string + getText(key: keyof Record): string { + return this.texts[key] + } + + constructor(private quill: FluentEditor, private blot: MindMapPlaceholderBlot) { + registerMindMapI18N(I18N) + this.lang = 'en-US' + this.texts = this.resolveTexts() + this.quill.emitter.on(CHANGE_LANGUAGE_EVENT, (lang: string) => { + this.lang = lang + this.texts = this.resolveTexts() + this.updateContextMenuItems() + }) + } + + resolveTexts() { + return { + copy: I18N.parserText('mindMap.contextMenu.copy', this.lang), + cut: I18N.parserText('mindMap.contextMenu.cut', this.lang), + paste: I18N.parserText('mindMap.contextMenu.paste', this.lang), + delete: I18N.parserText('mindMap.contextMenu.deleteContent', this.lang), + } + } + + updateContextMenuItems() { + if (!this.blot.contextMenu) return + + const menuItems = this.blot.contextMenu.querySelectorAll('.mind-map-context-menu-item') + if (menuItems.length >= 4) { + menuItems[0].textContent = this.texts.copy + menuItems[1].textContent = this.texts.cut + menuItems[2].textContent = this.texts.paste + menuItems[3].textContent = this.texts.delete + } + } +} + +const contextMenuHandlers = new WeakMap() + +export function initContextMenu(blot: MindMapPlaceholderBlot, quill: FluentEditor): void { + blot.contextMenu = document.createElement('div') + blot.contextMenu.className = 'mind-map-context-menu' + blot.contextMenu.style.position = 'fixed' + blot.contextMenu.style.background = 'white' + blot.contextMenu.style.borderRadius = '4px' + blot.contextMenu.style.boxShadow = '0 2px 10px rgba(0,0,0,0.1)' + blot.contextMenu.style.padding = '5px 0' + blot.contextMenu.style.zIndex = '1000' + blot.contextMenu.style.display = 'block' + blot.contextMenu.style.visibility = 'visible' + blot.contextMenu.style.opacity = '1' + blot.contextMenu.style.width = '120px' + blot.contextMenu.style.height = 'auto' + document.body.appendChild(blot.contextMenu) + + const handler = new MindMapContextMenuHandler(quill, blot) + contextMenuHandlers.set(blot, handler) + + addContextMenuItem(blot, handler.getText('copy'), () => handleCopy(blot)) + addContextMenuItem(blot, handler.getText('cut'), () => handleCut(blot)) + addContextMenuItem(blot, handler.getText('paste'), () => handlePaste(blot)) + addContextMenuItem(blot, handler.getText('delete'), () => handleDeleteContent(blot)) + + // 监听节点右键点击事件 + if (blot.mindMap) { + blot.mindMap.on('node_contextmenu', (e: any, node: any) => { + e.preventDefault() + e.stopPropagation() + blot.currentNode = node + if (blot.contextMenu) { + blot.contextMenu.style.display = 'block' + blot.contextMenu.style.left = `${e.clientX}px` + blot.contextMenu.style.top = `${e.clientY}px` + } + }) + } + + // 隐藏菜单的逻辑 + const hideMenu = () => { + if (blot.contextMenu) { + blot.contextMenu.style.display = 'none' + blot.currentNode = null + } + } + + blot.mindMap.on('node_click', hideMenu) + blot.mindMap.on('draw_click', hideMenu) + blot.mindMap.on('expand_btn_click', hideMenu) + document.addEventListener('click', (e) => { + if (blot.contextMenu && !blot.contextMenu.contains(e.target as Node)) { + hideMenu() + } + }) +} + +function addContextMenuItem(blot: MindMapPlaceholderBlot, text: string, onClick: () => void): void { + const item = document.createElement('div') + item.className = 'mind-map-context-menu-item' + item.textContent = text + item.style.padding = '5px 15px' + item.style.cursor = 'pointer' + item.style.whiteSpace = 'nowrap' + item.addEventListener('click', onClick) + item.addEventListener('mouseenter', () => { + item.style.background = '#f5f5f5' + }) + item.addEventListener('mouseleave', () => { + item.style.background = 'white' + }) + blot.contextMenu!.appendChild(item) +} + +function handleCopy(blot: MindMapPlaceholderBlot): void { + blot.mindMap.renderer.copy() + hideContextMenu(blot) +} + +function handleCut(blot: MindMapPlaceholderBlot): void { + blot.mindMap.renderer.cut() + hideContextMenu(blot) +} + +function handlePaste(blot: MindMapPlaceholderBlot): void { + blot.mindMap.renderer.paste() + hideContextMenu(blot) +} + +function handleDeleteContent(blot: MindMapPlaceholderBlot): void { + if (blot.currentNode) { + blot.currentNode.setText('') + blot.data = blot.mindMap.getData({}) + blot.domNode.setAttribute('data-mind-map', JSON.stringify(blot.data)) + blot.scroll.update([], {}) + } + hideContextMenu(blot) +} + +function hideContextMenu(blot: MindMapPlaceholderBlot): void { + if (blot.contextMenu) { + blot.contextMenu.style.display = 'none' + } +} diff --git a/packages/fluent-editor/src/modules/mind-map/modules/control-panel.ts b/packages/fluent-editor/src/modules/mind-map/modules/control-panel.ts new file mode 100644 index 00000000..0ddb288e --- /dev/null +++ b/packages/fluent-editor/src/modules/mind-map/modules/control-panel.ts @@ -0,0 +1,255 @@ +import type FluentEditor from '../../../core/fluent-editor' +import type MindMapPlaceholderBlot from '../formats/mind-map-blot' +import { CHANGE_LANGUAGE_EVENT } from '../../../config' +import { I18N } from '../../../modules/i18n' +import { registerMindMapI18N } from '../i18n' + +class MindMapControlPanelHandler { + private texts: Record + private lang: string + getText(key: keyof Record): string { + return this.texts[key] + } + + constructor(private quill: FluentEditor, private blot: MindMapPlaceholderBlot) { + registerMindMapI18N(I18N) + this.lang = 'en-US' + this.texts = this.resolveTexts() + this.quill.emitter.on(CHANGE_LANGUAGE_EVENT, (lang: string) => { + this.lang = lang + this.texts = this.resolveTexts() + this.updateControlPanelTexts() + }) + } + + resolveTexts() { + return { + zoomOut: I18N.parserText('mindMap.controlPanel.zoomOut', this.lang), + zoomIn: I18N.parserText('mindMap.controlPanel.zoomIn', this.lang), + fit: I18N.parserText('mindMap.controlPanel.fit', this.lang), + back: I18N.parserText('mindMap.controlPanel.back', this.lang), + forward: I18N.parserText('mindMap.controlPanel.forward', this.lang), + export: I18N.parserText('mindMap.controlPanel.export', this.lang), + import: I18N.parserText('mindMap.controlPanel.import', this.lang), + inserChildNode: I18N.parserText('mindMap.controlPanel.inserChildNode', this.lang), + inserNode: I18N.parserText('mindMap.controlPanel.inserNode', this.lang), + inserParentNode: I18N.parserText('mindMap.controlPanel.inserParentNode', this.lang), + removeNode: I18N.parserText('mindMap.controlPanel.removeNode', this.lang), + + zoomOutTitle: I18N.parserText('mindMap.controlPanel.zoomOutTitle', this.lang), + zoomInTitle: I18N.parserText('mindMap.controlPanel.zoomInTitle', this.lang), + fitTitle: I18N.parserText('mindMap.controlPanel.fitTitle', this.lang), + backTitle: I18N.parserText('mindMap.controlPanel.backTitle', this.lang), + forwardTitle: I18N.parserText('mindMap.controlPanel.forwardTitle', this.lang), + exportTitle: I18N.parserText('mindMap.controlPanel.exportTitle', this.lang), + importTitle: I18N.parserText('mindMap.controlPanel.importTitle', this.lang), + inserChildNodeTitle: I18N.parserText('mindMap.controlPanel.inserChildNodeTitle', this.lang), + inserNodeTitle: I18N.parserText('mindMap.controlPanel.inserNodeTitle', this.lang), + inserParentNodeTitle: I18N.parserText('mindMap.controlPanel.inserParentNodeTitle', this.lang), + removeNodeTitle: I18N.parserText('mindMap.controlPanel.removeNodeTitle', this.lang), + } + } + + updateControlPanelTexts() { + const controlItems = this.blot.domNode.querySelectorAll('.mind-map-control-item') + controlItems.forEach((item) => { + const icon = item.querySelector('i') + if (icon) { + const iconClass = icon.className.split('-')[3] + if (this.texts[iconClass]) { + const textSpan = item.querySelector('.mind-map-control-text') + if (textSpan) { + textSpan.textContent = this.texts[iconClass] + } + (item as HTMLElement).title = this.texts[`${iconClass}Title`] || '' + } + } + }) + } +} + +const controlPanelHandlers = new WeakMap() + +const DISABLED_OPACITY = '0.5' +const ENABLED_OPACITY = '1' +export function createControlPanel(blot: MindMapPlaceholderBlot, quill: FluentEditor): void { + let isStart = true + let isEnd = true + // 右上的控制面板 + const controlPanel = document.createElement('div') + controlPanel.className = 'mind-map-control' + // 左下的控制面板 + const controlLeftDownPanel = document.createElement('div') + controlLeftDownPanel.className = 'mind-map-left-down-control' + // 左上的控制面板 + const controlLeftUpPanel = document.createElement('div') + controlLeftUpPanel.className = 'mind-map-left-up-control' + + const handler = new MindMapControlPanelHandler(quill, blot) + controlPanelHandlers.set(blot, handler) + + const zoomOutBtn = createControlItem('zoomOut', handler.getText('zoomOut'), handler.getText('zoomOutTitle'), () => handleZoomOut(blot)) + const zoomInBtn = createControlItem('zoomIn', handler.getText('zoomIn'), handler.getText('zoomInTitle'), () => handleZoomIn(blot)) + const resetBtn = createControlItem('fit', handler.getText('fit'), handler.getText('fitTitle'), () => handleResetZoom(blot)) + const backBtn = createControlItem('back', handler.getText('back'), handler.getText('backTitle'), () => { + if (!isStart) { + blot.mindMap.execCommand('BACK') + } + }) + const forwardBtn = createControlItem('forward', handler.getText('forward'), handler.getText('forwardTitle'), () => { + if (!isEnd) { + blot.mindMap.execCommand('FORWARD') + } + }) + const exportJSON = createControlItem('export', handler.getText('export'), handler.getText('exportTitle'), () => handleExport(blot)) + const importJSON = createControlItem('import', handler.getText('import'), handler.getText('importTitle'), () => handleImport(blot)) + const insertChildNode = createControlItem('inserChildNode', handler.getText('inserChildNode'), handler.getText('inserChildNodeTitle'), () => handleInsertChildNode(blot)) + const insertNode = createControlItem('inserNode', handler.getText('inserNode'), handler.getText('inserNodeTitle'), () => handleInsertNode(blot)) + const insertParentNode = createControlItem('inserParentNode', handler.getText('inserParentNode'), handler.getText('inserParentNodeTitle'), () => handleInsertParentNode(blot)) + const removeNode = createControlItem('removeNode', handler.getText('removeNode'), handler.getText('removeNodeTitle'), () => handleRemoveNode(blot)) + + const updateButtonState = (index: number, len: number) => { + isStart = index <= 0 + isEnd = index >= len - 1 + backBtn.style.cursor = isStart ? 'not-allowed' : 'pointer' + backBtn.style.opacity = isStart ? DISABLED_OPACITY : ENABLED_OPACITY + forwardBtn.style.cursor = isEnd ? 'not-allowed' : 'pointer' + forwardBtn.style.opacity = isEnd ? DISABLED_OPACITY : ENABLED_OPACITY + } + + blot.mindMap.on('back_forward', (index: number, len: number) => { + updateButtonState(index, len) + }) + controlPanel.append(zoomOutBtn, zoomInBtn, resetBtn, backBtn, forwardBtn) + blot.domNode.appendChild(controlPanel) + controlLeftDownPanel.append(exportJSON, importJSON) + blot.domNode.appendChild(controlLeftDownPanel) + controlLeftUpPanel.append(insertChildNode, insertNode, insertParentNode, removeNode) + blot.domNode.appendChild(controlLeftUpPanel) +} + +function createControlItem(iconClass: string, text: string, title: string, onClick: () => void, disabled = false) { + const controlItem = document.createElement('div') + controlItem.className = 'mind-map-control-item' + controlItem.title = title + controlItem.style.cursor = disabled ? 'not-allowed' : 'pointer' + controlItem.style.opacity = disabled ? DISABLED_OPACITY : ENABLED_OPACITY + + const icon = document.createElement('i') + icon.className = `mind-map-control-${iconClass}` + + const textSpan = document.createElement('span') + textSpan.className = 'mind-map-control-text' + textSpan.textContent = text + + controlItem.appendChild(icon) + controlItem.appendChild(textSpan) + + if (!disabled) { + controlItem.addEventListener('click', onClick) + } + + return controlItem +} + +function handleInsertChildNode(blot: MindMapPlaceholderBlot): void { + blot.mindMap.execCommand('INSERT_CHILD_NODE') +} + +function handleInsertNode(blot: MindMapPlaceholderBlot): void { + blot.mindMap.execCommand('INSERT_NODE') +} + +function handleInsertParentNode(blot: MindMapPlaceholderBlot): void { + blot.mindMap.execCommand('INSERT_PARENT_NODE') +} + +function handleRemoveNode(blot: MindMapPlaceholderBlot): void { + blot.mindMap.execCommand('REMOVE_CURRENT_NODE') +} + +function handleExport(blot: MindMapPlaceholderBlot): void { + blot.mindMap.getElRectInfo() + if (blot.mindMap) { + blot.mindMap.export('json', true, '思维导图') + } +} + +function handleImport(blot: MindMapPlaceholderBlot): void { + const fileInput = document.createElement('input') + fileInput.type = 'file' + fileInput.accept = '.json' + fileInput.style.display = 'none' + + // 监听文件选择事件 + fileInput.addEventListener('change', (e) => { + const file = (e.target as HTMLInputElement).files?.[0] + if (!file) return + + const reader = new FileReader() + reader.onload = (event) => { + try { + const jsonData = JSON.parse(event.target?.result as string) + if (blot.mindMap) { + if (jsonData.root) { + blot.mindMap.setFullData(jsonData) + } + else { + blot.mindMap.setData(jsonData) + } + blot.mindMap.view.reset() + blot.data = blot.mindMap.getData({}) + blot.domNode.setAttribute('data-mind-map', JSON.stringify(blot.data)) + blot.scroll.update([], {}) + } + } + catch (error) { + alert('文件解析错误,请确保选择的是有效的JSON文件') + } + } + reader.readAsText(file) + }) + + // 触发文件选择对话框 + document.body.appendChild(fileInput) + fileInput.click() + document.body.removeChild(fileInput) +} + +function handleZoomIn(blot: MindMapPlaceholderBlot): void { + if (blot.mindMap && blot.mindMap.view) { + const containerRect = blot.mindMap.el.getBoundingClientRect() + const cx = containerRect.width / 2 + const cy = containerRect.height / 2 + blot.mindMap.view.enlarge(cx, cy, false) + blot.zoomCount++ + } +} + +function handleZoomOut(blot: MindMapPlaceholderBlot): void { + if (blot.mindMap && blot.mindMap.view) { + const containerRect = blot.mindMap.el.getBoundingClientRect() + const cx = containerRect.width / 2 + const cy = containerRect.height / 2 + blot.mindMap.view.narrow(cx, cy, false) + blot.zoomCount-- + } +} + +function handleResetZoom(blot: MindMapPlaceholderBlot): void { + if (!blot.mindMap || !blot.mindMap.view || blot.zoomCount === 0) return + const containerRect = blot.mindMap.el.getBoundingClientRect() + const centerX = containerRect.width / 2 + const centerY = containerRect.height / 2 + const operationCount = Math.abs(blot.zoomCount) + const isEnlarge = blot.zoomCount < 0 + for (let i = 0; i < operationCount; i++) { + if (isEnlarge) { + blot.mindMap.view.enlarge(centerX, centerY, false) + } + else { + blot.mindMap.view.narrow(centerX, centerY, false) + } + } + blot.zoomCount = 0 +} diff --git a/packages/fluent-editor/src/modules/mind-map/style/mind-map.scss b/packages/fluent-editor/src/modules/mind-map/style/mind-map.scss new file mode 100644 index 00000000..109b57e0 --- /dev/null +++ b/packages/fluent-editor/src/modules/mind-map/style/mind-map.scss @@ -0,0 +1,156 @@ +.mind-map-control { + position: absolute; + top: 8px; + right: 13px; + background-color: rgba(255, 255, 255, 0.85); + border-radius: 8px; + box-shadow: 0 3px 15px rgba(0, 0, 0, 0.15); + padding: 0 15px; + display: inline-flex; + gap: 6px; + white-space: nowrap; + pointer-events: auto; + .mind-map-control-item { + align-items: center; + cursor: pointer; + display: flex; + flex-direction: column; + justify-content: center; + padding: 5px 10px; + transition: all 0.2s ease; + .mind-map-control-text { + height: 20px; + font-size: 12px; + } + } +} + +.ql-mind-map { + position: relative; + width: 100%; + height: 100%; + overflow: hidden; +} + +.mind-map-control-item.disabled { + opacity: 0.5; + cursor: not-allowed; + pointer-events: none; +} + +.mind-map-control-icon { + width: 16px; + height: 16px; + margin-right: 6px; + display: flex; + align-items: center; + justify-content: center; +} +.mind-map-control-item i { + background-size: cover; + display: inline-block; + height: 20px; + vertical-align: middle; + width: 20px; +} +.mind-map-control-zoomOut { + background-image: url('../icons/zoomOutIcon.png'); +} +.mind-map-control-zoomIn { + background-image: url('../icons/zoomInIcon.png'); +} +.mind-map-control-fit { + background-image: url('../icons/fitIcon.png'); +} +.mind-map-control-back { + background-image: url('../icons/backIcon.png'); +} +.mind-map-control-forward { + background-image: url('../icons/forwardIcon.png'); +} +.mind-map-control-item:hover { + background-color: #efefef; +} + +.mind-map-left-down-control { + position: absolute; + bottom: 6px; + left: 6px; + background-color: rgba(255, 255, 255, 0.85); + border-radius: 8px; + box-shadow: 0 3px 15px rgba(0, 0, 0, 0.15); + display: inline-flex; + gap: 6px; + white-space: nowrap; + pointer-events: auto; + .mind-map-control-item { + align-items: center; + cursor: pointer; + display: flex; + flex-direction: column; + justify-content: center; + padding: 5px 5px; + transition: all 0.2s ease; + .mind-map-control-text { + height: 20px; + font-size: 12px; + } + } +} +.mind-map-left-up-control { + position: absolute; + top: 2px; + left: 2px; + display: inline-flex; + gap: 6px; + white-space: nowrap; + pointer-events: auto; + flex-direction: column; + background: hsla(0, 0%, 100%, 0.8); + border-radius: 5px; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); + margin: 5px; + padding: 15px 5px; + .mind-map-control-item { + align-items: center; + cursor: pointer; + display: flex; + flex-direction: column; + justify-content: center; + padding: 5px 0px; + transition: all 0.2s ease; + .mind-map-control-text { + font-size: 12px; + margin-top: 5px; + } + } +} +.mind-map-control-export { + background-image: url('../icons/exportIcon.png'); +} +.mind-map-control-import { + background-image: url('../icons/importIcon.png'); +} +.mind-map-control-inserChildNode { + background-image: url('../icons/childNodeIcon.png'); +} +.mind-map-control-inserNode { + background-image: url('../icons/levelNodeIcon.png'); +} +.mind-map-control-inserParentNode { + background-image: url('../icons/parentNodeIcon.png'); +} +.mind-map-control-removeNode { + background-image: url('../icons/deleteNodeIcon.png'); +} + +.mind-map-context-menu { + font-size: 14px; + color: #333; + user-select: none; + .mind-map-context-menu-item { + &:hover { + background-color: #f5f5f5; + } + } +} diff --git a/packages/fluent-editor/src/modules/shortcut-key/index.ts b/packages/fluent-editor/src/modules/shortcut-key/index.ts index df202097..d4c8e694 100644 --- a/packages/fluent-editor/src/modules/shortcut-key/index.ts +++ b/packages/fluent-editor/src/modules/shortcut-key/index.ts @@ -201,6 +201,20 @@ export class ShortCutKey extends QuillShortcutKey { title: this.quill.getLangText('file'), onClick: toolbarHandler('file'), }, + { + type: 'item' as const, + name: 'sldt', + alias: ['mind-map'], + icon: icons['mind-map'], + title: this.quill.getLangText('mind-map'), + onClick(this: Quill, range: Range | null, _: any) { + if (!range) return + const MindMapModule = this.getModule('mind-map') + if (MindMapModule && typeof (MindMapModule as any).insertMindMapEditor === 'function') { + (MindMapModule as any).insertMindMapEditor() + } + }, + }, ] } } diff --git a/packages/fluent-editor/src/ui/icons.config.ts b/packages/fluent-editor/src/ui/icons.config.ts index 6592b4b4..e2949996 100644 --- a/packages/fluent-editor/src/ui/icons.config.ts +++ b/packages/fluent-editor/src/ui/icons.config.ts @@ -314,3 +314,5 @@ export const TRIANGLE_DOWN_ICON = `` export const FORMAT_PAINTER_ICON = `` export const DIVIDER_ICON = `` + +export const MIND_MAP_ICON = `` diff --git a/packages/fluent-editor/src/ui/icons.ts b/packages/fluent-editor/src/ui/icons.ts index a23c2da1..e65b991b 100644 --- a/packages/fluent-editor/src/ui/icons.ts +++ b/packages/fluent-editor/src/ui/icons.ts @@ -25,6 +25,7 @@ import { LIST_CHECK_ICON, LIST_ORDERED_ICON, LIST_UNORDERED_ICON, + MIND_MAP_ICON, REDO_ICON, SCREENSHOT_ICON, STRIKE_ICON, @@ -75,6 +76,7 @@ const ICONS_CONFIG: { [key: string]: any } = { 'screenshot': SCREENSHOT_ICON, 'format-painter': FORMAT_PAINTER_ICON, 'divider': DIVIDER_ICON, + 'mind-map': MIND_MAP_ICON, } const Icons = FluentEditor.import('ui/icons') diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index daa4d202..45b8c0dd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,6 +32,12 @@ importers: '@floating-ui/dom': specifier: ^1.7.2 version: 1.7.2 + '@logicflow/core': + specifier: ^2.0.16 + version: 2.0.16 + '@logicflow/extension': + specifier: ^2.0.21 + version: 2.0.21(@logicflow/core@2.0.16) '@opentiny/fluent-editor': specifier: workspace:^ version: link:../fluent-editor @@ -62,6 +68,9 @@ importers: quill-toolbar-tip: specifier: ^0.0.13 version: 0.0.13(quill@2.0.3) + simple-mind-map: + specifier: 0.14.0-fix.1 + version: 0.14.0-fix.1 vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.7.2) @@ -124,6 +133,12 @@ importers: '@floating-ui/dom': specifier: ^1.7.2 version: 1.7.2 + '@logicflow/core': + specifier: ^2.0.16 + version: 2.0.16 + '@logicflow/extension': + specifier: ^2.0.21 + version: 2.0.21(@logicflow/core@2.0.16) '@types/jest': specifier: ^26.0.23 version: 26.0.24 @@ -157,6 +172,9 @@ importers: shelljs: specifier: ^0.8.4 version: 0.8.5 + simple-mind-map: + specifier: 0.14.0-fix.1 + version: 0.14.0-fix.1 ts-jest: specifier: ^26.5.6 version: 26.5.6(jest@26.6.3(ts-node@9.1.1(typescript@4.9.5)))(typescript@4.9.5) @@ -346,6 +364,9 @@ packages: '@antfu/utils@0.7.10': resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + '@antv/hierarchy@0.6.14': + resolution: {integrity: sha512-V3uknf7bhynOqQDw2sg+9r9DwZ9pc6k/EcqyTFdfXB1+ydr7urisP0MipIuimucvQKN+Qkd+d6w601r1UIroqQ==} + '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} @@ -1005,6 +1026,14 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@logicflow/core@2.0.16': + resolution: {integrity: sha512-KoNdY5g7WcAtfk7sMe+uOOso28mw6dwCHgLKmnzC0nenASD0HGWhFq+Yo7ktHP2asMXUISPb9hbQA221NcYZdg==} + + '@logicflow/extension@2.0.21': + resolution: {integrity: sha512-SdYBOnDlCEOEElScGFIprgxqH0fv39ur7suyYzhiWUaWjL/TpvIESgqcR/ujE9aolFNTtzv2USc6xPcrouc4PQ==} + peerDependencies: + '@logicflow/core': 2.0.16 + '@microsoft/api-extractor-model@7.30.2': resolution: {integrity: sha512-3/t2F+WhkJgBzSNwlkTIL0tBgUoBqDqL66pT+nh2mPbM0NIDGVGtpqbGWPgHIzn/mn7kGS/Ep8D8po58e8UUIw==} @@ -1059,42 +1088,36 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.0': resolution: {integrity: sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.0': resolution: {integrity: sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.0': resolution: {integrity: sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.0': resolution: {integrity: sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.0': resolution: {integrity: sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [musl] '@parcel/watcher-win32-arm64@2.5.0': resolution: {integrity: sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==} @@ -1118,6 +1141,12 @@ packages: resolution: {integrity: sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==} engines: {node: '>= 10.0.0'} + '@pdf-lib/standard-fonts@1.0.0': + resolution: {integrity: sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==} + + '@pdf-lib/upng@1.0.1': + resolution: {integrity: sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==} + '@pkgr/core@0.1.1': resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -1170,61 +1199,51 @@ packages: resolution: {integrity: sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.31.0': resolution: {integrity: sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.31.0': resolution: {integrity: sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.31.0': resolution: {integrity: sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-loongarch64-gnu@4.31.0': resolution: {integrity: sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ==} cpu: [loong64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-powerpc64le-gnu@4.31.0': resolution: {integrity: sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.31.0': resolution: {integrity: sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.31.0': resolution: {integrity: sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.31.0': resolution: {integrity: sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.31.0': resolution: {integrity: sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.31.0': resolution: {integrity: sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw==} @@ -1293,12 +1312,18 @@ packages: '@sinonjs/fake-timers@6.0.1': resolution: {integrity: sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==} + '@sphinxxxx/color-conversion@2.2.2': + resolution: {integrity: sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw==} + '@stylistic/eslint-plugin@2.13.0': resolution: {integrity: sha512-RnO1SaiCFHn666wNz2QfZEFxvmiNRqhzaMXHXxXXKt+MEP7aajlPxUSMIQpKAaJfverpovEYqjBOXDq6dDcaOQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.40.0' + '@svgdotjs/svg.js@3.2.0': + resolution: {integrity: sha512-Tr8p+QVP7y+QT1GBlq1Tt57IvedVH8zCPoYxdHLX0Oof3a/PqnC/tXAkVufv1JQJfsDHlH/UrjcDfgxSofqSNA==} + '@tailwindcss/node@4.0.0': resolution: {integrity: sha512-tfG2uBvo6j6kDIPmntxwXggCOZAt7SkpAXJ6pTIYirNdk5FBqh/CZZ9BZPpgcl/tNFLs6zc4yghM76sqiELG9g==} @@ -1337,28 +1362,24 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.0.0': resolution: {integrity: sha512-abhusswkduYWuezkBmgo0K0/erGq3M4Se5xP0fhc/0dKs0X/rJUYYCFWntHb3IGh3aVzdQ0SXJs93P76DbUqtw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.0.0': resolution: {integrity: sha512-hGtRYIUEx377/HlU49+jvVKKwU1MDSKYSMMs0JFO2Wp7LGxk5+0j5+RBk9NFnmp/lbp32yPTgIOO5m1BmDq36A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.0.0': resolution: {integrity: sha512-7xgQgSAThs0I14VAgmxpJnK6XFSZBxHMGoDXkLyYkEnu+8WRQMbCP93dkCUn2PIv+Q+JulRgc00PJ09uORSLXQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@tailwindcss/oxide-win32-arm64-msvc@4.0.0': resolution: {integrity: sha512-qEcgTIPcWY5ZE7f6VxQ/JPrSFMcehzVIlZj7sGE3mVd5YWreAT+Fl1vSP8q2pjnWXn0avZG3Iw7a2hJQAm+fTQ==} @@ -1456,6 +1477,9 @@ packages: '@types/markdown-it@14.1.2': resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + '@types/mdast@3.0.15': + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -1477,6 +1501,9 @@ packages: '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -1703,10 +1730,23 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-loose@6.1.0: + resolution: {integrity: sha512-FHhXoiF0Uch3IqsrnPpWwCtiv5PYvipTpT1k9lDMgQVVYc9iDuSl5zdJV358aI8twfHCYMFBRVYvAVki9wC/ng==} + engines: {node: '>=0.4.0'} + + acorn-walk@6.2.0: + resolution: {integrity: sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==} + engines: {node: '>=0.4.0'} + acorn-walk@7.2.0: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} engines: {node: '>=0.4.0'} + acorn@6.4.2: + resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} + engines: {node: '>=0.4.0'} + hasBin: true + acorn@7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} @@ -1864,6 +1904,9 @@ packages: resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} engines: {node: '>= 0.6.0'} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + base@0.11.2: resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} engines: {node: '>=0.10.0'} @@ -1906,6 +1949,9 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -1992,6 +2038,9 @@ packages: resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} engines: {node: '>=0.10.0'} + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + clean-regexp@1.0.0: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} engines: {node: '>=4'} @@ -2102,6 +2151,9 @@ packages: core-js-compat@3.40.0: resolution: {integrity: sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -2187,6 +2239,10 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deepmerge@1.5.2: + resolution: {integrity: sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==} + engines: {node: '>=0.10.0'} + deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -2239,6 +2295,10 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} @@ -2277,6 +2337,10 @@ packages: end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + enhanced-resolve@2.3.0: + resolution: {integrity: sha512-n6e4bsCpzsP0OB76X+vEWhySUQI8GHPVFVK+3QkX35tbryy2WoeGeK5kQ+oxzgDVHjIZyz5fyS60Mi3EpQLc0Q==} + engines: {node: '>=0.6'} + enhanced-resolve@5.18.0: resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} engines: {node: '>=10.13.0'} @@ -2289,6 +2353,9 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + err-code@3.0.1: + resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==} + errno@0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true @@ -2554,6 +2621,9 @@ packages: eventemitter3@2.0.3: resolution: {integrity: sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==} + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -2704,6 +2774,9 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-browser-rtc@1.1.0: + resolution: {integrity: sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ==} + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -2835,6 +2908,9 @@ packages: highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + hoist-non-react-statics@2.5.5: + resolution: {integrity: sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==} + hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} @@ -2879,6 +2955,9 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -2888,6 +2967,9 @@ packages: engines: {node: '>=0.10.0'} hasBin: true + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + immutable@5.0.3: resolution: {integrity: sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==} @@ -3061,6 +3143,9 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} + isomorphic.js@0.2.5: + resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} + istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -3277,6 +3362,9 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + katex@0.16.21: resolution: {integrity: sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==} hasBin: true @@ -3300,6 +3388,10 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} @@ -3316,6 +3408,14 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lib0@0.2.109: + resolution: {integrity: sha512-jP0gbnyW0kwlx1Atc4dcHkBbrVAkdHjuyHxtClUPYla7qCmwIif1qZ6vQeJdR5FrOVdn26HvQT0ko01rgW7/Xw==} + engines: {node: '>=16'} + hasBin: true + + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + lightningcss-darwin-arm64@1.29.1: resolution: {integrity: sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==} engines: {node: '>= 12.0.0'} @@ -3345,28 +3445,24 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] lightningcss-linux-arm64-musl@1.29.1: resolution: {integrity: sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [musl] lightningcss-linux-x64-gnu@1.29.1: resolution: {integrity: sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [glibc] lightningcss-linux-x64-musl@1.29.1: resolution: {integrity: sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [musl] lightningcss-win32-arm64-msvc@1.29.1: resolution: {integrity: sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==} @@ -3507,6 +3603,9 @@ packages: mdast-util-find-and-replace@3.0.2: resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + mdast-util-from-markdown@2.0.2: resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} @@ -3540,12 +3639,21 @@ packages: mdast-util-to-markdown@2.1.2: resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} mdurl@1.0.1: resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + medium-editor@5.23.3: + resolution: {integrity: sha512-he9/TdjX8f8MGdXGfCs8AllrYnqXJJvjNkDKmPg3aPW/uoIrlRqtkFthrwvmd+u4QyzEiadhCCM0EwTiRdUCJw==} + + memory-fs@0.3.0: + resolution: {integrity: sha512-QTNXnl79X97kZ9jJk/meJrtDuvgvRakX5LU7HZW1L7MsXHuSTwoMIzN9tOLLH3Xfsj/gbsSqX/ovnsqz246zKQ==} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -3553,6 +3661,9 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + micromark-core-commonmark@2.0.2: resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} @@ -3580,63 +3691,123 @@ packages: micromark-extension-gfm@3.0.0: resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + micromark-factory-destination@2.0.1: resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + micromark-factory-label@2.0.1: resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + micromark-factory-space@2.0.1: resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + micromark-factory-title@2.0.1: resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + micromark-factory-whitespace@2.0.1: resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + micromark-util-character@2.1.1: resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + micromark-util-chunked@2.0.1: resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + micromark-util-classify-character@2.0.1: resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + micromark-util-combine-extensions@2.0.1: resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + micromark-util-decode-numeric-character-reference@2.0.2: resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + micromark-util-decode-string@2.0.1: resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + micromark-util-encode@2.0.1: resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + micromark-util-html-tag-name@2.0.1: resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + micromark-util-normalize-identifier@2.0.1: resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + micromark-util-resolve-all@2.0.1: resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + micromark-util-sanitize-uri@2.0.1: resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + micromark-util-subtokenize@2.0.4: resolution: {integrity: sha512-N6hXjrin2GTJDe3MVjf5FuXpm12PGm80BrUAeub9XFXca8JZbP+oIwY4LJSVwFUCL1IPm/WwSVUN7goFHmSGGQ==} + micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + micromark-util-symbol@2.0.1: resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + micromark-util-types@2.0.1: resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + micromark@4.0.1: resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} @@ -3708,6 +3879,27 @@ packages: mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + mobx-preact@3.0.0: + resolution: {integrity: sha512-ijan/cBs3WmRye87E5+3JmoFBB00KDAwNA3pm7bMwYLPHBAXlN86aC3gdrXw8aKzM5RI8V3a993PphzPv6P4FA==} + peerDependencies: + mobx: 5.x + preact: '>=8' + + mobx-utils@5.6.2: + resolution: {integrity: sha512-a/WlXyGkp6F12b01sTarENpxbmlRgPHFyR1Xv2bsSjQBm5dcOtd16ONb40/vOqck8L99NHpI+C9MXQ+SZ8f+yw==} + peerDependencies: + mobx: ^4.13.1 || ^5.13.1 + + mobx@5.15.7: + resolution: {integrity: sha512-wyM3FghTkhmC+hQjyPGGFdpehrcX1KOXsDuERhfK2YbJemkUhEB+6wzEN639T21onxlfYBmriA1PFnvxTUhcKw==} + + mousetrap@1.6.5: + resolution: {integrity: sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -3778,6 +3970,10 @@ packages: nwsapi@2.2.16: resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==} + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + object-copy@0.1.0: resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} engines: {node: '>=0.10.0'} @@ -3851,6 +4047,9 @@ packages: package-manager-detector@0.2.8: resolution: {integrity: sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==} + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + parchment@1.1.4: resolution: {integrity: sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==} @@ -3909,6 +4108,9 @@ packages: pathe@2.0.2: resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} + pdf-lib@1.17.1: + resolution: {integrity: sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==} + perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} @@ -3993,6 +4195,9 @@ packages: resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} engines: {node: '>= 10'} + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -4062,6 +4267,12 @@ packages: resolution: {integrity: sha512-xEYQBqfYx/sfb33VJiKnSJp8ehloavImQ2A6564GAbqG55PGw1dAWUn1MUbQB62t0azawUS2CZZhWCjO8gRvTw==} engines: {npm: '>=8.2.3'} + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + rangy@1.3.2: + resolution: {integrity: sha512-fS1C4MOyk8T+ZJZdLcgrukPWxkyDXa+Hd2Kj+Zg4wIK71yrWgmjzHubzPMY1G+WD9EgGxMp3fIL0zQ1ickmSWA==} + react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} @@ -4073,6 +4284,13 @@ packages: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readdirp@4.1.1: resolution: {integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==} engines: {node: '>= 14.18.0'} @@ -4155,6 +4373,10 @@ packages: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} + resolve-from@2.0.0: + resolution: {integrity: sha512-qpFcKaXsq8+oRoLilkwyc7zHGF5i9Q2/25NIgLQQ/+VVv9rU4qvr6nXVAw1DsnXJyQkZsR4Ytfbtg5ehfcUssQ==} + engines: {node: '>=0.10.0'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -4210,6 +4432,16 @@ packages: rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-regex@1.1.0: resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} @@ -4278,6 +4510,9 @@ packages: resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} engines: {node: '>=0.10.0'} + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -4308,6 +4543,12 @@ packages: signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + simple-mind-map@0.14.0-fix.1: + resolution: {integrity: sha512-LuX2+32cS/lIB2AxmzkLZi5NHbrHuXBha3v0O376PE75K4ivAFoXYzJQ661/ls2E16ZOWwgvx9q4znt7jTBXxA==} + + simple-peer@9.11.1: + resolution: {integrity: sha512-D1SaWpOW8afq1CZGWB8xTfrT3FekjQmPValrqncJMX7QFl8YwhrPTZvMCANLtgBwwdS+7zURyqxDDEmY558tTw==} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -4425,6 +4666,12 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} @@ -4501,6 +4748,10 @@ packages: tailwindcss@4.0.0: resolution: {integrity: sha512-ULRPI3A+e39T7pSaf1xoi58AqqJxVCLg8F/uM5A3FadUbnyDTgltVnXJvdkTjwCOGA6NazqHVcwPJC5h2vRYVQ==} + tapable@0.2.9: + resolution: {integrity: sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==} + engines: {node: '>=0.6'} + tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -4509,6 +4760,10 @@ packages: resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} engines: {node: '>=8'} + tern@0.24.3: + resolution: {integrity: sha512-Z8uvtdWIlFn1GWy0HW5FhZ8VDryZwoJUdnjZU25C7/PBOltLIn1uv+WF3rVq6S1761YbsmbZYRP/l0ZJBCkvrw==} + hasBin: true + test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -4586,6 +4841,9 @@ packages: peerDependencies: typescript: '>=2.7' + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -4656,6 +4914,9 @@ packages: unist-util-remove@4.0.0: resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} + unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} @@ -4707,6 +4968,15 @@ packages: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + v8-to-istanbul@7.1.2: resolution: {integrity: sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==} engines: {node: '>=10.10.0'} @@ -4714,6 +4984,9 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + vanilla-picker@2.12.3: + resolution: {integrity: sha512-qVkT1E7yMbUsB2mmJNFmaXMWE2hF8ffqzMMwe9zdAikd8u2VfnsVY2HQcOUi2F38bgbxzlJBEdS1UUhOXdF9GQ==} + vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} @@ -4930,6 +5203,22 @@ packages: utf-8-validate: optional: true + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-js@1.6.11: + resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} + hasBin: true + xml-name-validator@3.0.0: resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} @@ -4940,6 +5229,19 @@ packages: xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + y-protocols@1.0.6: + resolution: {integrity: sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + yjs: ^13.0.0 + + y-webrtc@10.3.0: + resolution: {integrity: sha512-KalJr7dCgUgyVFxoG3CQYbpS0O2qybegD0vI4bYnYHI0MOwoVbucED3RZ5f2o1a5HZb1qEssUKS0H/Upc6p1lA==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + yjs: ^13.6.8 + y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} @@ -4986,6 +5288,10 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yjs@13.6.27: + resolution: {integrity: sha512-OIDwaflOaq4wC6YlPBy2L6ceKeKuF7DeTxx+jPzv1FHn9tCZ0ZwSRnUBxD05E3yed46fv/FWJbvR+Ud7x0L7zw==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -5164,6 +5470,8 @@ snapshots: '@antfu/utils@0.7.10': {} + '@antv/hierarchy@0.6.14': {} + '@babel/code-frame@7.26.2': dependencies: '@babel/helper-validator-identifier': 7.25.9 @@ -5836,6 +6144,29 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@logicflow/core@2.0.16': + dependencies: + classnames: 2.5.1 + lodash-es: 4.17.21 + mobx: 5.15.7 + mobx-preact: 3.0.0(mobx@5.15.7)(preact@10.25.4) + mobx-utils: 5.6.2(mobx@5.15.7) + mousetrap: 1.6.5 + preact: 10.25.4 + uuid: 9.0.1 + + '@logicflow/extension@2.0.21(@logicflow/core@2.0.16)': + dependencies: + '@antv/hierarchy': 0.6.14 + '@logicflow/core': 2.0.16 + classnames: 2.5.1 + lodash-es: 4.17.21 + medium-editor: 5.23.3 + mobx: 5.15.7 + preact: 10.25.4 + rangy: 1.3.2 + vanilla-picker: 2.12.3 + '@microsoft/api-extractor-model@7.30.2(@types/node@22.10.9)': dependencies: '@microsoft/tsdoc': 0.15.1 @@ -5944,6 +6275,14 @@ snapshots: '@parcel/watcher-win32-x64': 2.5.0 optional: true + '@pdf-lib/standard-fonts@1.0.0': + dependencies: + pako: 1.0.11 + + '@pdf-lib/upng@1.0.1': + dependencies: + pako: 1.0.11 + '@pkgr/core@0.1.1': {} '@playwright/test@1.49.1': @@ -6097,6 +6436,8 @@ snapshots: dependencies: '@sinonjs/commons': 1.8.6 + '@sphinxxxx/color-conversion@2.2.2': {} + '@stylistic/eslint-plugin@2.13.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.2)': dependencies: '@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.2) @@ -6109,6 +6450,8 @@ snapshots: - supports-color - typescript + '@svgdotjs/svg.js@3.2.0': {} + '@tailwindcss/node@4.0.0': dependencies: enhanced-resolve: 5.18.0 @@ -6256,6 +6599,10 @@ snapshots: '@types/linkify-it': 5.0.0 '@types/mdurl': 2.0.0 + '@types/mdast@3.0.15': + dependencies: + '@types/unist': 2.0.11 + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -6274,6 +6621,8 @@ snapshots: '@types/stack-utils@2.0.3': {} + '@types/unist@2.0.11': {} + '@types/unist@3.0.3': {} '@types/web-bluetooth@0.0.20': {} @@ -6565,8 +6914,16 @@ snapshots: dependencies: acorn: 8.14.0 + acorn-loose@6.1.0: + dependencies: + acorn: 6.4.2 + + acorn-walk@6.2.0: {} + acorn-walk@7.2.0: {} + acorn@6.4.2: {} + acorn@7.4.1: {} acorn@8.14.0: {} @@ -6743,6 +7100,8 @@ snapshots: base64-arraybuffer@1.0.2: {} + base64-js@1.5.1: {} + base@0.11.2: dependencies: cache-base: 1.0.1 @@ -6804,6 +7163,11 @@ snapshots: buffer-from@1.1.2: {} + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + builtin-modules@3.3.0: {} byte-size@9.0.1: {} @@ -6881,6 +7245,8 @@ snapshots: isobject: 3.0.1 static-extend: 0.1.2 + classnames@2.5.1: {} + clean-regexp@1.0.0: dependencies: escape-string-regexp: 1.0.5 @@ -6974,6 +7340,8 @@ snapshots: dependencies: browserslist: 4.24.4 + core-util-is@1.0.3: {} + create-require@1.1.1: {} cross-spawn@6.0.6: @@ -7049,6 +7417,8 @@ snapshots: deep-is@0.1.4: {} + deepmerge@1.5.2: {} + deepmerge@4.3.1: {} define-data-property@1.1.4: @@ -7092,6 +7462,8 @@ snapshots: diff@4.0.2: {} + diff@5.2.0: {} + doctrine@3.0.0: dependencies: esutils: 2.0.3 @@ -7124,6 +7496,13 @@ snapshots: dependencies: once: 1.4.0 + enhanced-resolve@2.3.0: + dependencies: + graceful-fs: 4.2.11 + memory-fs: 0.3.0 + object-assign: 4.1.1 + tapable: 0.2.9 + enhanced-resolve@5.18.0: dependencies: graceful-fs: 4.2.11 @@ -7133,10 +7512,11 @@ snapshots: entities@4.5.0: {} + err-code@3.0.1: {} + errno@0.1.8: dependencies: prr: 1.0.1 - optional: true error-ex@1.3.2: dependencies: @@ -7534,6 +7914,8 @@ snapshots: eventemitter3@2.0.3: {} + eventemitter3@4.0.7: {} + eventemitter3@5.0.1: {} exec-sh@0.3.6: {} @@ -7721,6 +8103,8 @@ snapshots: gensync@1.0.0-beta.2: {} + get-browser-rtc@1.1.0: {} + get-caller-file@2.0.5: {} get-intrinsic@1.2.7: @@ -7861,6 +8245,8 @@ snapshots: highlight.js@10.7.3: {} + hoist-non-react-statics@2.5.5: {} + hookable@5.5.3: {} hosted-git-info@2.8.9: {} @@ -7906,11 +8292,15 @@ snapshots: safer-buffer: 2.1.2 optional: true + ieee754@1.2.1: {} + ignore@5.3.2: {} image-size@0.5.5: optional: true + immediate@3.0.6: {} + immutable@5.0.3: {} import-fresh@3.3.0: @@ -8051,6 +8441,8 @@ snapshots: isobject@3.0.1: {} + isomorphic.js@0.2.5: {} + istanbul-lib-coverage@3.2.2: {} istanbul-lib-instrument@4.0.3: @@ -8508,6 +8900,13 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + jszip@3.10.1: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + katex@0.16.21: dependencies: commander: 8.3.0 @@ -8528,6 +8927,8 @@ snapshots: kleur@3.0.3: {} + kleur@4.1.5: {} + kolorist@1.8.0: {} less@4.2.2: @@ -8551,6 +8952,14 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lib0@0.2.109: + dependencies: + isomorphic.js: 0.2.5 + + lie@3.3.0: + dependencies: + immediate: 3.0.6 + lightningcss-darwin-arm64@1.29.1: optional: true @@ -8734,6 +9143,23 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 + mdast-util-from-markdown@1.3.1: + dependencies: + '@types/mdast': 3.0.15 + '@types/unist': 2.0.11 + decode-named-character-reference: 1.0.2 + mdast-util-to-string: 3.2.0 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + mdast-util-from-markdown@2.0.2: dependencies: '@types/mdast': 4.0.4 @@ -8848,16 +9274,46 @@ snapshots: unist-util-visit: 5.0.0 zwitch: 2.0.4 + mdast-util-to-string@3.2.0: + dependencies: + '@types/mdast': 3.0.15 + mdast-util-to-string@4.0.0: dependencies: '@types/mdast': 4.0.4 mdurl@1.0.1: {} + medium-editor@5.23.3: {} + + memory-fs@0.3.0: + dependencies: + errno: 0.1.8 + readable-stream: 2.3.8 + merge-stream@2.0.0: {} merge2@1.4.1: {} + micromark-core-commonmark@1.1.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + micromark-core-commonmark@2.0.2: dependencies: decode-named-character-reference: 1.0.2 @@ -8942,12 +9398,25 @@ snapshots: micromark-util-combine-extensions: 2.0.1 micromark-util-types: 2.0.1 + micromark-factory-destination@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + micromark-factory-destination@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.1 + micromark-factory-label@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + micromark-factory-label@2.0.1: dependencies: devlop: 1.1.0 @@ -8955,11 +9424,23 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.1 + micromark-factory-space@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + micromark-factory-space@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-types: 2.0.1 + micromark-factory-title@1.1.0: + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + micromark-factory-title@2.0.1: dependencies: micromark-factory-space: 2.0.1 @@ -8967,6 +9448,13 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.1 + micromark-factory-whitespace@1.1.0: + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + micromark-factory-whitespace@2.0.1: dependencies: micromark-factory-space: 2.0.1 @@ -8974,30 +9462,61 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.1 + micromark-util-character@1.2.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + micromark-util-character@2.1.1: dependencies: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.1 + micromark-util-chunked@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-chunked@2.0.1: dependencies: micromark-util-symbol: 2.0.1 + micromark-util-classify-character@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + micromark-util-classify-character@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.1 + micromark-util-combine-extensions@1.1.0: + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 + micromark-util-combine-extensions@2.0.1: dependencies: micromark-util-chunked: 2.0.1 micromark-util-types: 2.0.1 + micromark-util-decode-numeric-character-reference@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-decode-numeric-character-reference@2.0.2: dependencies: micromark-util-symbol: 2.0.1 + micromark-util-decode-string@1.1.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-decode-string@2.0.1: dependencies: decode-named-character-reference: 1.0.2 @@ -9005,24 +9524,49 @@ snapshots: micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-symbol: 2.0.1 + micromark-util-encode@1.1.0: {} + micromark-util-encode@2.0.1: {} + micromark-util-html-tag-name@1.2.0: {} + micromark-util-html-tag-name@2.0.1: {} + micromark-util-normalize-identifier@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-normalize-identifier@2.0.1: dependencies: micromark-util-symbol: 2.0.1 + micromark-util-resolve-all@1.1.0: + dependencies: + micromark-util-types: 1.1.0 + micromark-util-resolve-all@2.0.1: dependencies: micromark-util-types: 2.0.1 + micromark-util-sanitize-uri@1.2.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-sanitize-uri@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-encode: 2.0.1 micromark-util-symbol: 2.0.1 + micromark-util-subtokenize@1.1.0: + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + micromark-util-subtokenize@2.0.4: dependencies: devlop: 1.1.0 @@ -9030,10 +9574,36 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.1 + micromark-util-symbol@1.1.0: {} + micromark-util-symbol@2.0.1: {} + micromark-util-types@1.1.0: {} + micromark-util-types@2.0.1: {} + micromark@3.2.0: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.0(supports-color@9.4.0) + decode-named-character-reference: 1.0.2 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + micromark@4.0.1: dependencies: '@types/debug': 4.1.12 @@ -9132,6 +9702,22 @@ snapshots: pkg-types: 1.3.1 ufo: 1.5.4 + mobx-preact@3.0.0(mobx@5.15.7)(preact@10.25.4): + dependencies: + hoist-non-react-statics: 2.5.5 + mobx: 5.15.7 + preact: 10.25.4 + + mobx-utils@5.6.2(mobx@5.15.7): + dependencies: + mobx: 5.15.7 + + mobx@5.15.7: {} + + mousetrap@1.6.5: {} + + mri@1.2.0: {} + ms@2.0.0: {} ms@2.1.3: {} @@ -9212,6 +9798,8 @@ snapshots: nwsapi@2.2.16: {} + object-assign@4.1.1: {} + object-copy@0.1.0: dependencies: copy-descriptor: 0.1.1 @@ -9286,6 +9874,8 @@ snapshots: package-manager-detector@0.2.8: {} + pako@1.0.11: {} + parchment@1.1.4: {} parchment@3.0.0: {} @@ -9328,6 +9918,13 @@ snapshots: pathe@2.0.2: {} + pdf-lib@1.17.1: + dependencies: + '@pdf-lib/standard-fonts': 1.0.0 + '@pdf-lib/upng': 1.0.1 + pako: 1.0.11 + tslib: 1.14.1 + perfect-debounce@1.0.0: {} picocolors@1.1.1: {} @@ -9399,6 +9996,8 @@ snapshots: ansi-styles: 4.3.0 react-is: 17.0.2 + process-nextick-args@2.0.1: {} + prompts@2.4.2: dependencies: kleur: 3.0.3 @@ -9406,8 +10005,7 @@ snapshots: property-information@6.5.0: {} - prr@1.0.1: - optional: true + prr@1.0.1: {} psl@1.15.0: dependencies: @@ -9478,6 +10076,12 @@ snapshots: parchment: 3.0.0 quill-delta: 5.1.0 + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + rangy@1.3.2: {} + react-is@17.0.2: {} read-pkg-up@7.0.1: @@ -9493,6 +10097,22 @@ snapshots: parse-json: 5.2.0 type-fest: 0.6.0 + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readdirp@4.1.1: {} rechoir@0.6.2: @@ -9590,6 +10210,8 @@ snapshots: dependencies: resolve-from: 5.0.0 + resolve-from@2.0.0: {} + resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -9654,6 +10276,14 @@ snapshots: dependencies: tslib: 2.8.1 + sade@1.8.1: + dependencies: + mri: 1.2.0 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + safe-regex@1.1.0: dependencies: ret: 0.1.15 @@ -9682,8 +10312,7 @@ snapshots: optionalDependencies: '@parcel/watcher': 2.5.0 - sax@1.4.1: - optional: true + sax@1.4.1: {} saxes@5.0.1: dependencies: @@ -9737,6 +10366,8 @@ snapshots: is-plain-object: 2.0.4 split-string: 3.1.0 + setimmediate@1.0.5: {} + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 @@ -9771,6 +10402,39 @@ snapshots: signal-exit@3.0.7: {} + simple-mind-map@0.14.0-fix.1: + dependencies: + '@svgdotjs/svg.js': 3.2.0 + deepmerge: 1.5.2 + eventemitter3: 4.0.7 + jszip: 3.10.1 + katex: 0.16.21 + mdast-util-from-markdown: 1.3.1 + pdf-lib: 1.17.1 + quill: 2.0.3 + tern: 0.24.3 + uuid: 9.0.1 + ws: 7.5.10 + xml-js: 1.6.11 + y-webrtc: 10.3.0(yjs@13.6.27) + yjs: 13.6.27 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + simple-peer@9.11.1: + dependencies: + buffer: 6.0.3 + debug: 4.4.0(supports-color@9.4.0) + err-code: 3.0.1 + get-browser-rtc: 1.1.0 + queue-microtask: 1.2.3 + randombytes: 2.1.0 + readable-stream: 3.6.2 + transitivePeerDependencies: + - supports-color + sisteransi@1.0.5: {} slash@3.0.0: {} @@ -9899,6 +10563,14 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 @@ -9962,6 +10634,8 @@ snapshots: tailwindcss@4.0.0: {} + tapable@0.2.9: {} + tapable@2.2.1: {} terminal-link@2.1.1: @@ -9969,6 +10643,16 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 + tern@0.24.3: + dependencies: + acorn: 6.4.2 + acorn-loose: 6.1.0 + acorn-walk: 6.2.0 + enhanced-resolve: 2.3.0 + glob: 7.2.3 + minimatch: 3.1.2 + resolve-from: 2.0.0 + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 @@ -10057,6 +10741,8 @@ snapshots: typescript: 4.9.5 yn: 3.1.1 + tslib@1.14.1: {} + tslib@2.8.1: {} type-check@0.4.0: @@ -10120,6 +10806,10 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 + unist-util-stringify-position@3.0.3: + dependencies: + '@types/unist': 2.0.11 + unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.3 @@ -10172,6 +10862,15 @@ snapshots: uuid@8.3.2: optional: true + uuid@9.0.1: {} + + uvu@0.5.6: + dependencies: + dequal: 2.0.3 + diff: 5.2.0 + kleur: 4.1.5 + sade: 1.8.1 + v8-to-istanbul@7.1.2: dependencies: '@types/istanbul-lib-coverage': 2.0.6 @@ -10183,6 +10882,10 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 + vanilla-picker@2.12.3: + dependencies: + '@sphinxxxx/color-conversion': 2.2.2 + vfile-message@4.0.2: dependencies: '@types/unist': 3.0.3 @@ -10420,12 +11123,37 @@ snapshots: ws@7.5.10: {} + ws@8.18.3: + optional: true + + xml-js@1.6.11: + dependencies: + sax: 1.4.1 + xml-name-validator@3.0.0: {} xml-name-validator@4.0.0: {} xmlchars@2.2.0: {} + y-protocols@1.0.6(yjs@13.6.27): + dependencies: + lib0: 0.2.109 + yjs: 13.6.27 + + y-webrtc@10.3.0(yjs@13.6.27): + dependencies: + lib0: 0.2.109 + simple-peer: 9.11.1 + y-protocols: 1.0.6(yjs@13.6.27) + yjs: 13.6.27 + optionalDependencies: + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + y18n@4.0.3: {} y18n@5.0.8: {} @@ -10477,6 +11205,10 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yjs@13.6.27: + dependencies: + lib0: 0.2.109 + yn@3.1.1: {} yocto-queue@0.1.0: {}