From 82c34618c9c52370c6b3f4b456a9d94cc0569384 Mon Sep 17 00:00:00 2001 From: Caleb OLeary Date: Mon, 15 Aug 2022 18:19:02 -0500 Subject: [PATCH 01/81] fix(component): make Select close when option chosen with Enter key --- libs/components/ui/src/select/Select.tsx | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/libs/components/ui/src/select/Select.tsx b/libs/components/ui/src/select/Select.tsx index 7dcfcdc45a..c11ee9f3b4 100644 --- a/libs/components/ui/src/select/Select.tsx +++ b/libs/components/ui/src/select/Select.tsx @@ -1,5 +1,6 @@ import { forwardRef, + useState, type CSSProperties, type ForwardedRef, type ReactNode, @@ -39,6 +40,7 @@ export const Select = forwardRef(function CustomSelect( props: ExtendSelectProps & SelectUnstyledProps, ref: ForwardedRef ) { + const [isOpen, setIsOpen] = useState(false); const { width = '100%', style, listboxStyle, placeholder } = props; const components: SelectUnstyledProps['components'] = { // Root: generateStyledRoot({ width, ...style }), @@ -76,7 +78,21 @@ export const Select = forwardRef(function CustomSelect( ...props.components, }; - return ; + return ( + { + setIsOpen(true); + }} + {...props} + onChange={v => { + setIsOpen(false); + props.onChange && props.onChange(v); + }} + ref={ref} + components={components} + /> + ); }) as ( props: ExtendSelectProps & SelectUnstyledProps & From 17e454b1e65026cdd804602d2fb076f6b4f1013e Mon Sep 17 00:00:00 2001 From: QiShaoXuan Date: Sun, 21 Aug 2022 22:58:41 +0800 Subject: [PATCH 02/81] refactor: refactor clipboard --- .../common/src/lib/text/slate-utils.ts | 37 ++++- .../editor-blocks/src/blocks/bullet/index.ts | 9 -- .../editor-blocks/src/blocks/code/index.ts | 9 -- .../src/blocks/numbered/index.ts | 9 -- .../editor-blocks/src/blocks/page/index.ts | 9 -- .../src/blocks/text/QuoteBlock.tsx | 17 --- .../src/blocks/text/TextBlock.tsx | 33 ----- .../editor-blocks/src/blocks/todo/index.ts | 9 -- .../editor-blocks/src/blocks/youtube/index.ts | 4 +- .../src/editor/block/block-helper.ts | 114 +++++++++++++++- .../src/editor/clipboard/browser-clipboard.ts | 128 ----------------- .../editor/clipboard/clipboard-populator.ts | 38 ------ .../src/editor/clipboard/clipboard.ts | 47 +++++++ .../clipboard/clipboardEventDispatcher.ts | 82 +++++++++++ .../src/editor/clipboard/clipboardUtils.ts | 121 ++++++++++++++++ .../editor-core/src/editor/clipboard/copy.ts | 129 +++++++++++++++++- .../editor-core/src/editor/clipboard/index.ts | 0 .../editor-core/src/editor/clipboard/paste.ts | 4 +- .../editor-core/src/editor/clipboard/utils.ts | 8 +- .../editor-core/src/editor/editor.ts | 63 ++++----- .../editor-core/src/editor/index.ts | 2 +- .../editor-core/src/editor/plugin/hooks.ts | 11 +- .../editor-core/src/editor/types.ts | 10 +- .../editor-core/src/editor/views/base-view.ts | 45 +++--- 24 files changed, 592 insertions(+), 346 deletions(-) delete mode 100644 libs/components/editor-core/src/editor/clipboard/browser-clipboard.ts delete mode 100644 libs/components/editor-core/src/editor/clipboard/clipboard-populator.ts create mode 100644 libs/components/editor-core/src/editor/clipboard/clipboard.ts create mode 100644 libs/components/editor-core/src/editor/clipboard/clipboardEventDispatcher.ts create mode 100644 libs/components/editor-core/src/editor/clipboard/clipboardUtils.ts create mode 100644 libs/components/editor-core/src/editor/clipboard/index.ts diff --git a/libs/components/common/src/lib/text/slate-utils.ts b/libs/components/common/src/lib/text/slate-utils.ts index ec7e219810..fb183a7c35 100644 --- a/libs/components/common/src/lib/text/slate-utils.ts +++ b/libs/components/common/src/lib/text/slate-utils.ts @@ -24,6 +24,7 @@ import { MARKDOWN_STYLE_MAP, MatchRes, } from './utils'; +import { AsyncBlock, SelectBlock } from '@toeverything/components/editor-core'; function isInlineAndVoid(editor: Editor, el: any) { return editor.isInline(el) && editor.isVoid(el); @@ -958,7 +959,41 @@ class SlateUtils { } public getNodeByPath(path: Path) { - Editor.node(this.editor, path); + return Editor.node(this.editor, path); + } + + public getNodeByRange(range: Range) { + return Editor.node(this.editor, range); + } + + // This may should write with logic of render slate + public convertLeaf2Html(textValue: any) { + const { text, fontColor, fontBgColor } = textValue; + + const style = `style="${fontColor ? `color: ${fontColor};` : ''}${ + fontBgColor ? `backgroundColor: ${fontBgColor};` : '' + }"`; + if (textValue.bold) { + return `${text}`; + } + if (textValue.italic) { + return `${text}`; + } + if (textValue.underline) { + return `${text}`; + } + if (textValue.inlinecode) { + return `${text}`; + } + if (textValue.strikethrough) { + return `${text}`; + } + if (textValue.type === 'link') { + return `${this.convertLeaf2Html( + textValue.children + )}`; + } + return `${text}>`; } public getStartSelection() { diff --git a/libs/components/editor-blocks/src/blocks/bullet/index.ts b/libs/components/editor-blocks/src/blocks/bullet/index.ts index 087afb3056..58360954ce 100644 --- a/libs/components/editor-blocks/src/blocks/bullet/index.ts +++ b/libs/components/editor-blocks/src/blocks/bullet/index.ts @@ -2,7 +2,6 @@ import { AsyncBlock, BaseView, CreateView, - getTextProperties, SelectBlock, getTextHtml, } from '@toeverything/framework/virgo'; @@ -28,14 +27,6 @@ export class BulletBlock extends BaseView { return block; } - override getSelProperties( - block: AsyncBlock, - selectInfo: any - ): DefaultColumnsValue { - const properties = super.getSelProperties(block, selectInfo); - return getTextProperties(properties, selectInfo); - } - override html2block( el: Element, parseEl: (el: Element) => any[] diff --git a/libs/components/editor-blocks/src/blocks/code/index.ts b/libs/components/editor-blocks/src/blocks/code/index.ts index 9b089d6db5..1fc84f1df8 100644 --- a/libs/components/editor-blocks/src/blocks/code/index.ts +++ b/libs/components/editor-blocks/src/blocks/code/index.ts @@ -1,7 +1,6 @@ import { BaseView, AsyncBlock, - getTextProperties, CreateView, SelectBlock, getTextHtml, @@ -28,14 +27,6 @@ export class CodeBlock extends BaseView { return block; } - override getSelProperties( - block: AsyncBlock, - selectInfo: any - ): DefaultColumnsValue { - const properties = super.getSelProperties(block, selectInfo); - return getTextProperties(properties, selectInfo); - } - // TODO: internal format not implemented yet override html2block( el: Element, diff --git a/libs/components/editor-blocks/src/blocks/numbered/index.ts b/libs/components/editor-blocks/src/blocks/numbered/index.ts index b8b3c3dc0a..37295e026f 100644 --- a/libs/components/editor-blocks/src/blocks/numbered/index.ts +++ b/libs/components/editor-blocks/src/blocks/numbered/index.ts @@ -1,7 +1,6 @@ import { AsyncBlock, BaseView, - getTextProperties, SelectBlock, getTextHtml, } from '@toeverything/framework/virgo'; @@ -29,14 +28,6 @@ export class NumberedBlock extends BaseView { return block; } - override getSelProperties( - block: AsyncBlock, - selectInfo: any - ): DefaultColumnsValue { - const properties = super.getSelProperties(block, selectInfo); - return getTextProperties(properties, selectInfo); - } - override html2block( el: Element, parseEl: (el: Element) => any[] diff --git a/libs/components/editor-blocks/src/blocks/page/index.ts b/libs/components/editor-blocks/src/blocks/page/index.ts index 412bbdbd7c..06151bc481 100644 --- a/libs/components/editor-blocks/src/blocks/page/index.ts +++ b/libs/components/editor-blocks/src/blocks/page/index.ts @@ -8,7 +8,6 @@ import { BaseView, ChildrenView, getTextHtml, - getTextProperties, SelectBlock, } from '@toeverything/framework/virgo'; @@ -35,14 +34,6 @@ export class PageBlock extends BaseView { return this.get_decoration(content, 'text')?.value?.[0].text; } - override getSelProperties( - block: AsyncBlock, - selectInfo: any - ): DefaultColumnsValue { - const properties = super.getSelProperties(block, selectInfo); - return getTextProperties(properties, selectInfo); - } - override async block2html( block: AsyncBlock, children: SelectBlock[], diff --git a/libs/components/editor-blocks/src/blocks/text/QuoteBlock.tsx b/libs/components/editor-blocks/src/blocks/text/QuoteBlock.tsx index f62dfae040..94938aa595 100644 --- a/libs/components/editor-blocks/src/blocks/text/QuoteBlock.tsx +++ b/libs/components/editor-blocks/src/blocks/text/QuoteBlock.tsx @@ -7,7 +7,6 @@ import { BaseView, CreateView, getTextHtml, - getTextProperties, SelectBlock, } from '@toeverything/framework/virgo'; @@ -29,14 +28,6 @@ export class QuoteBlock extends BaseView { return block; } - override getSelProperties( - block: AsyncBlock, - selectInfo: any - ): DefaultColumnsValue { - const properties = super.getSelProperties(block, selectInfo); - return getTextProperties(properties, selectInfo); - } - override html2block( el: Element, parseEl: (el: Element) => any[] @@ -96,14 +87,6 @@ export class CalloutBlock extends BaseView { return block; } - override getSelProperties( - block: AsyncBlock, - selectInfo: any - ): DefaultColumnsValue { - const properties = super.getSelProperties(block, selectInfo); - return getTextProperties(properties, selectInfo); - } - override html2block( el: Element, parseEl: (el: Element) => any[] diff --git a/libs/components/editor-blocks/src/blocks/text/TextBlock.tsx b/libs/components/editor-blocks/src/blocks/text/TextBlock.tsx index 64902e252d..74085db922 100644 --- a/libs/components/editor-blocks/src/blocks/text/TextBlock.tsx +++ b/libs/components/editor-blocks/src/blocks/text/TextBlock.tsx @@ -2,7 +2,6 @@ import { BaseView, CreateView, AsyncBlock, - getTextProperties, SelectBlock, getTextHtml, } from '@toeverything/framework/virgo'; @@ -28,14 +27,6 @@ export class TextBlock extends BaseView { return block; } - override getSelProperties( - block: AsyncBlock, - selectInfo: any - ): DefaultColumnsValue { - const properties = super.getSelProperties(block, selectInfo); - return getTextProperties(properties, selectInfo); - } - override html2block( el: Element, parseEl: (el: Element) => any[] @@ -145,14 +136,6 @@ export class Heading1Block extends BaseView { return block; } - override getSelProperties( - block: AsyncBlock, - selectInfo: any - ): DefaultColumnsValue { - const properties = super.getSelProperties(block, selectInfo); - return getTextProperties(properties, selectInfo); - } - override html2block( el: Element, parseEl: (el: Element) => any[] @@ -210,14 +193,6 @@ export class Heading2Block extends BaseView { return block; } - override getSelProperties( - block: AsyncBlock, - selectInfo: any - ): DefaultColumnsValue { - const properties = super.getSelProperties(block, selectInfo); - return getTextProperties(properties, selectInfo); - } - override html2block( el: Element, parseEl: (el: Element) => any[] @@ -275,14 +250,6 @@ export class Heading3Block extends BaseView { return block; } - override getSelProperties( - block: AsyncBlock, - selectInfo: any - ): DefaultColumnsValue { - const properties = super.getSelProperties(block, selectInfo); - return getTextProperties(properties, selectInfo); - } - override html2block( el: Element, parseEl: (el: Element) => any[] diff --git a/libs/components/editor-blocks/src/blocks/todo/index.ts b/libs/components/editor-blocks/src/blocks/todo/index.ts index c6580009d0..db4187a890 100644 --- a/libs/components/editor-blocks/src/blocks/todo/index.ts +++ b/libs/components/editor-blocks/src/blocks/todo/index.ts @@ -1,6 +1,5 @@ import { BaseView, - getTextProperties, AsyncBlock, SelectBlock, getTextHtml, @@ -29,14 +28,6 @@ export class TodoBlock extends BaseView { return block; } - override getSelProperties( - block: TodoAsyncBlock, - selectInfo: any - ): DefaultColumnsValue { - const properties = super.getSelProperties(block, selectInfo); - return getTextProperties(properties, selectInfo); - } - override html2block( el: Element, parseEl: (el: Element) => any[] diff --git a/libs/components/editor-blocks/src/blocks/youtube/index.ts b/libs/components/editor-blocks/src/blocks/youtube/index.ts index 42f22bcda4..94ad3ac59d 100644 --- a/libs/components/editor-blocks/src/blocks/youtube/index.ts +++ b/libs/components/editor-blocks/src/blocks/youtube/index.ts @@ -41,7 +41,9 @@ export class YoutubeBlock extends BaseView { return null; } - + override async block2Text(block: AsyncBlock, selectInfo: SelectBlock) { + return block.getProperty('embedLink')?.value ?? ''; + } override async block2html( block: AsyncBlock, children: SelectBlock[], diff --git a/libs/components/editor-core/src/editor/block/block-helper.ts b/libs/components/editor-core/src/editor/block/block-helper.ts index 7bd0284ffc..70238c4be5 100644 --- a/libs/components/editor-core/src/editor/block/block-helper.ts +++ b/libs/components/editor-core/src/editor/block/block-helper.ts @@ -11,6 +11,11 @@ import { Selection as SlateSelection, } from 'slate'; import { Editor } from '../editor'; +import { + AsyncBlock, + SelectBlock, + SelectInfo, +} from '@toeverything/components/editor-core'; type TextUtilsFunctions = | 'getString' @@ -37,7 +42,9 @@ type TextUtilsFunctions = | 'blur' | 'setSelection' | 'insertNodes' - | 'getNodeByPath'; + | 'getNodeByPath' + | 'getNodeByRange' + | 'convertLeaf2Html'; type ExtendedTextUtils = SlateUtils & { setLinkModalVisible: (visible: boolean) => void; @@ -98,15 +105,116 @@ export class BlockHelper { return ''; } - public getBlockTextBetweenSelection(blockId: string) { + public async isBlockEditable(blockOrBlockId: AsyncBlock | string) { + const block = + typeof blockOrBlockId === 'string' + ? await this._editor.getBlockById(blockOrBlockId) + : blockOrBlockId; + const blockView = this._editor.getView(block.type); + + return blockView.activatable; + } + + public async getFlatBlocksUnderParent( + parentBlockId: string, + includeParent: boolean = false + ): Promise { + const blocks = []; + const block = await this._editor.getBlockById(parentBlockId); + if (includeParent) { + blocks.push(block); + } + const children = await block.children(); + ( + await Promise.all( + children.map(child => { + return this.getFlatBlocksUnderParent(child.id, true); + }) + ) + ).forEach(editableChildren => { + blocks.push(...editableChildren); + }); + return blocks; + } + + public getBlockTextBetweenSelection( + blockId: string, + shouldUsePreviousSelection = true + ) { const text_utils = this._blockTextUtilsMap[blockId]; if (text_utils) { - return text_utils.getStringBetweenSelection(true); + return text_utils.getStringBetweenSelection( + shouldUsePreviousSelection + ); } console.warn('Could find the block text utils'); return ''; } + public async getEditableBlockPropertiesBySelectInfo( + block: AsyncBlock, + selectInfo: SelectBlock + ) { + const properties = block.getProperties(); + if (properties.text.value.length === 0) { + return properties; + } + let text_value = properties.text.value; + + const { + text: { value: originTextValue, ...otherTextProperties }, + ...otherProperties + } = properties; + + // Use deepClone method will throw incomprehensible error + let textValue = JSON.parse(JSON.stringify(originTextValue)); + + if (selectInfo.endInfo) { + textValue = textValue.slice(0, selectInfo.endInfo.arrayIndex + 1); + textValue[textValue.length - 1].text = text_value[ + textValue.length - 1 + ].text.substring(0, selectInfo.endInfo.offset); + } + if (selectInfo.startInfo) { + textValue = textValue.slice(selectInfo.startInfo.arrayIndex); + textValue[0].text = textValue[0].text.substring( + selectInfo.startInfo.offset + ); + } + return { + ...otherProperties, + text: { + ...otherTextProperties, + value: textValue, + }, + }; + } + + // For editable blocks, the properties containing the selected text will be returned with the selection information + public async getBlockPropertiesBySelectInfo(selectBlockInfo: SelectBlock) { + const block = await this._editor.getBlockById(selectBlockInfo.blockId); + const blockView = this._editor.getView(block.type); + if (blockView.activatable) { + return this.getEditableBlockPropertiesBySelectInfo( + block, + selectBlockInfo + ); + } else { + return block?.getProperties(); + } + } + + public convertTextValue2Html(blockId: string, textValue: any) { + const text_utils = this._blockTextUtilsMap[blockId]; + if (!text_utils) { + return ''; + } + return textValue.reduce((html: string, textValueItem: any) => { + const fragment = text_utils.convertLeaf2Html(textValueItem); + return `${html}${fragment}`; + }, ''); + } + public setBlockBlur(blockId: string) { const text_utils = this._blockTextUtilsMap[blockId]; if (text_utils) { diff --git a/libs/components/editor-core/src/editor/clipboard/browser-clipboard.ts b/libs/components/editor-core/src/editor/clipboard/browser-clipboard.ts deleted file mode 100644 index 687c5280ee..0000000000 --- a/libs/components/editor-core/src/editor/clipboard/browser-clipboard.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { HooksRunner } from '../types'; -import { Editor } from '../editor'; -import ClipboardParse from './clipboard-parse'; -import { MarkdownParser } from './markdown-parse'; -import { shouldHandlerContinue } from './utils'; -import { Paste } from './paste'; -// todo needs to be a switch - -enum ClipboardAction { - COPY = 'copy', - CUT = 'cut', - PASTE = 'paste', -} - -//TODO: need to consider the cursor position after inserting the children -class BrowserClipboard { - private _eventTarget: Element; - private _hooks: HooksRunner; - private _editor: Editor; - private _clipboardParse: ClipboardParse; - private _markdownParse: MarkdownParser; - private _paste: Paste; - - constructor(eventTarget: Element, hooks: HooksRunner, editor: Editor) { - this._eventTarget = eventTarget; - this._hooks = hooks; - this._editor = editor; - this._clipboardParse = new ClipboardParse(editor); - this._markdownParse = new MarkdownParser(); - this._paste = new Paste( - editor, - this._clipboardParse, - this._markdownParse - ); - this._initialize(); - } - - public getClipboardParse() { - return this._clipboardParse; - } - - private _initialize() { - this._handleCopy = this._handleCopy.bind(this); - this._handleCut = this._handleCut.bind(this); - - document.addEventListener(ClipboardAction.COPY, this._handleCopy); - document.addEventListener(ClipboardAction.CUT, this._handleCut); - document.addEventListener( - ClipboardAction.PASTE, - this._paste.handlePaste - ); - this._eventTarget.addEventListener( - ClipboardAction.COPY, - this._handleCopy - ); - this._eventTarget.addEventListener( - ClipboardAction.CUT, - this._handleCut - ); - this._eventTarget.addEventListener( - ClipboardAction.PASTE, - this._paste.handlePaste - ); - } - - private _handleCopy(e: Event) { - if (!shouldHandlerContinue(e, this._editor)) { - return; - } - - this._dispatchClipboardEvent(ClipboardAction.COPY, e as ClipboardEvent); - } - - private _handleCut(e: Event) { - if (!shouldHandlerContinue(e, this._editor)) { - return; - } - - this._dispatchClipboardEvent(ClipboardAction.CUT, e as ClipboardEvent); - } - - private _preCopyCut(action: ClipboardAction, e: ClipboardEvent) { - switch (action) { - case ClipboardAction.COPY: - this._hooks.beforeCopy(e); - break; - - case ClipboardAction.CUT: - this._hooks.beforeCut(e); - break; - } - } - - private _dispatchClipboardEvent( - action: ClipboardAction, - e: ClipboardEvent - ) { - this._preCopyCut(action, e); - } - - dispose() { - document.removeEventListener(ClipboardAction.COPY, this._handleCopy); - document.removeEventListener(ClipboardAction.CUT, this._handleCut); - document.removeEventListener( - ClipboardAction.PASTE, - this._paste.handlePaste - ); - this._eventTarget.removeEventListener( - ClipboardAction.COPY, - this._handleCopy - ); - this._eventTarget.removeEventListener( - ClipboardAction.CUT, - this._handleCut - ); - this._eventTarget.removeEventListener( - ClipboardAction.PASTE, - this._paste.handlePaste - ); - this._clipboardParse.dispose(); - this._clipboardParse = null; - this._eventTarget = null; - this._hooks = null; - this._editor = null; - } -} - -export { BrowserClipboard }; diff --git a/libs/components/editor-core/src/editor/clipboard/clipboard-populator.ts b/libs/components/editor-core/src/editor/clipboard/clipboard-populator.ts deleted file mode 100644 index d7a8172566..0000000000 --- a/libs/components/editor-core/src/editor/clipboard/clipboard-populator.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Editor } from '../editor'; -import { SelectionManager } from '../selection'; -import { HookType, PluginHooks } from '../types'; -import ClipboardParse from './clipboard-parse'; -import { Subscription } from 'rxjs'; -import { Copy } from './copy'; -class ClipboardPopulator { - private _editor: Editor; - private _hooks: PluginHooks; - private _selectionManager: SelectionManager; - private _clipboardParse: ClipboardParse; - private _sub = new Subscription(); - private _copy: Copy; - constructor( - editor: Editor, - hooks: PluginHooks, - selectionManager: SelectionManager - ) { - this._editor = editor; - this._hooks = hooks; - this._selectionManager = selectionManager; - this._clipboardParse = new ClipboardParse(editor); - this._copy = new Copy(editor); - this._sub.add( - hooks.get(HookType.BEFORE_COPY).subscribe(this._copy.handleCopy) - ); - this._sub.add( - hooks.get(HookType.BEFORE_CUT).subscribe(this._copy.handleCopy) - ); - } - - disposeInternal() { - this._sub.unsubscribe(); - this._hooks = null; - } -} - -export { ClipboardPopulator }; diff --git a/libs/components/editor-core/src/editor/clipboard/clipboard.ts b/libs/components/editor-core/src/editor/clipboard/clipboard.ts new file mode 100644 index 0000000000..4891f7dffc --- /dev/null +++ b/libs/components/editor-core/src/editor/clipboard/clipboard.ts @@ -0,0 +1,47 @@ +import { ClipboardEventDispatcher } from './clipboardEventDispatcher'; +import { HookType } from '@toeverything/components/editor-core'; +import { Editor } from '../editor'; +import { Copy } from './copy'; +import { Paste } from './paste'; +import ClipboardParse from './clipboard-parse'; +import { MarkdownParser } from './markdown-parse'; + +export class Clipboard { + private _clipboardEventDispatcher: ClipboardEventDispatcher; + private _copy: Copy; + private _paste: Paste; + private _clipboardParse: ClipboardParse; + private _markdownParse: MarkdownParser; + + constructor(editor: Editor, clipboardTarget: HTMLElement) { + this._clipboardEventDispatcher = new ClipboardEventDispatcher( + editor, + clipboardTarget + ); + this._clipboardParse = new ClipboardParse(editor); + this._markdownParse = new MarkdownParser(); + this._copy = new Copy(editor); + + this._paste = new Paste( + editor, + this._clipboardParse, + this._markdownParse + ); + + editor + .getHooks() + .get(HookType.ON_COPY) + .subscribe(this._copy.handleCopy); + + editor.getHooks().get(HookType.ON_CUT).subscribe(this._copy.handleCopy); + + editor + .getHooks() + .get(HookType.ON_PASTE) + .subscribe(this._paste.handlePaste); + } + + public dispose() { + this._clipboardEventDispatcher.dispose(); + } +} diff --git a/libs/components/editor-core/src/editor/clipboard/clipboardEventDispatcher.ts b/libs/components/editor-core/src/editor/clipboard/clipboardEventDispatcher.ts new file mode 100644 index 0000000000..d529e20a84 --- /dev/null +++ b/libs/components/editor-core/src/editor/clipboard/clipboardEventDispatcher.ts @@ -0,0 +1,82 @@ +import { Editor } from '../editor'; +import { shouldHandlerContinue } from './utils'; + +enum ClipboardAction { + copy = 'copy', + cut = 'cut', + paste = 'paste', +} + +//TODO: need to consider the cursor position after inserting the children +export class ClipboardEventDispatcher { + private _editor: Editor; + private _clipboardTarget: HTMLElement; + + constructor(editor: Editor, clipboardTarget: HTMLElement) { + this._editor = editor; + this._clipboardTarget = clipboardTarget; + this._initialize(); + } + + private _initialize() { + this._copyHandler = this._copyHandler.bind(this); + this._cutHandler = this._cutHandler.bind(this); + this._pasteHandler = this._pasteHandler.bind(this); + + document.addEventListener(ClipboardAction.copy, this._copyHandler); + document.addEventListener(ClipboardAction.cut, this._cutHandler); + document.addEventListener(ClipboardAction.paste, this._pasteHandler); + this._clipboardTarget.addEventListener( + ClipboardAction.copy, + this._copyHandler + ); + this._clipboardTarget.addEventListener( + ClipboardAction.cut, + this._cutHandler + ); + this._clipboardTarget.addEventListener( + ClipboardAction.paste, + this._pasteHandler + ); + } + + private _copyHandler(e: ClipboardEvent) { + if (!shouldHandlerContinue(e, this._editor)) { + return; + } + this._editor.getHooks().onCopy(e); + } + + private _cutHandler(e: ClipboardEvent) { + if (!shouldHandlerContinue(e, this._editor)) { + return; + } + this._editor.getHooks().onCut(e); + } + private _pasteHandler(e: ClipboardEvent) { + if (!shouldHandlerContinue(e, this._editor)) { + return; + } + + this._editor.getHooks().onPaste(e); + } + + dispose() { + document.removeEventListener(ClipboardAction.copy, this._copyHandler); + document.removeEventListener(ClipboardAction.cut, this._cutHandler); + document.removeEventListener(ClipboardAction.paste, this._pasteHandler); + this._clipboardTarget.removeEventListener( + ClipboardAction.copy, + this._copyHandler + ); + this._clipboardTarget.removeEventListener( + ClipboardAction.cut, + this._cutHandler + ); + this._clipboardTarget.removeEventListener( + ClipboardAction.paste, + this._pasteHandler + ); + this._editor = null; + } +} diff --git a/libs/components/editor-core/src/editor/clipboard/clipboardUtils.ts b/libs/components/editor-core/src/editor/clipboard/clipboardUtils.ts new file mode 100644 index 0000000000..1a31620fb6 --- /dev/null +++ b/libs/components/editor-core/src/editor/clipboard/clipboardUtils.ts @@ -0,0 +1,121 @@ +import { Editor } from '../editor'; +import { + AsyncBlock, + SelectBlock, + SelectInfo, +} from '@toeverything/components/editor-core'; +import { ClipBlockInfo, OFFICE_CLIPBOARD_MIMETYPE } from './types'; +import { getClipInfoOfBlockById } from './utils'; +import { Clip } from './clip'; + +export class ClipboardUtils { + private _editor: Editor; + constructor(editor: Editor) { + this._editor = editor; + } + + async isBlockEditable(blockOrBlockId: AsyncBlock | string) { + const block = + typeof blockOrBlockId === 'string' + ? await this._editor.getBlockById(blockOrBlockId) + : blockOrBlockId; + const blockView = this._editor.getView(block.type); + + return blockView.activatable; + } + + async getClipInfoOfBlockById(blockId: string) { + const block = await this._editor.getBlockById(blockId); + const blockInfo: ClipBlockInfo = { + type: block.type, + properties: block?.getProperties(), + children: [] as ClipBlockInfo[], + }; + const children = (await block?.children()) ?? []; + + await Promise.all( + children.map(async childBlock => { + const childInfo = await this.getClipInfoOfBlockById( + childBlock.id + ); + blockInfo.children.push(childInfo); + }) + ); + + return blockInfo; + } + + async getClipDataOfBlocksById(blockIds: string[]) { + const clipInfos = await Promise.all( + blockIds.map(blockId => this.getClipInfoOfBlockById(blockId)) + ); + + return new Clip( + OFFICE_CLIPBOARD_MIMETYPE.DOCS_DOCUMENT_SLICE_CLIP_WRAPPED, + JSON.stringify({ + data: clipInfos, + }) + ); + } + + async getClipInfoOfBlockBySelectInfo(selectBlockInfo: SelectBlock) { + const block = await this._editor.getBlockById(selectBlockInfo.blockId); + const blockInfo: ClipBlockInfo = { + type: block?.type, + properties: + await this._editor.blockHelper.getBlockPropertiesBySelectInfo( + selectBlockInfo + ), + // Editable has no children + children: [], + }; + return blockInfo; + } + + async getClipDataOfBlocksBySelectInfo(selectInfo: SelectInfo) { + const clipInfos = await Promise.all( + selectInfo.blocks.map(selectBlockInfo => + this.getClipInfoOfBlockBySelectInfo(selectBlockInfo) + ) + ); + return new Clip( + OFFICE_CLIPBOARD_MIMETYPE.DOCS_DOCUMENT_SLICE_CLIP_WRAPPED, + JSON.stringify({ + data: clipInfos, + }) + ); + } + + async convertEditableBlockToHtml(block: AsyncBlock) { + const generate = (textList: any[]) => { + let content = ''; + textList.forEach(text_obj => { + let text = text_obj.text || ''; + if (text_obj.bold) { + text = `${text}`; + } + if (text_obj.italic) { + text = `${text}`; + } + if (text_obj.underline) { + text = `${text}`; + } + if (text_obj.inlinecode) { + text = `${text}`; + } + if (text_obj.strikethrough) { + text = `${text}`; + } + if (text_obj.type === 'link') { + text = `${generate( + text_obj.children + )}`; + } + content += text; + }); + return content; + }; + const text_list: any[] = block.getProperty('text').value; + return generate(text_list); + } +} diff --git a/libs/components/editor-core/src/editor/clipboard/copy.ts b/libs/components/editor-core/src/editor/clipboard/copy.ts index 94b3117264..8509af23fc 100644 --- a/libs/components/editor-core/src/editor/clipboard/copy.ts +++ b/libs/components/editor-core/src/editor/clipboard/copy.ts @@ -4,15 +4,15 @@ import { OFFICE_CLIPBOARD_MIMETYPE } from './types'; import { Clip } from './clip'; import ClipboardParse from './clipboard-parse'; import { getClipDataOfBlocksById } from './utils'; -import { copyToClipboard } from '@toeverything/utils'; +import { ClipboardUtils } from './clipboardUtils'; class Copy { private _editor: Editor; private _clipboardParse: ClipboardParse; - + private _utils: ClipboardUtils; constructor(editor: Editor) { this._editor = editor; this._clipboardParse = new ClipboardParse(editor); - + this._utils = new ClipboardUtils(editor); this.handleCopy = this.handleCopy.bind(this); } public async handleCopy(e: ClipboardEvent) { @@ -22,7 +22,6 @@ class Copy { if (!clips.length) { return; } - // TODO: is not compatible with safari const success = this._copyToClipboardFromPc(clips); if (!success) { // This way, not compatible with firefox @@ -49,7 +48,11 @@ class Copy { const affineClip = await this._getAffineClip(); clips.push(affineClip); - // get common html clip + const textClip = await this._getTextClip(); + clips.push(textClip); + + // const htmlClip = await this._getHtmlClip(); + // clips.push(htmlClip); const htmlClip = await this._clipboardParse.generateHtml(); htmlClip && clips.push(new Clip(OFFICE_CLIPBOARD_MIMETYPE.HTML, htmlClip)); @@ -57,16 +60,128 @@ class Copy { return clips; } + // private async _getHtmlClip(): Promise { + // const selectInfo: SelectInfo = + // await this._editor.selectionManager.getSelectInfo(); + // + // if (selectInfo.type === 'Range') { + // const html = ( + // await Promise.all( + // selectInfo.blocks.map(async selectBlockInfo => { + // const block = await this._editor.getBlockById( + // selectBlockInfo.blockId + // ); + // const blockView = this._editor.getView(block.type); + // const block2html = await blockView.block2html({ + // editor: this._editor, + // block, + // selectInfo: selectBlockInfo, + // }); + // + // if ( + // await this._editor.blockHelper.isBlockEditable( + // block + // ) + // ) { + // const selectedProperties = + // await this._editor.blockHelper.getEditableBlockPropertiesBySelectInfo( + // block, + // selectBlockInfo + // ); + // + // return ( + // block2html || + // this._editor.blockHelper.convertTextValue2Html( + // block.id, + // selectedProperties.text.value + // ) + // ); + // } + // + // return block2html; + // }) + // ) + // ).join(''); + // console.log('html', html); + // } + // + // return new Clip(OFFICE_CLIPBOARD_MIMETYPE.HTML, 'blockText'); + // } + private async _getAffineClip(): Promise { const selectInfo: SelectInfo = await this._editor.selectionManager.getSelectInfo(); - return getClipDataOfBlocksById( - this._editor, + if (selectInfo.type === 'Range') { + return this._utils.getClipDataOfBlocksBySelectInfo(selectInfo); + } + + // The only remaining case is that selectInfo.type === 'Block' + return this._utils.getClipDataOfBlocksById( selectInfo.blocks.map(block => block.blockId) ); } + private async _getTextClip(): Promise { + const selectInfo: SelectInfo = + await this._editor.selectionManager.getSelectInfo(); + + if (selectInfo.type === 'Range') { + const text = ( + await Promise.all( + selectInfo.blocks.map(async selectBlockInfo => { + const block = await this._editor.getBlockById( + selectBlockInfo.blockId + ); + const blockView = this._editor.getView(block.type); + const block2Text = await blockView.block2Text( + block, + selectBlockInfo + ); + + return ( + block2Text || + this._editor.blockHelper.getBlockTextBetweenSelection( + selectBlockInfo.blockId, + false + ) + ); + }) + ) + ).join('\n'); + return new Clip(OFFICE_CLIPBOARD_MIMETYPE.TEXT, text); + } + + // The only remaining case is that selectInfo.type === 'Block' + const selectedBlocks = ( + await Promise.all( + selectInfo.blocks.map(selectBlockInfo => + this._editor.blockHelper.getFlatBlocksUnderParent( + selectBlockInfo.blockId, + true + ) + ) + ) + ).flat(); + + const blockText = ( + await Promise.all( + selectedBlocks.map(async block => { + const blockView = this._editor.getView(block.type); + const block2Text = await blockView.block2Text(block); + return ( + block2Text || + this._editor.blockHelper.getBlockText(block.id) + ); + }) + ) + ).join('\n'); + + return new Clip(OFFICE_CLIPBOARD_MIMETYPE.TEXT, blockText); + } + + // TODO: Optimization + // TODO: is not compatible with safari private _copyToClipboardFromPc(clips: any[]) { let success = false; const tempElem = document.createElement('textarea'); diff --git a/libs/components/editor-core/src/editor/clipboard/index.ts b/libs/components/editor-core/src/editor/clipboard/index.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libs/components/editor-core/src/editor/clipboard/paste.ts b/libs/components/editor-core/src/editor/clipboard/paste.ts index 37168c2614..0d631991c2 100644 --- a/libs/components/editor-core/src/editor/clipboard/paste.ts +++ b/libs/components/editor-core/src/editor/clipboard/paste.ts @@ -42,13 +42,13 @@ export class Paste { OFFICE_CLIPBOARD_MIMETYPE.HTML, OFFICE_CLIPBOARD_MIMETYPE.TEXT, ]; - public handlePaste(e: Event) { + public handlePaste(e: ClipboardEvent) { if (!shouldHandlerContinue(e, this._editor)) { return; } e.stopPropagation(); - const clipboardData = (e as ClipboardEvent).clipboardData; + const clipboardData = e.clipboardData; const isPureFile = Paste._isPureFileInClipboard(clipboardData); if (isPureFile) { diff --git a/libs/components/editor-core/src/editor/clipboard/utils.ts b/libs/components/editor-core/src/editor/clipboard/utils.ts index c807a869a0..548e187814 100644 --- a/libs/components/editor-core/src/editor/clipboard/utils.ts +++ b/libs/components/editor-core/src/editor/clipboard/utils.ts @@ -2,7 +2,10 @@ import { Editor } from '../editor'; import { ClipBlockInfo, OFFICE_CLIPBOARD_MIMETYPE } from './types'; import { Clip } from './clip'; -export const shouldHandlerContinue = (event: Event, editor: Editor) => { +export const shouldHandlerContinue = ( + event: ClipboardEvent, + editor: Editor +) => { const filterNodes = ['INPUT', 'SELECT', 'TEXTAREA']; if (event.defaultPrevented) { @@ -20,10 +23,9 @@ export const getClipInfoOfBlockById = async ( blockId: string ) => { const block = await editor.getBlockById(blockId); - const blockView = editor.getView(block.type); const blockInfo: ClipBlockInfo = { type: block.type, - properties: blockView.getSelProperties(block, {}), + properties: block?.getProperties(), children: [] as ClipBlockInfo[], }; const children = (await block?.children()) ?? []; diff --git a/libs/components/editor-core/src/editor/editor.ts b/libs/components/editor-core/src/editor/editor.ts index e85db2ba65..931fd25da0 100644 --- a/libs/components/editor-core/src/editor/editor.ts +++ b/libs/components/editor-core/src/editor/editor.ts @@ -15,8 +15,7 @@ import assert from 'assert'; import type { WorkspaceAndBlockId } from './block'; import { AsyncBlock } from './block'; import { BlockHelper } from './block/block-helper'; -import { BrowserClipboard } from './clipboard/browser-clipboard'; -import { ClipboardPopulator } from './clipboard/clipboard-populator'; +import { Clipboard } from './clipboard/clipboard'; import { EditorCommands } from './commands'; import { EditorConfig } from './config'; import { DragDropManager } from './drag-drop'; @@ -65,8 +64,9 @@ export class Editor implements Virgo { readonly = false; private _rootBlockId: string; private storage_manager?: StorageManager; - private clipboard?: BrowserClipboard; - private clipboard_populator?: ClipboardPopulator; + private _clipboard: Clipboard; + // private clipboardActionDispacher?: ClipboardEventDispatcher; + // private clipboard_populator?: ClipboardPopulator; public reactRenderRoot: { render: PatchNode; has: (key: string) => boolean; @@ -138,7 +138,7 @@ export class Editor implements Virgo { public set container(v: HTMLDivElement) { this.ui_container = v; - this._initClipboard(); + this._clipboard = new Clipboard(this, this.ui_container); } public get container() { @@ -191,26 +191,26 @@ export class Editor implements Virgo { }; } - private _disposeClipboard() { - this.clipboard?.dispose(); - this.clipboard_populator?.disposeInternal(); - } + // private _disposeClipboard() { + // this.clipboard?.dispose(); + // this.clipboard_populator?.disposeInternal(); + // } - private _initClipboard() { - this._disposeClipboard(); - if (this.ui_container && !this._isDisposed) { - this.clipboard = new BrowserClipboard( - this.ui_container, - this.hooks, - this - ); - this.clipboard_populator = new ClipboardPopulator( - this, - this.hooks, - this.selectionManager - ); - } - } + // private _initClipboard() { + // this._disposeClipboard(); + // if (this.ui_container && !this._isDisposed) { + // this.clipboardActionDispacher = new ClipboardEventDispatcher({ + // clipboardTarget: this.ui_container, + // hooks: this.hooks, + // editor: this, + // }); + // this.clipboard_populator = new ClipboardPopulator( + // this, + // this.hooks, + // this.selectionManager + // ); + // } + // } /** Root Block Id */ getRootBlockId() { @@ -498,12 +498,13 @@ export class Editor implements Virgo { } public async page2html(): Promise { - const parse = this.clipboard?.getClipboardParse(); - if (!parse) { - return ''; - } - const html_str = await parse.page2html(); - return html_str; + return ''; + // const parse = this.clipboard?.getClipboardParse(); + // if (!parse) { + // return ''; + // } + // const html_str = await parse.page2html(); + // return html_str; } dispose() { @@ -519,6 +520,6 @@ export class Editor implements Virgo { this.plugin_manager.dispose(); this.selectionManager.dispose(); this.dragDropManager.dispose(); - this._disposeClipboard(); + this._clipboard?.dispose(); } } diff --git a/libs/components/editor-core/src/editor/index.ts b/libs/components/editor-core/src/editor/index.ts index 3131e6f0a1..08c479ba8f 100644 --- a/libs/components/editor-core/src/editor/index.ts +++ b/libs/components/editor-core/src/editor/index.ts @@ -8,6 +8,6 @@ export { Editor as BlockEditor } from './editor'; export * from './selection'; export { BlockDropPlacement, HookType, GroupDirection } from './types'; export type { Plugin, PluginCreator, PluginHooks, Virgo } from './types'; -export { BaseView, getTextHtml, getTextProperties } from './views/base-view'; +export { BaseView, getTextHtml } from './views/base-view'; export type { ChildrenView, CreateView } from './views/base-view'; export { getClipDataOfBlocksById } from './clipboard/utils'; diff --git a/libs/components/editor-core/src/editor/plugin/hooks.ts b/libs/components/editor-core/src/editor/plugin/hooks.ts index 42b9c262a0..747f0b42e2 100644 --- a/libs/components/editor-core/src/editor/plugin/hooks.ts +++ b/libs/components/editor-core/src/editor/plugin/hooks.ts @@ -116,12 +116,15 @@ export class Hooks implements HooksRunner, PluginHooks { this._runHook(HookType.ON_SEARCH); } - public beforeCopy(e: ClipboardEvent): void { - this._runHook(HookType.BEFORE_COPY, e); + public onCopy(e: ClipboardEvent): void { + this._runHook(HookType.ON_COPY, e); } - public beforeCut(e: ClipboardEvent): void { - this._runHook(HookType.BEFORE_CUT, e); + public onCut(e: ClipboardEvent): void { + this._runHook(HookType.ON_CUT, e); + } + public onPaste(e: ClipboardEvent): void { + this._runHook(HookType.ON_PASTE, e); } public onRootNodeScroll(e: React.UIEvent): void { diff --git a/libs/components/editor-core/src/editor/types.ts b/libs/components/editor-core/src/editor/types.ts index 1b97cf0f86..f2621164b6 100644 --- a/libs/components/editor-core/src/editor/types.ts +++ b/libs/components/editor-core/src/editor/types.ts @@ -174,8 +174,9 @@ export enum HookType { ON_ROOTNODE_DRAG_END = 'onRootNodeDragEnd', ON_ROOTNODE_DRAG_OVER_CAPTURE = 'onRootNodeDragOverCapture', ON_ROOTNODE_DROP = 'onRootNodeDrop', - BEFORE_COPY = 'beforeCopy', - BEFORE_CUT = 'beforeCut', + ON_COPY = 'onCopy', + ON_CUT = 'onCut', + ON_PASTE = 'onPaste', ON_ROOTNODE_SCROLL = 'onRootNodeScroll', } @@ -207,8 +208,9 @@ export interface HooksRunner { onRootNodeDragEnd: (e: React.DragEvent) => void; onRootNodeDragLeave: (e: React.DragEvent) => void; onRootNodeDrop: (e: React.DragEvent) => void; - beforeCopy: (e: ClipboardEvent) => void; - beforeCut: (e: ClipboardEvent) => void; + onCopy: (e: ClipboardEvent) => void; + onCut: (e: ClipboardEvent) => void; + onPaste: (e: ClipboardEvent) => void; onRootNodeScroll: (e: React.UIEvent) => void; } diff --git a/libs/components/editor-core/src/editor/views/base-view.ts b/libs/components/editor-core/src/editor/views/base-view.ts index b69cdd848a..f9db79fbc5 100644 --- a/libs/components/editor-core/src/editor/views/base-view.ts +++ b/libs/components/editor-core/src/editor/views/base-view.ts @@ -131,10 +131,6 @@ export abstract class BaseView { return result; } - getSelProperties(block: AsyncBlock, selectInfo: any): DefaultColumnsValue { - return cloneDeep(block.getProperties()); - } - html2block(el: Element, parseEl: (el: Element) => any[]): any[] | null { return null; } @@ -146,31 +142,24 @@ export abstract class BaseView { ): Promise { return ''; } -} + async block2Text( + block: AsyncBlock, + // The selectInfo parameter is not passed when the block is selected in ful, the selectInfo.type is Range + selectInfo?: SelectBlock + ): Promise { + return ''; + } -export const getTextProperties = ( - properties: DefaultColumnsValue, - selectInfo: any -) => { - let text_value = properties.text.value; - if (text_value.length === 0) { - return properties; - } - if (selectInfo.endInfo) { - text_value = text_value.slice(0, selectInfo.endInfo.arrayIndex + 1); - text_value[text_value.length - 1].text = text_value[ - text_value.length - 1 - ].text.substring(0, selectInfo.endInfo.offset); - } - if (selectInfo.startInfo) { - text_value = text_value.slice(selectInfo.startInfo.arrayIndex); - text_value[0].text = text_value[0].text.substring( - selectInfo.startInfo.offset - ); - } - properties.text.value = text_value; - return properties; -}; + // TODO: Try using new methods + // async block2html2(props: { + // editor: Editor; + // block: AsyncBlock; + // // The selectInfo parameter is not passed when the block is selected in ful, the selectInfo.type is Range + // selectInfo?: SelectBlock; + // }) { + // return ''; + // } +} export const getTextHtml = (block: AsyncBlock) => { const generate = (textList: any[]) => { From 065f833564f25aecf547f4c967e6e1f07386f087 Mon Sep 17 00:00:00 2001 From: QiShaoXuan Date: Mon, 22 Aug 2022 10:29:42 +0800 Subject: [PATCH 03/81] refactor: remove clipboard utils to ClipboardUtils --- .../src/editor/clipboard/clipboard.ts | 12 ++-- .../clipboard/clipboardEventDispatcher.ts | 10 ++-- .../src/editor/clipboard/clipboardUtils.ts | 59 ++++--------------- .../editor-core/src/editor/clipboard/copy.ts | 1 - .../editor-core/src/editor/clipboard/index.ts | 0 .../editor-core/src/editor/clipboard/paste.ts | 5 -- .../editor-core/src/editor/clipboard/utils.ts | 54 ----------------- .../editor-core/src/editor/editor.ts | 4 ++ .../editor-core/src/editor/index.ts | 1 - 9 files changed, 30 insertions(+), 116 deletions(-) delete mode 100644 libs/components/editor-core/src/editor/clipboard/index.ts delete mode 100644 libs/components/editor-core/src/editor/clipboard/utils.ts diff --git a/libs/components/editor-core/src/editor/clipboard/clipboard.ts b/libs/components/editor-core/src/editor/clipboard/clipboard.ts index 4891f7dffc..4cee691a08 100644 --- a/libs/components/editor-core/src/editor/clipboard/clipboard.ts +++ b/libs/components/editor-core/src/editor/clipboard/clipboard.ts @@ -5,6 +5,7 @@ import { Copy } from './copy'; import { Paste } from './paste'; import ClipboardParse from './clipboard-parse'; import { MarkdownParser } from './markdown-parse'; +import { ClipboardUtils } from './clipboardUtils'; export class Clipboard { private _clipboardEventDispatcher: ClipboardEventDispatcher; @@ -12,14 +13,12 @@ export class Clipboard { private _paste: Paste; private _clipboardParse: ClipboardParse; private _markdownParse: MarkdownParser; + public clipboardUtils: ClipboardUtils; constructor(editor: Editor, clipboardTarget: HTMLElement) { - this._clipboardEventDispatcher = new ClipboardEventDispatcher( - editor, - clipboardTarget - ); this._clipboardParse = new ClipboardParse(editor); this._markdownParse = new MarkdownParser(); + this.clipboardUtils = new ClipboardUtils(editor); this._copy = new Copy(editor); this._paste = new Paste( @@ -28,6 +27,11 @@ export class Clipboard { this._markdownParse ); + this._clipboardEventDispatcher = new ClipboardEventDispatcher( + editor, + clipboardTarget + ); + editor .getHooks() .get(HookType.ON_COPY) diff --git a/libs/components/editor-core/src/editor/clipboard/clipboardEventDispatcher.ts b/libs/components/editor-core/src/editor/clipboard/clipboardEventDispatcher.ts index d529e20a84..b3fd8305db 100644 --- a/libs/components/editor-core/src/editor/clipboard/clipboardEventDispatcher.ts +++ b/libs/components/editor-core/src/editor/clipboard/clipboardEventDispatcher.ts @@ -1,5 +1,5 @@ import { Editor } from '../editor'; -import { shouldHandlerContinue } from './utils'; +import { ClipboardUtils } from './clipboardUtils'; enum ClipboardAction { copy = 'copy', @@ -11,10 +11,12 @@ enum ClipboardAction { export class ClipboardEventDispatcher { private _editor: Editor; private _clipboardTarget: HTMLElement; + private _utils: ClipboardUtils; constructor(editor: Editor, clipboardTarget: HTMLElement) { this._editor = editor; this._clipboardTarget = clipboardTarget; + this._utils = new ClipboardUtils(editor); this._initialize(); } @@ -41,20 +43,20 @@ export class ClipboardEventDispatcher { } private _copyHandler(e: ClipboardEvent) { - if (!shouldHandlerContinue(e, this._editor)) { + if (!this._utils.shouldHandlerContinue(e)) { return; } this._editor.getHooks().onCopy(e); } private _cutHandler(e: ClipboardEvent) { - if (!shouldHandlerContinue(e, this._editor)) { + if (!this._utils.shouldHandlerContinue(e)) { return; } this._editor.getHooks().onCut(e); } private _pasteHandler(e: ClipboardEvent) { - if (!shouldHandlerContinue(e, this._editor)) { + if (!this._utils.shouldHandlerContinue(e)) { return; } diff --git a/libs/components/editor-core/src/editor/clipboard/clipboardUtils.ts b/libs/components/editor-core/src/editor/clipboard/clipboardUtils.ts index 1a31620fb6..d50b2fbdae 100644 --- a/libs/components/editor-core/src/editor/clipboard/clipboardUtils.ts +++ b/libs/components/editor-core/src/editor/clipboard/clipboardUtils.ts @@ -1,11 +1,6 @@ import { Editor } from '../editor'; -import { - AsyncBlock, - SelectBlock, - SelectInfo, -} from '@toeverything/components/editor-core'; +import { SelectBlock, SelectInfo } from '@toeverything/components/editor-core'; import { ClipBlockInfo, OFFICE_CLIPBOARD_MIMETYPE } from './types'; -import { getClipInfoOfBlockById } from './utils'; import { Clip } from './clip'; export class ClipboardUtils { @@ -14,15 +9,18 @@ export class ClipboardUtils { this._editor = editor; } - async isBlockEditable(blockOrBlockId: AsyncBlock | string) { - const block = - typeof blockOrBlockId === 'string' - ? await this._editor.getBlockById(blockOrBlockId) - : blockOrBlockId; - const blockView = this._editor.getView(block.type); + shouldHandlerContinue = (event: ClipboardEvent) => { + const filterNodes = ['INPUT', 'SELECT', 'TEXTAREA']; - return blockView.activatable; - } + if (event.defaultPrevented) { + return false; + } + if (filterNodes.includes((event.target as HTMLElement)?.tagName)) { + return false; + } + + return this._editor.selectionManager.currentSelectInfo.type !== 'None'; + }; async getClipInfoOfBlockById(blockId: string) { const block = await this._editor.getBlockById(blockId); @@ -85,37 +83,4 @@ export class ClipboardUtils { }) ); } - - async convertEditableBlockToHtml(block: AsyncBlock) { - const generate = (textList: any[]) => { - let content = ''; - textList.forEach(text_obj => { - let text = text_obj.text || ''; - if (text_obj.bold) { - text = `${text}`; - } - if (text_obj.italic) { - text = `${text}`; - } - if (text_obj.underline) { - text = `${text}`; - } - if (text_obj.inlinecode) { - text = `${text}`; - } - if (text_obj.strikethrough) { - text = `${text}`; - } - if (text_obj.type === 'link') { - text = `${generate( - text_obj.children - )}`; - } - content += text; - }); - return content; - }; - const text_list: any[] = block.getProperty('text').value; - return generate(text_list); - } } diff --git a/libs/components/editor-core/src/editor/clipboard/copy.ts b/libs/components/editor-core/src/editor/clipboard/copy.ts index 8509af23fc..3056091cd3 100644 --- a/libs/components/editor-core/src/editor/clipboard/copy.ts +++ b/libs/components/editor-core/src/editor/clipboard/copy.ts @@ -3,7 +3,6 @@ import { SelectInfo } from '../selection'; import { OFFICE_CLIPBOARD_MIMETYPE } from './types'; import { Clip } from './clip'; import ClipboardParse from './clipboard-parse'; -import { getClipDataOfBlocksById } from './utils'; import { ClipboardUtils } from './clipboardUtils'; class Copy { private _editor: Editor; diff --git a/libs/components/editor-core/src/editor/clipboard/index.ts b/libs/components/editor-core/src/editor/clipboard/index.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/libs/components/editor-core/src/editor/clipboard/paste.ts b/libs/components/editor-core/src/editor/clipboard/paste.ts index 0d631991c2..10643decbd 100644 --- a/libs/components/editor-core/src/editor/clipboard/paste.ts +++ b/libs/components/editor-core/src/editor/clipboard/paste.ts @@ -14,7 +14,6 @@ import { services, } from '@toeverything/datasource/db-service'; import { MarkdownParser } from './markdown-parse'; -import { shouldHandlerContinue } from './utils'; const SUPPORT_MARKDOWN_PASTE = true; type TextValueItem = { @@ -26,7 +25,6 @@ export class Paste { private _editor: Editor; private _markdownParse: MarkdownParser; private _clipboardParse: ClipboardParse; - constructor( editor: Editor, clipboardParse: ClipboardParse, @@ -43,9 +41,6 @@ export class Paste { OFFICE_CLIPBOARD_MIMETYPE.TEXT, ]; public handlePaste(e: ClipboardEvent) { - if (!shouldHandlerContinue(e, this._editor)) { - return; - } e.stopPropagation(); const clipboardData = e.clipboardData; diff --git a/libs/components/editor-core/src/editor/clipboard/utils.ts b/libs/components/editor-core/src/editor/clipboard/utils.ts deleted file mode 100644 index 548e187814..0000000000 --- a/libs/components/editor-core/src/editor/clipboard/utils.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Editor } from '../editor'; -import { ClipBlockInfo, OFFICE_CLIPBOARD_MIMETYPE } from './types'; -import { Clip } from './clip'; - -export const shouldHandlerContinue = ( - event: ClipboardEvent, - editor: Editor -) => { - const filterNodes = ['INPUT', 'SELECT', 'TEXTAREA']; - - if (event.defaultPrevented) { - return false; - } - if (filterNodes.includes((event.target as HTMLElement)?.tagName)) { - return false; - } - - return editor.selectionManager.currentSelectInfo.type !== 'None'; -}; - -export const getClipInfoOfBlockById = async ( - editor: Editor, - blockId: string -) => { - const block = await editor.getBlockById(blockId); - const blockInfo: ClipBlockInfo = { - type: block.type, - properties: block?.getProperties(), - children: [] as ClipBlockInfo[], - }; - const children = (await block?.children()) ?? []; - - for (let i = 0; i < children.length; i++) { - const childInfo = await getClipInfoOfBlockById(editor, children[i].id); - blockInfo.children.push(childInfo); - } - return blockInfo; -}; - -export const getClipDataOfBlocksById = async ( - editor: Editor, - blockIds: string[] -) => { - const clipInfos = await Promise.all( - blockIds.map(blockId => getClipInfoOfBlockById(editor, blockId)) - ); - - return new Clip( - OFFICE_CLIPBOARD_MIMETYPE.DOCS_DOCUMENT_SLICE_CLIP_WRAPPED, - JSON.stringify({ - data: clipInfos, - }) - ); -}; diff --git a/libs/components/editor-core/src/editor/editor.ts b/libs/components/editor-core/src/editor/editor.ts index 931fd25da0..9253ab2cbe 100644 --- a/libs/components/editor-core/src/editor/editor.ts +++ b/libs/components/editor-core/src/editor/editor.ts @@ -145,6 +145,10 @@ export class Editor implements Virgo { return this.ui_container; } + public get clipboard() { + return this._clipboard; + } + /** * Use it discreetly. * Preference to use {@link withBatch} diff --git a/libs/components/editor-core/src/editor/index.ts b/libs/components/editor-core/src/editor/index.ts index 08c479ba8f..d03326f386 100644 --- a/libs/components/editor-core/src/editor/index.ts +++ b/libs/components/editor-core/src/editor/index.ts @@ -10,4 +10,3 @@ export { BlockDropPlacement, HookType, GroupDirection } from './types'; export type { Plugin, PluginCreator, PluginHooks, Virgo } from './types'; export { BaseView, getTextHtml } from './views/base-view'; export type { ChildrenView, CreateView } from './views/base-view'; -export { getClipDataOfBlocksById } from './clipboard/utils'; From 4b904ef76204655e6253deabfab22d47d98feec4 Mon Sep 17 00:00:00 2001 From: QiShaoXuan Date: Mon, 22 Aug 2022 22:03:11 +0800 Subject: [PATCH 04/81] refactor: refactor block2html in clipboard --- libs/components/affine-board/src/Board.tsx | 13 ++- .../common/src/lib/text/slate-utils.ts | 2 +- .../editor-blocks/src/blocks/bullet/index.ts | 30 ++----- .../editor-blocks/src/blocks/code/index.ts | 28 ++----- .../editor-blocks/src/blocks/divider/index.ts | 10 +-- .../src/blocks/embed-link/index.ts | 12 +-- .../editor-blocks/src/blocks/figma/index.ts | 12 +-- .../editor-blocks/src/blocks/file/index.ts | 23 +++--- .../editor-blocks/src/blocks/group/Group.tsx | 19 +++-- .../src/blocks/groupDvider/index.ts | 10 +-- .../editor-blocks/src/blocks/image/index.ts | 26 +++--- .../src/blocks/numbered/index.ts | 29 ++----- .../editor-blocks/src/blocks/page/index.ts | 37 ++++----- .../src/blocks/text/QuoteBlock.tsx | 33 +++----- .../src/blocks/text/TextBlock.tsx | 51 +++--------- .../editor-blocks/src/blocks/todo/index.ts | 28 ++----- .../editor-blocks/src/blocks/youtube/index.ts | 12 +-- .../src/utils/commonBlockClip.ts | 30 +++++++ .../src/editor/block/block-helper.ts | 6 +- .../src/editor/clipboard/clipboard-parse.ts | 75 +---------------- .../src/editor/clipboard/clipboardUtils.ts | 78 +++++++++++++++++- .../editor-core/src/editor/clipboard/copy.ts | 80 +++++++------------ .../editor-core/src/editor/editor.ts | 8 +- .../editor-core/src/editor/index.ts | 2 +- .../editor-core/src/editor/views/base-view.ts | 56 ++----------- .../layout/src/header/PageSettingPortal.tsx | 8 +- .../Settings/util/handle-export.ts | 16 ++-- 27 files changed, 284 insertions(+), 450 deletions(-) create mode 100644 libs/components/editor-blocks/src/utils/commonBlockClip.ts diff --git a/libs/components/affine-board/src/Board.tsx b/libs/components/affine-board/src/Board.tsx index 4e99d6bbb0..5730649545 100644 --- a/libs/components/affine-board/src/Board.tsx +++ b/libs/components/affine-board/src/Board.tsx @@ -5,10 +5,7 @@ import { getSession } from '@toeverything/components/board-sessions'; import { deepCopy, TldrawApp } from '@toeverything/components/board-state'; import { tools } from '@toeverything/components/board-tools'; import { TDShapeType } from '@toeverything/components/board-types'; -import { - RecastBlockProvider, - getClipDataOfBlocksById, -} from '@toeverything/components/editor-core'; +import { RecastBlockProvider } from '@toeverything/components/editor-core'; import { services } from '@toeverything/datasource/db-service'; import { AsyncBlock, BlockEditor } from '@toeverything/framework/virgo'; import { useEffect, useState } from 'react'; @@ -70,10 +67,10 @@ const AffineBoard = ({ set_app(app); }, async onCopy(e, groupIds) { - const clip = await getClipDataOfBlocksById( - editor, - groupIds - ); + const clip = + await editor.clipboard.clipboardUtils.getClipDataOfBlocksById( + groupIds + ); e.clipboardData?.setData( clip.getMimeType(), diff --git a/libs/components/common/src/lib/text/slate-utils.ts b/libs/components/common/src/lib/text/slate-utils.ts index fb183a7c35..160f1a416b 100644 --- a/libs/components/common/src/lib/text/slate-utils.ts +++ b/libs/components/common/src/lib/text/slate-utils.ts @@ -993,7 +993,7 @@ class SlateUtils { textValue.children )}`; } - return `${text}>`; + return `${text}`; } public getStartSelection() { diff --git a/libs/components/editor-blocks/src/blocks/bullet/index.ts b/libs/components/editor-blocks/src/blocks/bullet/index.ts index 58360954ce..1577263af3 100644 --- a/libs/components/editor-blocks/src/blocks/bullet/index.ts +++ b/libs/components/editor-blocks/src/blocks/bullet/index.ts @@ -1,18 +1,10 @@ -import { - AsyncBlock, - BaseView, - CreateView, - SelectBlock, - getTextHtml, -} from '@toeverything/framework/virgo'; -import { - Protocol, - DefaultColumnsValue, -} from '@toeverything/datasource/db-service'; -// import { withTreeViewChildren } from '../../utils/with-tree-view-children'; +import { AsyncBlock, BaseView } from '@toeverything/framework/virgo'; +import { Protocol } from '@toeverything/datasource/db-service'; import { defaultBulletProps, BulletView } from './BulletView'; -import { IndentWrapper } from '../../components/IndentWrapper'; - +import { + Block2HtmlProps, + commonBlock2HtmlContent, +} from '../../utils/commonBlockClip'; export class BulletBlock extends BaseView { public type = Protocol.Block.Type.bullet; @@ -71,13 +63,7 @@ export class BulletBlock extends BaseView { return null; } - override async block2html( - block: AsyncBlock, - children: SelectBlock[], - generateHtml: (el: any[]) => Promise - ): Promise { - let content = getTextHtml(block); - content += await generateHtml(children); - return `
  • ${content}
`; + override async block2html(props: Block2HtmlProps) { + return `
  • ${await commonBlock2HtmlContent(props)}
`; } } diff --git a/libs/components/editor-blocks/src/blocks/code/index.ts b/libs/components/editor-blocks/src/blocks/code/index.ts index 1fc84f1df8..a204779656 100644 --- a/libs/components/editor-blocks/src/blocks/code/index.ts +++ b/libs/components/editor-blocks/src/blocks/code/index.ts @@ -1,16 +1,10 @@ -import { - BaseView, - AsyncBlock, - CreateView, - SelectBlock, - getTextHtml, -} from '@toeverything/framework/virgo'; -import { - Protocol, - DefaultColumnsValue, -} from '@toeverything/datasource/db-service'; +import { BaseView, AsyncBlock } from '@toeverything/framework/virgo'; +import { Protocol } from '@toeverything/datasource/db-service'; import { CodeView } from './CodeView'; -import { ComponentType } from 'react'; +import { + Block2HtmlProps, + commonBlock2HtmlContent, +} from '../../utils/commonBlockClip'; export class CodeBlock extends BaseView { type = Protocol.Block.Type.code; @@ -62,13 +56,7 @@ export class CodeBlock extends BaseView { return null; } - override async block2html( - block: AsyncBlock, - children: SelectBlock[], - generateHtml: (el: any[]) => Promise - ): Promise { - let content = getTextHtml(block); - content += await generateHtml(children); - return `${content}`; + override async block2html(props: Block2HtmlProps) { + return `${await commonBlock2HtmlContent(props)}`; } } diff --git a/libs/components/editor-blocks/src/blocks/divider/index.ts b/libs/components/editor-blocks/src/blocks/divider/index.ts index 6d67611cda..eb4615963c 100644 --- a/libs/components/editor-blocks/src/blocks/divider/index.ts +++ b/libs/components/editor-blocks/src/blocks/divider/index.ts @@ -5,6 +5,7 @@ import { } from '@toeverything/framework/virgo'; import { Protocol } from '@toeverything/datasource/db-service'; import { DividerView } from './divider-view'; +import { Block2HtmlProps } from '../../utils/commonBlockClip'; export class DividerBlock extends BaseView { type = Protocol.Block.Type.divider; @@ -28,12 +29,7 @@ export class DividerBlock extends BaseView { return null; } - - override async block2html( - block: AsyncBlock, - children: SelectBlock[], - generateHtml: (el: any[]) => Promise - ): Promise { - return `
`; + override async block2html(props: Block2HtmlProps) { + return `
`; } } diff --git a/libs/components/editor-blocks/src/blocks/embed-link/index.ts b/libs/components/editor-blocks/src/blocks/embed-link/index.ts index 731ae801d6..7674c71c3e 100644 --- a/libs/components/editor-blocks/src/blocks/embed-link/index.ts +++ b/libs/components/editor-blocks/src/blocks/embed-link/index.ts @@ -5,6 +5,7 @@ import { } from '@toeverything/framework/virgo'; import { Protocol } from '@toeverything/datasource/db-service'; import { EmbedLinkView } from './EmbedLinkView'; +import { Block2HtmlProps } from '../../utils/commonBlockClip'; export class EmbedLinkBlock extends BaseView { public override selectable = true; @@ -35,13 +36,8 @@ export class EmbedLinkBlock extends BaseView { return null; } - - override async block2html( - block: AsyncBlock, - children: SelectBlock[], - generateHtml: (el: any[]) => Promise - ): Promise { - const figma_url = block.getProperty('embedLink')?.value; - return `

${figma_url}

`; + override async block2html({ block }: Block2HtmlProps) { + const url = block.getProperty('embedLink')?.value; + return `

${url}

`; } } diff --git a/libs/components/editor-blocks/src/blocks/figma/index.ts b/libs/components/editor-blocks/src/blocks/figma/index.ts index 3ed44c9c85..652abfbc1d 100644 --- a/libs/components/editor-blocks/src/blocks/figma/index.ts +++ b/libs/components/editor-blocks/src/blocks/figma/index.ts @@ -5,6 +5,7 @@ import { SelectBlock, } from '@toeverything/framework/virgo'; import { FigmaView } from './FigmaView'; +import { Block2HtmlProps } from '../../utils/commonBlockClip'; export class FigmaBlock extends BaseView { public override selectable = true; @@ -41,13 +42,8 @@ export class FigmaBlock extends BaseView { return null; } - - override async block2html( - block: AsyncBlock, - children: SelectBlock[], - generateHtml: (el: any[]) => Promise - ): Promise { - const figma_url = block.getProperty('embedLink')?.value; - return `

${figma_url}

`; + override async block2html({ block }: Block2HtmlProps) { + const figmaUrl = block.getProperty('embedLink')?.value; + return `

${figmaUrl}

`; } } diff --git a/libs/components/editor-blocks/src/blocks/file/index.ts b/libs/components/editor-blocks/src/blocks/file/index.ts index e55eed7721..42c2bee1f6 100644 --- a/libs/components/editor-blocks/src/blocks/file/index.ts +++ b/libs/components/editor-blocks/src/blocks/file/index.ts @@ -9,25 +9,22 @@ import { services, } from '@toeverything/datasource/db-service'; import { FileView } from './FileView'; +import { Block2HtmlProps } from '../../utils/commonBlockClip'; export class FileBlock extends BaseView { public override selectable = true; public override activatable = false; type = Protocol.Block.Type.file; View = FileView; + override async block2html({ block }: Block2HtmlProps) { + const fileProperty = block.getProperty('file'); + const fileId = fileProperty?.value; + const fileInfo = fileId + ? await services.api.file.get(fileId, block.workspace) + : null; - override async block2html( - block: AsyncBlock, - children: SelectBlock[], - generateHtml: (el: any[]) => Promise - ): Promise { - const file_property = - block.getProperty('file') || ({} as FileColumnValue); - const file_id = file_property.value; - let file_info = null; - if (file_id) { - file_info = await services.api.file.get(file_id, block.workspace); - } - return `

${file_property?.name}

`; + return fileInfo + ? `

${fileProperty?.name}

` + : ''; } } diff --git a/libs/components/editor-blocks/src/blocks/group/Group.tsx b/libs/components/editor-blocks/src/blocks/group/Group.tsx index ac194d7eab..b5fdcac58c 100644 --- a/libs/components/editor-blocks/src/blocks/group/Group.tsx +++ b/libs/components/editor-blocks/src/blocks/group/Group.tsx @@ -6,6 +6,10 @@ import { SelectBlock, } from '@toeverything/framework/virgo'; import { GroupView } from './GroupView'; +import { + Block2HtmlProps, + commonBlock2HtmlContent, +} from '../../utils/commonBlockClip'; export class Group extends BaseView { public override selectable = true; @@ -25,13 +29,12 @@ export class Group extends BaseView { override async onCreate(block: AsyncBlock): Promise { return block; } - - override async block2html( - block: AsyncBlock, - children: SelectBlock[], - generateHtml: (el: any[]) => Promise - ): Promise { - const content = await generateHtml(children); - return `
${content}
`; + override async block2html({ editor, selectInfo, block }: Block2HtmlProps) { + const childrenHtml = + await editor.clipboard.clipboardUtils.convertBlock2HtmlBySelectInfos( + block, + selectInfo?.children + ); + return `
${childrenHtml}`; } } diff --git a/libs/components/editor-blocks/src/blocks/groupDvider/index.ts b/libs/components/editor-blocks/src/blocks/groupDvider/index.ts index 4120f1a525..52940173e6 100644 --- a/libs/components/editor-blocks/src/blocks/groupDvider/index.ts +++ b/libs/components/editor-blocks/src/blocks/groupDvider/index.ts @@ -5,6 +5,7 @@ import { } from '@toeverything/framework/virgo'; import { Protocol } from '@toeverything/datasource/db-service'; import { GroupDividerView } from './groupDividerView'; +import { Block2HtmlProps } from '../../utils/commonBlockClip'; export class GroupDividerBlock extends BaseView { type = Protocol.Block.Type.groupDivider; @@ -28,12 +29,7 @@ export class GroupDividerBlock extends BaseView { return null; } - - override async block2html( - block: AsyncBlock, - children: SelectBlock[], - generateHtml: (el: any[]) => Promise - ): Promise { - return `
`; + override async block2html(props: Block2HtmlProps) { + return `
`; } } diff --git a/libs/components/editor-blocks/src/blocks/image/index.ts b/libs/components/editor-blocks/src/blocks/image/index.ts index 8f56468b41..190f83d72a 100644 --- a/libs/components/editor-blocks/src/blocks/image/index.ts +++ b/libs/components/editor-blocks/src/blocks/image/index.ts @@ -1,10 +1,7 @@ -import { - AsyncBlock, - BaseView, - SelectBlock, -} from '@toeverything/framework/virgo'; +import { BaseView } from '@toeverything/framework/virgo'; import { Protocol } from '@toeverything/datasource/db-service'; import { ImageView } from './ImageView'; +import { Block2HtmlProps } from '../../utils/commonBlockClip'; export class ImageBlock extends BaseView { public override selectable = true; @@ -37,18 +34,13 @@ export class ImageBlock extends BaseView { return null; } - // TODO: - override async block2html( - block: AsyncBlock, - children: SelectBlock[], - generateHtml: (el: any[]) => Promise - ): Promise { - const text = block.getProperty('text'); + override async block2html({ block, editor }: Block2HtmlProps) { + const textValue = block.getProperty('text'); const content = ''; - if (text) { - text.value.map(text => `${text}`).join(''); - } - // TODO: child - return `

`; + // TODO: text.value should export with style?? + const figcaption = (textValue?.value ?? []) + .map(({ text }) => `${text}`) + .join(''); + return `
${figcaption}
${figcaption}
`; } } diff --git a/libs/components/editor-blocks/src/blocks/numbered/index.ts b/libs/components/editor-blocks/src/blocks/numbered/index.ts index 37295e026f..d6eb9c1839 100644 --- a/libs/components/editor-blocks/src/blocks/numbered/index.ts +++ b/libs/components/editor-blocks/src/blocks/numbered/index.ts @@ -1,16 +1,10 @@ -import { - AsyncBlock, - BaseView, - SelectBlock, - getTextHtml, -} from '@toeverything/framework/virgo'; -import { - Protocol, - DefaultColumnsValue, -} from '@toeverything/datasource/db-service'; -// import { withTreeViewChildren } from '../../utils/with-tree-view-children'; +import { AsyncBlock, BaseView } from '@toeverything/framework/virgo'; +import { Protocol } from '@toeverything/datasource/db-service'; import { defaultTodoProps, NumberedView } from './NumberedView'; -import { IndentWrapper } from '../../components/IndentWrapper'; +import { + Block2HtmlProps, + commonBlock2HtmlContent, +} from '../../utils/commonBlockClip'; export class NumberedBlock extends BaseView { public type = Protocol.Block.Type.numbered; @@ -77,14 +71,7 @@ export class NumberedBlock extends BaseView { return null; } - - override async block2html( - block: AsyncBlock, - children: SelectBlock[], - generateHtml: (el: any[]) => Promise - ): Promise { - let content = getTextHtml(block); - content += await generateHtml(children); - return `
  1. ${content}
`; + override async block2html(props: Block2HtmlProps) { + return `
  1. ${await commonBlock2HtmlContent(props)}
`; } } diff --git a/libs/components/editor-blocks/src/blocks/page/index.ts b/libs/components/editor-blocks/src/blocks/page/index.ts index 06151bc481..4209cbbdb6 100644 --- a/libs/components/editor-blocks/src/blocks/page/index.ts +++ b/libs/components/editor-blocks/src/blocks/page/index.ts @@ -1,20 +1,9 @@ import { withRecastBlock } from '@toeverything/components/editor-core'; -import { - Protocol, - DefaultColumnsValue, -} from '@toeverything/datasource/db-service'; -import { - AsyncBlock, - BaseView, - ChildrenView, - getTextHtml, - SelectBlock, -} from '@toeverything/framework/virgo'; +import { Protocol } from '@toeverything/datasource/db-service'; +import { AsyncBlock, BaseView } from '@toeverything/framework/virgo'; import { PageView } from './PageView'; - -export const PageChildrenView: (prop: ChildrenView) => JSX.Element = props => - props.children; +import { Block2HtmlProps } from '../../utils/commonBlockClip'; export class PageBlock extends BaseView { type = Protocol.Block.Type.page; @@ -34,13 +23,17 @@ export class PageBlock extends BaseView { return this.get_decoration(content, 'text')?.value?.[0].text; } - override async block2html( - block: AsyncBlock, - children: SelectBlock[], - generateHtml: (el: any[]) => Promise - ): Promise { - const content = getTextHtml(block); - const childrenContent = await generateHtml(children); - return `

${content}

${childrenContent}`; + override async block2html({ block, editor, selectInfo }: Block2HtmlProps) { + const header = + await editor.clipboard.clipboardUtils.convertTextValue2HtmlBySelectInfo( + block, + selectInfo + ); + const childrenHtml = + await editor.clipboard.clipboardUtils.convertBlock2HtmlBySelectInfos( + block, + selectInfo?.children + ); + return `

${header}

${childrenHtml}`; } } diff --git a/libs/components/editor-blocks/src/blocks/text/QuoteBlock.tsx b/libs/components/editor-blocks/src/blocks/text/QuoteBlock.tsx index 94938aa595..c3613f585d 100644 --- a/libs/components/editor-blocks/src/blocks/text/QuoteBlock.tsx +++ b/libs/components/editor-blocks/src/blocks/text/QuoteBlock.tsx @@ -1,14 +1,13 @@ -import { - DefaultColumnsValue, - Protocol, -} from '@toeverything/datasource/db-service'; +import { Protocol } from '@toeverything/datasource/db-service'; import { AsyncBlock, BaseView, CreateView, - getTextHtml, - SelectBlock, } from '@toeverything/framework/virgo'; +import { + Block2HtmlProps, + commonBlock2HtmlContent, +} from '../../utils/commonBlockClip'; import { TextView } from './TextView'; @@ -60,14 +59,10 @@ export class QuoteBlock extends BaseView { return null; } - override async block2html( - block: AsyncBlock, - children: SelectBlock[], - generateHtml: (el: any[]) => Promise - ): Promise { - let content = getTextHtml(block); - content += await generateHtml(children); - return `
${content}
`; + override async block2html(props: Block2HtmlProps) { + return `
${await commonBlock2HtmlContent( + props + )}
`; } } @@ -135,13 +130,7 @@ export class CalloutBlock extends BaseView { return null; } - override async block2html( - block: AsyncBlock, - children: SelectBlock[], - generateHtml: (el: any[]) => Promise - ): Promise { - let content = getTextHtml(block); - content += await generateHtml(children); - return ``; + override async block2html(props: Block2HtmlProps) { + return ``; } } diff --git a/libs/components/editor-blocks/src/blocks/text/TextBlock.tsx b/libs/components/editor-blocks/src/blocks/text/TextBlock.tsx index 74085db922..7161d0ec9e 100644 --- a/libs/components/editor-blocks/src/blocks/text/TextBlock.tsx +++ b/libs/components/editor-blocks/src/blocks/text/TextBlock.tsx @@ -2,16 +2,15 @@ import { BaseView, CreateView, AsyncBlock, - SelectBlock, - getTextHtml, } from '@toeverything/framework/virgo'; -import { - DefaultColumnsValue, - Protocol, -} from '@toeverything/datasource/db-service'; +import { Protocol } from '@toeverything/datasource/db-service'; import { TextView } from './TextView'; import { getRandomString } from '@toeverything/components/common'; +import { + Block2HtmlProps, + commonBlock2HtmlContent, +} from '../../utils/commonBlockClip'; export class TextBlock extends BaseView { type = Protocol.Block.Type.text; @@ -111,14 +110,8 @@ export class TextBlock extends BaseView { : null; } - override async block2html( - block: AsyncBlock, - children: SelectBlock[], - generateHtml: (el: any[]) => Promise - ): Promise { - let content = getTextHtml(block); - content += await generateHtml(children); - return `

${content}

`; + override async block2html(props: Block2HtmlProps) { + return `

${await commonBlock2HtmlContent(props)}

`; } } @@ -168,14 +161,8 @@ export class Heading1Block extends BaseView { return null; } - override async block2html( - block: AsyncBlock, - children: SelectBlock[], - generateHtml: (el: any[]) => Promise - ): Promise { - let content = getTextHtml(block); - content += await generateHtml(children); - return `

${content}

`; + override async block2html(props: Block2HtmlProps) { + return `

${await commonBlock2HtmlContent(props)}

`; } } @@ -225,14 +212,8 @@ export class Heading2Block extends BaseView { return null; } - override async block2html( - block: AsyncBlock, - children: SelectBlock[], - generateHtml: (el: any[]) => Promise - ): Promise { - let content = getTextHtml(block); - content += await generateHtml(children); - return `

${content}

`; + override async block2html(props: Block2HtmlProps) { + return `

${await commonBlock2HtmlContent(props)}

`; } } @@ -282,13 +263,7 @@ export class Heading3Block extends BaseView { return null; } - override async block2html( - block: AsyncBlock, - children: SelectBlock[], - generateHtml: (el: any[]) => Promise - ): Promise { - let content = getTextHtml(block); - content += await generateHtml(children); - return `

${content}

`; + override async block2html(props: Block2HtmlProps) { + return `

${await commonBlock2HtmlContent(props)}

`; } } diff --git a/libs/components/editor-blocks/src/blocks/todo/index.ts b/libs/components/editor-blocks/src/blocks/todo/index.ts index db4187a890..9ea9bbccad 100644 --- a/libs/components/editor-blocks/src/blocks/todo/index.ts +++ b/libs/components/editor-blocks/src/blocks/todo/index.ts @@ -1,18 +1,12 @@ -import { - BaseView, - AsyncBlock, - SelectBlock, - getTextHtml, -} from '@toeverything/framework/virgo'; -// import type { CreateView } from '@toeverything/framework/virgo'; -import { - Protocol, - DefaultColumnsValue, -} from '@toeverything/datasource/db-service'; -// import { withTreeViewChildren } from '../../utils/with-tree-view-children'; +import { BaseView } from '@toeverything/framework/virgo'; +import { Protocol } from '@toeverything/datasource/db-service'; import { withTreeViewChildren } from '../../utils/WithTreeViewChildren'; import { TodoView, defaultTodoProps } from './TodoView'; import type { TodoAsyncBlock } from './types'; +import { + Block2HtmlProps, + commonBlock2HtmlContent, +} from '../../utils/commonBlockClip'; export class TodoBlock extends BaseView { type = Protocol.Block.Type.todo; @@ -78,13 +72,7 @@ export class TodoBlock extends BaseView { return null; } - override async block2html( - block: AsyncBlock, - children: SelectBlock[], - generateHtml: (el: any[]) => Promise - ): Promise { - let content = getTextHtml(block); - content += await generateHtml(children); - return `
  • [ ] ${content}
`; + override async block2html(props: Block2HtmlProps) { + return `
  • [ ] ${await commonBlock2HtmlContent(props)}
`; } } diff --git a/libs/components/editor-blocks/src/blocks/youtube/index.ts b/libs/components/editor-blocks/src/blocks/youtube/index.ts index 94ad3ac59d..f1f6e1faa3 100644 --- a/libs/components/editor-blocks/src/blocks/youtube/index.ts +++ b/libs/components/editor-blocks/src/blocks/youtube/index.ts @@ -5,6 +5,10 @@ import { SelectBlock, } from '@toeverything/framework/virgo'; import { YoutubeView } from './YoutubeView'; +import { + Block2HtmlProps, + commonBlock2HtmlContent, +} from '../../utils/commonBlockClip'; export class YoutubeBlock extends BaseView { public override selectable = true; @@ -44,12 +48,8 @@ export class YoutubeBlock extends BaseView { override async block2Text(block: AsyncBlock, selectInfo: SelectBlock) { return block.getProperty('embedLink')?.value ?? ''; } - override async block2html( - block: AsyncBlock, - children: SelectBlock[], - generateHtml: (el: any[]) => Promise - ): Promise { + override async block2html({ block }: Block2HtmlProps) { const url = block.getProperty('embedLink')?.value; - return `

${url}

`; + return `

${url}

`; } } diff --git a/libs/components/editor-blocks/src/utils/commonBlockClip.ts b/libs/components/editor-blocks/src/utils/commonBlockClip.ts new file mode 100644 index 0000000000..b381f465de --- /dev/null +++ b/libs/components/editor-blocks/src/utils/commonBlockClip.ts @@ -0,0 +1,30 @@ +import { + AsyncBlock, + BlockEditor, + SelectBlock, +} from '@toeverything/components/editor-core'; + +export type Block2HtmlProps = { + editor: BlockEditor; + block: AsyncBlock; + // The selectInfo parameter is not passed when the block is selected in ful, the selectInfo.type is Range + selectInfo?: SelectBlock; +}; + +export const commonBlock2HtmlContent = async ({ + editor, + block, + selectInfo, +}: Block2HtmlProps) => { + const html = + await editor.clipboard.clipboardUtils.convertTextValue2HtmlBySelectInfo( + block, + selectInfo + ); + const childrenHtml = + await editor.clipboard.clipboardUtils.convertBlock2HtmlBySelectInfos( + block, + selectInfo?.children + ); + return `${html}${childrenHtml}`; +}; diff --git a/libs/components/editor-core/src/editor/block/block-helper.ts b/libs/components/editor-core/src/editor/block/block-helper.ts index 70238c4be5..947e7eafe6 100644 --- a/libs/components/editor-core/src/editor/block/block-helper.ts +++ b/libs/components/editor-core/src/editor/block/block-helper.ts @@ -153,7 +153,7 @@ export class BlockHelper { public async getEditableBlockPropertiesBySelectInfo( block: AsyncBlock, - selectInfo: SelectBlock + selectInfo?: SelectBlock ) { const properties = block.getProperties(); if (properties.text.value.length === 0) { @@ -169,13 +169,13 @@ export class BlockHelper { // Use deepClone method will throw incomprehensible error let textValue = JSON.parse(JSON.stringify(originTextValue)); - if (selectInfo.endInfo) { + if (selectInfo?.endInfo) { textValue = textValue.slice(0, selectInfo.endInfo.arrayIndex + 1); textValue[textValue.length - 1].text = text_value[ textValue.length - 1 ].text.substring(0, selectInfo.endInfo.offset); } - if (selectInfo.startInfo) { + if (selectInfo?.startInfo) { textValue = textValue.slice(selectInfo.startInfo.arrayIndex); textValue[0].text = textValue[0].text.substring( selectInfo.startInfo.offset diff --git a/libs/components/editor-core/src/editor/clipboard/clipboard-parse.ts b/libs/components/editor-core/src/editor/clipboard/clipboard-parse.ts index 43b72ed6e7..04d976612d 100644 --- a/libs/components/editor-core/src/editor/clipboard/clipboard-parse.ts +++ b/libs/components/editor-core/src/editor/clipboard/clipboard-parse.ts @@ -1,31 +1,7 @@ import { Protocol, BlockFlavorKeys } from '@toeverything/datasource/db-service'; -import { escape } from '@toeverything/utils'; import { Editor } from '../editor'; -import { SelectBlock } from '../selection'; import { ClipBlockInfo } from './types'; -class DefaultBlockParse { - public static html2block(el: Element): ClipBlockInfo[] | undefined | null { - const tag_name = el.tagName; - if (tag_name === 'DIV' || el instanceof Text) { - return el.textContent?.split('\n').map(str => { - const data = { - text: escape(str), - }; - return { - type: 'text', - properties: { - text: { value: [data] }, - }, - children: [], - }; - }); - } - - return null; - } -} - export default class ClipboardParse { private editor: Editor; private static block_types: BlockFlavorKeys[] = [ @@ -82,7 +58,7 @@ export default class ClipboardParse { constructor(editor: Editor) { this.editor = editor; - this.generate_html = this.generate_html.bind(this); + // this.generate_html = this.generate_html.bind(this); this.parse_dom = this.parse_dom.bind(this); } // TODO: escape @@ -152,55 +128,6 @@ export default class ClipboardParse { return blocks; } - public async generateHtml(): Promise { - const select_info = await this.editor.selectionManager.getSelectInfo(); - return await this.generate_html(select_info.blocks); - } - - public async page2html(): Promise { - const root_block_id = this.editor.getRootBlockId(); - if (!root_block_id) { - return ''; - } - - const block_info = await this.get_select_info(root_block_id); - return await this.generate_html([block_info]); - } - - private async get_select_info(blockId: string) { - const block = await this.editor.getBlockById(blockId); - if (!block) return null; - const block_info: SelectBlock = { - blockId: block.id, - children: [], - }; - const children_ids = block.childrenIds; - for (let i = 0; i < children_ids.length; i++) { - block_info.children.push( - await this.get_select_info(children_ids[i]) - ); - } - return block_info; - } - - private async generate_html(selectBlocks: SelectBlock[]): Promise { - let result = ''; - for (let i = 0; i < selectBlocks.length; i++) { - const sel_block = selectBlocks[i]; - if (!sel_block || !sel_block.blockId) continue; - const block = await this.editor.getBlockById(sel_block.blockId); - if (!block) continue; - const block_utils = this.editor.getView(block.type); - const html = await block_utils.block2html( - block, - sel_block.children, - this.generate_html - ); - result += html; - } - return result; - } - public dispose() { this.editor = null; } diff --git a/libs/components/editor-core/src/editor/clipboard/clipboardUtils.ts b/libs/components/editor-core/src/editor/clipboard/clipboardUtils.ts index d50b2fbdae..f4e9665b7e 100644 --- a/libs/components/editor-core/src/editor/clipboard/clipboardUtils.ts +++ b/libs/components/editor-core/src/editor/clipboard/clipboardUtils.ts @@ -1,5 +1,9 @@ import { Editor } from '../editor'; -import { SelectBlock, SelectInfo } from '@toeverything/components/editor-core'; +import { + AsyncBlock, + SelectBlock, + SelectInfo, +} from '@toeverything/components/editor-core'; import { ClipBlockInfo, OFFICE_CLIPBOARD_MIMETYPE } from './types'; import { Clip } from './clip'; @@ -83,4 +87,76 @@ export class ClipboardUtils { }) ); } + + async convertTextValue2HtmlBySelectInfo( + blockOrBlockId: AsyncBlock | string, + selectBlockInfo?: SelectBlock + ) { + const block = + typeof blockOrBlockId === 'string' + ? await this._editor.getBlockById(blockOrBlockId) + : blockOrBlockId; + const selectedProperties = + await this._editor.blockHelper.getEditableBlockPropertiesBySelectInfo( + block, + selectBlockInfo + ); + return this._editor.blockHelper.convertTextValue2Html( + block.id, + selectedProperties.text.value + ); + } + async convertBlock2HtmlBySelectInfos( + blockOrBlockId: AsyncBlock | string, + selectBlockInfos?: SelectBlock[] + ) { + if (!selectBlockInfos) { + const block = + typeof blockOrBlockId === 'string' + ? await this._editor.getBlockById(blockOrBlockId) + : blockOrBlockId; + const children = await block?.children(); + return ( + await Promise.all( + children.map(async childBlock => { + const blockView = this._editor.getView(childBlock.type); + return await blockView.block2html({ + editor: this._editor, + block: childBlock, + }); + }) + ) + ).join(''); + } + + return ( + await Promise.all( + selectBlockInfos.map(async selectBlockInfo => { + const block = await this._editor.getBlockById( + selectBlockInfo.blockId + ); + const blockView = this._editor.getView(block.type); + return await blockView.block2html({ + editor: this._editor, + block, + selectInfo: selectBlockInfo, + }); + }) + ) + ).join(''); + } + + async page2html() { + const rootBlockId = this._editor.getRootBlockId(); + if (!rootBlockId) { + return ''; + } + const rootBlock = await this._editor.getBlockById(rootBlockId); + const blockView = this._editor.getView(rootBlock.type); + + return await blockView.block2html({ + editor: this._editor, + block: rootBlock, + }); + } } diff --git a/libs/components/editor-core/src/editor/clipboard/copy.ts b/libs/components/editor-core/src/editor/clipboard/copy.ts index 3056091cd3..4d89a500b6 100644 --- a/libs/components/editor-core/src/editor/clipboard/copy.ts +++ b/libs/components/editor-core/src/editor/clipboard/copy.ts @@ -50,62 +50,38 @@ class Copy { const textClip = await this._getTextClip(); clips.push(textClip); - // const htmlClip = await this._getHtmlClip(); - // clips.push(htmlClip); - const htmlClip = await this._clipboardParse.generateHtml(); - htmlClip && - clips.push(new Clip(OFFICE_CLIPBOARD_MIMETYPE.HTML, htmlClip)); + const htmlClip = await this._getHtmlClip(); + + clips.push(htmlClip); + // const htmlClip = await this._clipboardParse.generateHtml(); + // htmlClip && + // clips.push(new Clip(OFFICE_CLIPBOARD_MIMETYPE.HTML, htmlClip)); return clips; } - // private async _getHtmlClip(): Promise { - // const selectInfo: SelectInfo = - // await this._editor.selectionManager.getSelectInfo(); - // - // if (selectInfo.type === 'Range') { - // const html = ( - // await Promise.all( - // selectInfo.blocks.map(async selectBlockInfo => { - // const block = await this._editor.getBlockById( - // selectBlockInfo.blockId - // ); - // const blockView = this._editor.getView(block.type); - // const block2html = await blockView.block2html({ - // editor: this._editor, - // block, - // selectInfo: selectBlockInfo, - // }); - // - // if ( - // await this._editor.blockHelper.isBlockEditable( - // block - // ) - // ) { - // const selectedProperties = - // await this._editor.blockHelper.getEditableBlockPropertiesBySelectInfo( - // block, - // selectBlockInfo - // ); - // - // return ( - // block2html || - // this._editor.blockHelper.convertTextValue2Html( - // block.id, - // selectedProperties.text.value - // ) - // ); - // } - // - // return block2html; - // }) - // ) - // ).join(''); - // console.log('html', html); - // } - // - // return new Clip(OFFICE_CLIPBOARD_MIMETYPE.HTML, 'blockText'); - // } + private async _getHtmlClip(): Promise { + const selectInfo: SelectInfo = + await this._editor.selectionManager.getSelectInfo(); + + const htmlStr = ( + await Promise.all( + selectInfo.blocks.map(async selectBlockInfo => { + const block = await this._editor.getBlockById( + selectBlockInfo.blockId + ); + const blockView = this._editor.getView(block.type); + return await blockView.block2html({ + editor: this._editor, + block, + selectInfo: selectBlockInfo, + }); + }) + ) + ).join(''); + + return new Clip(OFFICE_CLIPBOARD_MIMETYPE.HTML, htmlStr); + } private async _getAffineClip(): Promise { const selectInfo: SelectInfo = diff --git a/libs/components/editor-core/src/editor/editor.ts b/libs/components/editor-core/src/editor/editor.ts index 9253ab2cbe..acdf4233c5 100644 --- a/libs/components/editor-core/src/editor/editor.ts +++ b/libs/components/editor-core/src/editor/editor.ts @@ -502,13 +502,7 @@ export class Editor implements Virgo { } public async page2html(): Promise { - return ''; - // const parse = this.clipboard?.getClipboardParse(); - // if (!parse) { - // return ''; - // } - // const html_str = await parse.page2html(); - // return html_str; + return this.clipboard?.clipboardUtils?.page2html?.(); } dispose() { diff --git a/libs/components/editor-core/src/editor/index.ts b/libs/components/editor-core/src/editor/index.ts index d03326f386..2525fe5683 100644 --- a/libs/components/editor-core/src/editor/index.ts +++ b/libs/components/editor-core/src/editor/index.ts @@ -8,5 +8,5 @@ export { Editor as BlockEditor } from './editor'; export * from './selection'; export { BlockDropPlacement, HookType, GroupDirection } from './types'; export type { Plugin, PluginCreator, PluginHooks, Virgo } from './types'; -export { BaseView, getTextHtml } from './views/base-view'; +export { BaseView } from './views/base-view'; export type { ChildrenView, CreateView } from './views/base-view'; diff --git a/libs/components/editor-core/src/editor/views/base-view.ts b/libs/components/editor-core/src/editor/views/base-view.ts index f9db79fbc5..d632f6e70a 100644 --- a/libs/components/editor-core/src/editor/views/base-view.ts +++ b/libs/components/editor-core/src/editor/views/base-view.ts @@ -135,13 +135,6 @@ export abstract class BaseView { return null; } - async block2html( - block: AsyncBlock, - children: SelectBlock[], - generateHtml: (el: any[]) => Promise - ): Promise { - return ''; - } async block2Text( block: AsyncBlock, // The selectInfo parameter is not passed when the block is selected in ful, the selectInfo.type is Range @@ -151,45 +144,12 @@ export abstract class BaseView { } // TODO: Try using new methods - // async block2html2(props: { - // editor: Editor; - // block: AsyncBlock; - // // The selectInfo parameter is not passed when the block is selected in ful, the selectInfo.type is Range - // selectInfo?: SelectBlock; - // }) { - // return ''; - // } + async block2html(props: { + editor: Editor; + block: AsyncBlock; + // The selectInfo parameter is not passed when the block is selected in ful, the selectInfo.type is Range + selectInfo?: SelectBlock; + }) { + return ''; + } } - -export const getTextHtml = (block: AsyncBlock) => { - const generate = (textList: any[]) => { - let content = ''; - textList.forEach(text_obj => { - let text = text_obj.text || ''; - if (text_obj.bold) { - text = `${text}`; - } - if (text_obj.italic) { - text = `${text}`; - } - if (text_obj.underline) { - text = `${text}`; - } - if (text_obj.inlinecode) { - text = `${text}`; - } - if (text_obj.strikethrough) { - text = `${text}`; - } - if (text_obj.type === 'link') { - text = `${generate( - text_obj.children - )}`; - } - content += text; - }); - return content; - }; - const text_list: any[] = block.getProperty('text').value; - return generate(text_list); -}; diff --git a/libs/components/layout/src/header/PageSettingPortal.tsx b/libs/components/layout/src/header/PageSettingPortal.tsx index 452734ff3c..9defcf754d 100644 --- a/libs/components/layout/src/header/PageSettingPortal.tsx +++ b/libs/components/layout/src/header/PageSettingPortal.tsx @@ -153,9 +153,7 @@ function PageSettingPortal() { const handleExportHtml = async () => { //@ts-ignore - const htmlContent = await virgo.clipboard - .getClipboardParse() - .page2html(); + const htmlContent = await virgo.clipboard.clipboardUtils.page2html(); const htmlTitle = pageBlock.title; FileExporter.exportHtml(htmlTitle, htmlContent); @@ -163,9 +161,7 @@ function PageSettingPortal() { const handleExportMarkdown = async () => { //@ts-ignore - const htmlContent = await virgo.clipboard - .getClipboardParse() - .page2html(); + const htmlContent = await virgo.clipboard.clipboardUtils.page2html(); const htmlTitle = pageBlock.title; FileExporter.exportMarkdown(htmlTitle, htmlContent); }; diff --git a/libs/components/layout/src/settings-sidebar/Settings/util/handle-export.ts b/libs/components/layout/src/settings-sidebar/Settings/util/handle-export.ts index fe284b986c..d329701f25 100644 --- a/libs/components/layout/src/settings-sidebar/Settings/util/handle-export.ts +++ b/libs/components/layout/src/settings-sidebar/Settings/util/handle-export.ts @@ -1,5 +1,4 @@ import { createEditor } from '@toeverything/components/affine-editor'; -import { ClipboardParse } from '@toeverything/components/editor-core'; import { fileExporter } from './file-exporter'; interface CreateClipboardParseProps { @@ -7,13 +6,12 @@ interface CreateClipboardParseProps { rootBlockId: string; } -const createClipboardParse = ({ +const createClipboardUtils = ({ workspaceId, rootBlockId, }: CreateClipboardParseProps) => { const editor = createEditor(workspaceId, rootBlockId); - - return new ClipboardParse(editor); + return editor.clipboard.clipboardUtils; }; interface ExportHandlerProps extends CreateClipboardParseProps { @@ -25,9 +23,8 @@ export const exportHtml = async ({ rootBlockId, title, }: ExportHandlerProps) => { - const clipboardParse = createClipboardParse({ workspaceId, rootBlockId }); - const htmlContent = await clipboardParse.page2html(); - fileExporter.exportHtml(title, htmlContent); + const clipboardUtils = createClipboardUtils({ workspaceId, rootBlockId }); + fileExporter.exportHtml(title, await clipboardUtils.page2html()); }; export const exportMarkdown = async ({ @@ -35,7 +32,6 @@ export const exportMarkdown = async ({ rootBlockId, title, }: ExportHandlerProps) => { - const clipboardParse = createClipboardParse({ workspaceId, rootBlockId }); - const htmlContent = await clipboardParse.page2html(); - fileExporter.exportMarkdown(title, htmlContent); + const clipboardUtils = createClipboardUtils({ workspaceId, rootBlockId }); + fileExporter.exportMarkdown(title, await clipboardUtils.page2html()); }; From ab070daa7ee511fb78b48ef26e0af6e7c93d4b29 Mon Sep 17 00:00:00 2001 From: mitsuha Date: Tue, 23 Aug 2022 15:37:44 +0800 Subject: [PATCH 05/81] feat: 1. add toc; --- README.md | 2 +- .../src/pages/workspace/docs/Page.tsx | 67 ++++--- .../workspace/docs/components/tabs/Tabs.tsx | 36 ++-- .../workspace/docs/components/toc/TOC.tsx | 168 ++++++++++++++++++ .../workspace/docs/components/toc/index.ts | 1 + .../docs/utils/getPageContentById.ts | 64 +++++++ .../editor-core/src/editor/editor.ts | 13 ++ .../db-service/src/services/index.ts | 9 + .../db-service/src/services/workspace/toc.ts | 28 +++ 9 files changed, 350 insertions(+), 38 deletions(-) create mode 100644 apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx create mode 100644 apps/ligo-virgo/src/pages/workspace/docs/components/toc/index.ts create mode 100644 apps/ligo-virgo/src/pages/workspace/docs/utils/getPageContentById.ts create mode 100644 libs/datasource/db-service/src/services/workspace/toc.ts diff --git a/README.md b/README.md index 718d32c94d..19e0db1307 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,7 @@ Our latest news can be found on [Twitter](https://twitter.com/AffineOfficial), [ # Contact Us -You may contact us by emailing to: contact@toeverything.info +You may contact us by emailing to: contact@toeverything.info # The Philosophy of AFFiNE diff --git a/apps/ligo-virgo/src/pages/workspace/docs/Page.tsx b/apps/ligo-virgo/src/pages/workspace/docs/Page.tsx index a2440a1757..6d9d2fac90 100644 --- a/apps/ligo-virgo/src/pages/workspace/docs/Page.tsx +++ b/apps/ligo-virgo/src/pages/workspace/docs/Page.tsx @@ -22,16 +22,29 @@ import { type BlockEditor } from '@toeverything/components/editor-core'; import { useFlag } from '@toeverything/datasource/feature-flags'; import { CollapsiblePageTree } from './collapsible-page-tree'; import { Tabs } from './components/tabs'; +import { TabMap, TAB_TITLE } from './components/tabs/Tabs'; +import { TOC } from './components/toc'; import { WorkspaceName } from './workspace-name'; + type PageProps = { workspace: string; }; export function Page(props: PageProps) { + const [activeTab, setActiveTab] = useState( + TabMap.get(TAB_TITLE.PAGES).value + ); const { page_id } = useParams(); const { showSpaceSidebar, fixedDisplay, setSpaceSidebarVisible } = useShowSpaceSidebar(); const dailyNotesFlag = useFlag('BooleanDailyNotes', false); + const editorRef = useRef(null); + + const onTabChange = v => setActiveTab(v); + + const getEditor = editor => { + editorRef.current = editor; + }; return ( @@ -50,35 +63,45 @@ export function Page(props: PageProps) { > - + -
- {dailyNotesFlag && ( + {activeTab === TabMap.get(TAB_TITLE.PAGES).value && ( +
+ {dailyNotesFlag && ( +
+ + + +
+ )}
- - + +
- )} -
- - - +
+ + {page_id ? : null} + +
-
- - {page_id ? : null} - -
-
+ )} + + {activeTab === TabMap.get(TAB_TITLE.TOC).value && ( + TOC + )} - + ); } @@ -86,9 +109,11 @@ export function Page(props: PageProps) { const EditorContainer = ({ pageId, workspace, + getEditor, }: { pageId: string; workspace: string; + getEditor: (editor: BlockEditor) => void; }) => { const [lockScroll, setLockScroll] = useState(false); const [scrollContainer, setScrollContainer] = useState(); @@ -105,6 +130,8 @@ const EditorContainer = ({ const obv = new ResizeObserver(e => { setPageClientWidth(e[0].contentRect.width); }); + + getEditor(editorRef.current); obv.observe(scrollContainer); return () => obv.disconnect(); } diff --git a/apps/ligo-virgo/src/pages/workspace/docs/components/tabs/Tabs.tsx b/apps/ligo-virgo/src/pages/workspace/docs/components/tabs/Tabs.tsx index 74a8dcc5ae..aea0c88374 100644 --- a/apps/ligo-virgo/src/pages/workspace/docs/components/tabs/Tabs.tsx +++ b/apps/ligo-virgo/src/pages/workspace/docs/components/tabs/Tabs.tsx @@ -1,6 +1,5 @@ import { styled } from '@toeverything/components/ui'; import type { ValueOf } from '@toeverything/utils'; -import { useState } from 'react'; const StyledTabs = styled('div')(({ theme }) => { return { @@ -56,32 +55,35 @@ const StyledTabTitle = styled('div')<{ } `; -const TAB_TITLE = { - PAGES: 'pages', - GALLERY: 'gallery', - TOC: 'toc', +export const TAB_TITLE = { + PAGES: 'PAGES', + GALLERY: 'GALLERY', + TOC: 'TOC', } as const; -const TabMap = new Map([ - ['PAGES', { value: 'pages' }], - ['GALLERY', { value: 'gallery', disabled: true }], - ['TOC', { value: 'toc' }], +export const TabMap = new Map< + TabValue, + { value: TabValue; disabled?: boolean } +>([ + [TAB_TITLE.PAGES, { value: TAB_TITLE.PAGES }], + [TAB_TITLE.GALLERY, { value: TAB_TITLE.GALLERY, disabled: true }], + [TAB_TITLE.TOC, { value: TAB_TITLE.TOC }], ]); -type TabKey = keyof typeof TAB_TITLE; type TabValue = ValueOf; -const Tabs = () => { - const [activeValue, setActiveTab] = useState(TAB_TITLE.PAGES); +interface Props { + activeTab: TabValue; + onTabChange: (v: TabValue) => void; +} - const onClick = (v: TabValue) => { - setActiveTab(v); - }; +const Tabs = (props: Props) => { + const { activeTab, onTabChange } = props; return ( {[...TabMap.entries()].map(([k, { value, disabled = false }]) => { - const isActive = activeValue === value; + const isActive = activeTab === value; return ( { className={isActive ? 'active' : ''} isActive={isActive} isDisabled={disabled} - onClick={() => onClick(value)} + onClick={() => onTabChange(value)} > {k} diff --git a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx new file mode 100644 index 0000000000..b2c0aa693e --- /dev/null +++ b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx @@ -0,0 +1,168 @@ +import { BlockEditor } from '@toeverything/components/editor-core'; +import { styled } from '@toeverything/components/ui'; +import { services } from '@toeverything/datasource/db-service'; +import type { ReactNode } from 'react'; +import { + createContext, + useCallback, + useContext, + useEffect, + useState, +} from 'react'; +import { useParams } from 'react-router'; +import { + BLOCK_TYPES, + getPageContentById, +} from '../../utils/getPageContentById'; + +const StyledTOC = styled('div')(() => { + return {}; +}); + +const StyledTOCItem = styled('a')<{ type?: string; isActive?: boolean }>( + ({ type, isActive }) => { + const common = { + height: '32px', + display: 'flex', + alignItems: 'center', + cursor: 'pointer', + color: isActive ? '#3E6FDB' : '#4C6275', + }; + + if (type === BLOCK_TYPES.HEADING1) { + return { + ...common, + padding: '0 12px', + fontWeight: '600', + fontSize: '16px', + }; + } + + if (type === BLOCK_TYPES.HEADING2) { + return { + ...common, + padding: '0 32px', + fontSize: '14px', + }; + } + + if (type === BLOCK_TYPES.HEADING3) { + return { + ...common, + padding: '0 52px', + fontSize: '12px', + }; + } + + if (type === BLOCK_TYPES.GROUP) { + return { + ...common, + margin: '6px 0px', + height: '46px', + padding: '6px 12px', + fontWeight: '600', + fontSize: '16px', + borderTop: '0.5px solid #E0E6EB', + borderBottom: '0.5px solid #E0E6EB', + color: isActive ? '#3E6FDB' : '#98ACBD', + }; + } + + return {}; + } +); + +const StyledItem = styled('div')(props => { + return { + overflow: 'hidden', + textOverflow: 'ellipsis', + whiteSpace: 'nowrap', + }; +}); + +const TOCContext = createContext(null); + +interface Props { + children: ReactNode; + editor: BlockEditor; +} + +const TOCItem = props => { + const { activeBlockId, onClick } = useContext(TOCContext); + const { id, type, text } = props; + const isActive = id === activeBlockId; + + return ( + onClick(id)} + > + {text} + + ); +}; + +const renderTOCContent = tocDataSource => { + return ( + <> + {tocDataSource.map(tocItem => { + if (tocItem?.length) { + return renderTOCContent(tocItem); + } + + const { id, type, text } = tocItem; + + return ; + })} + + ); +}; + +export const TOC = (props: Props) => { + const { editor } = props; + const { workspace_id, page_id } = useParams(); + const [tocDataSource, setTocDataSource] = useState([]); + const [activeBlockId, setActiveBlockId] = useState('blockId'); + + const updateTocDataSource = useCallback(async () => { + const tocDataSource = await getPageContentById(editor, page_id); + setTocDataSource(tocDataSource); + }, [editor, page_id]); + + useEffect(() => { + (async () => await updateTocDataSource())(); + }, [updateTocDataSource]); + + useEffect(() => { + let unobserve: () => void; + const observe = async () => { + unobserve = await services.api.tocService.observe( + { workspace: workspace_id, pageId: page_id }, + updateTocDataSource + ); + }; + void observe(); + + return () => { + unobserve?.(); + }; + }, [updateTocDataSource, workspace_id]); + + const onClick = async (blockId?: string) => { + if (blockId === activeBlockId) { + return; + } + + console.log(blockId); + setActiveBlockId(blockId); + await editor.scrollManager.scrollIntoViewByBlockId(blockId); + }; + + return ( + + {renderTOCContent(tocDataSource)} + + ); +}; diff --git a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/index.ts b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/index.ts new file mode 100644 index 0000000000..e603af8242 --- /dev/null +++ b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/index.ts @@ -0,0 +1 @@ +export { TOC } from './TOC'; diff --git a/apps/ligo-virgo/src/pages/workspace/docs/utils/getPageContentById.ts b/apps/ligo-virgo/src/pages/workspace/docs/utils/getPageContentById.ts new file mode 100644 index 0000000000..b1d16cb9d6 --- /dev/null +++ b/apps/ligo-virgo/src/pages/workspace/docs/utils/getPageContentById.ts @@ -0,0 +1,64 @@ +import type { BlockEditor } from '@toeverything/components/editor-core'; + +export const BLOCK_TYPES = { + GROUP: 'group', + HEADING1: 'heading1', + HEADING2: 'heading2', + HEADING3: 'heading3', +}; + +const getContentByAsyncBlocks = async (asyncBlocks = []) => { + /* maybe should recast it to tail recursion */ + return await Promise.all( + asyncBlocks.map(async asyncBlock => { + const asyncBlocks = await asyncBlock.children(); + + if (asyncBlocks?.length) { + return getContentByAsyncBlocks(asyncBlocks); + } + + const { id, type } = asyncBlock; + + if (Object.values(BLOCK_TYPES).includes(type)) { + const properties = await asyncBlock.getProperties(); + + return { + id: id, + type, + text: properties?.text?.value?.[0]?.text || '', + }; + } + + return null; + }) + ); +}; + +const getPageContentById = async (editor: BlockEditor, pageId: string) => { + const { children = [] } = (await editor.queryByPageId(pageId))?.[0] || {}; + const asyncBlocks = (await editor.getBlockByIds(children)) || []; + + const tocContents = await getContentByAsyncBlocks(asyncBlocks); + + return tocContents + .reduce((tocGroupContent, tocContent, index) => { + const { id, type } = asyncBlocks[index]; + const groupContent = { + id, + type, + text: 'Untitled Group', + }; + + tocGroupContent.push( + !tocContent.flat(Infinity).filter(Boolean).length + ? groupContent + : tocContent + ); + + return tocGroupContent; + }, []) + .flat(Infinity) + .filter(Boolean); +}; + +export { getPageContentById }; diff --git a/libs/components/editor-core/src/editor/editor.ts b/libs/components/editor-core/src/editor/editor.ts index e7f6458a5f..74243ba6aa 100644 --- a/libs/components/editor-core/src/editor/editor.ts +++ b/libs/components/editor-core/src/editor/editor.ts @@ -333,6 +333,12 @@ export class Editor implements Virgo { return await this.getBlock({ workspace: this.workspace, id: blockId }); } + async getBlockByIds(ids: string[]): Promise[]> { + return await Promise.all( + ids.map(id => this.getBlock({ workspace: this.workspace, id })) + ); + } + /** * TODO: to be optimized * get block`s dom by block`s id @@ -477,6 +483,13 @@ export class Editor implements Virgo { return await services.api.editorBlock.query(this.workspace, query); } + async queryByPageId(pageId: string) { + return await services.api.editorBlock.get({ + workspace: this.workspace, + ids: [pageId], + }); + } + /** Hooks */ public getHooks(): HooksRunner & PluginHooks { diff --git a/libs/datasource/db-service/src/services/index.ts b/libs/datasource/db-service/src/services/index.ts index 315ee84496..c39119fe68 100644 --- a/libs/datasource/db-service/src/services/index.ts +++ b/libs/datasource/db-service/src/services/index.ts @@ -5,6 +5,7 @@ import { Database } from './database'; import { EditorBlock } from './editor-block'; import { FileService } from './file'; import { PageTree } from './workspace/page-tree'; +import { TOC } from './workspace/toc'; import { UserConfig } from './workspace/user-config'; export { @@ -48,6 +49,7 @@ export interface DbServicesMap { userConfig: UserConfig; file: FileService; commentService: CommentService; + tocService: TOC; } interface RegisterDependencyConfigWithName extends RegisterDependencyConfig { @@ -76,6 +78,13 @@ const dbServiceConfig: RegisterDependencyConfigWithName[] = [ value: PageTree, dependencies: [{ token: Database }], }, + { + type: 'class', + callName: 'tocService', + token: TOC, + value: TOC, + dependencies: [{ token: Database }], + }, { type: 'class', callName: 'userConfig', diff --git a/libs/datasource/db-service/src/services/workspace/toc.ts b/libs/datasource/db-service/src/services/workspace/toc.ts new file mode 100644 index 0000000000..16bec3da18 --- /dev/null +++ b/libs/datasource/db-service/src/services/workspace/toc.ts @@ -0,0 +1,28 @@ +import { ServiceBaseClass } from '../base'; +import { ReturnUnobserve } from '../database/observer'; +import { ObserveCallback } from './page-tree'; + +export class TOC extends ServiceBaseClass { + private onActivePageChange?: () => void; + + async observe( + { workspace, pageId }: { workspace: string; pageId: string }, + callback: ObserveCallback + ): Promise { + // not only use observe, but also addChildrenListener is OK 🎉🎉🎉 + // const pageBlock = await this.getBlock(workspace, pageId); + // + // this.onActivePageChange?.(); + // pageBlock?.addChildrenListener('onPageChildrenChange', () => { + // callback(); + // }); + // + // this.onActivePageChange = () => pageBlock?.removeChildrenListener('onPageChildrenChange'); + + const unobserve = await this._observe(workspace, pageId, callback); + + return () => { + unobserve(); + }; + } +} From a13e2a59d3c30f5908cc18c73913e8327b85d9e9 Mon Sep 17 00:00:00 2001 From: tzhangchi Date: Tue, 23 Aug 2022 16:51:41 +0800 Subject: [PATCH 06/81] docs(readme): update readme.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 718d32c94d..19e0db1307 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,7 @@ Our latest news can be found on [Twitter](https://twitter.com/AffineOfficial), [ # Contact Us -You may contact us by emailing to: contact@toeverything.info +You may contact us by emailing to: contact@toeverything.info # The Philosophy of AFFiNE From eedb4864df81d80830e7d5b9912da6110cff0b72 Mon Sep 17 00:00:00 2001 From: austaras Date: Tue, 23 Aug 2022 12:04:32 +0800 Subject: [PATCH 07/81] mod(whiteboard): close tool panel when select tool --- README.md | 2 +- libs/components/affine-board/src/Board.tsx | 7 ++-- .../src/components/tools-panel/LineTools.tsx | 6 +++- .../src/components/tools-panel/ShapeTools.tsx | 6 +++- .../src/components/tools-panel/ToolsPanel.tsx | 36 +++++++++---------- .../tools-panel/pen-tools/PenTools.tsx | 17 ++++++--- libs/components/ui/src/cascader/Cascader.tsx | 2 +- libs/components/ui/src/popper/Popper.tsx | 11 ++++-- libs/components/ui/src/popper/interface.ts | 2 ++ 9 files changed, 55 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 718d32c94d..19e0db1307 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,7 @@ Our latest news can be found on [Twitter](https://twitter.com/AffineOfficial), [ # Contact Us -You may contact us by emailing to: contact@toeverything.info +You may contact us by emailing to: contact@toeverything.info # The Philosophy of AFFiNE diff --git a/libs/components/affine-board/src/Board.tsx b/libs/components/affine-board/src/Board.tsx index af9e8982fe..101d54d37b 100644 --- a/libs/components/affine-board/src/Board.tsx +++ b/libs/components/affine-board/src/Board.tsx @@ -134,17 +134,14 @@ const AffineBoard = ({ } }) ); - let pageBindingsString = ( + const pageBindingsString = ( await services.api.editorBlock.get({ workspace: workspace, ids: [rootBlockId], }) )?.[0].properties.bindings?.value; - console.log(123123123); - let pageBindings = JSON.parse(pageBindingsString ?? '{}'); - console.log(pageBindings, 3333, bindings); + const pageBindings = JSON.parse(pageBindingsString ?? '{}'); Object.keys(bindings).forEach(bindingsKey => { - console.log(345345345345345); if (!bindings[bindingsKey]) { delete pageBindings[bindingsKey]; } else { diff --git a/libs/components/board-draw/src/components/tools-panel/LineTools.tsx b/libs/components/board-draw/src/components/tools-panel/LineTools.tsx index 3ef546ca3c..ce6cb97574 100644 --- a/libs/components/board-draw/src/components/tools-panel/LineTools.tsx +++ b/libs/components/board-draw/src/components/tools-panel/LineTools.tsx @@ -35,6 +35,7 @@ const activeToolSelector = (s: TDSnapshot) => s.appState.activeTool; export const LineTools = ({ app }: { app: TldrawApp }) => { const activeTool = app.useStore(activeToolSelector); + const [visible, setVisible] = useState(false); const [lastActiveTool, setLastActiveTool] = useState( TDShapeType.Line @@ -51,8 +52,10 @@ export const LineTools = ({ app }: { app: TldrawApp }) => { return ( setVisible(prev => !prev)} + onClickAway={() => setVisible(false)} content={ {shapes.map(({ type, label, tooltip, icon: Icon }) => ( @@ -60,6 +63,7 @@ export const LineTools = ({ app }: { app: TldrawApp }) => { { app.selectTool(type); + setVisible(false); setLastActiveTool(type); }} > diff --git a/libs/components/board-draw/src/components/tools-panel/ShapeTools.tsx b/libs/components/board-draw/src/components/tools-panel/ShapeTools.tsx index eb2fb5c564..0c04126c95 100644 --- a/libs/components/board-draw/src/components/tools-panel/ShapeTools.tsx +++ b/libs/components/board-draw/src/components/tools-panel/ShapeTools.tsx @@ -71,6 +71,7 @@ const activeToolSelector = (s: TDSnapshot) => s.appState.activeTool; export const ShapeTools = ({ app }: { app: TldrawApp }) => { const activeTool = app.useStore(activeToolSelector); + const [visible, setVisible] = useState(false); const [lastActiveTool, setLastActiveTool] = useState( TDShapeType.Rectangle @@ -87,8 +88,10 @@ export const ShapeTools = ({ app }: { app: TldrawApp }) => { return ( setVisible(prev => !prev)} + onClickAway={() => setVisible(false)} content={ {shapes.map(({ type, label, tooltip, icon: Icon }) => ( @@ -96,6 +99,7 @@ export const ShapeTools = ({ app }: { app: TldrawApp }) => { { app.selectTool(type); + setVisible(false); setLastActiveTool(type); }} > diff --git a/libs/components/board-draw/src/components/tools-panel/ToolsPanel.tsx b/libs/components/board-draw/src/components/tools-panel/ToolsPanel.tsx index f659fdff1c..82a5315816 100644 --- a/libs/components/board-draw/src/components/tools-panel/ToolsPanel.tsx +++ b/libs/components/board-draw/src/components/tools-panel/ToolsPanel.tsx @@ -12,12 +12,12 @@ import { import { IconButton, PopoverContainer, + styled, // MuiIconButton as IconButton, // MuiTooltip as Tooltip, Tooltip, useTheme, } from '@toeverything/components/ui'; -import style9 from 'style9'; import { TldrawApp } from '@toeverything/components/board-state'; import { @@ -90,8 +90,8 @@ export const ToolsPanel = ({ app }: { app: TldrawApp }) => { }} direction="none" > -
-
+ + {tools.map( ({ type, @@ -127,24 +127,22 @@ export const ToolsPanel = ({ app }: { app: TldrawApp }) => { ) )} -
-
+ + ); }; -const styles = style9.create({ - container: { - display: 'flex', - flexDirection: 'column', - justifyContent: 'center', - height: '100%', - }, - toolBar: { - display: 'flex', - flexDirection: 'column', - backgroundColor: '#ffffff', - borderRadius: '10px', - padding: '4px 4px', - }, +const Container = styled('div')({ + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + height: '100%', +}); +const ToolBar = styled('div')({ + display: 'flex', + flexDirection: 'column', + backgroundColor: '#ffffff', + borderRadius: '10px', + padding: '4px 4px', }); diff --git a/libs/components/board-draw/src/components/tools-panel/pen-tools/PenTools.tsx b/libs/components/board-draw/src/components/tools-panel/pen-tools/PenTools.tsx index 0536acfce1..c955afba0d 100644 --- a/libs/components/board-draw/src/components/tools-panel/pen-tools/PenTools.tsx +++ b/libs/components/board-draw/src/components/tools-panel/pen-tools/PenTools.tsx @@ -12,7 +12,7 @@ import { styled, Tooltip, } from '@toeverything/components/ui'; -import { ReactElement, type CSSProperties } from 'react'; +import { useState, type CSSProperties, type ReactElement } from 'react'; import { Palette } from '../../palette'; import { Pen } from './Pen'; @@ -106,6 +106,7 @@ const PENCIL_CONFIGS_MAP = PENCIL_CONFIGS.reduce< export const PenTools = ({ app }: { app: TldrawApp }) => { const appCurrentTool = app.useStore(state => state.appState.activeTool); + const [visible, setVisible] = useState(false); const chosenPen = PENCIL_CONFIGS.find(config => config.key === appCurrentTool) || PENCIL_CONFIGS[0]; @@ -134,8 +135,10 @@ export const PenTools = ({ app }: { app: TldrawApp }) => { return ( setVisible(prev => !prev)} + onClickAway={() => setVisible(false)} content={ @@ -153,7 +156,10 @@ export const PenTools = ({ app }: { app: TldrawApp }) => { name={title} primaryColor={color_vars['--color-0']} secondaryColor={color_vars['--color-1']} - onClick={() => setPen(key)} + onClick={() => { + setVisible(false); + setPen(key); + }} /> ); } @@ -163,7 +169,10 @@ export const PenTools = ({ app }: { app: TldrawApp }) => { setPenColor(color)} + onSelect={color => { + setVisible(false); + setPenColor(color); + }} />
diff --git a/libs/components/ui/src/cascader/Cascader.tsx b/libs/components/ui/src/cascader/Cascader.tsx index 1ba44aab6b..7bf43413f2 100644 --- a/libs/components/ui/src/cascader/Cascader.tsx +++ b/libs/components/ui/src/cascader/Cascader.tsx @@ -1,5 +1,5 @@ import { ArrowRightIcon } from '@toeverything/components/icons'; -import { ReactElement, useRef, useState } from 'react'; +import { useRef, useState, type ReactElement } from 'react'; import { Divider } from '../divider'; import { MuiGrow as Grow, diff --git a/libs/components/ui/src/popper/Popper.tsx b/libs/components/ui/src/popper/Popper.tsx index 924e3be8fd..55d5692927 100644 --- a/libs/components/ui/src/popper/Popper.tsx +++ b/libs/components/ui/src/popper/Popper.tsx @@ -35,6 +35,8 @@ export const Popper = ({ offset = [0, 5], showArrow = false, popperHandlerRef, + onClick, + onClickAway, ...popperProps }: PopperProps) => { const [anchorEl, setAnchorEl] = useState(null); @@ -97,15 +99,20 @@ export const Popper = ({ return ( { - setVisible(false); + if (visibleControlledByParent) { + onClickAway?.(); + } else { + setVisible(false); + } }} > {isAnchorCustom ? null : (
setAnchorEl(dom)} - onClick={() => { + onClick={e => { if (!hasClickTrigger || visibleControlledByParent) { + onClick?.(e); return; } setVisible(!visible); diff --git a/libs/components/ui/src/popper/interface.ts b/libs/components/ui/src/popper/interface.ts index b449eff61f..1f7473ebf4 100644 --- a/libs/components/ui/src/popper/interface.ts +++ b/libs/components/ui/src/popper/interface.ts @@ -62,4 +62,6 @@ export type PopperProps = { showArrow?: boolean; popperHandlerRef?: Ref; + + onClickAway?: () => void; } & Omit; From 6df2676c8807916110fb77d0cc29df69ae265089 Mon Sep 17 00:00:00 2001 From: DarkSky Date: Tue, 23 Aug 2022 17:07:16 +0800 Subject: [PATCH 08/81] refactor: jwt internal version migration --- libs/datasource/jwt/package.json | 2 +- libs/datasource/jwt/src/block/abstract.ts | 35 +++--- libs/datasource/jwt/src/block/base.ts | 38 +++--- libs/datasource/jwt/src/block/indexer.ts | 33 +++-- libs/datasource/jwt/src/index.ts | 117 +++++++++++------- libs/datasource/jwt/src/types/block.ts | 6 +- libs/datasource/jwt/src/utils/event-bus.ts | 2 +- libs/datasource/jwt/src/utils/index.ts | 4 +- .../jwt/src/{adapter => }/yjs/binary.ts | 6 +- .../jwt/src/{adapter => }/yjs/block.ts | 17 +-- .../jwt/src/{adapter => }/yjs/gatekeeper.ts | 2 +- .../jwt/src/{adapter => }/yjs/history.ts | 5 +- .../jwt/src/{adapter => }/yjs/index.ts | 42 ++++--- .../jwt/src/{adapter => }/yjs/listener.ts | 3 +- .../jwt/src/{adapter => }/yjs/operation.ts | 38 ++++-- .../jwt/src/{adapter => }/yjs/provider.ts | 6 +- .../src/{adapter/index.ts => yjs/types.ts} | 6 +- pnpm-lock.yaml | 57 ++++++++- 18 files changed, 274 insertions(+), 145 deletions(-) rename libs/datasource/jwt/src/{adapter => }/yjs/binary.ts (96%) rename libs/datasource/jwt/src/{adapter => }/yjs/block.ts (95%) rename libs/datasource/jwt/src/{adapter => }/yjs/gatekeeper.ts (95%) rename libs/datasource/jwt/src/{adapter => }/yjs/history.ts (95%) rename libs/datasource/jwt/src/{adapter => }/yjs/index.ts (95%) rename libs/datasource/jwt/src/{adapter => }/yjs/listener.ts (98%) rename libs/datasource/jwt/src/{adapter => }/yjs/operation.ts (93%) rename libs/datasource/jwt/src/{adapter => }/yjs/provider.ts (97%) rename libs/datasource/jwt/src/{adapter/index.ts => yjs/types.ts} (97%) diff --git a/libs/datasource/jwt/package.json b/libs/datasource/jwt/package.json index dd8f6f6761..b43942b6ee 100644 --- a/libs/datasource/jwt/package.json +++ b/libs/datasource/jwt/package.json @@ -12,7 +12,7 @@ "file-selector": "^0.6.0", "flexsearch": "^0.7.21", "lib0": "^0.2.52", - "lru-cache": "^7.13.2", + "lru-cache": "^7.14.0", "ts-debounce": "^4.0.0" }, "dependencies": { diff --git a/libs/datasource/jwt/src/block/abstract.ts b/libs/datasource/jwt/src/block/abstract.ts index 38ee415e05..55249514b3 100644 --- a/libs/datasource/jwt/src/block/abstract.ts +++ b/libs/datasource/jwt/src/block/abstract.ts @@ -1,3 +1,10 @@ +import { + BlockFlavorKeys, + BlockFlavors, + BlockTypeKeys, + BlockTypes, +} from '../types'; +import { getLogger } from '../utils'; import { BlockInstance, BlockListener, @@ -6,14 +13,7 @@ import { ContentTypes, HistoryManager, MapOperation, -} from '../adapter'; -import { - BlockFlavorKeys, - BlockFlavors, - BlockTypeKeys, - BlockTypes, -} from '../types'; -import { getLogger } from '../utils'; +} from '../yjs/types'; declare const JWT_DEV: boolean; const logger = getLogger('BlockDB:block'); @@ -29,10 +29,10 @@ export class AbstractBlock< private readonly _id: string; private readonly _block: BlockInstance; private readonly _history: HistoryManager; - private readonly _root?: AbstractBlock; + private readonly _root: AbstractBlock | undefined; private readonly _parentListener: Map; - private _parent?: AbstractBlock; + private _parent: AbstractBlock | undefined; private _changeParent?: () => void; constructor( @@ -48,7 +48,9 @@ export class AbstractBlock< this._parentListener = new Map(); JWT_DEV && logger_debug(`init: exists ${this._id}`); - if (parent) this._refreshParent(parent); + if (parent) { + this._refreshParent(parent); + } } public get root() { @@ -146,7 +148,7 @@ export class AbstractBlock< return new Date(timestamp) .toISOString() .split('T')[0] - .replace(/-/g, ''); + ?.replace(/-/g, ''); } // eslint-disable-next-line no-empty } catch (e) {} @@ -259,7 +261,7 @@ export class AbstractBlock< } /** - * Insert sub-Block + * Insert children block * @param block Block instance * @param position Insertion position, if it is empty, it will be inserted at the end. If the block already exists, the position will be moved * @returns @@ -270,9 +272,12 @@ export class AbstractBlock< ) { JWT_DEV && logger(`insertChildren: start`); - if (block.id === this._id) return; // avoid self-reference + if (block.id === this._id) { + // avoid self-reference + return; + } if ( - this.type !== BlockTypes.block || // binary cannot insert subblocks + this.type !== BlockTypes.block || // binary cannot insert children blocks (block.type !== BlockTypes.block && this.flavor !== BlockFlavors.workspace) // binary can only be inserted into workspace ) { diff --git a/libs/datasource/jwt/src/block/base.ts b/libs/datasource/jwt/src/block/base.ts index 72183187b1..b5872980db 100644 --- a/libs/datasource/jwt/src/block/base.ts +++ b/libs/datasource/jwt/src/block/base.ts @@ -1,3 +1,5 @@ +import { BlockItem } from '../types'; +import { getLogger } from '../utils'; import { ArrayOperation, BlockInstance, @@ -5,9 +7,7 @@ import { ContentTypes, InternalPlainObject, MapOperation, -} from '../adapter'; -import { BlockItem } from '../types'; -import { getLogger } from '../utils'; +} from '../yjs/types'; import { AbstractBlock } from './abstract'; import { BlockCapability } from './capability'; @@ -23,8 +23,8 @@ export interface Decoration extends InternalPlainObject { type Validator = (value: T | undefined) => boolean | void; export type IndexMetadata = Readonly<{ - content?: string; - reference?: string; + content: string | undefined; + reference: string | undefined; tags: string[]; }>; export type QueryMetadata = Readonly< @@ -51,7 +51,7 @@ export class BaseBlock< B extends BlockInstance, C extends ContentOperation > extends AbstractBlock { - private readonly _exporters?: Exporters; + private readonly _exporters: Exporters | undefined; private readonly _contentExportersGetter: () => Map< string, ReadableContentExporter @@ -68,7 +68,7 @@ export class BaseBlock< ReadableContentExporter >; - validators: Map = new Map(); + private readonly _validators: Map = new Map(); constructor( block: B, @@ -157,14 +157,14 @@ export class BaseBlock< setValidator(key: string, validator?: Validator) { if (validator) { - this.validators.set(key, validator); + this._validators.set(key, validator); } else { - this.validators.delete(key); + this._validators.delete(key); } } private validate(key: string, value: unknown): boolean { - const validate = this.validators.get(key); + const validate = this._validators.get(key); if (validate) { return validate(value) === false ? false : true; } @@ -179,7 +179,7 @@ export class BaseBlock< } /** - * Get an instance of the child Block + * Get an instance of the child block * @param blockId block id */ private get_children_instance(blockId?: string): BaseBlock[] { @@ -201,9 +201,15 @@ export class BaseBlock< } try { const parent_page = this._getParentPage(false); - if (parent_page) metadata['page'] = parent_page; - if (this.group) metadata['group'] = this.group.id; - if (this.parent) metadata['parent'] = this.parent.id; + if (parent_page) { + metadata['page'] = parent_page; + } + if (this.group) { + metadata['group'] = this.group.id; + } + if (this.parent) { + metadata['parent'] = this.parent.id; + } } catch (e) { logger(`Failed to export default metadata`, e); } @@ -228,7 +234,9 @@ export class BaseBlock< for (const [name, exporter] of this._contentExportersGetter()) { try { const content = exporter(this.getContent()); - if (content) contents.push(content); + if (content) { + contents.push(content); + } } catch (err) { logger(`Failed to export content: ${name}`, err); } diff --git a/libs/datasource/jwt/src/block/indexer.ts b/libs/datasource/jwt/src/block/indexer.ts index dfee685b7e..ed57465dbc 100644 --- a/libs/datasource/jwt/src/block/indexer.ts +++ b/libs/datasource/jwt/src/block/indexer.ts @@ -7,14 +7,14 @@ import produce from 'immer'; import LRUCache from 'lru-cache'; import sift, { Query } from 'sift'; +import { BlockFlavors } from '../types'; +import { BlockEventBus, getLogger } from '../utils'; import { AsyncDatabaseAdapter, BlockInstance, ChangedStates, ContentOperation, -} from '../adapter'; -import { BlockFlavors } from '../types'; -import { BlockEventBus, getLogger } from '../utils'; +} from '../yjs/types'; import { BaseBlock, IndexMetadata, QueryMetadata } from './base'; @@ -315,7 +315,9 @@ export class BlockIndexer< private _testMetaKey(key: string) { try { const metadata = this._blockMetadata.values().next().value; - if (!metadata || typeof metadata !== 'object') return false; + if (!metadata || typeof metadata !== 'object') { + return false; + } return !!(key in metadata); } catch (e) { return false; @@ -324,8 +326,11 @@ export class BlockIndexer< private _getSortedMetadata(sort: string, desc?: boolean) { const sorter = naturalSort(Array.from(this._blockMetadata.entries())); - if (desc) return sorter.desc(([, m]) => m[sort]); - else return sorter.asc(([, m]) => m[sort]); + if (desc) { + return sorter.desc(([, m]) => m[sort]); + } else { + return sorter.asc(([, m]) => m[sort]); + } } public query(query: QueryIndexMetadata) { @@ -337,15 +342,23 @@ export class BlockIndexer< if ($sort && this._testMetaKey($sort)) { const metadata = this._getSortedMetadata($sort, $desc); metadata.forEach(([key, value]) => { - if (matches.length > limit) return; - if (filter(value)) matches.push(key); + if (matches.length > limit) { + return; + } + if (filter(value)) { + matches.push(key); + } }); return matches; } else { this._blockMetadata.forEach((value, key) => { - if (matches.length > limit) return; - if (filter(value)) matches.push(key); + if (matches.length > limit) { + return; + } + if (filter(value)) { + matches.push(key); + } }); return matches; diff --git a/libs/datasource/jwt/src/index.ts b/libs/datasource/jwt/src/index.ts index 664e0f21fa..e08bdc1e16 100644 --- a/libs/datasource/jwt/src/index.ts +++ b/libs/datasource/jwt/src/index.ts @@ -1,26 +1,7 @@ /* eslint-disable max-lines */ import { DocumentSearchOptions } from 'flexsearch'; import LRUCache from 'lru-cache'; -import { - AsyncDatabaseAdapter, - BlockInstance, - BlockListener, - ChangedStates, - Connectivity, - ContentOperation, - ContentTypes, - DataExporter, - getDataExporter, - HistoryManager, - YjsAdapter, - YjsContentOperation, - YjsInitOptions, -} from './adapter'; -import { - getYjsProviders, - YjsBlockInstance, - YjsProviderOptions, -} from './adapter/yjs'; + import { BaseBlock, BlockIndexer, @@ -39,6 +20,26 @@ import { UUID, } from './types'; import { BlockEventBus, genUUID, getLogger } from './utils'; +import { + getYjsProviders, + YjsAdapter, + YjsBlockInstance, + YjsContentOperation, + YjsInitOptions, + YjsProviderOptions, +} from './yjs'; +import { + AsyncDatabaseAdapter, + BlockInstance, + BlockListener, + ChangedStates, + Connectivity, + ContentOperation, + ContentTypes, + DataExporter, + getDataExporter, + HistoryManager, +} from './yjs/types'; declare const JWT_DEV: boolean; @@ -157,8 +158,11 @@ export class BlockClient< public addBlockListener(tag: string, listener: BlockListener) { const bus = this._eventBus.topic('updated'); - if (tag !== 'index' || !bus.has(tag)) bus.on(tag, listener); - else console.error(`block listener ${tag} is reserved or exists`); + if (tag !== 'index' || !bus.has(tag)) { + bus.on(tag, listener); + } else { + console.error(`block listener ${tag} is reserved or exists`); + } } public removeBlockListener(tag: string) { @@ -170,8 +174,11 @@ export class BlockClient< listener: BlockListener> ) { const bus = this._eventBus.topic>>('editing'); - if (tag !== 'index' || !bus.has(tag)) bus.on(tag, listener); - else console.error(`editing listener ${tag} is reserved or exists`); + if (tag !== 'index' || !bus.has(tag)) { + bus.on(tag, listener); + } else { + console.error(`editing listener ${tag} is reserved or exists`); + } } public removeEditingListener(tag: string) { @@ -184,15 +191,18 @@ export class BlockClient< ) { const bus = this._eventBus.topic>('connectivity'); - if (tag !== 'index' || !bus.has(tag)) bus.on(tag, listener); - else + if (tag !== 'index' || !bus.has(tag)) { + bus.on(tag, listener); + } else { console.error(`connectivity listener ${tag} is reserved or exists`); + } } public removeConnectivityListener(tag: string) { this._eventBus.topic('connectivity').off(tag); } + // @ts-ignore private inspector() { return { ...this._adapter.inspector(), @@ -220,7 +230,9 @@ export class BlockClient< this.addBlockListener('index', async states => { await Promise.allSettled( Array.from(states.entries()).map(([id, state]) => { - if (state === 'delete') this._blockCaches.delete(id); + if (state === 'delete') { + this._blockCaches.delete(id); + } return this._blockIndexer.refreshIndex(id, state); }) ); @@ -255,7 +267,7 @@ export class BlockClient< } /** - * research all + * Full text search * @param part_of_title_or_content Title or content keyword, support Chinese * @param part_of_title_or_content.index search range, optional values: title, ttl, content, reference * @param part_of_title_or_content.tag tag, string or array of strings, supports multiple tags @@ -295,7 +307,9 @@ export class BlockClient< this.search(part_of_title_or_content).flatMap(({ result }) => result.map(async id => { const page = this._pageMapping.get(id as string); - if (page) return page; + if (page) { + return page; + } const block = await this.get(id as BlockTypeKeys); return this.set_page(block); }) @@ -307,9 +321,10 @@ export class BlockClient< } return Promise.all( this._blockIndexer.getMetadata(pages).map(async page => ({ - content: this.get_decoded_content( - await this._adapter.getBlock(page.id) - ), + content: + this.get_decoded_content( + await this._adapter.getBlock(page.id) + ) || '', ...page, })) ); @@ -327,9 +342,10 @@ export class BlockClient< const ids = this.query(query); return Promise.all( this._blockIndexer.getMetadata(ids).map(async page => ({ - content: this.get_decoded_content( - await this._adapter.getBlock(page.id) - ), + content: + this.get_decoded_content( + await this._adapter.getBlock(page.id) + ) || '', ...page, })) ); @@ -378,7 +394,7 @@ export class BlockClient< private async get_parent(id: string) { const parents = this._parentMapping.get(id); - if (parents) { + if (parents && parents[0]) { const parent_block_id = parents[0]; if (!this._blockCaches.has(parent_block_id)) { this._blockCaches.set( @@ -405,7 +421,9 @@ export class BlockClient< private set_page(block: BaseBlock) { const page = this._pageMapping.get(block.id); - if (page) return page; + if (page) { + return page; + } const parent_page = block.parent_page; if (parent_page) { this._pageMapping.set(block.id, parent_page); @@ -472,8 +490,9 @@ export class BlockClient< matched += 1; } } - if (matched === conditions.length) + if (matched === conditions.length) { exporters.push([name, exporter] as const); + } } return exporters; @@ -487,7 +506,9 @@ export class BlockClient< ); if (exporter) { const op = block.content.asMap(); - if (op) return exporter[1](op); + if (op) { + return exporter[1](op); + } } } return undefined; @@ -566,7 +587,9 @@ export class BlockClient< this.set_page(abstract_block); abstract_block.on('parent', 'client_hook', state => { const [parent] = state.keys(); - this.set_parent(parent, abstract_block.id); + if (parent) { + this.set_parent(parent, abstract_block.id); + } this.set_page(abstract_block); }); this._blockCaches.set(abstract_block.id, abstract_block); @@ -650,13 +673,6 @@ export type BlockInitOptions = NonNullable< Parameters[1] >; -export type { - ArrayOperation, - ChangedStates, - Connectivity, - MapOperation, - TextOperation, -} from './adapter'; export type { BlockSearchItem, Decoration as BlockDecoration, @@ -665,4 +681,11 @@ export type { export { BlockTypes, BucketBackend as BlockBackend } from './types'; export type { BlockTypeKeys } from './types'; export { isBlock } from './utils'; +export type { + ArrayOperation, + ChangedStates, + Connectivity, + MapOperation, + TextOperation, +} from './yjs/types'; export type { QueryIndexMetadata }; diff --git a/libs/datasource/jwt/src/types/block.ts b/libs/datasource/jwt/src/types/block.ts index 3b04dc7830..d1867f1ef9 100644 --- a/libs/datasource/jwt/src/types/block.ts +++ b/libs/datasource/jwt/src/types/block.ts @@ -1,4 +1,4 @@ -import { ContentOperation } from '../adapter'; +import { ContentOperation } from '../yjs/types'; import { RefMetadata } from './metadata'; import { UUID } from './uuid'; // base type of block @@ -60,8 +60,8 @@ export type BlockItem = { flavor: typeof BlockFlavors[BlockFlavorKeys]; children: string[]; readonly created: number; // creation time, UTC timestamp - readonly updated?: number; // update time, UTC timestamp - readonly creator?: string; // creator id + readonly updated?: number | undefined; // update time, UTC timestamp + readonly creator?: string | undefined; // creator id content: C; // Essentially what is stored here is either Uint8Array (binary resource) or YDoc (structured resource) }; diff --git a/libs/datasource/jwt/src/utils/event-bus.ts b/libs/datasource/jwt/src/utils/event-bus.ts index 50f5363390..85096dd6ed 100644 --- a/libs/datasource/jwt/src/utils/event-bus.ts +++ b/libs/datasource/jwt/src/utils/event-bus.ts @@ -81,7 +81,7 @@ class BlockScopedEventBus extends BlockEventBus { options?: ListenerOptions ) { if (options?.debounce) { - const { wait, maxWait } = options.debounce; + const { wait, maxWait = 500 } = options.debounce; const debounced = debounce(listener, wait, { maxWait }); this.on_listener(this._topic, name, e => { debounced((e as CustomEvent)?.detail); diff --git a/libs/datasource/jwt/src/utils/index.ts b/libs/datasource/jwt/src/utils/index.ts index f19e5633a1..3d0d3bb101 100644 --- a/libs/datasource/jwt/src/utils/index.ts +++ b/libs/datasource/jwt/src/utils/index.ts @@ -39,7 +39,9 @@ export function getLogger(namespace: string) { if (JWT_DEV) { const logger = debug(namespace); logger.log = console.log.bind(console); - if (JWT_DEV === ('testing' as any)) logger.enabled = true; + if (JWT_DEV === ('testing' as any)) { + logger.enabled = true; + } return logger; } else { return () => {}; diff --git a/libs/datasource/jwt/src/adapter/yjs/binary.ts b/libs/datasource/jwt/src/yjs/binary.ts similarity index 96% rename from libs/datasource/jwt/src/adapter/yjs/binary.ts rename to libs/datasource/jwt/src/yjs/binary.ts index 468710ac4a..c156452c78 100644 --- a/libs/datasource/jwt/src/adapter/yjs/binary.ts +++ b/libs/datasource/jwt/src/yjs/binary.ts @@ -25,7 +25,7 @@ export class YjsRemoteBinaries { } else { // TODO: Remote Load try { - const file = await this._remoteStorage?.instance.getBuffData( + const file = await this._remoteStorage?.instance?.getBuffData( name ); console.log(file); @@ -44,11 +44,11 @@ export class YjsRemoteBinaries { this._binaries.set(name, binary); if (this._remoteStorage) { // TODO: Remote Save, if there is an object with the same name remotely, the upload is skipped, because the file name is the hash of the file content - const has_file = this._remoteStorage.instance.exist(name); + const has_file = this._remoteStorage.instance?.exist(name); if (!has_file) { const upload_file = new File(binary.toArray(), name); await this._remoteStorage.instance - .upload(upload_file) + ?.upload(upload_file) .catch(err => { throw new Error(`${err} upload error`); }); diff --git a/libs/datasource/jwt/src/adapter/yjs/block.ts b/libs/datasource/jwt/src/yjs/block.ts similarity index 95% rename from libs/datasource/jwt/src/adapter/yjs/block.ts rename to libs/datasource/jwt/src/yjs/block.ts index 3f2b756799..513016f90e 100644 --- a/libs/datasource/jwt/src/adapter/yjs/block.ts +++ b/libs/datasource/jwt/src/yjs/block.ts @@ -5,8 +5,8 @@ import { transact, } from 'yjs'; -import { BlockItem, BlockTypes } from '../../types'; -import { BlockInstance, BlockListener, HistoryManager } from '../index'; +import { BlockItem, BlockTypes } from '../types'; +import { BlockInstance, BlockListener, HistoryManager } from './types'; import { YjsHistoryManager } from './history'; import { ChildrenListenerHandler, ContentListenerHandler } from './listener'; @@ -34,7 +34,7 @@ type YjsBlockInstanceProps = { export class YjsBlockInstance implements BlockInstance { private readonly _id: string; private readonly _block: YMap; - private readonly _binary?: YArray; + private readonly _binary: YArray | undefined; private readonly _children: YArray; private readonly _setBlock: ( id: string, @@ -48,8 +48,7 @@ export class YjsBlockInstance implements BlockInstance { private readonly _childrenListeners: Map; private readonly _contentListeners: Map; - // eslint-disable-next-line @typescript-eslint/naming-convention - _childrenMap: Map; + private _childrenMap: Map; constructor(props: YjsBlockInstanceProps) { this._id = props.id; @@ -184,7 +183,9 @@ export class YjsBlockInstance implements BlockInstance { } hasChildren(id: string): boolean { - if (this.children.includes(id)) return true; + if (this.children.includes(id)) { + return true; + } return this.getChildren().some(block => block.hasChildren(id)); } @@ -263,7 +264,9 @@ export class YjsBlockInstance implements BlockInstance { break; } } - if (id) failed.push(id); + if (id) { + failed.push(id); + } } this._childrenMap = getMapFromYArray(this._children); diff --git a/libs/datasource/jwt/src/adapter/yjs/gatekeeper.ts b/libs/datasource/jwt/src/yjs/gatekeeper.ts similarity index 95% rename from libs/datasource/jwt/src/adapter/yjs/gatekeeper.ts rename to libs/datasource/jwt/src/yjs/gatekeeper.ts index 7e02c5a09e..9acf1becf5 100644 --- a/libs/datasource/jwt/src/adapter/yjs/gatekeeper.ts +++ b/libs/datasource/jwt/src/yjs/gatekeeper.ts @@ -32,7 +32,7 @@ export class GateKeeper { return creator === this._userId || !!this._common.get(block_id); } - checkDeleteLists(block_ids: string[]) { + checkDeleteLists(block_ids: string[]): [string[], string[]] { const success = []; const fail = []; for (const block_id of block_ids) { diff --git a/libs/datasource/jwt/src/adapter/yjs/history.ts b/libs/datasource/jwt/src/yjs/history.ts similarity index 95% rename from libs/datasource/jwt/src/adapter/yjs/history.ts rename to libs/datasource/jwt/src/yjs/history.ts index 6739cf9a50..5c6f5c4001 100644 --- a/libs/datasource/jwt/src/adapter/yjs/history.ts +++ b/libs/datasource/jwt/src/yjs/history.ts @@ -1,10 +1,11 @@ import { Map as YMap, UndoManager } from 'yjs'; -import { HistoryCallback, HistoryManager } from '../../adapter'; +import { HistoryCallback, HistoryManager } from './types'; type StackItem = UndoManager['undoStack'][0]; export class YjsHistoryManager implements HistoryManager { + // @ts-ignore private readonly _blocks: YMap; private readonly _historyManager: UndoManager; private readonly _pushListeners: Map>; @@ -56,7 +57,7 @@ export class YjsHistoryManager implements HistoryManager { } break(): void { - // this.#history_manager. + // this._historyManager. } undo(): Map | undefined { diff --git a/libs/datasource/jwt/src/adapter/yjs/index.ts b/libs/datasource/jwt/src/yjs/index.ts similarity index 95% rename from libs/datasource/jwt/src/adapter/yjs/index.ts rename to libs/datasource/jwt/src/yjs/index.ts index ec201c2d84..7d0f30e4e3 100644 --- a/libs/datasource/jwt/src/adapter/yjs/index.ts +++ b/libs/datasource/jwt/src/yjs/index.ts @@ -18,15 +18,15 @@ import { transact, } from 'yjs'; +import { BlockItem, BlockTypes } from '../types'; +import { getLogger, sha3, sleep } from '../utils'; import { AsyncDatabaseAdapter, BlockListener, ChangedStateKeys, Connectivity, HistoryManager, -} from '../../adapter'; -import { BlockItem, BlockTypes } from '../../types'; -import { getLogger, sha3, sleep } from '../../utils'; +} from './types'; import { YjsRemoteBinaries } from './binary'; import { YjsBlockInstance } from './block'; @@ -40,6 +40,7 @@ import { import { YjsProvider } from './provider'; declare const JWT_DEV: boolean; +// @ts-ignore const logger = getLogger('BlockDB:yjs'); type ConnectivityListener = ( @@ -54,7 +55,7 @@ type YjsProviders = { gatekeeper: GateKeeper; connListener: { listeners?: ConnectivityListener }; userId: string; - remoteToken?: string; // remote storage token + remoteToken: string | undefined; // remote storage token }; const _yjsDatabaseInstance = new Map(); @@ -70,8 +71,8 @@ async function _initYjsDatabase( workspace: string, options: { userId: string; - token?: string; - provider?: Record; + token?: string | undefined; + provider?: Record | undefined; } ): Promise { if (_asyncInitLoading.has(workspace)) { @@ -243,9 +244,10 @@ export class YjsAdapter implements AsyncDatabaseAdapter { typeof updated === 'number' && updated + 1000 * 10 > Date.now() ) { - if (!editing_mapping[editing]) + if (!editing_mapping[editing]) { editing_mapping[editing] = []; - editing_mapping[editing].push(userId); + } + editing_mapping[editing]?.push(userId); } } listener( @@ -338,7 +340,7 @@ export class YjsAdapter implements AsyncDatabaseAdapter { ], }); const [file] = (await fromEvent(handles)) as File[]; - const binary = await file.arrayBuffer(); + const binary = await file?.arrayBuffer(); // await this._provider.idb.clearData(); const doc = new Doc({ autoLoad: true, shouldLoad: true }); let updated = 0; @@ -348,7 +350,9 @@ export class YjsAdapter implements AsyncDatabaseAdapter { updated += 1; }); setInterval(() => { - if (updated > 0) updated -= 1; + if (updated > 0) { + updated -= 1; + } }, 500); const update_check = new Promise(resolve => { @@ -362,8 +366,10 @@ export class YjsAdapter implements AsyncDatabaseAdapter { }); // await new IndexedDBProvider(this._provider.idb.name, doc) // .whenSynced; - applyUpdate(doc, new Uint8Array(binary)); - await update_check; + if (binary) { + applyUpdate(doc, new Uint8Array(binary)); + await update_check; + } console.log('load success'); }, parse: () => this._doc.toJSON(), @@ -409,8 +415,8 @@ export class YjsAdapter implements AsyncDatabaseAdapter { async createBlock( options: Pick, 'type' | 'flavor'> & { - uuid?: string; - binary?: ArrayBufferLike; + uuid: string | undefined; + binary: ArrayBufferLike | undefined; } ): Promise { const uuid = options.uuid || `affine${nanoid(16)}`; @@ -481,7 +487,9 @@ export class YjsAdapter implements AsyncDatabaseAdapter { async getBlock(id: string): Promise { const block_instance = this.get_block_sync(id); - if (block_instance) return block_instance; + if (block_instance) { + return block_instance; + } const block = this._blocks.get(id); if (block && block.get('type') === BlockTypes.binary) { const binary = await this._binaries.get( @@ -540,7 +548,9 @@ export class YjsAdapter implements AsyncDatabaseAdapter { let uploaded: Promise | undefined; if (!block.size) { const content = item.content[INTO_INNER](); - if (!content) return reject(); + if (!content) { + return reject(); + } const children = new YArray(); children.push(item.children); diff --git a/libs/datasource/jwt/src/adapter/yjs/listener.ts b/libs/datasource/jwt/src/yjs/listener.ts similarity index 98% rename from libs/datasource/jwt/src/adapter/yjs/listener.ts rename to libs/datasource/jwt/src/yjs/listener.ts index 36c203bbce..a109862b20 100644 --- a/libs/datasource/jwt/src/adapter/yjs/listener.ts +++ b/libs/datasource/jwt/src/yjs/listener.ts @@ -1,7 +1,8 @@ import { produce } from 'immer'; import { debounce } from 'ts-debounce'; import { YEvent } from 'yjs'; -import { BlockListener, ChangedStateKeys } from '../index'; + +import { BlockListener, ChangedStateKeys } from './types'; let listener_suspend = false; diff --git a/libs/datasource/jwt/src/adapter/yjs/operation.ts b/libs/datasource/jwt/src/yjs/operation.ts similarity index 93% rename from libs/datasource/jwt/src/adapter/yjs/operation.ts rename to libs/datasource/jwt/src/yjs/operation.ts index a8dfdaffa4..8d1bac4723 100644 --- a/libs/datasource/jwt/src/adapter/yjs/operation.ts +++ b/libs/datasource/jwt/src/yjs/operation.ts @@ -6,6 +6,7 @@ import { Text as YText, } from 'yjs'; +import { ChildrenListenerHandler, ContentListenerHandler } from './listener'; import { ArrayOperation, BaseTypes, @@ -16,21 +17,29 @@ import { Operable, TextOperation, TextToken, -} from '../index'; -import { ChildrenListenerHandler, ContentListenerHandler } from './listener'; +} from './types'; const INTO_INNER = Symbol('INTO_INNER'); export const DO_NOT_USE_THIS_OR_YOU_WILL_BE_FIRED_SYMBOL_INTO_INNER: typeof INTO_INNER = INTO_INNER; -function auto_get(root: ContentOperation, key: string): unknown | undefined { +function auto_get( + root: ContentOperation, + key: string | undefined +): unknown | undefined { const array = root.asArray(); - if (array && !Number.isNaN(Number(key))) return array.get(Number(key)); + if (array && !Number.isNaN(Number(key))) { + return array.get(Number(key)); + } const map = root.asMap(); - if (map) return map.get(key); + if (map && key) { + return map.get(key); + } const text = root.asText(); - if (text) return text.toString(); + if (text) { + return text.toString(); + } console.error('auto_get unknown root', root, key); return undefined; } @@ -150,7 +159,9 @@ export class YjsContentOperation implements ContentOperation { if (root instanceof YjsContentOperation) { if (path.length === 1) { const [key] = path; - if (key) return auto_set(root, key, data); + if (key) { + return auto_set(root, key, data); + } console.error('autoSet unknown path', root, path, data); return; } @@ -191,6 +202,7 @@ export class YjsContentOperation implements ContentOperation { } // eslint-disable-next-line @typescript-eslint/naming-convention + // @ts-ignore private toJSON() { return this._content.toJSON(); } @@ -283,7 +295,9 @@ class YjsArrayOperation get(index: number): Operable | undefined { const content = this._arrayContent.get(index); - if (content) return this.to_operable(content); + if (content) { + return this.to_operable(content); + } return undefined; } @@ -368,7 +382,9 @@ class YjsMapOperation set(key: string, value: Operable): void { if (value instanceof YjsContentOperation) { const content = value[INTO_INNER](); - if (content) this._mapContent.set(key, content as unknown as T); + if (content) { + this._mapContent.set(key, content as unknown as T); + } } else { this._mapContent.set(key, value as T); } @@ -376,7 +392,9 @@ class YjsMapOperation get(key: string): Operable | undefined { const content = this._mapContent.get(key); - if (content) return this.to_operable(content); + if (content) { + return this.to_operable(content); + } return undefined; } diff --git a/libs/datasource/jwt/src/adapter/yjs/provider.ts b/libs/datasource/jwt/src/yjs/provider.ts similarity index 97% rename from libs/datasource/jwt/src/adapter/yjs/provider.ts rename to libs/datasource/jwt/src/yjs/provider.ts index ba1835cc52..99a09fd69c 100644 --- a/libs/datasource/jwt/src/adapter/yjs/provider.ts +++ b/libs/datasource/jwt/src/yjs/provider.ts @@ -7,13 +7,13 @@ import { WebsocketProvider, } from '@toeverything/datasource/jwt-rpc'; -import { Connectivity } from '../../adapter'; -import { BucketBackend } from '../../types'; +import { BucketBackend } from '../types'; +import { Connectivity } from './types'; type YjsDefaultInstances = { awareness: Awareness; doc: Doc; - token?: string; + token?: string | undefined; workspace: string; emitState: (connectivity: Connectivity) => void; }; diff --git a/libs/datasource/jwt/src/adapter/index.ts b/libs/datasource/jwt/src/yjs/types.ts similarity index 97% rename from libs/datasource/jwt/src/adapter/index.ts rename to libs/datasource/jwt/src/yjs/types.ts index 2d7176e6be..b23c685e5c 100644 --- a/libs/datasource/jwt/src/adapter/index.ts +++ b/libs/datasource/jwt/src/yjs/types.ts @@ -139,8 +139,8 @@ interface AsyncDatabaseAdapter { reload(): void; createBlock( options: Pick, 'type' | 'flavor'> & { - binary?: ArrayBuffer; - uuid?: string; + binary: ArrayBuffer | undefined; + uuid: string | undefined; } ): Promise>; getBlock(id: string): Promise | undefined>; @@ -184,8 +184,6 @@ export const getDataExporter = () => { return { importData, exportData, hasExporter, installExporter }; }; -export { YjsAdapter } from './yjs'; -export type { YjsContentOperation, YjsInitOptions } from './yjs'; export type { AsyncDatabaseAdapter, BlockPosition, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 802d964374..e9f182f211 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -184,7 +184,7 @@ importers: yjs: ^13.5.41 dependencies: authing-js-sdk: 4.23.35 - firebase-admin: 11.0.1_@firebase+app-types@0.7.0 + firebase-admin: 11.0.1 lib0: 0.2.52 lru-cache: 7.13.2 nanoid: 4.0.0 @@ -566,6 +566,9 @@ importers: dependencies: ffc-js-client-side-sdk: 1.1.5 + libs/datasource/jwst/pkg: + specifiers: {} + libs/datasource/jwt: specifiers: '@types/debug': ^4.1.7 @@ -583,7 +586,7 @@ importers: idb-keyval: ^6.2.0 immer: ^9.0.15 lib0: ^0.2.52 - lru-cache: ^7.13.2 + lru-cache: ^7.14.0 nanoid: ^4.0.0 sha3: ^2.1.4 sift: ^16.0.0 @@ -614,7 +617,7 @@ importers: file-selector: 0.6.0 flexsearch: 0.7.21 lib0: 0.2.52 - lru-cache: 7.13.2 + lru-cache: 7.14.0 ts-debounce: 4.0.0 libs/datasource/jwt-rpc: @@ -3180,6 +3183,15 @@ packages: - utf-8-validate dev: true + /@firebase/auth-interop-types/0.1.6_@firebase+util@1.6.3: + resolution: {integrity: sha512-etIi92fW3CctsmR9e3sYM3Uqnoq861M0Id9mdOPF6PWIg38BXL5k4upCNBggGUpLIS0H1grMOvy/wn1xymwe2g==} + peerDependencies: + '@firebase/app-types': 0.x + '@firebase/util': 1.x + dependencies: + '@firebase/util': 1.6.3 + dev: false + /@firebase/auth-interop-types/0.1.6_pbfwexsq7uf6mrzcwnikj3g37m: resolution: {integrity: sha512-etIi92fW3CctsmR9e3sYM3Uqnoq861M0Id9mdOPF6PWIg38BXL5k4upCNBggGUpLIS0H1grMOvy/wn1xymwe2g==} peerDependencies: @@ -3188,6 +3200,7 @@ packages: dependencies: '@firebase/app-types': 0.7.0 '@firebase/util': 1.6.3 + dev: true /@firebase/auth-types/0.11.0_pbfwexsq7uf6mrzcwnikj3g37m: resolution: {integrity: sha512-q7Bt6cx+ySj9elQHTsKulwk3+qDezhzRBFC9zlQ1BjgMueUOnGMcvqmU0zuKlQ4RhLSH7MNAdBV2znVaoN3Vxw==} @@ -3223,6 +3236,19 @@ packages: '@firebase/util': 1.6.3 tslib: 2.4.0 + /@firebase/database-compat/0.2.4: + resolution: {integrity: sha512-VtsGixO5mTjNMJn6PwxAJEAR70fj+3blCXIdQKel3q+eYGZAfdqxox1+tzZDnf9NWBJpaOgAHPk3JVDxEo9NFQ==} + dependencies: + '@firebase/component': 0.5.17 + '@firebase/database': 0.13.4 + '@firebase/database-types': 0.9.12 + '@firebase/logger': 0.3.3 + '@firebase/util': 1.6.3 + tslib: 2.4.0 + transitivePeerDependencies: + - '@firebase/app-types' + dev: false + /@firebase/database-compat/0.2.4_@firebase+app-types@0.7.0: resolution: {integrity: sha512-VtsGixO5mTjNMJn6PwxAJEAR70fj+3blCXIdQKel3q+eYGZAfdqxox1+tzZDnf9NWBJpaOgAHPk3JVDxEo9NFQ==} dependencies: @@ -3234,6 +3260,7 @@ packages: tslib: 2.4.0 transitivePeerDependencies: - '@firebase/app-types' + dev: true /@firebase/database-types/0.9.10: resolution: {integrity: sha512-2ji6nXRRsY+7hgU6zRhUtK0RmSjVWM71taI7Flgaw+BnopCo/lDF5HSwxp8z7LtiHlvQqeRA3Ozqx5VhlAbiKg==} @@ -3248,6 +3275,19 @@ packages: '@firebase/app-types': 0.7.0 '@firebase/util': 1.6.3 + /@firebase/database/0.13.4: + resolution: {integrity: sha512-NW7bOoiaC4sJCj6DY/m9xHoFNa0CK32YPMCh6FiMweLCDQbOZM8Ql/Kn6yyuxCb7K7ypz9eSbRlCWQJsJRQjhg==} + dependencies: + '@firebase/auth-interop-types': 0.1.6_@firebase+util@1.6.3 + '@firebase/component': 0.5.17 + '@firebase/logger': 0.3.3 + '@firebase/util': 1.6.3 + faye-websocket: 0.11.4 + tslib: 2.4.0 + transitivePeerDependencies: + - '@firebase/app-types' + dev: false + /@firebase/database/0.13.4_@firebase+app-types@0.7.0: resolution: {integrity: sha512-NW7bOoiaC4sJCj6DY/m9xHoFNa0CK32YPMCh6FiMweLCDQbOZM8Ql/Kn6yyuxCb7K7ypz9eSbRlCWQJsJRQjhg==} dependencies: @@ -3259,6 +3299,7 @@ packages: tslib: 2.4.0 transitivePeerDependencies: - '@firebase/app-types' + dev: true /@firebase/firestore-compat/0.1.23_53yvy43rwpg2c45kgeszsxtrca: resolution: {integrity: sha512-QfcuyMAavp//fQnjSfCEpnbWi7spIdKaXys1kOLu7395fLr+U6ykmto1HUMCSz8Yus9cEr/03Ujdi2SUl2GUAA==} @@ -10332,12 +10373,12 @@ packages: semver-regex: 2.0.0 dev: true - /firebase-admin/11.0.1_@firebase+app-types@0.7.0: + /firebase-admin/11.0.1: resolution: {integrity: sha512-rL3wlZbi2Kb/KJgcmj1YHlD4ZhfmhfgRO2YJialxAllm0tj1IQea878hHuBLGmv4DpbW9t9nLvX9kddNR2Y65Q==} engines: {node: '>=14'} dependencies: '@fastify/busboy': 1.1.0 - '@firebase/database-compat': 0.2.4_@firebase+app-types@0.7.0 + '@firebase/database-compat': 0.2.4 '@firebase/database-types': 0.9.10 '@types/node': 18.0.1 jsonwebtoken: 8.5.1 @@ -13573,6 +13614,12 @@ packages: /lru-cache/7.13.2: resolution: {integrity: sha512-VJL3nIpA79TodY/ctmZEfhASgqekbT574/c4j3jn4bKXbSCnTTCH/KltZyvL2GlV+tGSMtsWyem8DCX7qKTMBA==} engines: {node: '>=12'} + dev: false + + /lru-cache/7.14.0: + resolution: {integrity: sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ==} + engines: {node: '>=12'} + dev: true /lru-memoizer/2.1.4: resolution: {integrity: sha512-IXAq50s4qwrOBrXJklY+KhgZF+5y98PDaNo0gi/v2KQBFLyWr+JyFvijZXkGKjQj/h9c0OwoE+JZbwUXce76hQ==} From 8a95f6e05b8bb463ff870ac7cbd3ae9aba54462d Mon Sep 17 00:00:00 2001 From: CJSS Date: Tue, 23 Aug 2022 17:38:19 +0800 Subject: [PATCH 09/81] Update README and documentation (#314) * Update README.md Introduction update * Update README.md Sections updated: Stars Getting Started * Update README.md License section updated * Rename CONTRIBUTING.md to docs/CONTRIBUTING.md Move CONTRIBUTING to docs folder. * Rename CODE_OF_CONDUCT.md to docs/CODE_OF_CONDUCT.md Move CODE_OF_CONDUCT to docs folder. * Update CONTRIBUTING.md Title error * Update README.md Table of contents removed Useful links added * Update README.md Create your story moved and updated * Update README.md Useful links - added communities (removed FAQ) * Update README.md Fixed contribution and code of conduct links * Update CONTRIBUTING.md * Update CONTRIBUTING.md Labels link update * Create types-of-contributions.md * Update types-of-contributions.md README link fixed * Update types-of-contributions.md Punctuation * Update README.md Update useful links - added descriptions * chore: format * chore: format Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com> Co-authored-by: Whitewater --- README.md | 119 +++++------------- CODE_OF_CONDUCT.md => docs/CODE_OF_CONDUCT.md | 0 CONTRIBUTING.md => docs/CONTRIBUTING.md | 12 +- docs/types-of-contributions.md | 31 +++++ 4 files changed, 70 insertions(+), 92 deletions(-) rename CODE_OF_CONDUCT.md => docs/CODE_OF_CONDUCT.md (100%) rename CONTRIBUTING.md => docs/CONTRIBUTING.md (84%) create mode 100644 docs/types-of-contributions.md diff --git a/README.md b/README.md index 19e0db1307..b2507efa5b 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,13 @@ AFFiNE.PRO
- The Next-Gen Knowledge Base to Replace Notion & Miro. + The Next-Gen Collaborative Knowledge Base

-Planning, Sorting and Creating all Together. Open-source, Privacy-First, and Free to use. +Open-source and privacy-first.
+A free replacement for Notion & Miro.

@@ -22,9 +23,10 @@ See https://github.com/all-?/all-contributors/issues/361#issuecomment-637166066 -[![affine.pro](https://img.shields.io/static/v1?label=live%20demo&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAhpJREFUWEdjZEACtnl3MxgY/0YzMjAaMzAwcCLLUYH9/T/D/7MM/5mXHp6kPANmHiOI4Zx9Xfg3C+tKBob/zlSwiAgjGPey/vkdvneq5luwA+zy7+yhn+Vwv+89NFHFhREU7IyM/6YT4WyqK/n/nymT0Tb/1mFGBkYbqptOhIH/Gf4fYbTLv/2NBgmOCOvBSr6DHPCfWNW0UEe2A2x1uRlakiXBbtpx6jND+7KXZLmPbAdURokzeJjxwi31rrzH8OX7P5IdQbYDtnUoMXBzMMEt7Fj2imH7qU/0cQBy8MNsPHL5K0P13Of0cQB68MNsJScaSI4CHk4mhq3tSnCf3n36k0FZmh3Mn7L+DcPqgx9ICgWSHeBpxsdQESUGtgRk+eqDH+H8O09/MiR3P6atA1qTJRlsdLnhPgYlPOQQCW96wPDi3R+iHUFSCKAHP8wydEeREg0kOQA9+JOgwR1qL8CQEygC9jWp0UCSA+aVysIT3JqDHxgmr38DtlRCiIVhZZ0CPNhB6QDkEGIA0Q4gZAkuxxFyBNEOQA7ml+/+MIQ1PUAxG1kelAhB6YMYQLQDCPmQUAjhcgxRDiDWcEKOxOYIohyQGyjCEGIvANaPLfhhBiNHA6hmBBXNhABRDgCV/aBQAAFQpYMrn4PUgNTCACiXEMoNRDmAkC8okR8UDhjYRumAN8sHvGMCSkAD2jUDOWDAO6ewbDQQ3XMAy/oxKownQR0AAAAASUVORK5CYII=&color=orange&message=→)](https://affine.pro) +[![affine.pro](https://img.shields.io/static/v1?label=live%20demo&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAhpJREFUWEdjZEACtnl3MxgY/0YzMjAaMzAwcCLLUYH9/T/D/7MM/5mXHp6kPANmHiOI4Zx9Xfg3C+tKBob/zlSwiAgjGPey/vkdvneq5luwA+zy7+yhn+Vwv+89NFHFhREU7IyM/6YT4WyqK/n/nymT0Tb/1mFGBkYbqptOhIH/Gf4fYbTLv/2NBgmOCOvBSr6DHPCfWNW0UEe2A2x1uRlakiXBbtpx6jND+7KXZLmPbAdURokzeJjxwi31rrzH8OX7P5IdQbYDtnUoMXBzMMEt7Fj2imH7qU/0cQBy8MNsPHL5K0P13Of0cQB68MNsJScaSI4CHk4mhq3tSnCf3n36k0FZmh3Mn7L+DcPqgx9ICgWSHeBpxsdQESUGtgRk+eqDH+H8O09/MiR3P6atA1qTJRlsdLnhPgYlPOQQCW96wPDi3R+iHUFSCKAHP8wydEeREg0kOQA9+JOgwR1qL8CQEygC9jWp0UCSA+aVysIT3JqDHxgmr38DtlRCiIVhZZ0CPNhB6QDkEGIA0Q4gZAkuxxFyBNEOQA7ml+/+MIQ1PUAxG1kelAhB6YMYQLQDCPmQUAjhcgxRDiDWcEKOxOYIohyQGyjCEGIvANaPLfhhBiNHA6hmBBXNhABRDgCV/aBQAAFQpYMrn4PUgNTCACiXEMoNRDmAkC8okR8UDhjYRumAN8sHvGMCSkAD2jUDOWDAO6ewbDQQ3XMAy/oxKownQR0AAAAASUVORK5CYII=&color=orange&message=→)](https://livedemo.affine.pro) [![stars](https://img.shields.io/github/stars/toeverything/AFFiNE.svg?style=flat&logo=github&colorB=red&label=stars)](https://github.com/toeverything/AFFiNE) [![All Contributors][all-contributors-badge]](#contributors) +
[![Node](https://img.shields.io/badge/node->=16.0-success)](https://www.typescriptlang.org/) [![React](https://img.shields.io/badge/TypeScript-4.7-3178c6)](https://www.typescriptlang.org/) [![React](https://img.shields.io/badge/React-18-61dafb)](https://reactjs.org/) @@ -35,11 +37,11 @@ See https://github.com/all-?/all-contributors/issues/361#issuecomment-637166066

  - +   - +   - +  

@@ -48,100 +50,53 @@ See https://github.com/all-?/all-contributors/issues/361#issuecomment-637166066

affine_screen

-# Stay Up-to-Date and Support Us +# :star: Support Us and Keep Updated :star: ![952cd7a5-70fe-48ab-b74f-23981d94d2c5](https://user-images.githubusercontent.com/79301703/182365526-df074c64-cee4-45f6-b8e0-b912f17332c6.gif) -# How to use +# Getting Started -

-🥳🥳🥳 Our web live demo is ready! 🥳🥳🥳 -

+[![affine.pro](https://img.shields.io/static/v1?label=Try%20it%20Online&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAhpJREFUWEdjZEACtnl3MxgY/0YzMjAaMzAwcCLLUYH9/T/D/7MM/5mXHp6kPANmHiOI4Zx9Xfg3C+tKBob/zlSwiAgjGPey/vkdvneq5luwA+zy7+yhn+Vwv+89NFHFhREU7IyM/6YT4WyqK/n/nymT0Tb/1mFGBkYbqptOhIH/Gf4fYbTLv/2NBgmOCOvBSr6DHPCfWNW0UEe2A2x1uRlakiXBbtpx6jND+7KXZLmPbAdURokzeJjxwi31rrzH8OX7P5IdQbYDtnUoMXBzMMEt7Fj2imH7qU/0cQBy8MNsPHL5K0P13Of0cQB68MNsJScaSI4CHk4mhq3tSnCf3n36k0FZmh3Mn7L+DcPqgx9ICgWSHeBpxsdQESUGtgRk+eqDH+H8O09/MiR3P6atA1qTJRlsdLnhPgYlPOQQCW96wPDi3R+iHUFSCKAHP8wydEeREg0kOQA9+JOgwR1qL8CQEygC9jWp0UCSA+aVysIT3JqDHxgmr38DtlRCiIVhZZ0CPNhB6QDkEGIA0Q4gZAkuxxFyBNEOQA7ml+/+MIQ1PUAxG1kelAhB6YMYQLQDCPmQUAjhcgxRDiDWcEKOxOYIohyQGyjCEGIvANaPLfhhBiNHA6hmBBXNhABRDgCV/aBQAAFQpYMrn4PUgNTCACiXEMoNRDmAkC8okR8UDhjYRumAN8sHvGMCSkAD2jUDOWDAO6ewbDQQ3XMAy/oxKownQR0AAAAASUVORK5CYII=&message=%E2%86%92&style=for-the-badge)](https://affine.pro) No installation or registration required! Head over to our website and try it out now. -

-Start to play with AFFiNE web version on our landing page: -

- -

- check_live_demo -

- -If you have experience in front-end development, you may wish to refer to our [documentation](https://docs.affine.pro/affine/basic-documentation/contribute-to-affine) to learn more about deploying your own version or contributing further to development. -Also, thanks to Lee who has made a [desktop build with Tauri](https://github.com/m1911star/affine-client) for you to try out. -Please notice that AFFiNE is still under Alpha stage and is not ready for production use. - -# Table of contents - -- [Stay Up-to-Date and Support Us](#stay-up-to-date-and-support-us) -- [How to Use](#how-to-use) -- [Table of contents](#table-of-contents) - - [Shape your page](#shape-your-page) - - [Plan your task](#plan-your-task) - - [Sort your knowledge](#sort-your-knowledge) - - [Create your story](#create-your-story) -- [Documentation](#documentation) - - [Getting Started with development](#getting-started-with-development) -- [Roadmap](#roadmap) -- [Releases](#releases) -- [Feature requests](#feature-requests) -- [FAQ](#faq) -- [The Philosophy of AFFiNE](#the-philosophy-of-affine) -- [Community](#community) -- [Contributors](#contributors) -- [Acknowledgments](#acknowledgments) -- [License](#license) - -## Shape your page - -![546163d6-4c39-4128-ae7f-55d59bc3b76b](https://user-images.githubusercontent.com/79301703/182365611-b0ba3690-21c0-4d9b-bfbc-0bc15da05aeb.gif) - -## Plan your task - -![41a7b3a4-32f2-4d18-ac6b-57d1e1fda753](https://user-images.githubusercontent.com/79301703/182366553-1f6558a7-f17b-4611-ab95-aea3ec997154.gif) - -## Sort your knowledge - -![c9e1ff46-cec2-411b-b89d-6727a5e6f6c3](https://user-images.githubusercontent.com/79301703/182366602-08e44d28-a031-4097-9904-52fb9b1e9e17.gif) +Want to deploy it yourself? AFFiNE can run just about anywhere. Check our +[documentation](#documentation) +for more information. +

+⚠️ Please note that AFFiNE is still under active development and is not yet ready for production use. ⚠️ ## Create your story -We want your data always to be yours, without any sacrifice to your accessibility. Your data is always stored local first, yet we support real-time collaboration on a peer-to-peer basis. We don't think "privacy-first" is a good excuse for not supporting modern web features. -And when it comes to collaboration, these features are not just necessarily for teams -- you can take and insert pictures on your phone, edit them from your desktop, and then share them with your collaborators. -Affine is fully built with web technologies to ensure consistency and accessibility on Mac, Windows and Linux. The local file system support will be available when version 0.0.1beta is released. +There can be more than Notion and Miro. AFFiNE is a next-gen knowledge base that brings planning, sorting and creating all together. Privacy first, open-source, customizable and ready to use, built with web technologies to ensure consistency and accessibility on Mac, Windows and Linux. We want your data always to be yours, without any sacrifice to your accessibility. Your data is always stored local first, with full support for real-time collaboration through peer-to-peer technology. We don't think "privacy-first" is a good excuse for not supporting modern web features. +And when it comes to collaboration, these features are not just necessarily for teams - you can take and insert pictures on your phone, edit them from your desktop, and then share them with your collaborators. -# Documentation +### Shape your page -AFFiNE is not yet ready for production use. For installation, you may check how to build or deploy AFFiNE from our [quick-start](https://docs.affine.pro/affine/basic-documentation/contribute-to-affine/quick-start) guide. Alternatively, you can view our [full documentation](https://docs.affine.pro/affine/). +![546163d6-4c39-4128-ae7f-55d59bc3b76b](https://user-images.githubusercontent.com/79301703/182365611-b0ba3690-21c0-4d9b-bfbc-0bc15da05aeb.gif) -## Getting Started with development +### Plan your task -Please view the path Contribute-to-AFFiNE/Software-Contributions/Quick-Start in the documentation. +![41a7b3a4-32f2-4d18-ac6b-57d1e1fda753](https://user-images.githubusercontent.com/79301703/182366553-1f6558a7-f17b-4611-ab95-aea3ec997154.gif) -# Roadmap +### Sort your knowledge -Yes! Permanent storage, collaboration, stable release is planned! Check it [here](https://github.com/toeverything/AFFiNE/issues/293) +![c9e1ff46-cec2-411b-b89d-6727a5e6f6c3](https://user-images.githubusercontent.com/79301703/182366602-08e44d28-a031-4097-9904-52fb9b1e9e17.gif) -# Releases +# Useful Links -Get our latest [release notes](https://github.com/toeverything/AFFiNE/wiki) from here. +- [AFFiNE Documentation](https://docs.affine.pro/affine/) - More detailed documentation on how to use and develop with AFFiNE -# Feature requests +- [Feature Roadmap](https://github.com/toeverything/AFFiNE/issues/293) - Looking for a feature? It might already be planned for release - you can check here +- [Release Notes](https://github.com/toeverything/AFFiNE/wiki) - Find out what changes we are making and how we are improving AFFiNE -Please go to [feature requests](https://github.com/toeverything/AFFiNE/issues). +- [Contributing Guide](/docs/CONTRIBUTING.md) - Want to help improve AFFiNE? You might not even need to write a line of code. Find out how you can contribute. +- [Code of Conduct](/docs/CODE_OF_CONDUCT.md) - How we promote and maintain a harassment-free experience for everyone in our community. -# FAQ - -Get quick help on [Telegram](https://t.me/affineworkos) or [Discord](https://discord.gg/yz6tGVsf5p) and join our community of developers and contributors. - -Our latest news can be found on [Twitter](https://twitter.com/AffineOfficial), [Medium](https://medium.com/@affineworkos) and the [AFFiNE Blog](https://blog.affine.pro/). +- AFFiNE Communities: [Discord](https://discord.gg/yz6tGVsf5p) | [Telegram](https://t.me/affineworkos) | [Twitter](https://twitter.com/AffineOfficial) | + [Medium](https://medium.com/@affineworkos) | [AFFiNE Blog](https://blog.affine.pro) # Contact Us -You may contact us by emailing to: contact@toeverything.info +Feel free to send us an email: contact@toeverything.info # The Philosophy of AFFiNE @@ -186,12 +141,6 @@ We would also like to give thanks to open-source projects that make affine possi Thanks a lot to the community for providing such powerful and simple libraries, so that we can focus more on the implementation of the product logic, and we hope that in the future our projects will also provide a more easy-to-use knowledge base for everyone. -# Community - -For help, discussion about best practices, or any other conversation that would benefit from being searchable: - -[Discuss AFFiNE on GitHub](https://github.com/toeverything/AFFiNE/discussions) - # Contributors @@ -250,4 +199,4 @@ For help, discussion about best practices, or any other conversation that would AFFiNE is distributed under the terms of MIT license. -See LICENSE for details. +See [LICENSE](/LICENSE) for details. diff --git a/CODE_OF_CONDUCT.md b/docs/CODE_OF_CONDUCT.md similarity index 100% rename from CODE_OF_CONDUCT.md rename to docs/CODE_OF_CONDUCT.md diff --git a/CONTRIBUTING.md b/docs/CONTRIBUTING.md similarity index 84% rename from CONTRIBUTING.md rename to docs/CONTRIBUTING.md index 7b7b63a1a5..cd21902653 100644 --- a/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -1,4 +1,4 @@ -# Welcome to ourcontributing guide +# Welcome to our contributing guide Thank you for investing your time in contributing to our project! Any contribution you make will be reflected on our GitHub :sparkles:. @@ -10,7 +10,7 @@ Use the table of contents icon on the top left corner of this document to get to ## New contributor guide -To get an overview of the project, read the [README](README.md). Here are some resources to help you get started with open source contributions: +To get an overview of the project, read the [README](../README.md). Here are some resources to help you get started with open source contributions: - [Finding ways to contribute to open source on GitHub](https://docs.github.com/en/get-started/exploring-projects-on-github/finding-ways-to-contribute-to-open-source-on-github) - [Set up Git](https://docs.github.com/en/get-started/quickstart/set-up-git) @@ -19,19 +19,17 @@ To get an overview of the project, read the [README](README.md). Here are some r ## Getting started -To navigate our codebase with confidence, see [the introduction to working in the docs repository](/contributing/working-in-docs-repository.md) :confetti_ball:. For more information on how we write our markdown files, see [the GitHub Markdown reference](contributing/content-markup-reference.md). - -Check to see what [types of contributions](/contributing/types-of-contributions.md) we accept before making changes. Some of them don't even require writing a single line of code :sparkles:. +Check to see what [types of contributions](/types-of-contributions.md) we accept before making changes. Some of them don't even require writing a single line of code :sparkles:. ### Issues -#### Create a new issue +#### Create a new issue or feature request If you spot a problem, [search if an issue already exists](https://docs.github.com/en/github/searching-for-information-on-github/searching-on-github/searching-issues-and-pull-requests#search-by-the-title-body-or-comments). If a related issue doesn't exist, you can open a new issue using a relevant [issue form](https://github.com/toeverything/AFFiNE/issues/new/choose). #### Solve an issue -Scan through our [existing issues](https://github.com/toeverything/AFFiNE/issues) to find one that interests you. You can narrow down the search using `labels` as filters. See [Labels](/contributing/how-to-use-labels.md) for more information. As a general rule, we don’t assign issues to anyone. If you find an issue to work on, you are welcome to open a PR with a fix. +Scan through our [existing issues](https://github.com/toeverything/AFFiNE/issues) to find one that interests you. You can narrow down the search using `labels` as filters. See our [Labels](https://github.com/toeverything/AFFiNE/labels) for more information. As a general rule, we don’t assign issues to anyone. If you find an issue to work on, you are welcome to open a PR with a fix. ### Make Changes diff --git a/docs/types-of-contributions.md b/docs/types-of-contributions.md new file mode 100644 index 0000000000..fd448200e9 --- /dev/null +++ b/docs/types-of-contributions.md @@ -0,0 +1,31 @@ +# Types of contributions :memo: + +You can contribute to AFFiNE in several ways. This repo is a place to discuss and collaborate on AFFiNE! + +### :mega: Discussions + +Discussions are where we have conversations. + +If you'd like help troubleshooting a docs PR you're working on, have a great new idea, or want to share something amazing you've learned in our docs, join us in [discussions](https://github.com/toeverything/AFFiNE/discussions). + +### :lady_beetle: Issues + +[Issues](https://docs.github.com/en/github/managing-your-work-on-github/about-issues) are used to track tasks that contributors can help with. If an issue has a triage label, we haven't reviewed it yet, and you shouldn't begin work on it. + +If you've found something in the content or the website that should be updated, search open issues to see if someone else has reported the same thing. If it's something new, open an issue using a [template](https://github.com/toeverything/AFFiNE/issues/new/choose). We'll use the issue to have a conversation about the problem you want to fix. + +### :hammer_and_wrench: Pull requests + +A [pull request](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests) is a way to suggest changes in our repository. When we merge those changes, they should be deployed to the live site within 24 hours. :earth_africa: +You can [create a new pull request](https://github.com/toeverything/AFFiNE/compare) and view [current pull requests](https://github.com/toeverything/AFFiNE/pulls). + +### :question: Support + +We are a small team working hard to keep up with the documentation demands of a continuously changing product. +You may be able to find additional help and information on our social media platforms and groups - the links to these can be found in our [README](../README.md). + +### :earth_asia: Translations + +AFFiNE is internationalized and available in multiple languages. The source content in this repository is written in English. We integrate with an external localization platform to work with the community in localizing the English content. + +**We do not currently offer this feature**, but we hope to in the future. From b96d6c37f75407580309123699649fcc178a57e5 Mon Sep 17 00:00:00 2001 From: mitsuha Date: Tue, 23 Aug 2022 20:07:35 +0800 Subject: [PATCH 10/81] opti: 1.adjust eventlistener; --- .../src/pages/workspace/docs/Page.tsx | 4 +- .../workspace/docs/components/toc/TOC.tsx | 45 +++++++------------ .../workspace/docs/components/toc/index.ts | 2 +- .../utils/{getPageContentById.ts => toc.ts} | 27 +++++------ .../db-service/src/services/index.ts | 9 ---- .../db-service/src/services/workspace/toc.ts | 28 ------------ 6 files changed, 34 insertions(+), 81 deletions(-) rename apps/ligo-virgo/src/pages/workspace/docs/utils/{getPageContentById.ts => toc.ts} (67%) delete mode 100644 libs/datasource/db-service/src/services/workspace/toc.ts diff --git a/apps/ligo-virgo/src/pages/workspace/docs/Page.tsx b/apps/ligo-virgo/src/pages/workspace/docs/Page.tsx index 6d9d2fac90..0bbcfb5d75 100644 --- a/apps/ligo-virgo/src/pages/workspace/docs/Page.tsx +++ b/apps/ligo-virgo/src/pages/workspace/docs/Page.tsx @@ -23,7 +23,7 @@ import { useFlag } from '@toeverything/datasource/feature-flags'; import { CollapsiblePageTree } from './collapsible-page-tree'; import { Tabs } from './components/tabs'; import { TabMap, TAB_TITLE } from './components/tabs/Tabs'; -import { TOC } from './components/toc'; +import { Toc } from './components/toc'; import { WorkspaceName } from './workspace-name'; type PageProps = { @@ -92,7 +92,7 @@ export function Page(props: PageProps) { )} {activeTab === TabMap.get(TAB_TITLE.TOC).value && ( - TOC + TOC )} diff --git a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx index b2c0aa693e..513e2913a6 100644 --- a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx +++ b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx @@ -1,6 +1,5 @@ import { BlockEditor } from '@toeverything/components/editor-core'; import { styled } from '@toeverything/components/ui'; -import { services } from '@toeverything/datasource/db-service'; import type { ReactNode } from 'react'; import { createContext, @@ -12,12 +11,9 @@ import { import { useParams } from 'react-router'; import { BLOCK_TYPES, - getPageContentById, -} from '../../utils/getPageContentById'; - -const StyledTOC = styled('div')(() => { - return {}; -}); + getContentByAsyncBlocks, + getPageTOC, +} from '../../utils/toc'; const StyledTOCItem = styled('a')<{ type?: string; isActive?: boolean }>( ({ type, isActive }) => { @@ -120,49 +116,42 @@ const renderTOCContent = tocDataSource => { ); }; -export const TOC = (props: Props) => { +export const Toc = (props: Props) => { const { editor } = props; - const { workspace_id, page_id } = useParams(); + const { page_id } = useParams(); const [tocDataSource, setTocDataSource] = useState([]); const [activeBlockId, setActiveBlockId] = useState('blockId'); const updateTocDataSource = useCallback(async () => { - const tocDataSource = await getPageContentById(editor, page_id); + const { children = [] } = + (await editor.queryByPageId(page_id))?.[0] || {}; + const asyncBlocks = (await editor.getBlockByIds(children)) || []; + const tocDataSource = getPageTOC( + asyncBlocks, + await getContentByAsyncBlocks(asyncBlocks, updateTocDataSource) + ); + setTocDataSource(tocDataSource); }, [editor, page_id]); useEffect(() => { - (async () => await updateTocDataSource())(); + (async () => { + await updateTocDataSource(); + })(); }, [updateTocDataSource]); - useEffect(() => { - let unobserve: () => void; - const observe = async () => { - unobserve = await services.api.tocService.observe( - { workspace: workspace_id, pageId: page_id }, - updateTocDataSource - ); - }; - void observe(); - - return () => { - unobserve?.(); - }; - }, [updateTocDataSource, workspace_id]); - const onClick = async (blockId?: string) => { if (blockId === activeBlockId) { return; } - console.log(blockId); setActiveBlockId(blockId); await editor.scrollManager.scrollIntoViewByBlockId(blockId); }; return ( - {renderTOCContent(tocDataSource)} +
{renderTOCContent(tocDataSource)}
); }; diff --git a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/index.ts b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/index.ts index e603af8242..1e45e9bd09 100644 --- a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/index.ts +++ b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/index.ts @@ -1 +1 @@ -export { TOC } from './TOC'; +export { Toc } from './Toc'; diff --git a/apps/ligo-virgo/src/pages/workspace/docs/utils/getPageContentById.ts b/apps/ligo-virgo/src/pages/workspace/docs/utils/toc.ts similarity index 67% rename from apps/ligo-virgo/src/pages/workspace/docs/utils/getPageContentById.ts rename to apps/ligo-virgo/src/pages/workspace/docs/utils/toc.ts index b1d16cb9d6..8331b0726d 100644 --- a/apps/ligo-virgo/src/pages/workspace/docs/utils/getPageContentById.ts +++ b/apps/ligo-virgo/src/pages/workspace/docs/utils/toc.ts @@ -1,4 +1,4 @@ -import type { BlockEditor } from '@toeverything/components/editor-core'; +import { AsyncBlock } from '@toeverything/components/editor-core'; export const BLOCK_TYPES = { GROUP: 'group', @@ -7,23 +7,29 @@ export const BLOCK_TYPES = { HEADING3: 'heading3', }; -const getContentByAsyncBlocks = async (asyncBlocks = []) => { +/* 😞😞sorry, I don't know how to define unlimited dimensions array */ +const getContentByAsyncBlocks = async ( + asyncBlocks: AsyncBlock[] = [], + callback: () => void +): Promise => { /* maybe should recast it to tail recursion */ return await Promise.all( - asyncBlocks.map(async asyncBlock => { + asyncBlocks.map(async (asyncBlock: AsyncBlock) => { const asyncBlocks = await asyncBlock.children(); if (asyncBlocks?.length) { - return getContentByAsyncBlocks(asyncBlocks); + return getContentByAsyncBlocks(asyncBlocks, callback); } - const { id, type } = asyncBlock; + /* get update notice */ + asyncBlock.onUpdate(callback); + const { id, type } = asyncBlock; if (Object.values(BLOCK_TYPES).includes(type)) { const properties = await asyncBlock.getProperties(); return { - id: id, + id, type, text: properties?.text?.value?.[0]?.text || '', }; @@ -34,12 +40,7 @@ const getContentByAsyncBlocks = async (asyncBlocks = []) => { ); }; -const getPageContentById = async (editor: BlockEditor, pageId: string) => { - const { children = [] } = (await editor.queryByPageId(pageId))?.[0] || {}; - const asyncBlocks = (await editor.getBlockByIds(children)) || []; - - const tocContents = await getContentByAsyncBlocks(asyncBlocks); - +const getPageTOC = (asyncBlocks: AsyncBlock[], tocContents) => { return tocContents .reduce((tocGroupContent, tocContent, index) => { const { id, type } = asyncBlocks[index]; @@ -61,4 +62,4 @@ const getPageContentById = async (editor: BlockEditor, pageId: string) => { .filter(Boolean); }; -export { getPageContentById }; +export { getPageTOC, getContentByAsyncBlocks }; diff --git a/libs/datasource/db-service/src/services/index.ts b/libs/datasource/db-service/src/services/index.ts index c39119fe68..315ee84496 100644 --- a/libs/datasource/db-service/src/services/index.ts +++ b/libs/datasource/db-service/src/services/index.ts @@ -5,7 +5,6 @@ import { Database } from './database'; import { EditorBlock } from './editor-block'; import { FileService } from './file'; import { PageTree } from './workspace/page-tree'; -import { TOC } from './workspace/toc'; import { UserConfig } from './workspace/user-config'; export { @@ -49,7 +48,6 @@ export interface DbServicesMap { userConfig: UserConfig; file: FileService; commentService: CommentService; - tocService: TOC; } interface RegisterDependencyConfigWithName extends RegisterDependencyConfig { @@ -78,13 +76,6 @@ const dbServiceConfig: RegisterDependencyConfigWithName[] = [ value: PageTree, dependencies: [{ token: Database }], }, - { - type: 'class', - callName: 'tocService', - token: TOC, - value: TOC, - dependencies: [{ token: Database }], - }, { type: 'class', callName: 'userConfig', diff --git a/libs/datasource/db-service/src/services/workspace/toc.ts b/libs/datasource/db-service/src/services/workspace/toc.ts deleted file mode 100644 index 16bec3da18..0000000000 --- a/libs/datasource/db-service/src/services/workspace/toc.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { ServiceBaseClass } from '../base'; -import { ReturnUnobserve } from '../database/observer'; -import { ObserveCallback } from './page-tree'; - -export class TOC extends ServiceBaseClass { - private onActivePageChange?: () => void; - - async observe( - { workspace, pageId }: { workspace: string; pageId: string }, - callback: ObserveCallback - ): Promise { - // not only use observe, but also addChildrenListener is OK 🎉🎉🎉 - // const pageBlock = await this.getBlock(workspace, pageId); - // - // this.onActivePageChange?.(); - // pageBlock?.addChildrenListener('onPageChildrenChange', () => { - // callback(); - // }); - // - // this.onActivePageChange = () => pageBlock?.removeChildrenListener('onPageChildrenChange'); - - const unobserve = await this._observe(workspace, pageId, callback); - - return () => { - unobserve(); - }; - } -} From 595a29db740769bab14fa6495ebaf27466c877a0 Mon Sep 17 00:00:00 2001 From: CJSS Date: Tue, 23 Aug 2022 20:30:47 +0800 Subject: [PATCH 11/81] Update CONTRIBUTING.md (#316) Fixed types of contributions link --- docs/CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index cd21902653..94806e00f8 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -19,7 +19,7 @@ To get an overview of the project, read the [README](../README.md). Here are som ## Getting started -Check to see what [types of contributions](/types-of-contributions.md) we accept before making changes. Some of them don't even require writing a single line of code :sparkles:. +Check to see what [types of contributions](types-of-contributions.md) we accept before making changes. Some of them don't even require writing a single line of code :sparkles:. ### Issues From a81456450f9ee1cbc164b779dce074d4c79f942f Mon Sep 17 00:00:00 2001 From: DarkSky Date: Tue, 23 Aug 2022 21:03:14 +0800 Subject: [PATCH 12/81] feat: about us --- .vscode/settings.json | 1 + apps/venus/package.json | 6 +- apps/venus/src/app/AboutUs.tsx | 166 +++++ apps/venus/src/app/App.tsx | 667 +++++++++++++++++++ apps/venus/src/app/Common.tsx | 335 ++++++++++ apps/venus/src/app/Icons.tsx | 75 +++ apps/venus/src/app/MdxMarks.tsx | 45 ++ apps/venus/src/app/about.mdx | 88 +++ apps/venus/src/app/index.tsx | 1055 +----------------------------- apps/venus/src/app/keeupdate.png | Bin 0 -> 631441 bytes apps/venus/src/index.tsx | 4 +- apps/venus/src/mdx.d.ts | 4 + apps/venus/tsconfig.app.json | 2 +- apps/venus/webpack.config.js | 18 +- pnpm-lock.yaml | 1005 +++++++++++++++++++++++++--- 15 files changed, 2338 insertions(+), 1133 deletions(-) create mode 100644 apps/venus/src/app/AboutUs.tsx create mode 100644 apps/venus/src/app/App.tsx create mode 100644 apps/venus/src/app/Common.tsx create mode 100644 apps/venus/src/app/Icons.tsx create mode 100644 apps/venus/src/app/MdxMarks.tsx create mode 100644 apps/venus/src/app/about.mdx create mode 100644 apps/venus/src/app/keeupdate.png create mode 100644 apps/venus/src/mdx.d.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index e69da8bc93..18f956c613 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,6 +5,7 @@ "editor.codeActionsOnSave": ["source.fixAll", "source.organizeImports"], "prettier.prettierPath": "./node_modules/prettier", "cSpell.words": [ + "aboutus", "AUTOINCREMENT", "Backlinks", "blockdb", diff --git a/apps/venus/package.json b/apps/venus/package.json index 321da2b80d..87065b9d79 100644 --- a/apps/venus/package.json +++ b/apps/venus/package.json @@ -9,13 +9,15 @@ "dependencies": { "@emotion/react": "^11.10.0", "@emotion/styled": "^11.10.0", - "@mui/joy": "^5.0.0-alpha.39", + "@mui/joy": "^5.0.0-alpha.42", "i18next": "^21.9.1", "lozad": "^1.16.0", "react-i18next": "^11.18.4" }, "devDependencies": { - "image-minimizer-webpack-plugin": "^3.2.3", + "@mdx-js/loader": "^2.1.3", + "github-markdown-css": "^5.1.0", + "image-minimizer-webpack-plugin": "^3.3.0", "imagemin": "^8.0.1", "imagemin-optipng": "^8.0.0", "mini-css-extract-plugin": "^2.6.1", diff --git a/apps/venus/src/app/AboutUs.tsx b/apps/venus/src/app/AboutUs.tsx new file mode 100644 index 0000000000..19dfbd4a8a --- /dev/null +++ b/apps/venus/src/app/AboutUs.tsx @@ -0,0 +1,166 @@ +import { useTranslation } from 'react-i18next'; +import { useNavigate } from 'react-router-dom'; + +import { Box, Button, Grid, Typography } from '@mui/joy'; +import Option from '@mui/joy/Option'; +import Select from '@mui/joy/Select'; +// eslint-disable-next-line no-restricted-imports +import { useMediaQuery } from '@mui/material'; + +import 'github-markdown-css'; +import AboutText from './about.mdx'; +import { AFFiNEFooter, AFFiNEImage } from './Common'; +import { options } from './i18n'; +import KeepUpdate from './keeupdate.png'; + +export const AboutUs = () => { + const matches = useMediaQuery('(max-width: 1024px)'); + const navigate = useNavigate(); + const { i18n } = useTranslation(); + + const changeLanguage = (event: any) => { + i18n.changeLanguage(event); + }; + return ( + <> + + + + + + + + + + + + + To Shape, not to adapt. + + + + + + + Deliver Building Blocks for Future SaaS Applications. + + + + + + + + + + + + window.open( + 'https://github.com/toeverything/AFFiNE' + ) + } + /> + + + + + ); +}; diff --git a/apps/venus/src/app/App.tsx b/apps/venus/src/app/App.tsx new file mode 100644 index 0000000000..8f791b7ec3 --- /dev/null +++ b/apps/venus/src/app/App.tsx @@ -0,0 +1,667 @@ +/* eslint-disable max-lines */ +/* eslint-disable @typescript-eslint/naming-convention */ +import clsx from 'clsx'; +import { useEffect, useMemo, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useNavigate } from 'react-router-dom'; + +import { Box, Button, Grid, Typography } from '@mui/joy'; +import Option from '@mui/joy/Option'; +import Select from '@mui/joy/Select'; +import { styled } from '@mui/joy/styles'; +import { LogoIcon } from '@toeverything/components/icons'; +// eslint-disable-next-line no-restricted-imports +import { useMediaQuery } from '@mui/material'; + +import CollaborationImage from './collaboration.png'; +import { AFFiNEFooter, AFFiNEImage } from './Common'; +import { options } from './i18n'; +import { GitHub } from './Icons'; +import PageImage from './page.png'; +import ShapeImage from './shape.png'; +import TaskImage from './task.png'; + +const Alternatives = styled(Box)<{ width: string }>(({ width }) => ({ + position: 'relative', + width: '24em', + height: '128px', + transform: 'translateY(-8px)', + overflowY: 'hidden', + '@media (max-width: 1024px)': { + width, + height: '48px', + transform: 'translateY(0)', + }, + '& .scroll-element': { + width: 'inherit', + height: 'inherit', + position: 'absolute', + left: '0%', + top: '0%', + lineHeight: '96px', + '@media (max-width: 1024px)': { + lineHeight: '32px', + }, + }, + '& .scroll-element.active': { + animation: 'primary 500ms linear infinite', + }, + '.primary.active': { + animation: 'primary 500ms linear infinite', + }, + '.secondary.active': { + animation: 'secondary 500ms linear infinite', + }, + '@keyframes primary': { + from: { + top: '0%', + }, + to: { + top: '-100%', + }, + }, + '@keyframes secondary': { + from: { + top: '100%', + }, + to: { + top: '0%', + }, + }, +})); + +const _alternatives = ['Notion', 'Miro', 'Monday']; +const _alternativesSize = [8, 6, 10]; + +const Product = () => { + const [idx, setIdx] = useState(0); + const [last, current] = useMemo( + () => [ + _alternatives[idx], + _alternatives[idx + 1] ? _alternatives[idx + 1] : _alternatives[0], + ], + [idx] + ); + const maxWidth = useMemo(() => _alternativesSize[idx], [idx]); + const [active, setActive] = useState(false); + const matches = useMediaQuery('(max-width: 1024px)'); + + useEffect(() => { + const handle = setInterval(() => { + setActive(true); + setTimeout( + () => { + setIdx(idx => (_alternatives[idx + 1] ? idx + 1 : 0)); + setActive(false); + }, + matches ? 450 : 380 + ); + }, 2000); + return () => clearInterval(handle); + }, [matches]); + + return ( + + + + {last} + + + + + {current} + + + + ); +}; + +const AFFiNEOnline = (props: { center?: boolean; flat?: boolean }) => { + const matches = useMediaQuery('(max-width: 1024px)'); + const { t } = useTranslation(); + return ( + + ); +}; + +export function App() { + const matches = useMediaQuery('(max-width: 1024px)'); + const navigate = useNavigate(); + const { t, i18n } = useTranslation(); + + const changeLanguage = (event: any) => { + i18n.changeLanguage(event); + }; + return ( + <> + + + + + + + + + + + + + + + {t('Open Source')}, + + + {t('Privacy First')} + + + + + + + + {t('Alternative')} + + + + + + + {t('description1.part1')} + + + + + + + + + + + + + + + + + + {t('description1.part2')} + + + + + + + {t('description1.part3')} + + + {t('description1.part4')} + + + + + + + + {t('description2.part1')} + + + {t('description2.part2')} + + + {t('description2.part3')} + + + + + + + + + + + + + + {t('description3.part1')} + + + {t('description3.part2')} + + + {t('description3.part3')} + + + {t('description3.part4')} + + + + + + + + + + + + + {t('description4.part1')} + + + {t('description4.part2')} + + + {t('description4.part3')} + + + + + + + + + + + ); +} diff --git a/apps/venus/src/app/Common.tsx b/apps/venus/src/app/Common.tsx new file mode 100644 index 0000000000..8c1102620a --- /dev/null +++ b/apps/venus/src/app/Common.tsx @@ -0,0 +1,335 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +import GitHubIcon from '@mui/icons-material/GitHub'; +import RedditIcon from '@mui/icons-material/Reddit'; +import TelegramIcon from '@mui/icons-material/Telegram'; +import { Box, Button, Grid, Typography } from '@mui/joy'; +import { styled } from '@mui/joy/styles'; +// eslint-disable-next-line no-restricted-imports +import { useTranslation } from 'react-i18next'; +import { DiscordIcon, GitHub } from './Icons'; +import LogoImage from './logo.png'; + +export const AFFiNEImage = styled('img')({ + maxWidth: '100%', + objectFit: 'contain', +}); + +export const AFFiNEFooter = ({ + keepupdate = true, +}: { + keepupdate?: boolean; +}) => { + const { t } = useTranslation(); + + return ( + <> + {keepupdate ? ( + <> + + + + + + + + + {t('BuildFor')} + + + + + + + + + {t('KeepUpdated')} + + + + + + + ) : null} + + + + {t('Join')} + + + + + + + + + + + + + + + + + + + + + AFFiNE is an + + #OpenSource + + company + + + + + + + Copyright © 2022 AFFiNE. + + + + + ); +}; diff --git a/apps/venus/src/app/Icons.tsx b/apps/venus/src/app/Icons.tsx new file mode 100644 index 0000000000..ec30f2067c --- /dev/null +++ b/apps/venus/src/app/Icons.tsx @@ -0,0 +1,75 @@ +/* eslint-disable max-lines */ +/* eslint-disable @typescript-eslint/naming-convention */ +import GitHubIcon from '@mui/icons-material/GitHub'; +import { Button, SvgIcon } from '@mui/joy'; +// eslint-disable-next-line no-restricted-imports +import { useMediaQuery } from '@mui/material'; +import { useTranslation } from 'react-i18next'; + +export const DiscordIcon = (props: any) => { + return ( + + + + + + + + + + + ); +}; + +export const GitHub = (props: { center?: boolean; flat?: boolean }) => { + const matches = useMediaQuery('(max-width: 1024px)'); + const { t } = useTranslation(); + + return ( + + ); +}; diff --git a/apps/venus/src/app/MdxMarks.tsx b/apps/venus/src/app/MdxMarks.tsx new file mode 100644 index 0000000000..1e3890cae1 --- /dev/null +++ b/apps/venus/src/app/MdxMarks.tsx @@ -0,0 +1,45 @@ +import { Box, Typography } from '@mui/joy'; + +type NameProps = { + name: string; + link: string; + title: string; + description?: string; +}; + +export const Name = (props: NameProps) => { + return ( + <> + + + + {props.name} + + + + {' | '} + {props.title} + + + {props.description ? ( + + {props.description} + + ) : null} + + ); +}; + +export const Padding = () => { + return
; +}; diff --git a/apps/venus/src/app/about.mdx b/apps/venus/src/app/about.mdx new file mode 100644 index 0000000000..d05c285003 --- /dev/null +++ b/apps/venus/src/app/about.mdx @@ -0,0 +1,88 @@ +import { Name, Padding } from './MdxMarks'; + + + +## Do Contact US if you + +- Want to know more about AFFiNE as a collaborative knowledge base; +- Want to join us; +- Want to build your own block-based applications. + +General contact: [contact@toeverything.info](mailto:contact@toeverything.info) + +Send Resume to: [hr@toeverything.info](mailto:hr@toeverything.info) + + + +## Team Member + +### Founder & Co-founders + + + + + + + + + +### Architectural Developers + + + + + + + + + +## The Philosophy of AFFiNE + +People need better building blocks for future applications. And it should not be so hard to develop collaborative, transferable, smart spreadsheets or block editors. + +Timothy Berners-Lee once taught us about the idea of the semantic web, where all the data can be interpreted in any form while the "truth" is kept. This gives our best image of an ideal knowledge base by far, that sorting of information, planning of project and goals as well as creating of knowledge can be all together. + +We have witnessed waves of paradigm shift so many times. At first, everything was noted on office-like apps or DSL like LaTeX, then we found todo-list apps and WYSIWYG markdown editors better for writing and planning. + +Finally, here comes Notion and Miro, who take advantage of the idea of blocks to further liberate our creativity. It is all perfect... without waste operations and redundant information. And, we insist that privacy first should always be given by default. That's why we are making AFFiNE. diff --git a/apps/venus/src/app/index.tsx b/apps/venus/src/app/index.tsx index e4d9c7854e..8464ca5b4a 100644 --- a/apps/venus/src/app/index.tsx +++ b/apps/venus/src/app/index.tsx @@ -1,1050 +1,37 @@ -/* eslint-disable max-lines */ -/* eslint-disable @typescript-eslint/naming-convention */ -import clsx from 'clsx'; -import { useEffect, useMemo, useState } from 'react'; +import { Outlet, Route, Routes } from 'react-router-dom'; -import GitHubIcon from '@mui/icons-material/GitHub'; -import RedditIcon from '@mui/icons-material/Reddit'; -import TelegramIcon from '@mui/icons-material/Telegram'; -import { Box, Button, Container, Grid, SvgIcon, Typography } from '@mui/joy'; -import Option from '@mui/joy/Option'; -import Select from '@mui/joy/Select'; -import { CssVarsProvider, styled } from '@mui/joy/styles'; -import { LogoIcon } from '@toeverything/components/icons'; -// eslint-disable-next-line no-restricted-imports -import { useMediaQuery } from '@mui/material'; -import { useTranslation } from 'react-i18next'; -import CollaborationImage from './collaboration.png'; -import { options } from './i18n'; -import LogoImage from './logo.png'; -import PageImage from './page.png'; -import ShapeImage from './shape.png'; -import TaskImage from './task.png'; +import { Container } from '@mui/joy'; +import { CssVarsProvider } from '@mui/joy/styles'; -const DiscordIcon = (props: any) => { - return ( - - - - - - - - - - - ); -}; +import { AboutUs } from './AboutUs'; +import { App } from './App'; -const VenusContainer = styled(Container)({ - margin: '1em auto', -}); - -const Alternatives = styled(Box)<{ width: string }>(({ width }) => ({ - position: 'relative', - width: '24em', - height: '128px', - transform: 'translateY(-8px)', - overflowY: 'hidden', - '@media (max-width: 1024px)': { - width, - height: '48px', - transform: 'translateY(0)', - }, - '& .scroll-element': { - width: 'inherit', - height: 'inherit', - position: 'absolute', - left: '0%', - top: '0%', - lineHeight: '96px', - '@media (max-width: 1024px)': { - lineHeight: '32px', - }, - }, - '& .scroll-element.active': { - animation: 'primary 500ms linear infinite', - }, - '.primary.active': { - animation: 'primary 500ms linear infinite', - }, - '.secondary.active': { - animation: 'secondary 500ms linear infinite', - }, - '@keyframes primary': { - from: { - top: '0%', - }, - to: { - top: '-100%', - }, - }, - '@keyframes secondary': { - from: { - top: '100%', - }, - to: { - top: '0%', - }, - }, -})); - -const _alternatives = ['Notion', 'Miro', 'Monday']; -const _alternativesSize = [8, 6, 10]; - -const Product = () => { - const [idx, setIdx] = useState(0); - const [last, current] = useMemo( - () => [ - _alternatives[idx], - _alternatives[idx + 1] ? _alternatives[idx + 1] : _alternatives[0], - ], - [idx] - ); - const maxWidth = useMemo(() => _alternativesSize[idx], [idx]); - const [active, setActive] = useState(false); - const matches = useMediaQuery('(max-width: 1024px)'); - - useEffect(() => { - const handle = setInterval(() => { - setActive(true); - setTimeout( - () => { - setIdx(idx => (_alternatives[idx + 1] ? idx + 1 : 0)); - setActive(false); - }, - matches ? 450 : 380 - ); - }, 2000); - return () => clearInterval(handle); - }, [matches]); - - return ( - - - - {last} - - - - - {current} - - - - ); -}; - -const AffineImage = styled('img')({ - maxWidth: '100%', - objectFit: 'contain', -}); - -const GitHub = (props: { center?: boolean; flat?: boolean }) => { - const matches = useMediaQuery('(max-width: 1024px)'); - const { t } = useTranslation(); - - return ( - - ); -}; - -const AFFiNEOnline = (props: { center?: boolean; flat?: boolean }) => { - const matches = useMediaQuery('(max-width: 1024px)'); - const { t } = useTranslation(); - return ( - - ); -}; - -export function App() { - const matches = useMediaQuery('(max-width: 1024px)'); - const { t, i18n } = useTranslation(); - - const changeLanguage = (event: any) => { - i18n.changeLanguage(event); - }; +const VenusContainer = () => { return ( - div': { marginTop: '1em', }, }} > - - - - - - - - - - - - - - {t('Open Source')}, - - - {t('Privacy First')} - - - - - - - - {t('Alternative')} - - - - - - - {t('description1.part1')} - - - - - - - - - - - - - - - - - - {t('description1.part2')} - - - - - - - {t('description1.part3')} - - - {t('description1.part4')} - - - - - - - - {t('description2.part1')} - - - {t('description2.part2')} - - - {t('description2.part3')} - - - - - - - - - - - - - - {t('description3.part1')} - - - {t('description3.part2')} - - - {t('description3.part3')} - - - {t('description3.part4')} - - - - - - - - - - - - - {t('description4.part1')} - - - {t('description4.part2')} - - - {t('description4.part3')} - - - - - - - - - - - - - - - - - {t('BuildFor')} - - - - - - - - {t('KeepUpdated')} - - - - - - - - - {t('Join')} - - - - - - - - - - - - - - - - - - - - - AFFiNE is an - - #OpenSource - - company - - - - - - - Copyright © 2022 AFFiNE. - - - - + + ); -} +}; -export default App; +export function VenusRoutes() { + return ( + + }> + } /> + } /> + + + ); +} diff --git a/apps/venus/src/app/keeupdate.png b/apps/venus/src/app/keeupdate.png new file mode 100644 index 0000000000000000000000000000000000000000..7bdc36986ba657443ca88ceb05096e9c0498d32e GIT binary patch literal 631441 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

5fKQAxw_jJkWVAgv@C%|r=sM^`&iFSN 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

2T@l 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�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

<-LiBQ8@@c! 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

xRVQNTHCs zT$@AdLR|Y(Os0H#8H(BoYzjTDWW)^#*f%s!L`*FJT3Cv4YBj-%!~qa|=In^eIs4?^@% zkrRZh6cZWuDdq4m*W}?PDlb27lb;)-_2r<+AXkMZE@o_Nnbsr|h7jOB0-D&BAsC1wcqxzyukxq)~4NJA<<-W*u} z{U=7*590@adF7HT?+#t0-z7%>QT05Qfa+nb(AavEu<+l{qfs8R%gwiy4Zb}qvWUE2 zRU}1FdbZbRlttx(QKwlN8sKcQxHwidlKa_l0&&aHuSkh8G;tIcxia+2tyIio)9IJn zYV5n?(}#<K(=ZCuItWwC~BHH8HNnV>a0W#M-%W}iZ~&~0znSD%E( zd}kr7kplJyI*$gGE1w7AJGc26bTqsQ#O{2|yiSn)XEpS;1dosI`061GhhlXIK$+tQ6(CW$t#P-DOl`<9bWN{CTeQpRvuvwhL}>dYBa_144KW8Ev)BN? z<$NSFnT0ITh;M}bXATx~>R-)kCZj%EU{|`Bex(tM#bo`N9S5bgaOTX8%_MaQ0;JsX z28%K2@=<*)OcP_G#-Ja{K65ouwe1mC`Ab3Xj=agGfQ?>E>Me|B3DixD1jN(NBk{;v z;-&rnwAHV`8i!sYx^6ahBs9$8-TOonwLDN+`PuzG?(}#}AXR+jFe`~ZPn3H7g+ctc zaT8QI?G*{x)3Q0sp=Y#f+;eQIh;xFe+2Pv=4cA|+`5Q(le4if8rs$0xyp*rG>rr73 zXWvahAWKy9yUwOluP&Ho>0&9N>sn0H=QCV+rEiZ{@t${dYaGo%SoS6E50 z!~hWM+{bs$37B0Cnq19mFjslVZ!s#NJD(V9ozs5z;CeKK- zL03JR<9$Anaf>W7K-yf}p{-2ig}1R#@oBJeI3QcsHT@#2d)=`^qyBv;4@``1N>Dtz z-1}<7c+)id6FF8A_K@uqJ@*j-=YRc>zrb8pu-`%jyWYi$6097s%u!-2eK{i@j|;NC z6{|(8(j=)dyJm=lNQ`u^;A9Iv5><|sQ7R67&VOpQyM?UJjYpo=aSQmB(_H0N?HBa4 zV?x{v@@2-I=FcjLPdF!U@_?hm*#IVXWgSPr7;VSh6GIWUKd!Zf9yaC4o}5fc2E=TLqW_W z868x;3b)l3iw?#gz=0i|e81}l$|nne%m9ry0Rb5NBdZ9^CTyZDXm%_31l(J(ruf-9 z%=<>BBiwZkW8gR_$C#%wC7`9wF69>yP9GoLxkWbL!GUw34RBU0`06+;z`vL>tRh41 zA1ZDzF{Y_=KNEE$k6<1(o~G|q+f;Z1?Lv@0`Ggj|d(ysi0BbO!JIqb0BDwYklZMDn zMEURe_HXd7b4=QxV-;QfICw!Btn`6?-pd)SKQobArQ9fkm>yVRAy-FVtn?1wi@ zdAev&0W1UDUXTkTr(XJ?eu1&d+eP%_c5715{EkjT>xK$uaViZ-8g|e-{+Um*F#Cx0 zIr1Om5qD8$KVB!j<4}ChYEA1R8eFnegnL(_Y+^k(ZV`e*ZJH#}|A zl%J)?56Ds18)dI-t`by8#-T4X2zt+ir;{{Lf{BYluijvDur3u=2wZ~1w0^HT*Hkd) z`{NF8&b~V0Viw`UW8d?YupTEs=~9oZk@ zVyLF+eWcFZQn|0{alidiwV+3eux?H=o29&E-&BCbS|LJ-EI(Ty8L{CRg57VRr1(Xj z;TJRLAT4^UNM%Lg&F|l}bOkP>na*>`+ZL0;cY*fcXJ-PE2~Nims2(F|FAK1jpl>x+ zUv%7KqiS;G02tBRTxTyfwmJ2>Bjsh+9vJ3+?Sn;uSgrE!xa!~cymL&^fPI`H#GiqE zy8K3QM*-t**Vh|zqJP5*-%sn5apv09*k2s-LXs00qEQj~gb>fWs$(NvHLD|uzEf*^EnYSPXR z>m;>aFkqzzr}Z%`%2PK{1=2bh&NJ-X>PCtbqLJK?f*{@CB0@w^RWTCE@hJ^ zT&IOSDv<2l;jYrRI~?wZmIBd%4q=2KjSbddWq9=zD1gKpS7EwyAE_vyxPvgM={309 z=S)ctA?4dFs#k_VmYiv;q+qKXwi=KzKWn@ll0@d&wsBrX%}T%e=$%@NIOhwhNC_Op zqkk3A%Iaz1Oda|7;oeI#w>@m`dZvjcr)*0-@chg741H}CM3ZlQeN+YyJ+IK_8cPXQ zX|W;+sit{lsM*9COyX8$PsS?5z=X6)3bpOgpXgbn=Q=U+aPG?+H{5>pHUIMilHmKt zkBIYx@%IUqe8r7zULsYPpmjHuaTij2HM2vE-#|c4ckoT?bJz=n<0uJ%V_T+wj9UKn z$JQpX3z-G|YhYRF?Yt4Voq87#jJL$xXzley=i>Qhn|PRQ*tV>(H!H0$kuReA2+Woa zKiGdz2T3kGIrsY1%2N?>H`R^9>(W7EVLCa%TN~sOk}12!bjspb@>Ecw{6swRs6eDX zbBbu9rx-Pzyb4c8dpW3eEcdV408Ff5%n#Ly(|{E4 z+@rq!$lneX|4{<`(TV7gG(g7@j)Yq1v0b2vYglr>ptXD)s~NpNfDSj-v?D%bnHYSL zu-;N-DV2Z710A{<+gLukrIDWfdaGg+cbl5!e5^rV{HS&=ZE3wvQ}PQLl2D!K2Uq^e@V_q(hG?)DgQ)MOR2)S z@nw?bJ3VfTtcWi=2lQsylY)#d_sYTQ*}6aOhsxO07$!Kz#%TOFY_6!Y690eJ_aNx# zlbSTjJC(M5%G_byn(-anRC0ROE}H5NG#di;9B%xb$dpA*SoI*K zUP+1J^;5PB@V7>VDd z9O7pEgC~x`v2VW5P%+}QloG@N~Xl$92 zXj|1i$xxK_-o<&b|6s21-+gd9zfdddF0cz9V2|0enl_T#^Iu zsvIdCzejN$y^%H8!gBeqFyRmIEN{RVX*8gC+Q5UF(pQeTK=FkqQm5mCjTd#;<5#dj z<9>cv)#)4vwCHh&tFSiXSnq2N?tQ9UyR%kw!c-lD)b+VB{zAJ7a{ep`eZ0{YP z9jIv>iG!WAfaIW*%<-TiBDWgQ0e_y40k01Z* zc=~^jFz}ODYXAKzfs#o3H?2eo(HArJ^D!;qe4{Od87$!g$hF^t&hdQb(f3Zj2p#}Cy=#acK|9le1DD>b zn0v{cpDh?Xr$u#EDf3Psn=g^Z+-uj>h_ z!7I5DE;3!BuutSMrhz>ETO8w``+q_wl4}x*VDK}H<|f23IltuxC{E1nJkv>@xSK|O zupJQCZ zGR4z?#UGU>`dvvLXi?k^zDyg-{BVG=;i&K8?X)~OC=Bnn!!nl0bU3*WqRDQM zik@3Vu8B?Z^Y|SF>X^gyj7&&qiVMtQRuntDB}jXd8EETLB;oC8b+iB#&C`7j;wYo+Bw|PL||TQa%7b-@|>My zb9~Kf6yXB~i2X8z29XG+r*WzUX*pym?Nen*20+_t%O#U`np5065_(!aH zH>kIRRimkXu6z|q0JMIcDBB|L$>bk9AN)Tc9n~o%=-Obc#(S+~;h`A+=a$2Gd-RKa zrR088EK{zh-iN99*IP1foG95X`7htYcp8|=W!tc-LzHYb?u8PFX${znT~^Y?x=luW zag*qJm>EBtGuDp;LOm=hi=O$GDg)+Bo2UWgG;H;ns{?XZnnNOSGton+xr51~PYGP9 zcJn9A@Xdl6^{$pXiK>t73-MIIJoB?iuro3k+*#+mcwkXI=zHHQwT)=*G?!l|*5MeG z{Nnc;c?ej4NJ?1nZo0rK34J`qyZ#gey>z~pd)9a|vaEU%I6?&5{%j(gNc6`lg$e#u zR5c9j?|2x+dCoH$5|TMtD0JSk#+`PUaO$fzGs9>jkNC- z2>C8%pxR9Zx*#Yi(OFm=$p^h*it|VvSENJ<$G?XnFd2Rh=z*3gD;HAgXIPINZq@tM z=%C4viT!JMZDoa{>~n-VKe7|SVr?%W7|`5p_&Ffhpx&w~@VhQR)SWK75I&Xx;_pw& z=i@!q-0J`HTnz54Y=DqIx_rIHX8$CUYzRsFCYqtI6jd=w$Z)=R7x=_CBtdjtqg%=( z+Y||Ba%-7;Z>L%-53Ch+rgn-|%O}_4xBzR*5#)@M@&rTQNpc_~MS8gQ4 z$M-Px4d2yE_^cqO8H=k8pUoeiLA-=eE1uHMXzHt24p0t&2jFAW+-hR~##~pD(@St4 zd@1T@`$vZF+`c-#8d`Jm-_?IV1ObECOO^5fy4h!XlO(0M_c}F-1>ZSGzw^X%t{|xd zZ#w!CVcZmNWB!*cnqSAt0N|pdqwIqT<9acs4Lf9SEc=bMlM2L~u4){gW1P7Dxi@M6 zi*rqa@#lg#z9fOh5Fa)m4kHorw`uVxV`fq}^H2-@&|p6B+1@&)CEs7o6uk`hiWTd+ z=o>>R;9h%!kl-4FV^dP-A9#DQ8yj0JkugrnqCEkXjbnQH3I?pXL}M?`b-r*iQlI%5 zL;~k8q&i|GuNiyY)C-2LW&CJBG@&S!$ii*$nfXMyqpf3pUvRo;zWQ&gg?}OGzh*AX zr2Z%mE+NDcp{}TwJM4-_bT@WGI!E4PK@E@|7nbwm%aS`S9RI|=gC`rVNzlA;t4y;m zu9gOtQdPMRF)-OHOdnj`sc3mn*;+i?Lg!?wt-sO%yO`=r65!b!8%WZyq{ks5&l!y;w*1)L_GHM3*qU<-oGxE6Kv(SgiaXh5z4IUn0o#?L6_Rn zH|G!zdfwHTcM?H3WI*eAi57ga&gPd%xHw_tfivpRD?;7zgXNX|BWpa2d5e~~7g{kx zu6`YF)&f9!Vr!r>>bwqwQ(Dj^?M-q1Q^43r$2qNVXZfnj_a*VtZ2gzew+j??@_=~~ z$sAFIR)sa)oUn$X2Oy7QfC%X*QE2pZT6y|`g74M&w^gHe6Va>EYY7B&kLpkEFB z1Nqpi026BBMfH2A5e39y+BO$*u1sp%P_Xs8TWAxMx!%@xgxyceb3nmZe6vs8)z7<*e< za(MN?9#=NdwH5Y`M zw4ii1lG5E9zQw)2bMEzg-ZA`R4#!}@TyxDgpXYhQod_B&X}?~=wb*y@8Cf{`(H9W) z>pfX6*JULd*Bs+VS7x2@GR;jKo}sg06#sf zM`*;}nYl928om>4T3#K+)i08g)*qA{coJdwSfoYvbvvs`@ zQe3f8W|#RxY|@KdW)x9dETrrRx<#q~u`7ptH5hx)^g1QmcPZ^eUSlmVHGbx!a*-e% zcv*o9ZxdVLh~D^ldMItpUAQ35;<{nBW-CzZ-b5@Q>H|bqnKIh~vZ0@<9pJ$%TJ@VRDtX21w<0_FSktb9p zHy7mil}*ua9%bqAwWaD#R`X7I@}mAf{Pq8C1qZ*UJj_Use$Tfr9hlP!31&fz>ZMzD zV#khnjz%9rj8ve;!IhP+V$QV;zvIfRF4f{A=@_j>bBKuo86hK`CC84LNU#*dX3aI; z>YSfLjzm@%hAZ928)d`UPV@KeLZ0{c)wjpyswZj!CJ@;T)>%B;2mt}ZJrR8958{Y(_9R);k+=q003W3N#5=um8ke+*FKb0cEu>T+|9zaUf_3sfIL>+8 zG~m0lbHMr0z&A~?J}$Q?J0`^7W<3H?W70vausw- zjOA{iJmx5HCIhEn*oRTwH;{}}2d&Chu(3xlQG|@c?-`H0h5N-m1Wgvk!UWU_@2P^z z7jO}jJ3Hyl_E>5NIV{Q5#>NRoA_tZfaea7cIdM$hK?%xwZ!^vkCPeOkCPnd{WU%MWdE)h&puC6L8)7$O2D z`BUf)@M&y#Fm6C3XF}i#Gm>86`Dl3b9$%Shw{6i~%eUotwOkCQ*`N4HD0RnPJ@kPs zr6?R1XYho0{JkA&nwc$xtu0|_y-q1sAN-qG;e{T_Y z3US)sQD$6pi>{u!woSd4fPpu9*5BV+WG+-y4Vc2&i%g+Xb4o7$P6IFaOnen_`qLnS zz1Xpm@6w5aM4s=hYQQtoP7RQbRU28&Las=3H+dqI>@ZKy4g~LU(ZDBRrM3F{*&{u7 z-O2ugAr6xhT-M{oUzNA@^f~0OlotHA_CLIeZu`YOsq$6`_WU1^t9D76swmxG4%B4b zJ1tE62BhemCPDRZ?~k75uUqqQ;SEjgk8iswH`!g^7{s(FJ2t;MNXfSAxsT`n1{$|zLA5P~J>jgSP@I!IkyA6)hEq_T&jlw}aJWIVX=b_Rl!%sVE-+3*^Dc z!psHyqC1|K0rOUP*DY4m8wrwMGBh>XSdpoZE)|Wzir+&?LOZ45;MXa!r}?$U^;d@% ziyA{APWK7&Z9)?!dpqy=%^G!!zzpsuEVf4GzVcE&=(?jeXf z)B$a;|L|H!DTLZY?3t{N+@Y6fuO|cvTH_H}-D|cTU3oT#9^ccEC(^edH)GWO7;gP+ z(-b!Jl_=iBQh_DF%+4|pER3(7MAKp*LTA%mU&x&q85ILd<#nQJv(AQY%lYr$P2F8e zru^uOG+44hX|wC;hcZW#Yupe&|3~kd3Tqmz%bbo~EHq`gq8|CD=CylQZpzI}s_c5e zdDRhZfcfMld;4IX)GMm}5RUy&oO6AXaMKj$i-8+MqdzDh0E9;DVvnO7@?S4HgYrz! zjWD5FeA_r9vvUNLOP$VENCW)h0@`XS%c1)gv|n*b0pGv_a`GxQR-#)_lfI0AR??_? z#CVjzb1h&}-wTW%7&E_2p(J7l68-^6qcBIQo@Yxv(^)9j20W9YtAphqZ5X7h`Z~0@ zLNBPjOqR@N$R8*P8({7h_Uo;%MMnxYZgs`wgsg4w76z;lk#^#f`tJ%hSqixXVRN-N5fYx{S99*|&8Lf5}8aUtky!8M4Hhw(_5k5zkmCzNm0}{#~`oI@f%Ve zU51GJrn{*<#$oTQJEj7s2eC+5VIYd&Z^3<&q|sSMC+XXdwvgtKC?AR+0k1!_%~_8r zxdCLTUc{yuCC~q;?);}w3#e<+z?+pT2e5$f2F)Vwn`8LQaB8~K9fr@qf#~Zf*rDt- zlIbxKlgbY;Ui@Hl#|H7kPMNvfcQCw4>A$o91|;Te1#IZbBl3O2oe-I*(u0XV3s$*< z;MY~Lx7wZ&@Pa<$$BhUV*NU%2`3^2gNdL%ICUt!1sIwud7UwEc1eWBFLa(tT0V@8mEPP8Ys|j#dQ8A|x zri$kLS5P^BbiPpMG`#Ga~si3cW959q^ zAQ;kvtB@0<>_#|EF=DYQV}i}203~(cw6sO?p@i=WQ7(r+5qAE1zSpcxk*d1Zd|z+yQwMt$xcO{_a2uh7cnL5?^>O$mCruvusxknR z3c=iQ_yvSFqb#+x7VmLQ*?Qk2`W!H7GMEa-{%rrMV?FfebO9dQ3uv6+!0O=3JxsI5 zu9>SBZKViG6ok*;8QyfcGac6i$`OsHflY(gxIgJ*XoxUBK(x*+gJ{|yPmifGhA+&o zEJkapOK2)-vradc%lOl=H(;gtmQzC>qP&p$f@B=y!A8Hyz80o2>6J)e=P4&ha4KIfNZi6tlqW_x6QRJxbX%*rcoK6&K5-77d=j`~_J#{&m*)n#ByV z8F3izb(AwRq(EKqPf=$>J6LY8|B-NOjIULxurj>jN;9@8kg&sx(dGK+WueE!8`S3}6Zhos^`%G0Dk5im5rXNN6DKkk!gC3C1dKl7% zW=r~!$BkqQP)zqi5a3}~#mU&0$w&Uj#Z%y6G+;)_301;bYu-T5+w-kc;d~-ZWP{PJ zRUO@;8YE^R%Mv#1}cD2AgyDC+CUDOdPdyd^csy zWag>-M!sw_TES|q)37XF9H1KN4FJB`#WK8iha_OGfz~3M1`=1@hZOS{4R=hRi`_pX zzN81_9@|-E+JD|3L`}e>e}C#qlCMSDftr|?|LxaDtC4=k!aKLD&3Vk^)ZXfBKbqZ(L+yCg8+eY}XkM0i=wfo*mhv;iJA8;#_2 zuimBJY(_!Xzbr;e0y1d-Nre6?Hp(o69uUDpzAB0dT3O2sWSXd4knw@w2~oUvtLDbs z?`mL>5L9;_pnEuv%sfD^kRVD}74CM)o@8XRG0P&bl=fp!p{co6mUj`+DK!vKgk?bq zUg>f2C${d%&2mK%6;Far1m${+YrV%JS;~YWVjDZc07~u^=5*X?;}*_B6RqkpweW1m zqgCho7v*W|bSx%o)1f}+t3jf_QT_f(;JuiEY{P++?K8NMJv3L|5D`5txn4YqrVo$q;pCxext z_|6_7;<8iN7HW+PvZ&8_*eI$(074(@OQVLX&HPwH`Q#?wdlI$Jw5vM7fUGk_O zw~i9Uo2f{RlZ^%;F{TVi8BGV`G#0*l8gl-eLn@xdMSeqF%4oJEYW?QLHXhN_P+^06 zAchG5B4|e0(IBn~egwof(|Lnk`n`-LojuIUjbcJNu06nTnLm7nL12&Uc7wpj3!o3_ zL1%>Ps!eh2R^&9J@o8^|QXCKKPRU^AB?G6qigGri}h@fd7{ zAzi4nx-{t+h|Qq=P_yiKi=$nV9ST5?!`iuzv|dXCd5+kVFppqw`@Z}M8VKvMBuhpU1k0iIBJ^80h zL}-d!;lRH~kh{FVP~WRw8Jh5#6ORgK_4GEcii^&k%y+Yn87s4Ogcm)l7I{Om4aAE* z`l;Y`hsD@|6QBJhB;Vf+^Iunzg#i96Smlluq}zK`TyS`bl0hgyB`W6G+jp%<8s!e0 zW;_6T=E9P}+%WNbQ6RG}QKcj+^DsJ@j0IkI(c#k`X84y;7U-lc*Wn|AbG&jZ6CDAj zUp6KHYB0A|pi6IlSPL&C+ip&v1UN2hWV<#Vo`mYCz0f96qX}{|Po%N;;4)oP==dfHY|M8d3Xe(fK0VZ{^jpX~ z^!72?9eMEN%c6BYAtRA-@m;C34kl-9|0wxC6>Nf~Wr9$8E5q7k`@S|@nJSR%7qLG> z5mu>&<{>7j8p<(fw${17^cU5!4ENA?#C+#DX2PK28a-*7mth0c1xY}rPxM4HGfGy< zGsQ}`kY@>fD8GES^BX_qAgCN>!P&;BT6jqgwCe69zdP+JPZGvGAhuZWgH`wza9hO) zmm?^$N~ zC62OgWa}inhX9GSr|t76{RhsDH;1(h$E~Mzn!Ten)4>3R@#n@NR=VD;EsAj;nLGS9 zA1s}2lklB!uiDkSZt`1yKf-mU2y8^cJyWjq3k2!9eE#U@Fv+wB9ub@YVrjseuf^xM zrzdxFZ5P$}S1y-zWhB?t1tD57#TZ|gC4uH-U_wd9HMMdy&D{~XBp6?V8SUeiG8;ixw9l^aL#X@s9_7N(cl`EZiaW=Y~N45 z?-TNzzJO&_~|6`^9b0r>8 zurme;(hE${fLlgBQXk*IozkS@xPexsDyG_)riF?0byX`T{GtAil|?D1OaR=gB#R`EzD15$_AuaP2Ph~|n)BZmmkZlsVQ z!=686NEg^nwUZ07;W->@A^=BcPL)IbP5e7S)CCz6Q?u&*Xf#UNYI8!WjX;^dOzVT-&zTE$YOy@Zm~-WjmBZCF z=EP`wO0rkU=c9B1**n;g2<+G6v!0A<($@H4ixg@^$SbPqczghK%KI8LcV~l?a8{@p{jchlwIWE5vD zTMLMjQ^YYYw>C)p$P*lq(Vjn8OcXX)|M2ZvZ+!2)6sZir6sLx@*%(|L#kdNNNZTDQ z6g0q8~IA^3mvpv#Hamnzv))ItfUCo7rn37uvdYO{ zv?+L{E!iizOHtlllbbk*3XI!JQFH+g2WV9%|9Hll``jS&;9F5>sEJ=Ds8#dxq>TwZ zWd20e0~r~xJ1mBh|6BL{`ufNnHKTDz5NVD27gTK#?+nQ4#Dd|E+pF?G><&$^Kx z;-8hnR-Ro80Am1Lbj1G{|4{^!QdT7xfp&=pJSMdgZA*7vlP2tW?s8n6X-Bu4&{xf* zN>sLn54@*czS*%#(9kpg9z@f_g+3+XS%(hOwuU=)-RE7npjr~S&SgdEl_sDd$ZXPn zJsUC4#sRzkd7=D}YfvN@2P#-a+>}pw=#pm0h7Ac_x3Es%XjpEv9z5Y}Mm9j$dzKc` zE`8gy$`*M$x{_)9Edq9@!BH+W`;GL{k(BY}UItiyl;t1unXBZ%btrvv4V{pXUet?L zq8Tdn-MqyM6E9fetm|Zct)aACy1Tq7)bOQ*snm?=G8=~d(dIv%@z+g>&kDNceVSbL5ObZ$*2`x%EFp*6BpWqvYGZ~GDvy1M52U_=)UW0U zgDF-mG_bGI(zUxy?wL(j$JtntP2hUxt1nqf%oef%sRN)AaD@q1R7bgJ^HmtVS?Q_#$dCDYvk`mA>J3VF1&6c*&AB)vf6R;d z&psiaT3M(uzBMPiSz!yp7U)G{`qU8H^Ub@b;(f9Fns|uu%5{%N1@YbB42Es58pt$y zq8<@Up59u>h)y2s(Pet@YA%?>4RGhZC$o}4uZzFwlHr@#&4%KiKTNj1MFYD@C{|Jr z)vtSs;_0IhygV>OTVEi6r$j+KM#gDK{lWVl*d4Dfh}!>V@B$&fuV7RF|Ai-$;Ul|r zxlt?=75v&Zp4Vl3DLn8_|7%uudp>Q>xlQU`d-@zaT)1l~x%s|^+6ig68 zr8$~ffa3qNvElJBye`K>;^g&2bYFFy^RU6ir(AOG<#1?o<&|UOjo4c0k?v47za2S| zV_D=pR@*tlkeSb;MqQ07&b)w7jR!3BU|73F&eFbvKqZ3kk;OVOs|%5#K}q0MB`j?< z1mY7ZD;ZViDH9;MsX9u#?o5>+5kT+XF1*6V)^Su@`1OlAs&htUT&uk?6{FOpP|g2; zv~%y`98G>A#&4cH`&kOw55)PfYByQPlLwe*$YpB#@hyw^X*H`1 zZ>(f04?>#O7Xw1o|9r?-n8kyerXE|bIdi%@65tUchy>Zh%hW>ExZ;Y)(l=pUf)BTqI$<$`T9hj%(5) zldbkW5TgF~lm2h*)Cw*+fi;j`a*|>_@2qkj`W_>$$tD%>@@l$4RivDGl5@nah+5V3 zpjre#z&o7-^UF7(DWXKs3=<6yWS z8#fjX)a@g`4nP5q*wN-V{KlyIaiWO&Eb!P>#QDCjb129xrVl~?h2zgzZ7$Lj`B;7S zUF(*GhA_?JOT2_x%6gAQ(TzPE36LWG<#B#n9LgZ08AIzX*O&?Tan895X3BAP?U<;0 zIx38t3TJ2b$tyN9g02sw5ALWH#(gwrPo_v2sqT7B+nQ1IVt-CJNCOeMfhx4Kqgwru z0*w@?h-vd_jnM4``MrO@Gs@hP3PRk?jpt}J5!G2Kxs)sT!9vVAyUH300t6JwgIVp9 z2X9A?sjy=mHIrXQc=*tKwk6}&(3o4*y#2P+YWCu_C-1k$mX10mFZXW}`n`gNCS}OC z0i(r5f_UHr60D5dd*}s=SQ7Jk%jRaHw*PiBLcy05FcFDR4*F0E=hkGZ*>d{Ai=FqX zO^YkDXNsRDP8BQk4^n2&_8YlPTQa-s@LC9orywjgr-1nqQl`jVrJ%u;5pDN&dtU*G zyb2_H=Z}g1!fC5wO#AG9l&aM!zEApgboESVUh>0dr5+}OHB<6;Gn+|tAKDf@raQM4 z<2gw26j!vX|6zI>kim7-q>e~ZGs4;A9c17aJiT60Xh5JgN3}E4IB~OKV_Ypv{_At9 z>~J}>SqTxqbpQV;M)MN<%lu@&iQ0 zw&(O3J6Mo+66r79DiWJ|Ckta$*B6VCEP;mUQ)fu+EhYo` zRLjjnR!|6wbon5GAY@jMY9iDabB6oWj#6=tB4vRNZq7!zNgcNfU!b(qO}iEEu6t35 zD$um;dd8RGKtHnwrT;L*Y~e204o9Ru_&bJ%Q}Bb}$P>4mmS4s{YWS#psGBwGjnfZ zm_T3MH+J-G9oLG6ln2)>vF0B=TmS=Smp!!^S?V(V4Mz~yn}!6K!z1OLZk!VlX_;rC z^_Ev(zvtBP15Bmh|36URe*}F%6Z!Yiq&J8H=M;kT^QS=pc5jiL6QW+_^MjE>%TKZR ziFMJ4=CI5Fg!iUQ4rz}lfFY^^%~F4NvdSDC@+}bVnAXVDoBeo4lk#9R9N)Bai`r+l z2i9Cc5DL5yTgU(<3%k%n0Yd%tp2P%bje`254p4<)1Qos~wAAovmF8g(LvS+>i&M#= zuczZMb=Gf)hEqt1;IqkxP&?%VvW36di@%JBBVq9DIP!DcOXIgTl>~}xJs*23zdTcf zvH1(6UTgmq&stciOv$HO9y{WkmYgnnZ5|I5@iIamQRUGy8|;KOom2VUdXOh zuE`&r!R7DVntNKPct1hOU`RthCjn|6WC)BgUm3T=J9YUm zHaV5w%eY5o`|$ZHGNL}i;IebDE4J4-n7LJy-Vx8nDj5&uh-}ZLR&hI>o9P)!Z>PQX zgO~z=%bw&JyVvp_{LGTl+}f&-Nl z3m|6N{7ej5pVHoQBu_N-x%o+m+y{;1Dq{yC^6FR zO9^~mS?Pd16AakL>}$UO+zFXEyVF4K`Ys}?J}Yvjn5@KhUHNvBpJf||#1$BISsynn z3aRlrJ(Xwoa7s%iPA2d-3}Nr5lH%rJvE#ne&d{K|l<)h%Nultb2XrWcPiOZ9GR zZEEYOlo~$qsH{x|UUZ68I>M~+edxDjo?5n|?U`FJ&x#2#(=mARIBU33@e1hFuqE0{ zf6@B=Dz*<|TOAE>(6OTW-|_GierleDpH%&jPvjrFA&p2O3joYV6({oYN92p zk4Dg#+UYTyrqeNR0t^rH#_YRHYJQRPD?Jqt{g*d>Eop|W7S3{{fpIiLc4Uf&j`#y= zVv!^mrm(Ej(FY>yogf8Anvr-8EPl%MWhd_utv~7;XX7CW2Eu)EkW45mH9RHS>+hGT zwc$mCx~bPCpDcWqMwfnRwp3L1cA14F#>cEm?);CC!07{6(O7@rvV;1ws&CJl8Ky!F z|4CIHUt&w6U1Rhzkk*0E)Y>*!X~)K}TD~eIbX~TsM!N zZolE>YTDw7O$Rdcb5zS4pUVSP*}hY)!SwNa;}<|OTTZilxK6nFF-T%H$lU%N-U-fS zBFDDlw-P`r&BJ^011-djne}dEV7Lu4Kx6TPahtm-m5|++fYpc|9l%akS>cl1w~4=m z?xV@g8gEs0C#J=k8F-v+5~I+0jalMEWyD?ZL!R$odj zBcKt~zBBy6p1oXt-DvRL0|hvPK&l77CI7x*{6x}7tH`Xy|if$CJFZqKjuLDcjw3;)~VFcP_a zAdj2-7y5UX_eO16PfAfr!eO~8H*-o0#e1AFew-~+B99cl(11Z@8b`7Iuo@9`R^P<5 zgH~po@-}NCXjSjN{5ZO%F_LX9fX(lH)BbBivp7&xa+7dua^J?hBC1#Q;$Ny-d#2i! zVi~{q%Mk`cpmK$sGV$mH&B`o~;YHRMSA5cr$aS;Yas;+8`kLm)saO1f(N9V^vtM0W zR0V{SqF+CHJ{3FRVO-&9AEgwzg^9n8wDm2(Rr9e9=yJ(b7Q7Lb^{9 zIk5?=&>tFk_BtwNe3Qm)w`Tapd^%a9=ckaj)>B{6SU%uv{`(RCw+7~n=lEQbf1%Fy z(&P+#<%>*q_H}xU6OBM#VZ6)?l=gv$F-LtP31TClg)=c6oM^7T&Atf%55|bTlCf8ZRWT54be(VFsE_ z&h%{LfkwFW9LW-`oHyI#E!&c<8TS(&jf_MhP^%>|6IsDQ9a%tggV&I6deih5y4tni z8n$J^N3kJSa^E}gU)E)5tHN2dSvTlDB0m_AI5PRSN~IW|lYd<#&;7mp?1Y6pp8383 z#r_3lK%tTsS>rR=)ynTbT1T$W762uU_@>58PXqA9Bu9C#{`qJQvNLwf2IP-+oD!#) z?09qUd+(De#7d!pCp^o`@|QDsar`MS3`;sI__H`4#f8oBv@5S9x}d>~z-BRBiV??X ztP_9^LIZd=#N$^F2Fsqp>v@iT_~$QjVcf_9$P5Ej>{xrJlXUGHj38{~2d#Nvs8~e) zR~>HB*H(GZ@Nj|`vETUfq%?hINh}bO;*R{$b1BFgXWV2Hox{E{>^yxio5t8$Te$G# z4J3JV9pV`-Eqz)YW=`b!dn5B@dbp2*92Pk}}J+dE9?=e4%}`(=GNJSA*mSAnqe%Kq0X(J4WyUJh28#NNB7g7}ra z4X9X;lj-JhQHV)jw5wdc6&Roj9J^h}ZblUPbTP|_va2Ef!DsplNtyO=mA}1sib_sG zyQv~YX)WGn%W8?bz-~)s`bSM9~g!JpS4OP@$vQ4Xs$m|;q{=a^W#{oxw6^4rq0|Ebi8ZZB0hO7XQTjQ)D{epDxj_Q-_f-m z9H`-*l$Lt7-}K0>d5&x9RRxJ1qV&ScgAf58ba1W)TnPJqwKQso$5y`i??3u~k7*aD zR~9-|@|zcN3d9Lo{?P#@ptKlG5q-q!o@!joTP&AH{~d3y%f!;8O*y2;C_)3rWx2=J zxO$lL{b>Gd2s@B%1JT+z?OGAnCr_*FZ#9{iS(954^`oNTBlr=!MP z5Ic>_HB$`ospB7 z&q_oBQto&-q^nOW;)!#j?0Fl%G0^PyfAaK?(G0+Q#f9e}7Z~2{DELBt^t^Y+ zsXO}C&aan#!tf;caQ_mmCi+M+>e`w?K+y<|{4Lo6cZItq$W9$)R*u1gnYl#26l&;p zQFZ%cqV&hRsjgE>b#(Y1o~{Z&HgO=WOF)6AE}em<3KcxglyD^O_{7!Jy`ZB1TxG2? z;0E<5;N@HzrMvd2UfTGOGK~Z0#2_}?oZ)_HK>&5KaqQ5XT%w`NL5)(*UCWOl*ctBD z=hp?QqN_U7HkiF@8<_NDd#2%~l$_Xc>%L3z*uU@3BVJVCZq2yv>er1$E;op;%QZQy zHKu_%1uJd66wSANM7w-Qi6FgjpY-&l25p=t?OxDXWRV&w{O^zXzdN-|iLGonv7TfP z+R%r9395EHR~AF0sI<$Yj4U*?3+81e;1sY)b6sAoeWe1j8oppW2a}ldbeeY!SKJd{ znPYO%sO@cUcJZ8e^83sYI+TmP zXhI^u6(_0-eusN1**Grkb%;kjBccP(nu}fq&9<{$nReNuixGakRrA<3)#MSHtP$KG-8JI9&fB>dh} zF@!gK3|^mkxfwrPYVY!QpWOh^5)hDEpswy;0w-@)LT^?wtBB3q=H0wD_~T;*_v5ME zIA^&q1SXL{e=-SzcA)LjM!jm;=ENQ^g?VNncwOFIhi|WZ1xwl3X>CSq1Grd&AERk1 zlcbzbEBnlIFwx-Y*2p&`%EJwkpmY(6P*I;EHa1QAD%hnoWn@6kqrs~tGGph_XPx#C zgq$57ltitEp2}?jxGpN4SZKb-neZr=toKu|6^SPxz*xpSl18^}yj#&NCSBI;lcF1P zoPLM$uO3&`mxC85nr|UDSwy62U_WPST9rk;v@qEQ2XKRJRe-NyDD9ti^x%DnK()_2 zA}ODgGIj#oR+j_GyU+I%hgr!~JslsyKOMh$#r&!S7^6fXqj6LG)u34Du_|_y%CV)` znxX&BP+8w*+C9Mm9}P*wSK-8}y0?-MK73_);H_>9 zchea#Mh}%W;{B#lmPkJqSj)W9!}nPNphTvQbA1KQ&p+-9Hf8bCsLlt~3b!A)HSn;K zvM?`4ycB9yH2wJqc;0^pElw*aHJLX{45+b|zZ~3RdsNOp*X}`2LP(o?RNmg0G5m4U z?VZ$4SJ-hpLU~Uj2nKjN50$B(Gj~9J?a|cOoRhewa~&gyzVWQy37L;o0Ju8lqWDS2G{g8$A;^va@5wU=E=N8kE}^sS7uT1&hKQv!ltbl4raFWfjF zbP6cUg|^crl7Dr+#tuo~5i)3670yA0`;{4>!4E#bos&=#xS&AX*G5KQ>yvvme^*=R>`xGLUOIxrVB=kEWpkWMpr=x_kZoJ#gQuNMxmp`II-ETYSDV{ytFTY-U=DS(MQ*rOvsZmLdlQTZBo3 zly0~!BjB!(Y4~HWz8?K$w#Gs~cuRxm40Qm7?)S6Oa|6val+k|31nozBW@bXwmw#=Z z_<3h%M*HbrmV^4w&&)p!s_uee)&ft#<%mHqe=FYnJJb*6ktPfDw4jVTopWk@MZ@y@WpG z$=wov*afhcU>vf?^O=dF8()u- zz6thMhf#{#<2CBn#$zSr7aQ%GexD%E1ODzNQHuCY4$}y>SgWa6Yk@8L1W^$bDnqN* z^MQ-EFraWfXF;p(O1)^L69+AoV7f zVVSZW1peL9*espIkK5LMFC_vxVJ^eM!)ivIm^k5T%+`d)1%$YG$(<52)*!l{feM#_ z$xz9NekJ9*B7eTEzV7Us`k-YYhqjen!Vq zKFF5zJ>SA4ZtPIW*%bIb_e`bZjK zn@t6f$ejN$w5*b32t9~V;%`W<5Nb=;N^~c)uq;k9)y{zP?*OAH|3=f%^8@AU%R-pW za}Z3io;`DkjPnuPML^&+I2ZN}@qAvR&=*z#r~O13)az9UJ0WD1*r9Rl9?BcSwfLR8~EBU$lAZ9`d4Tlq+!ePAHt%1ERjfDU;(u zzUSth_78bl48%;CjTSZ*~*^n@bqohv_; zJsR$z3>-!%e`LS|9X>2TAtFt@{iB+OG+PB8tb_*Bko*l|K!s!Z3HUl~RnBQ3)J6t%j}llY9_Q_OjoP(IVVtSl~_Hymu7QPy|GS&2=ZsI+792lee5QJcw{j> zJ0EYVGS7wFw?4nWpCo?+bdYyRg3C3Ri>xP-jWQ}!MBEP)7;f0JYkajXzaKOc?9ZrD z`}cUD^vZW#aYpUsBnIscd>M`6!87l7z(L+(;55N!zMG&qe!c&t;OH^ALCeL(#q+xh zKXOaOnvhbf=jcp|Kz8~U_Vr=0oQE?#f04nr|Aurw!g&djCZ(%gi-9)928roC8ULmH zp|o*~W678+ueJx?;I=B1RyN!teFynl!xUL|U)_*-@t-j!w@#o548xXA+xmqSM{EfB z?zc}FI20&7$nm0Sy2%zvD&f|k9+VfTN(Rro_$I>O&oypgjJ`w?-%l(8_5u;x>2l-Xc{+K8LW{Dvf z(H3VHog-w8cME3nhQ7oXgUSl6#Qdde(KnJWKOp-$W0->@8V5UD@w$FR*2$E8 zzUHga*7^?6u_&ULsIj~u#(TZ*MdC^HUD*=&xXcFPa1d$Gz!JgCv zMw}QieSSR4Yh9!?+JxZNW9%0RbFiI*|QS0Hl423K<|N&jBuKun$8J(x@Y!~1=Nfna1GSqF`sJG@tF|wOWJ{HEe@2-GFu%aPf;Hmp2#Np8i{3*gnS0+RiAsOM+jO&TIsJHqXt#Lj;AD>S?v|3_(DwAxmN`^96 zTG1$(fX=l>H=g_53o08?xUYMI)^Kk~awkeY7?b5pdwQ?zowmPT;|3!tc37y@;pY4{><4-JjQ* z=tH~}m9)IATEW_BZ-=Wgsq}4l4qYGk8~&@v__sj^TC6hdlqq8!cbMTbA2bDKdbXG8 znQGI7d||)J&iC)lL{dIrsDkmhUO4YoU<^16h|0LC>_l%)CSGMn_4SaxmQ z&qg5SMV{@QV(5%@U^RPjL|et=xj1Dos+5u4R6UJtFKX3bxHYEGka=j&Kq@ba%}3bO z;ljHQ^u!m1UaV2k6DPUQ5DpEnbo?HPTY?_w7gT1(7_|N5{1WDkslav+a#{P@^U(KX zOk-_%?PEY-hDxBR)?21$6(5sBcS@vDJ3OkESP_E@u&;7F{QnWI>47pYnY)@G&a5Vf z9Ve>ouqyEm=cc#9D|gNl(Iz({61e0k!dIuJH#_KvNbhKpb9GmZ{4gODrMc)-BWC5j zABVY+&{ABf5=IuWTWt+yD8(zo3lZ_s$A3h3Uh%)QC)swCW8QIJlZ|;0U0g1wu2N{9 zCyQsYE)CuJb~j7RMCDP;wL*Y+Kq%K-@f11hJu&Wz(tbE3EyKDf=-e7)%xZ@Nnt-HmJULP^<~z#wzHzJ zlnd*AXq|U{pcr4)Hh%9pe+pz;xFgS2#dhVJln~%SQe3n5L3cy4Zw5o&^Cx~><$(56 zk^5dmjD0R{%O2X$e_Dg%_AL6?2^VD(m@i+NFWHoiA&(51AnH5lYL%w4foM3nIcRHgYfVV_((WylHWiG-$cH&T}oc=b=XbG0a#4ge@^L z6rCaoP*Wt+UbOTybfPuznXH*3pSA)ZO?|hB-*!v{;J_xF@P@I(Mf0E$Fz!!NnAizk zME%&7O|K|&2XrDx50g&syK2X5OhV;SC51B#oL+Bz%z#-CISJ{j#k@`_^(LoBxy~q~ zd*egzjt^z)Tx0u(Kc~W(?kVSWE=2e^=cVe>kZmA0zFB^!Sik*zKY6dwN&*Mza>{r8@S z0@kuKRaML4d^c9cVP{1?{dZ)4G>*Cm_@=$t(TEL~bo`LBIs`O304@c13s-V8jnOR_ z`uuaTN>-U5!>zM!s|zOhU|Du&#Mw|Ny(YLJ_F%r5{NT@@DbR+K%8_h*tsxM?%&Ah+ zHp8Wk?cIC(g%d?4CkcP;nH4ZvqI-sxLV2Z4qitU3UT6DrpP~QHm|tAudttxyc1m@B zazU}}kv<3jQk{A)K{Ct+p8{7hrwpMoRH_7o^RgW7A(^f-)r|`UC-)J93FGq~DdotyCHne_Whz*(pdp4-|`zyTZq|Ga@2v4Q! zqxMq>2`tokmC>Ku9ADk-6LDv#(xXv2>QKA>zd9h&lnK397CyFX0ipgYR__^^T(x-{!HVJZN2n#L)xT${Hg1hzCtr?hlRcXue=Al=>FumO=4l`aJOR{pw=sk?w266a%OAMd2o9A7yDYm7#XUv@U<2MJv}G10H; zNQq!OYG#85V!7ng^V_nD3l#p=E&1E=cEiEq(XM)uUA<%@F@3~}LEeEc1z++y9dBq6 zQ);)59yFyVX<5dsjU<)%0`Z;IE9XSj#=cR{Bs_dojS=g#d%AsutWly?Ii-TN&(vvT zYEpeA`1G^8Wt$97C)@NJr10+YMk;bct_B)%bmTflkP(+o@x9bzx2~*6l`uV%6i*|M zP(pDDf{k7nE}xn-7g4_i@sQQhscaQ@@(k2phNo3EzJdDaIbkAaAbi$j3X}-QqCGv~ z9Rm^%tvD8EJUhS7p8lf+P%j>@u?e}gJvg~EQA<9)wd5(q^(G5z6qws9D^nwiVNa27 zn|(F@`+}waB`~*wuuQOmB(@;#R|?z49%=FwAlI&2-7c(m5zOx4p(ijJQRO&EZ)si~ z#!Kx64W)^+QhNQU8jMYTKBuG4He3XaF_3;H)Zsnr4s!cY-umFGB(;@l_^r@6d^xa{ znEHt$`+iaSs-+W!rV>p7++Nr1?n=Oh0q#YL54Gi5O%G<_?L%9fOC&`=_{Uv;ZO%tu{wFAdg=?a3=AVS1l_g*l~-XZB&-MN|A%-`TH^Ai7vB3dZAH<2kwc^#lHC zcyl8avuvBZf9g(Ys>ZDoNV)%pCxm@4anu^W8>xnCHu6LATz}Q1cxxEx^XP~B0)8b) z5}CEjsq7Y1hlikSi}uN7ST!t4q2<(R7W~>*fy72%-ni8*=XQ|hCMI1Za=#(qc){?*u#yxQcrShF(rRH6Z+8eF@4O5Y9_FT=E;|5 z77Bs^-n)qdkJ;?jZ&sJ=S9)y&u3c6-VV9WZK1gIrSDloM^QrkJH<+Tk-a%}~+I4~B8dGy1)!6moH$&I7Dlz&QQ zUTycXS#k#~Q zQdjRSR1;RW=2Pd9R@B{)5p%Wv|JaMVfG7YPi!;rV92~#!c|_Owo?p_Pc;)jgy4k2K z9!z*QzJ_>J_ss5R&o!>jsu@5oC`uw=w%ND?vt zK@67au&ey@S3J)UzfVDSic7XE$%@Q*aj3{`^g;(XKljVtOOyN;U8cV4enyHw@*^n} z+A44Dv8k`Qiz7bh*8o@WU?(YJ*7MKvx*|^;ov`B22LoIo5>@bhA`-=NQcFyUoJIqT zG)k!Og_TlsdX#osJt!H#yG_8JkCVuR@L_k_WmImw(%4iTj2s%wT^hTB@bX0BZ5|0{ zcaR#zrc{|^zA%JE(sRPk%67B3ACMDJf`1lnQ73^13p2E{baYAC#Olm8+_AG$Gc?Ku z!Gb;>J@E~6i>W0-sxDWV{SjhN1>kLF`01Y9;5Hh?$ST}K$rk2{(v}a!Svg$Z^()xN z*NWONG z;=(rP)bCCFEr%uQZ6B7jpPG1M5@tN6Q2l0&V5L4a8-Y9!myh8a?GvbV3`BhF6rX{j zhCFCKz4X0#!q;70+!fLQvq7nVHr4p{zM%G}|0@bfYqzZLJu3`fy3`FTL>`(`w+A9pI%wk>?kn=SdJzQJnP zvZ!xaH*dRQ&QvOiuf6EbxcCf0E1kR2sB8lw_Ybp=5Mp@m$E#r)n#>h6BPMf7IA=_@ z6J7=QQtx0M&Ey5#LIDbt*!i2bh)W6r7lm!Z{%2klBLl-R&PhCljHc<%Pmqp50WLy^ zn%OHv%O@Xb+asrUH1Wn@LAW9gjb_Wg<>#cOc8CHued9w_9jYs$2E+7TWJEnUl(GU+6)fU6XovD92 zZsnX7&!Zep!Tea)&1i>V4f?PfWWc5}78SURXjVVYTD${)CMy%9jC8E0RGt!{RUy}V zBqTQT0?ljbDKXC?({D$?ppCKbT1;B z-ijHvXj7krC=lkC(mn+_Q)4dWK?hZ%yBz8iBw8J1B$}M^u!^AL_cwC!XF{$&gjPMPFtv)h{GXN$ zi;p{+Ip0qgqQiQVy>wDucf3o=*{fEuGifNN*w52hlm=~2FgF-LYUG`&MSd+L{L>@= z+$y2_cBr4h8_A>YdKz5ekzD0!tG<2x1`7g^vwv$QLc$#*$Cch|#Nd3j7+E{y5~|4@ zU#H9$=5<})XE|FjnpXCq}aPji(naUuqTlm^_S#^8-O@rBc-*=#0`mYFs<52!qF2|Qf~Cs3I>wX;v0i*fG` zIe&xP4toxOyfeOpb;EF3p2RGBke*y2&5IEFjR=rtU!8h04_ zFT0s4a<5ClwYJx*0Fi)%#^|K!4Cd4;{xrzURB}0Cg|x_E{iZDIZaq2lhh3dPWsY&z z97DtJiE`jFnRxi~JqlEBu5!+vc~1dRFH1JAcRBeEmtmC$i>;!X!kcu8I`hx+l|!EU z;I3IY*O-nD`>2Zk=Kt@rsh}9;?1fMI0!!DwhMUR;;Vseo9t`8B zJA_SKO>1YcYKjNW{8UPTAqnD#W~6xX;%B97LJa|R8o$*XzlF}Ar}E)agYFpnn{odS? zGa*JGF9(OBFVS~COOr)u;aeg8ApZp+t0K~!8l^oX8sm4>`i!%P^Elv{1j48MO5MrT zx;KV!x2B4|;3@L&9;Y@JLeXAs-)YYh-yb7Un()8K1jBUwtC%CK7;E9Nm`Pq-oe9mT|)QarQX$1mbiqMTEt;Nb3~ z1YTe_Oq^xR&T}SFxb1N5nUwC<9dXVa{8CNoP4*Wh_=TygPSUDR=UVRT_rMewZpGAE z-?u)!&t^DI!Z<47$dX)x+y+Wa(RRs-Qde)G`ycYkK|`-{21iU*wFv873GDMuq>{J= z2TY>=jNF`%)=j$X^WS>zzTlK6fsry76l0Nm$FqP=6Map473?#dYe4d)g6xIXAVF^POk>lHRI! zYoUiS?j+<`Rl2VLV5fjr4h{ooqSSkxL)}Qt-g3gMaeu$+ozn8Z-FKm87TZ70orCUU zFu|TwFE{NlZWfb7VS)&)b_Yf4peiE2)PwaN!Qzf}0qh9GZV&D$pSqs|f zEU?ak(39Zjt&($ZvfV-$+!-vkv4*UiXx|^=g@u+ zbUb91{C$AWsUevYL-!XeKEgo_=8#(g-f8+l-VDZ zr>It2xpv-+C0~`9ee#d1NvMd-{-)WEUknfbJLb6`o@lOyXJpjCbq})r>K80%^Hdd% z?SKqrL>7a0RQSh{Ag0%9;$2-wuyX>qWvI>esh!(XM|V-A?znuPV6*^ZXz0!R6HHmB z@3aBepUxj0AA5c;iIVieRG`bFTx~sGTz*bh%PA4+G)DF@-&J!V@oU_j}sCARyD)tX;8>GA_5`oqWSx4F^7>~r#JdBrb zncGta0 z_@8N}ErrcMM7G!>K%5S80aU9!FrN-#B9z`J@%i#%eIqf*g^H(0i2s}kU`7gZUqnxI zEca1BtrS6XL&8uCIbl8MKrlzEgVD##Ue3^I5&HSLn2jOma3Cl-tE<@Q-CoAv88`)ac1{Xc*092EK}U%8I_2f zLF5^kO@{2D*%g5 zn4@%&nw|1wkq-)hstmAazRp?bu=!F;uPLP#65|+v)aM%9h%_3SVm`IkeJXHI4iaF8 z{p^lQopPEAA;ezzHq1$Vh>eygWa(4U-nb$wXho|b7hf^Bdg+GvbQrXe$R_EZQOx)m zlcySxm;W~>`CpdeD2imeyF`=zg8HNl?4S0{eB5`@2roc=8M~-hlMR<6KO5IaOM876 z7W@5YzYK|lJ98HSREm|iU1}>Hhf~z^NsJ4jFZTLlE)Sv&;em1jK%+?QF3g+Uswm;Y z1q}rpa^K?k4whs}I%#2?KjHXVebx(=0YV4?zmZc1>fowyvPqltr*mLAj5RpaJ4xvE zGIo|b#esnT746Zue1JC%_Vig!=}f1v9b}cx^+>4%ko5aMrM8s7Wjx(Q!|@>>8|~8y zG<@UJi2|M8n`8f#V@$Z=X16?&nmsK`YCco8PyG( z@^14cFZbBl^J^}#xOhIYY9czSAqIS#E3go7L9O669v}ffCaCd$7?LdgDT*P^kk1ze z==T8=8Dx}%Ws8zxMG@h~I^%H7aoT%GrpNC=h24-`WCCDkKIr2!xj+`M2z(QEs#^(4(bXP(-R5Z$X1)U|h8~%)_v7O`f z&E8(N*;_yECk_8(1xHB5B#S*t7>IL{K()EmY57 zCpxc!JeT^G`!1sj#;=#1nj^lix30^I@bj{1z`3q2O+9vPAk%K3z0V_;;e)1};XmYa z>gp7>Lcno)a5_A zyf`ec$bDZWe0TeTmL$qfaBk-ie%3#+M!#Fjj`T7+Gweh_;WxMr@hnF{;n3dnt6O|F zE3rul5Y$q(`PR5qcR#!BGwl~q?i$gVmPs8{)g+yu`4qFQhswoN-b^*W5Ncv{miohc zX_L)f$jMqtS&0s1@>AjF5NOpEfEZ#6$GsGAO2+eZY;t@9BE1^wPvsqatw=Y1=nTmq zJtwog*Yu~Q$=;JQOZ3!}@;s)qX{&=Yw!=pSBXiN6l$3Ej5V3!+hN}1#L246?4vHNu zDkmLYPq$}-19ZlXia@s5aSoINTGZJ)$cRgC3JkI!EFIXJLdO*bT?kw9el1GI95RBX zY_DVpQE35Es5nja9uFmyKKbaAs#r^avt<=%14pMa3>X{Hj}I&ioA{2ZKrlt3w@PuW zpZ}!HKW`}o_RlOB0Fw@O1;-7gsEZ7}fidm!Ojsc{s8*J2z*7h=lptWp)6(jhG*92| z#Xh$_Z`CzrF+?%Eo$df*aycmfn5GnIDlxZ-z^Nv(GP1{P`zgR6ObUZME;`%P%@TLf z5i++h7IR&4XM2uTA1#|EX=|4A6fZ=ie`dy1lYRG?fDqK5mLDw>C_^W%fN_C(5g5Q8 zy}RT^e@vIxXH!IY^tkf8fD&usx9yNWfhOA{wC93otRZyiHu zIRc?iDA}dJX|0R#;}~~aDqY>{X5f^X--JK@3VHJY(JE$;AR3DL;UA$K_Ju=;FUq#&{D&=;A|c)vdQ4Ix^kiU)vVe`v{(sw|ZpwMH4 z$b@D^iF=vZKCSCR5&2dA?k~vN{g4u}RwCTzukN9-_uN5O;A|3`?k@T!?2xKHI_`YZ z!WEmSUZO<-{?^8utwD6XZO$NmfW=wd?(N|U$+0~!ji9K}hLz9s6ZQD}!k)|KU-c!DFgO&Zy@DJVbU?dywZX2w zrX7H~ZiLO0Le56%!trlIp#V6D?6$0$A8gCCU*j8kY_g>^*QqQcFt)?C?-EsPmQ)rQ z`34-HL23U2(98dCe*4!m^MfF3#Iu~)mBk|C62V~gCYmx(eY$3&96L=v&*ola9Uv&s z-GVt!^|D91jS&>&rNBAZt_nBh{b_)CZEi8l3uHz`tg8rFsAQp(u=bN87XcXO00tKd zx{2j&>GA4;UaDtk*j$$NDa5B!lk^PkM z4Gg_RzYWQEpz#!v+mrY%79pr(M<>$>y!W9vBy?S|2pvDC!glaiHW|RK5fkCxZJK9A z{UCBi3L3&}?dj$aoxYqY9_aJz_baI<^3i$f_-F4bVk+t`-Y6JhwU!cLYRg7ruRao0 zk%>e)XD8b&7OWw=K8*-47&AFwuz{=9ojM!BfOeyyXB8jA_R9QFe-j%;A;R1^+t^Xe zn(cUNKCdf^#`?;9=OG}QrN;?-+LNG<@)2&3gJrHFv`(UTY#DzpPY8U1|3hzwNnw(n zYw#5+20vhKb7S`~$B*`&A ze&NVN!jpsIlp>PFjIs1q>RiLXCt-a2_7?jr?|tIzyx-<+an{zI@Gep4n%I!B0j$%R z@s`9-Z4nw^Crvyy-@3tZjNs;Kv5wWn@qYU5!}Y6g<3*_*k9*Sf97ng2zqu&TlNLO9 zTfLs64$Of!_Q8X1Bit8Z_BL0!p@bj};62Aq(-l9KUu%b}c4@IWK}-*!6SHoD`L zL=cl|JkeYVE3&T&8Qj^aNNHU=xd+)089lX=uJ-msWbvB^d8Qo@s#hP#8U3MjHctQ` z=xeo`9D*rSfEsj(yO@tA$TMCD%KKm~rm>_;)e6r+L+C)ZSOY-QZ&KuW$>zSFCr5`p z_&5+uWQC{PtrY=2U=#=p4)>Rykl-_Mru+Ux z5VyEUJef>@`qvHL4An!Pm1iMU6jFqDW2tK+#oKBYIj;JHEn57+GTW)4=qRs=4iQitIrdE_4oga5AV9* zoj>)WcJ>F5#*dpWt$G)n*7OVv+RRmqnFunfnkI$z%^um3H>~}S}xrt zVS{pRoo`l>Q{2??I6`QUi3x$qE=O2KDL{pK2XObykAtw#LIp2xp?(~bEqZvFPaOqy z(PD&*+PouaL@nBVCn^Z50hygj_-Dr1mZ>GpGAZT-b1jc~rDrOF^pMxGhPc8$`obK9D6LDNeLvmZe$I zETiGH7mS4=CTx@Ujf5{Bv3LfYl8jRY33W^*XXUlGFFfvMsmg>`dA=!UniG3(^{+$# zBf<3QzId!n_&LPhNIcK;BFAet&Zo_W$FRBsw#!1Z$RZYXKhnOVQS?3Els_0z&RuAh zE5t-T?}|Y2i~hY32ymV)Ux{QM5}RS-C7yWMuF=PTS9Rc0GWUa)Ph1^}sz`N^cg#~+ zDhh;Kw$}-z5(xPPA^hLKYov+vqV2ml8BeDU$DBmjhmTugB&D7LEP_1HqxPq06P%0< z0KLNj6a;oqWPMzaBU&B%-UNcdw3We}3g4six+Yf*78ant-rGwx^{X1A1QT1QWuARq zR3rkzzIW-%6Mi2Ye{(j1eMOMU5ka7C%_hG|xHYBY@J6!=~5@-}X zIdkD`j)ls*k#gtD_J=lF5}BGh78Mbru8kzs<|6d9gA*uR2588{GJl+FisuhP6e=1z zk4Smfd3fdQ<>-LfipAMuR$H2F78c=zPGY7_oX3#gD*^Bz4mB{e-n{ku4(+ zvf^*}&WBgk(=2aJWJ9IZZg)L|SnMEB+^F}MJ4}PwcrsESQhqcte6uN9mLIOfW^I5G?W%d(4HTE*%A6s(fjkqV=vTkgG(%w;v{+BRO!%I>6^yB zfIkX`d~u>y>DUn7b^U>C&dz{7?Ln=M=2ih_9`maciHvrIq5Mi+k!3ktBg4ue5IquD zk0;QYXIO1q02=ZXacFpl{?$l?HvpDP$6SIRg?-NbQ;|K4MQ2)@<1rs*y|p1H?o9Si zy9`2vS9074K1QvKARw{POO|{nSU&q>5_-J|rX)kO;uI;)6u;Mp8w=?k#Dx7OOLu0& z&eO5{!56#Od;$|?xX-C!@~YmRj5#Ir#A8U}Vs(KPFDZh*dAzPzGXng3SMTrBhl+Qv zc?ntt*F@p?Cr$bu7= zq3z&fQ$>Mgm#O00{JZmrgTx}0lmXTZp7O4sIEe;d3$5gx8>k`vlIvPYl~+9SW0 z;V~dVX5?QnZ~>(=J+;V&(%JMyt~zJo&h3Y|>|6F#LsvgSn+am}G-t%PiC9_29X6)w zf&D+fnA6V!AF$3Dk&VpZLV1zu9m+z8CLQ{mC>bQe&xv|sctjz z+Mok!N4|G>qlz3;J8wQoiy$6j_@w1OK{{V_)nc96p$w(j3=XPup*B)<%Cx#%0y2u%*W8 zcP81EU)Ip>01o_G)QiTbBbtadZ^YnvW_17e_9~5_(Ap&hl_U}xj6-FedADF$Kuj|B zc<;D1(zoVfTXSE0M9jJ7EVDO0;^ZDzxsW^J4C(ftjXJ`YzRZ7Zp0Kr4S`z%8`^E#; z;*QM60h?M@ZOO;LCBA$(H-m~m^EKrS9wXe z!C6P`SB?&kUas)0&V3Z15Lio1**8Dy8|{5--<5K}LqKKY?8M?0xb!TY$GJEzjT|f5 zc@U&k|DbAaYgrSw>!B5D9!e~~lZB+e@U7JJ)!Dpot4hGh_OnLJJ#ulVXM=?~6DQUy z7u2xj?)=3eH$Xr97lUENXhyL~>#H1WE4G~07<6G{6bZ5NGe_9)pEN;zNkyt$qY_I> zmWo73MQZwpZdx4wK%Lc5{MXL_j1H)X33!sNnLp@EDxk6MO=w_@(sqpg@r2;Gk98?x3~GwjE1|=^PIi zoiRVvaFs8oWr!rQ+fgUG;7`csz<*jm|4mO z;CAxJ!lD+2tEQ)trX8CKFb>1SB?gMDe@3#D->g!caQIO?Ct{W?sDP4~li*msr{zfo z5C2;V^wZyDvcrD#&K>od*=+6{FEe{9;XlxE!hu)*zUmuoL0m3YjBw$uv&%jx|D?bB zQoQax$HgbdA(M^iEf;&7>fo==oGg3B;C^YAdn-#McWf5=An!g~Llb9Wwjc%fc|(J1 zX2<;!T6CjKJRE$d6mN&?$=ncHqSSygQh7;9XOSr~*pIGyGdZ}578_-2Ge>=+=(o^& zs=1rd0iqyNJn-LUV{oqTs+9)0U*D82j$Z-vr<`TtT(@k4s*?gi(ck$zv+&QL)mez_ z3SYQCDWJ^cD91(lGm|O01x48}e{>@@$2Dg}+mx5KwsPu5H)eOwUcXvC5H>uWBYN?1uF-ovhmX37<=syJW6Qpb;Yzmn{tcvL>)o| z=I4f`aE-|Nkke0;n9JF=uPh66+^JLg8U2d>;*C~6sqO?;>^++bBwzfTix6mJc8oPY zAzOCF!^WXdo*+@6V5@T4{3HlU6Bt;4^^#M%)JcRt^NrPpquSdpbvFrEXR+R+{C5N~ z&=UHyF04W@ySXb91MP7e)&jV;(eO_v{HlA4B0KM-9DC&iI{f6xR%>XR#=3{_4a}L; zv@l_lAL^3Dd_}nmDK6~gSzKSdUCtf5FPkOUE&#$?v1eSh%jiyX=uLH>M0AHxI`V{8 z&S`0vc~BTCuUy#1IQ*zM?C|C8IooGoBXwU4W#YWGpu9=`;y63dCr4(Kif&yHF_wl! zWY(|uGPbSQ8K+6*jz8=Am7a_i$R`d7Ib!FGdDZ|~%gfGC%tb zIQ|j>J!$&1`7t;V{apV0@n241NIsiyIsWdUkbWN43wO4pMu=vA&p=7k)5Nt+Th=9gAvu94z0YTi~(gR4gmB@2!<7WLg_J|(B5triSuDebv zL>|x6@-ZJwD?8G@APBejKC3Ut*Q7w*oq`BG0ui&oAT~wzJ%wD+pY^%*wqqu#7|L#d zaYS|F7UKK*S?lO6h0z$8M1Eao`VUD)=}8bZ;}=}$<@7h^D7{wy4;qlJy%iGX9D{-e zLe?l8hr|>*bPx8C?Q)M(kjc1*Dv0N&RhQsyFx$d$>?oaN|AC3xw z@~zTAougso*2QydDVD+zWqg6(pQrHj({hi)mdY%!Hm5Mt4pxR+qpKcMLRrf)f-5ek z%#uPtNz#=964kEEtdr0*&;79p?)p>Z$Y4zLkWT?WXRN`&Q7`!Sb#hL6gEZ&#=x@b2yHp31q(z+nMrx#EXBLde|dPvTO_d3N96@79sM51Pis=H zmV+JsEpXVJ)dS5FbR74Higw(!eOYBROK!T7uXtNpQDKZ-PS_+=u-aVwTiKEbz`w%+Qa?GX3cGJ zfU7P5Uucx@(`#_psdzB`DeSwXIyrJ{=NkWuH7>P^hc{)Hs-a_^V#~OsXAO84vBLiG zU6zu!Svvtgq9`}_-aaGT%+sB5-Y{M1F;cNB@F@L|o~!Xpk!ve){>Q zx!-Mx)x}RbpuuKZX>x$F3R*}1g4$__hhsJ&Ey`R=i^3F!*so(qO##G@EWmz@4-9zx zn^ps!7xD#OTN!r8DD(|^fYg9VPe-8tFn$BtM%iWq)uvY$E9vF4cYpb(pdaGhPYm(c zy}xu>`rM#m+4F;%icTK1bn&7jm4(pTJc!XA?iG>mcN7q9GaeXnCK{mwdq{^6jPoXv%K`q8S;!^Yp z&f1jyHlYp*6nJ|Yr8zzdWQEv^>XqMdIH~aXMLunO6~Kl>LG3rH!utY4UE40-BVG2| zcStnQ5RS{|9=SRS^bTK4xl{UK-q(U&B9-seOWo|kMCJWRxWr#a=I%QE*k-VfcpITH z;*i3fyd&tl@3iNEzKvLr`5e~krfoO-?u#OsQoPCC*W-ihc!6uBmL{4_c&x)vTD`fd zDq7!_`w_l>?EC(qyGzojuDk!ETYD-wj5Kvx%V{0v^HvDY)UyTyTIZeAvch2s-H#fT zg2Tx92UajF6gV->Bb>@k3X7)c z>!TVxt~%dVCtW3iwg^{^{h zyGHUyMVgr8-+lo4Wx#ixA=zR*tBT|xZHP!~CKu5aU`K)QODPWX)dbn(NY_=Uc&S2b z`!rC;u>Hs;U%xeocRZOGI`ju@JqSt-Ns5mU73Er_ahW-3e`mulI9%2&w-7hsQpe-S zvq)AW{qKeNhf{lxkEr2UKbp^CUYSnGV=J=WY!)p~31ih@vlfoaaE4LK!BI6)?5e8b zA0xq|hg|b?r7_Tczo6|}_kVnJwn8FU;s4577nfxFDk|sz&hBLw@`BR(o2Y?+2>tum z0>Z|p+*nz?b2jwFI}G5f`0CwpdwVTi#}5g(x~OX3qSaUrIO(Ex=ysCHE@*V*S;_xMgmSgR4nzsO6t@@=u9)grYej&9@PFQ)MT)Q%P8 z*6S3|khOI_q9>JE*VoK=oO_frlS9zwOyRfRJ{Wsim&|fhkk)O;m8)zq5I0HQ`(gyS ze}-z)$q>u0`adryD3Q84%3{2l+agn^Vie{kGo9dC1f(HehHUx7fP_$5PW$YqZ2-A< zV7HKeUsjL9ad*J*t9Q9UPsN9)xkhKqjwsZz$$>OLCRuhU_ zqm<7@G0Yd-TTAs8s}=YAwJBQjT!bfSUgk7;;81#O2&p*jcH|!H*Gv~4fBn}{!8qU= znvw{61?COiki4#P+f0=zlaUmndxT3D5lW&dT1Ba~>N%O) z*)|c&PyCFOVK~%T{}JrcN46gYDcC{-pfGr)=+ovdw@p@E z#)y(v2j=PV&R0;#kyhc5oW)e+JpC3bBDI6Gv$B@WL<%uP6)W1`quf$T#;wL zNL>u}(#_Out#4anr%@%G%Vjbb<*9#C?GP$pM<1{(9mB?(g$$EhZnG$kJXI@KxED;C zZbm-zJRjFhxYPC*Ck?91Kh4d(yCcxKJ7D76@WrGvpgb}4Fu;yl$t10#yzY(vbmspR zReSxe{YX>TcWfIzH?Ka7odzv7*IDKN*wVEPJQ^nYBetn06I$(_^P~AI`_GFmA2{U^ zut07brr4#dFmGI%blh>FwMQD0%`E9ph7nF=o|D?-)`E8Yy)ImVcKbhgP3B7|((%+u zKdt|sDwxNq`?(JTSYX5wBCLXN(&690;K9brHc*TgS$zzupw^kKc z+{=Tzu12}snaWQ0fpi^KA&zU0#o#Hy0&n5Au>ZQf^eXY=--#gEt z4)Eyda%=_E;;@g^smAgc`OR4`j3lK|=P#eu2&IEzli9H`$4^?4=UE*h zRWlS+s?ts*RN;A$xKAdKNK%pC+*Y=INzfuxQ1f{aU$M}}pb(>(XZxC9cLg@8H78RR zmS9CE3oT#;-X{;ION=1EFi27j99h-=J^W}i z928sqgGVd;g=GRGK9G_jiWpfOTAXSsPVNZy_LeVL?JO;5XusU*x;zIo&P4rhpO?{n zKiK851yQYa&58T$N?M+HBUmz7r8_r*sIIw4{DZl1b(728ukMV5Gs#dX?&ik6-K|U0 zWiWIYTpgWphXnX8y{rG7#&+m{kw&gIvc}aku`*Vj!IMu;n{-w^{aP~M>H(%P!3K%e zf{MYC-bdGVu2#KN&c{HBA>my*XtP@Avd4)g%x#uyrgnF349@^=C*!%pU~i_@eD)WgXu?*-`_$<=oM}quOPOhnM%BsFx_Kl}N%LD%`;> zkn#}fTmBLSRoAoE=ZHW?Tya2&nIyV6l~8$@fZAw+p7HkGd6_ji<0ROQB&W`^f$Ns4 zL+hF};ObnnFJ2H<#yn59Mo^OqTlpU?fcSw7?1!bF!Hp~eB-Y4>T#8E`Kz}kadd6J!-l_51Thf|s_0{_CfWgePPV$S+}*3f@clx&R;Z*9 z-NCuCL;udZQ3n@YI&l+%7E^s3RM*{*r|yp68}Tsq{uCx|i$syZ6&C2hw!(C>3%IMP z)=Y(eO!U&cedkr+Y1DzA687lM=Na?dJ_N~x*pAxA%>WqV!GZsdac-uUK1qa4?O}{_ z6wn!Sx2>lEscn8eVtBn3;L@7AN9MoH{oRxfy3DFTy;V&i*?mI34R=x^a2#MrmQ*L7 zeSPCZc4nRKAV@QfMiIZkoxfnx!*wNe*NlBJn7EQamJQaRS}=&7Zz!br=ScrLSWh>2 z|5;ut)LnYfJvKYbZ-mm%Kj+zE9h=zX+_-`VoujT6s19uhEqGoqI-g;s zH3a{s21_dwc%e&+lu>m5*+GcX*?cw69S}O*{RaEiO0hnbJC+aS(GZ%3yIK-xPGN0A zjKYtzVbC2-X{MEP1UVgE1d4b)fS(?S?k+bjfZBgD1Au^^CTznfvszhh=U-oRmflUH zviTijGvvWU`k2UyBA+g-1d|4-6Hif}K8L6-{KHk*CqdXxs`pdVpL$!NS?KZevC2y4 zZP2T09K_GWmM%)GX2|m|9m568P6WsQGG6i5$pgO^Xp73()F3SSlLA|KB1GW@&{qT<Y}&;@nItSPdwX0()~Ew376dR_86R_uXB`wQynd6BY);3vqhF89m{k) zO^t8{h8$q@FYyU0l@#w$2prDWH-XqgofFP;^`v$>qdBq#Z@t^cR?iQacYh+MFG84* zeubECsCvc}mHeMs1@h*{KNl>M$sa~YN`~wtSTC|T(Ep{hsmYvEo(pxSqA?>Gr{sNVm7NEo<0qE!%zk&@ z((nz4@3Pr{j>zP`?ivh?JR$pst>N8n?rbS_kIh(@!&EsxRF0s%Pm_X&RjEd9 zisyIlqAHF*D_v>tNl2ycc;QHNHl6$PiJfp%CyJ^#m&%RYNi%GQ8)PKUw8 z=P%BwNKjN_hn6^4!emj3jfgs>DEcQ%_XQv6F&UK2cYi!!ePQoqrAc6>qi3RwGh9gq zUB(jq=7Ud0$auxACAjkxm@QeGA`7Dluh&!!))I1th}lD6H_k!ek*8QX`u*>?M<)II z7FPWqG7#}k8-_eVd^DuSwrOcX{uAcx(*~XRRb>sURdJhx(;0HwGTtKGSq2v|VN-Ax z_873KrCw3rL*rfeXM4|mtOzXX=Djz;ZMh*+eW)-p=BkK$zNgq6Tp(|UxAZuP~7{(O#KQvNM8|L<)Xu)rYuOuq1yrAzcLhn}^~f%SP444WL{@s2LKcFB}= zVfcwaeQ^uf^f8K9hGv_Q5!S<>XugDZnc!e{zkvv`Gx8d&6K%EmKfKx7623i@jOn`h ze~i5aP*rXBJ}ht$jz~+Vw313ncY}0yhjfF)k&+JS4(aX=X+gR>j&ye(_#b?J@B2Rb zJm1VW_albVBsy2D1?Uz76vZ zXvjPnM8#BMKSJBSInI3CD<7QTv+L7Y5lX$3GYy~W*RGbC;t5+jvu$-4+8gn$sv0$9 z;*8=Xz;@K?T~q|`Wm*QXcd@JMnQ_$~-2pnMz()x)e$C)+FFw~{JD? z&z=m1p|2eqeKE*DK1Ai;Wuu*oN3Oj$~$;@B^JRGsO#;bh?7v7*22 znFCai(-X3>&|Zr+HgS$AEcqX>V7nOa%W;xOF8Xe3iUr`G(q3bt&BGw0Jvp5;sFD{Vx^VD!oZ;nu6( z<2>h}#dD=?2NCS$5(Nq141zKI``6ySW%B-5kZMMNI;`sOYD zKBqUO&%b%UW@$mN!>-43#blcZQAM4AfH0oujG7KgX!x%^Ki;g=V5;?kVo}RyO2J0u z8H(A?N#q_BV(6adc)8&xTj}rLL|2XA9Ty3(c>OEww^uZSv-bVc$0K)AI@MKIN!+6y z=Cu_Vg)n9ISnHgmusBXMHuN%aPPqfqo%TJRjrC6faL*YS1;}EhgULgHy*>i(-oRp8 zD~4R;Z+}Dy^5hcV8@G=(UKdHNDiBm>*u_U5VPr?l{3Uw|nud;~N@$0}v=wHh8^EF< zq}B>7)rUoW(FE0)eDZ9a(~lEcgvABPv`ODu5<}Pmn{q^M9bNOMoRj6sP$EO0Xl}{K7cOLVTW*ns9GM7d_#M-lyJ4zh2*s@LEud zTCP3}!GT|!qQw*2+x=qS3Y=Np)W6X!19mf##VGGX$+Mkhjp_V`SQC{Ph3by2gIS>B zDc4^`wnS+{>->|EW-nMh?m)(?5oZN3r^R^hjIqtGfXF0A%Rs(aaoHG|krig&KE0-Am z503ip8(l`VucG0Ypxl@zo|u+tS~L$@G$uLWZ34AlLyq9r6p8xz7^Ma7-KdKH2@AT0 z0Sc$DT2(LELgLw@C*}Q}4kQJsOvY>+bG6?2X!curDq}=f@a}2B?qqkpwe5L+TX_3~ z9a|@Gc(olDmxfwY&&+0tXAVDz;zz8@$l#Z|hilp0pp0_(^n^b!I83i2T%nA1R!wQ{ zWQH(@3Un)^_eu&`j{&n6@bPOS7Y56XoqKxMz3_mELQoKm=@~-i2;)RegGed<2U6rY zbG5_StcHKSC-l^JEdlhnW_L4-?{TY$ztf_WK7UQ(zN5X3vD3RMFVBS$J)ngY7S*T` zPP3Wb-qL2jFWef}_T@k{!O~>;ejMjZpP6aQ&U3CI=_Gt(iiFtMieE4*2N)1Kr%PUX zaYU2@FEAntF$4v!{zS!t5Y$@&B zD(TAOq?>sm47Ol1V3jrfY(TI4MPUj0(f%#s;a|DJ40l;6|Iw}gZX8f>k5(X$%}IU^ zXl&)Kbn@vOOO|^lA2_81r+vhL404koM{l5@p_UM_36ICI6M`*^YNrBu2FD5#@d^#H zUg%yG8>f$&C-S=vZrW1jr!`zVAyDWc#m#t{365g6b6AwW@ z$D%(Mvc@>@>wy_ht_Ixi(w-bf`-b-vrkj(u5%8`Ni(DUH6Hu?$^J#?B-O1HPGk}$6 z@)n7o|GuSd`GCbZS?!gw#;d?tU!LJLKwaYqyfmWYt@Sw7*?{R{<=Jv-J;os?+gz1c zNBVKQP z27Y@XC);^ziyT4;^A4(<0;S(l3+ZXeX74i?*o-nNO)Er%#W@)y0!qq0vC+g&6J>e+ zTNvsC&>?~0q6n@Xiw)ZLGQaK_4*k?;)8Mks?)s7Cf@|y9Y7p(7kio3ILo2X;b#t4g z$PDkKj^tgWP=s@NaqiA=k>O??##|2!25L4UtTyI{utyfmsX&H2-zGMdUvs2ztLG_# zccGVm*(Ow6j;2$Tpy+vtjsk*=8waA%!h>%gmyuW@&B@E#3+jn=PZyIUax;e_lK2ZB ztV6tE7}DQK5F9A5=0wyE95bgsx`b!;(9(nbY3Q)?%ZuznD%D9FS%YPd+Pc!_F13Q1 zMro2m9}|eb#Up>+>mY!3oSH9jJc_7-jhfF++~H^86;}D;&V*g4;f7@%3CS;AIisSMVc0S=N2^D+ND=C zTKyAOKQXQ1B0d`9Wg>qS8-;G~WdGW|n^c^8OM$apOaI7pWJb`9^%NB{+CKR~EpVE) z*hmY0D-@xBazc8*X+I~{6sjCgEt-Kh$LQ{1>y*JWWch}}%_$rI##^d5c~!n5ut62` zESDtcv1au5YTsY??UodJftQOdlWZ1ZH>uQ1B#gpQVh~Ez?B|*aavm=6U180LJ$v~% z+;o6ejMn`_jwqWeZ+8t$x=PZ+WR!K>vJOlB~OFM~h+uIw+8Z={6xMo!-ms+Hkc3$Yyi?Ixoo&1<0s-5=wN~bZ9Ra+OKCJLNE zgx@R1#>z!pO=$4*9OUG&8>Lqa?DpI;-4XYH9`rt;P8aiM6dE7Hd5Co>vzIFSG>och zXl{SV9%&}3BuZB%J@cxX`eUwrzz78rdc2Uu4QOdn-MR@4$8HpmTZ6d;yXALMKk1HSJZN-zO1oP09F2nF}Rx8 z2@m>M|F)P#O*5!{5$28KU8&0qF*+Z16xf$(@rTf4PGQ@i zIMblQf!bUibU9AQhL>G48Og zhLkk~sp9}A*TkOk<3HUBG~?`C?fk(T7x%gR8=X-mn03am@_YI6zTRqzk8Alz*d%Wi zKD6TDRTTv5>-2t^I_zRE(<#O@WaDqNrT^~RdrH{O&-Pz*&zP^9C)>`#Z#CEh2EH3S z*$cosS*Hs4h9X;Nw@zy&P6ucBl|U7kGl(-u4rKpLZ>rPY%Tu3x7Jv@8Du)sc9;Eak_q z^r)%oUgG>yueg*h0-t1fO$`k=(VkcFX19Ke9TH?b4t1qcj~TvB42KDawv1jOW~8ga zPUM;>+<2n9s1#k!yQ>Jej2g9|?mpwh$f!})q?8h+R^=?qYJ@7hsyrSVz=Dfo3p z%8y92m^t%(VK4gTa~bl9HojJJt^Ta&BeY_}t@HDmUcaOfG}YP#DCo5VmfN1R)E`L8 zCxJ6xmmd(zloAv8IXpOi??y=cO-D_nI#8ROlHUp8P^dvSNv$8-3ms~0?boCueS&3h z8!B9-nMK_+wX#3Cz8vy|M>_r}OX*A{g$^Oe<-7z)W0y_e4uwo#9MxW7dyj^E9BDZ% zK*|qPU6@vPT-*Of;{T@~YWJkjJ62cu5R@$N(V}ACETvEk(h8U~8I}$edidCgU!+|o zRV0EV3@$aaktg{fH&lKoGO>%U$?|UrM#eSXmrvh1XkWY;(prmRN(((A*|7imp)lS# z!rUgc&riU10#rU*Vzr*xt8AwRg^nd$pP2-_tnfO1gHXT1|4totYUUhBox`Kyr%ZX* znc;*jByF)NE{M&{irCOWTX*cYvRp*5mk2*sC)CaGoCPllnr%G>j~v*rQd-7udEGqQ zSf&T>mLQ7n^Xt3=O%FD@SDL%dzk}U#U~)&qd9BZG0`hnRhCxs^Lj`6Z2OJ@JPC7dt zi^|f)97>Uz#CFU9o+=@^mswp-D#@NQ{JD;3Bn9LC341usylCG>qD9z;@^9B@odN? zkmtY@wte#X@|oxl$JGv@_NiBzu?0*es|Oh_e)-1W;K>m?`^63~Z{M&mgKkVmS7h%c z@pD=d&1ReCG;!Jx-+c?N0Ky=hx@*ZcG9|su0j8d=K|#<4&J|+=Ag-Kjnh#a0M~btCLh!0yd{9LK z3`3ow48?)Xd6ETPr7w2yjmKCq^4r21ukoeB79Xz1T+lWhSWL}be_5dR=3SS96(S-7hdb zInFR$UN2%cgiYc7Yrh;n>;oI zadp{|oo`hl4p2^??G*6m`H%IA$63yx=4AZKuRM|7#tPZ+rNd`^p|C#xJV=?~T&o}M$=y+l%hCe3g zoz{wmY7E0(&4|~`x-Ggl-}?==tAsR6P%f%uqQnLcomW4*5=2y$Lx`17o_ON#^@c(` zR^Pq{26~WFz#zq&_W<)cF;;js{Kvf$*s4{CcEwq&gAHR>S$rNlRyigCxocs)>)YJPSf+?uW`76|N#?E;6^ zpv#qFXPfWa-aVar)gNg*TL?!P-y+b~+}2R~XOZX^E*==iPmCc@LAI*YJ6&XCu)B(; z;Vi!|*fgGcA4PYvbY^)#wsR=)DVAoDb~{0ngmF8bXzd`8BC@~EIhw`)IdAxftQ(%j z@_w@PhralAc(X5G3o!Qru`h(EJG+YHCW-IdMvkJ?fHRpqPoWG-TUkVw-QAXiV$jy4 zHKP++gROD(1hAux_5P5LTNt9c&Q&Uscw&p@Q?g`!7cjFliG3MDBY}yxw6nCvXcV=4 zGkkarv5ILDi4RGAK!Ze3Y?-wW8)eqX4~dK)0-paKw?X4?$V-eca$YwJs<{U?RcPQk z16Nie4ACp%3F+#bipg=bC)K{`Sl(g zgMhu8){g|KPmqM{$0<|4W5D=k;zr|ic0F4=dySC!vO#ZUV+Q#Aa`@@0Si{+^y`60a zB+=*OD`R+sVI<)D%8 zUpe)-7ZZXwKiyEOuvCbn-Aq`|h+YfkXH!Lg6MYdlZRnROw)Hc2)%@RCW-N_NU@u^3&ZKGsq_s<2J_qWpQ7Hj`r)q+ zC5s+1dhWFdsADIbun9V3J^NjR4a(9Yv;8~_t%FAwAL{OVBr^~j1R0Ig|;NaYV^CKU-_LEzsI;5~7t~ zA?s-NY7lN9*ACA>SsW4fhd2-Xm|eA~g&F(8rR{Bj_T~gM$*-uqgyd@no6Tm7pALkp zJl42|I6y&jin~RSX6R_T-L^Ty-LLR7#$^+V^bZh{kL$A}2vInEr-8@v6S~3i3${dC zTCsM^K~!5#fL)4P`_yt*^z}Uq{)cwgJD!}^Z32ex0-)Y;S(8g}u?#XgpVpWl(n`B5 zBZg9zZiVc8Pe7%tGg7x@2$Yr|=K3Q)U%5vc0eYU?;APrm{$yfE9%w$t9fm*KfZI_d zaB7~mBA5MP4#}SZN~Nd?Kky`ejU%H&`U4^O<$)cf`Ke0-+voWh!QF4DN-uFysS>w@ zm9@3}u~;NgqF@tju@yB%Vx}vP(XIN+be4PCS;1CZu7U)XRI%MSY8L}2%CRLqxW$sO z(p_@Oi;{SnuXH_T2ry))f(F)c*(q!l0R3&KvKvt0U5z<%lLMDjk!>oC4}Ps#4p%}B zR3^VRM2ZD0Lj5q+$4(*uKw}}^=0Xw7k#=HXJV9 zVhEKfh+6+-85vyYdBF+;=?6Aej@Wx9TxDNEsu%K{*3d%S{|L2yCH&k!04GOaRskir zr*FbGlzK-=ptI67FvFG;mtSj+L{@f4%vKo>3|>=3PL?W&XwR$7i&)m&J$N0^UUwIJ zaTSX|A)*eo4+syv<*LD#Y=JWamy!#Q=jMCBglzJ$Z_;_hSP(pEwq2}K&Rp5RKJ_6# zAHjnd_X$U2S9pe9M8yrSmS%LtTX8MRLI320->Rj+wLuc}EpLk` zM^$~^E06qrT^UBB8%lSfI9dUk@x94j=I9h=#Rf@^b0$%cP2Y@|ZV?%JDRXjU7|=c>V9ayT1di z{II?JE4GkCPI@fRQ3t;oNbT1feYkj%c_lqGxK~X0jpS9;3p!UL?R? znt>OVf*f0<-vDN{E3hCa_XDIT-Cn|lIIjkWtvkNJlqp$XN_2*qT2M()cRIA@lN2S- z;2{EyFY-R~M<#Oe?zHqP%L-q}OBSxe%9o7K0Jg&5;G2FAk{(?Ubo*QareOT|F1aS{ zjL`Wx_LJE@bMt!t1lM3*Te+osQbU2hFS=(6xw|@v5K*Oz z)f!}=m_f!d!y4Jy%zn&?ps7$``b)zc!+G`d2k+JIWqIit&A}zp96p@-#>Jm^5t^T4 z?bxCAyOU&b0|1};JWk8}(a$^<%08aJp6!^#M*!?zj>(7tAz}V3v0}INE#au&-u&TD z+TWm$z-N<+f-PXrYVnGY%TcJNY3go^@{ttva=;Qnb#@7Q{h8dIA+~o|;D+h+5Y@l2 zcK;LH521m)zSwGIiTC4NQl`6%Vm;`(xUw)}e%I06G~O$2`RD)?7i^`TY-v$#sseJ4 z@W+J$a%n;s^hq1}iuFF&8(YS_`H)&D1k6L-aqTJ!3^jiwtaTxNfUSr#O9$?=tSwWn z?d`gM#nQCO)7D|tSl(?Oz}t7BJB5m;_X#62ihnS;g@06aZGS}-X}ABZKAdRfCPx>O zIc)1WMS{eVd6wPgd=7}sLAn6VC=yV^gp|!`fSiIjc*{yENBjh|%F9(IJYR;VI^#<> z$_qDl{_+B&ADg+-ee2Et^}PI!KXM!b=tMiP!9PQLk2C|1Phr=6o*}>Rvvvv3nycYM zOYe&>?wjvOR>Xn_Z!t{CQJGsL#2tTyE>ftO!HVep+P0~duRZ%guTwy(NTX54pp5jL ziE+XV@?VmbeFrP3C14s$(i_#D<(pzELhnv*_Jy#OFBCiH@Z*tr_9Vge!7Ci=DVTj% zp0YpDZv&K|4DW5ELz#KtetTKvu{d`Ck8VV=ItfK^`7q4W-))uS73};jVv-H;}1 z-xpD*?6%gH%G6HTt-LuKF(ug%uV&dRT^8pMvt~60a7)I8Xio&z>wi!J+qbDB1IzLo z_>EIG1O1<`j#nj#%?`~?XoOx;;nMF|MzR{oMR0!?U<3C%RcP$0ma&nT9mCVfI{IW% zJCwyu8O`TZ!OTB2I)QCrUkAWI3;BHJ(qLle{ufkh43orNhif|+hG zH=T?L4ezMeLYN#01=mZVUT))=ygsJcJy&>?;3h@<;hwiYC0%4>>*bJb-($(AC^RDn z^2&1#ICQf8)q3>T#{S#{(}+6;~Y0`&jaLxOS>zy&!Mu<(PQ)N6-DLcf(KYc z$&iJp(C6}9^XnqE+ADLwr?=~Om~u`1E_;0Iu{hV2w;NxqFlHM~s95{6MJ5RaF2!{j z@40XI{Gb^{IaP+;6THi))8D0(jIIcbq(|3Qj;^m8o$HcUDCigL}4 z>6Ao?AUMQ6LcxYbOVbt+2-b0|uc%7ShG`#d7x0BHDN393ED@o|BrAoN(Z?TSp_8LZ z4WrV8Pm3M=8jS#SMt&9iLLX+K{fN{OdWPZ+@oIq=J0rY23ac$cTg$9Tdef|~TbGSg z4o(?G4B_Lz3!b#33Y)(G7F!MA2P#0r>r6+qDPyg}Tz8&bR9ms3`laioc%O*G#Mo)` z4Dl|z5NkioQI~l4N0$NshMsFdFiKd!ygaNq;+F}Ul705=DI27ZyVwZ}z~2wcNeq#p02 z6bSgKv=`dxYHj7RXZks>`&M!SMMt%(lojhA#R=$^&(L}BGaVN@zpS~=e|4WqtNs0y zUOh@S;$im~hP?Ubxg-NgIdX5b2y9>2oP|Md1y(JtD`#;6qLqoziqy5BdIS_N_d`@m z5kn?}*=KqV?5Xs*rpWRfDtEd5 zHM|Ni3D|z|WUW8A`xfJM$nHE_{|Mq;LJj(KgUI@MxRstkK$JSuV8=&DYXFSk zihvs_0PQJ{3PM0=n24%s;kB6w-Q4!7{K#!>SLvu1wMCZozoGNCr9hTl$JD3b^-$eL zKW(mWLx#8hxp#!x0&DR&*Ch|&)NOg%lX`9{PV0lW#oXv%3u*2=XHuvz$ZH{+E^Fuf zVS1PdEQyCbDf`bP9F^kFg&R^6g61^!yrZ7s-(#54ogvR4Ggk-G{{qX1RbV+`9C{)y zk8t@52TU^WeW8;tQ#GOD77uqV5B5;z;Tlc~KW9Y#iMXBxDe;r$^r@QeyuB$w4bNp{Px-#u)_3 z@ry-g_w=C}Y)<;b2u+#ARO_z!pDyN$^c+zyghCJAR-YM$-3EN1`yv$dFN9YF8GglJ zr)su76WCi1*1j@v+({8SdE7Vm$z^CsTe|9qf5Dpa`UbUQ4=;8~#H(Uv2 zN_x>5^wSGOF3#N(YBjR)8l^DpqAFUg_)zjDg6dc&%dW@rukc(0Xhw?mbsEK|7llfC zgrC#_Pqq1ZOBgMFKNBrNOKB$88jucHLqsLRuwr8X9S7(qv>=Ssg&rTQ2~rpaEED@jIzS^Oci zQZkIXnYo)G{EYM~p=Cn^)yk9gX0*O;)J>*iQZMvkx9;JJYr8r_OckA<10kk-c7FY% z%4%xGLwa-qm=R4@iNpfQ$wylP@x?|ozv8y`0Xe}Jj>bj(;Iv9@nKSoO&uKc9k@vl2 z*PV1CXZOB_4KM27Ed!>YeO;_2V@HbT_owqG-;VMz-RQV6M2RnPq+LQh!W>6u)=YH` zvXE%Wxav2BTXgkdwIZOv_HQNvEo(`SJ`7!5Swhhq-VJ=J7)hGb_9lY2YaMSSxOBVneH+eq4QW zsA3^@Hwj1_mBN1!4vqOK5c9dXvmr0F3y?-sOu91*0?@_z=pU#ObQ|h+R*K0qDmwYb zaDlSej0ppRa5g`%C|0Z<_vhn4jTLCsuL+VET5A@xp18iul*|_+8LCm8L9BSFnBJ zuN_5w1mynw)7~jas?_}wKr8EGjKDlJL zc$e3&T5reFIOKWse$NF~c%i+}xAZ-Bsz-i3_15Y)t93>N&ca_&-}iU<)ftyMckmLv z3;WXD6<|m-y_!IK%rSfQc1WnP;+x$cSqb#}wZl=B4<&8kK#8{HDVlO^(2l?UD-^@} zM2;AT>HGtnqM!|3y}eE8DR*J)3}QPNpyoM3_`t62OWBOqjP5PTp^W8$W%!xYtXd*h z2I#=|>ke;Th^SBJFvDOWV+uXPww4Xx&)#-2^F~Z~gAK#-odv6!j>*OTQ?|owfXaaC zjlRkHH_y_c0ztaTS-8eR6cARuOQz?HhIB6hv;frR9chp0-YN*W#o$>{aXK8`LyK)zKBOJ zo@FM&xs+m_28_Ft4V2K>yEKhc5MOU4FJaZnKO}tUb%KqMBZh^=M(Off4r+5>pI|hN z{;psI4^j0#seZ5%hGa@JWMO+X<;5p=O3G{>wOhFzWrEz#+l{ z`#p2&TFQL;raHbtNA4=z43R7bku66b=8!jspG2aG*Y8rClS`D69gsEj<0Fubs>$eG zMWlaxy(`&kwR7@pa`J@>Rme1gv?oSpi}?fzd|L~nvo}a>@pr?35-7M}!Y~K;P7AP& z>5SxWRy{uV1GlE%HyIO*MhuIUo^O@K=j3EmC2rXf5iRYuW&dKe{+@HW@&ke|Q8slh zkcbXnsu-1mSuts)vHWlFxZlv!z5R($(~4}ownA%S5KSB(L>zA=oaVaaEu`bpQ86nb z_}Ra+FHGUxDlP+A%%HSlXl8t0Y(U(?`w1BM3S%hgE(HKntW=!$jjy}9dN`D|f#`Ll zZSjNNqCRaSM!r@rUy39%$H)NhuWB`PkwQZR+{nUY0b@PRSwzUifOMxGNiFz5lt3MH zsDC&C1e6}(UhaOrb@2_iqR};&Dw3TPp0{yoBDP$6a}l4zWB5pl`>SH`x9etPJCm&S ziYgEnb@*0^I!gHf?T-4SPoJkq{=ws*Qynv0x!=`oX8j@slL=cT%7-LzvL{g3z?J9q z3vW_JBP)c5l{Cl~D1FkG6RKL_)RI;U;ejlu6;5}eAP71~tHh4xoZIQJfaNnW6$ ziGefkV%DopBW|}xb~3cNFQW7ze{{EJxuL8(n<6IApWiQjajjQFnk&6OqV^I4wX)A9 z;Ib(sf2qPIZDM56`H(d-C*2^Y+UHh2+Rj*B7E)YY7TxHB^JgE0Y`Bj|*;1CS7XgyQ zYVqfX@VWOk@nV?T^?AdK#j5*LkPB$rj{Kh>6Z8w^`8^p6HWl*v>dHMa|90BdXUJKl z*THI>VZg6qT0R17^7bbrIL_DXqd?Wgc*arxTlaOLU2?`jGhPZ}bJvh=hc5|1ZpEQO z8J|j`QMjFOHB{KbuVCO2!U$KP<`7qc*A>fR3jW3XmxnN8AVOicGrb{c6;OU6-huzYql`t^9dRn zQ$a_WFq4^%2n8X+i=&S{yt_K>2Ye3~sC@J9qM}NAx^;25R6VN6rO#?(k6Q;!W(C2X zl$qKLoz|bh)p9;TY z)32_2e~yL{#rov+Heon+IYc(M3eC#EpU;v%v5B5^2DRBu*_7Fl-nfV)e^!2Rt?Xvm ztT)P-*u2R1>4ZNT51JRYh62OnhVaWA*_M`H=}WPc7?H>86> zdvlPS<$Y+Yv7ahbH=g|&kqFP<-5~liM>C3Xv%S2d@2HNbUFcYbvG%a5t=>ONN)?!D z1}WIKaWfw0RisFLyYn8eEnEV&L&M{0ku5iA4ql3vckg5emIAkNA98Bu?=6lS~))Pr93yZm);8p59qp5;xf z;QUyq&R0a}I4)Wdgrwrsi-Sw3dh_?e#Kv*kee)f_Tc_dU;E+7-6pt(Gk3hxd1P zn-_lAwP@V>Jm0$?o?40rW>H<%$p36>WL%#LUV!ZNlNd*Z%xey1g!&n{3LY)NRrz&` z6ash1(ojmCudkW;{WTD|xWHE{R^qtqX|XMq9V7t-W?Ok7I2Gr5?YxZ7&F^M@*sG0C z*sZr!#F622s?N>$_~!W`ZTPOTNsPQKRpDa1y(pC9a9OK7<$;nmD}1MY+|}}RLGk$n z$?EOMQ0xt(;|R^djGrI~v@{0i+745s8ghUu&jVZNDDGvS#m3z`g2b;hjqV zsro-Uiywcsy#k$Syfw6miLGiUewzp*^h@|=c&-&cVSA=)NpE9MDIHDm5SQwm#>SXLXR+8(5;BCWiQqA1wQj|i z>7_g}3sFD$+{3A*a3oV|lz$dcQxUx#L~H`mkQnTal-l%FR-bxO^zmhVxuBQyzx{#>}vQqAf6)YgUcL0oH;i2H5XePqYF zMYg$@rKJgWu_I|j8){DZeF;s}{F)2<^nW(X{6d0QUK7Z@JkjV{3`% z7EYS(J>OfIzWP+b)bp*Ss5&Mp7~c^AW8ebxAyRE4gh=NgY@j84^Ds#J(CVxOZsA%L z=o5eM$wi$>fpR;f8%oAk?NUi~1(~F7Jrf&tn~`v~knVn+WX9dC`vjDZ2n-wf@=fxS zx&N;${-_KS7d5cRN69b(vYYUUn}3;!(l&F}!>dA)%=@M8^%auNPw)7MbtLTRbiJ;O z)`;@CtcA_~Qo@}QKh6PL8_AKFQ-St1)2{RPP$532Lr0vFKFoBFy9kDidrfgJFZ6Yb zCW~4*wof|J7z+`vr3+z8TxkBuV(XRR2RAa`tT(R2^nNduqye`)Z$jU>-PixrG`UaS zCfJY`t^jYNit=J*1;1jKsvbp~=T zy`}e3yxsJ6SUanppfVJV)4&g-mct|$-Y|F&*fR5e%hHuyqrJr*Rr@OgY+a=F9d{mv z@NT~@S*Yxf`?b46eV!`{u$P^|Gvf|LjsB1A!W!*I0U&PFC|Mn4i zwF{{hn@e^(f2EeaW@qk3N|VAab6PIR^=H9`&;*JVFoiky;b7OPwB=hoS7VUJN1CBf zGrH=|P;R`->s`c58APSY=>KQ|2>wga3sfaRii&BWa=K(GXvbKT0baZeTRtxkE9q+* zhfZO3W8o<0@CaaGQcA%Ox>=;@70STCe4UqW1&HIhzO`LB%({F3p3TcRDxr1yRvtUb zvQn-MQDc1Nu+uuKa}b5~F&Ddg4jSzGsrp91yuAX>kHSdH3O3g{e8l5vK_^+!1jBjj z+2uyaL0_yNctkK+$-g9DmD)~hbgR}r59SuRtSkpIrS@5u)Xj+R|43-sk1=OLFRjUvs8$^j)GB5S?&4T) zo~{K1?KZ081oHq}T)!~oR^gcTeB%u=M|lHGi@AiJjWVmCo9~h3S~r*2Sigh#zc5K? zg9~_Hw@2RE0wW2doI_UMcAuPocQ2F%d?h97QAc1R~N1xy~vsjG)XLEXG@Z{D3A>L&tYaipKHEYt4e4C!fve9_rD#bUr1G}ro5G8q(c^zsx8mf(<->vGN&pr%C`F${lGL!b zw8G+Qb=0gF5RVQLw}%QtZ8t9ynp9h~Ayc=l=O)G~q8HN&=o=fv-rT&~tNI((5d^S^ zq&`oemvVMkY*PHmp+Qy^+miOu>u(k+?=Ig%YILt#68j%iuO1{VFI$Us+4$@vUpiDN z?Elm-b&koaEw7A-Z4@mzlRPALqII-nnWU*ZcC$40x0c)~#?9Tl@QPoXoY1mVA^D&|=m`vTV5`s+G-QiEZE2;R=hKJ*1?<+1wUx&7_I|I)gdmHbX@$08fc4pOW z!C=NOah`k2G$kf{1l=c>6ZR^QF0>o*So3~I1AF2tB>O^HAPsYv!;HX9^JjK_IhHT%&ffj z+FJkk1*FQ#5JG?Vx~OXGU7aIsQ%1`My`zm?wC*dS=2P|YXQk(#1!?83dSstm_m(cP za)LO#<-D>gOD&5nM>##Di*8qia)1YD^>DBPyBV7JxXoiYg){5g*=|VwgtV8#A8%mi zu%=k1Ik_7qM!(Buh%Jgk*Sp;lv!0L^Uq4^`%9O#~Q}jU?;gj#hm*J+ceG=2aLcN%R zHThh~mX^ox+`GC9B&TNzr1m6=It~5AWvYXUr4ksh>{O8vWgpt+a%65bsOhy-hVgF~ zml~{7IcZWGna1z#8w59EZzt;)y}O@Pk-z+9VE?-uy@AIkaw%|X&i#Qs)qU7@je4JF zbC+*_(53?^X|smWSww{_w<^55)h23?FBKc!Zw^-wzpV2#-M{Q;Q1u2+vhTTm)ZNco z=dE9sA;KPBKpk_-L2?qVzUJGSo+_P&@5+s9BX7}cCkfkRz7Kc+xjFYjbSuHm_k733 zDjb*PURQ7fPInAnF@y4w7@U4RpRS5tGk;atS&@S0jzk`W3Npk!4*!y16Q%IOzUAiq zRyRpm$wPaaBBa+FLc*Ej{nN_@yGD1~|Gi6WzwYUBIYj9}cjr2+pDjy8Nw!fJw&Z;q zxK#x;TJ${b&}6v=wcg|8sA>DbYW{u6e(rXNmATYH2f{!#OKu9+f6eaERLnsIEvh?a z^7=Np8t(m88sDMCfptsmCs1wr(mm|d;Q4W@*L+%oaR~kGB)TfcT%>@$ z>NR@@DJQ)U??x-Go)G3jDjFxT#UAx)}zAZr6ew|0+!U zM#V1$kO6!w1 zhiYeOR6!}I(=@1!a(Z&DBPscJ;_L$wj~njxS+kRta=dr3Vqm~_@Xp-fjGbEB4}~X{ zULjeiLl>I^r7FY=Zy~%yJM!}D{uh@y_G6G2^%ECp=cD1hNYlJ7ZrEpBPQ^%{RFk}; zYn;25bPI)~OMuKkBFW2r2|KK0eIrFS|?S` zOTBA}FRV!<&dHA4ucy(a#QyH}pr7dK8LX9ic&ZChQa_|)jXb7sBHiG?f@?XeigCN+ zv}w)47$;x{x=KK4QNZ8_lv=jQTTB(jnkpWZfqigD~3qb+ts=A-P-25G^!URRt5Kco4jUR z)-NiR3X2(YYmJ(+F5I8XD1aVcaX|>wdE7yYv-4SP=hU1+t;p<(xvtVj=F$uoCXW`Y zUVYca8!Y6W;)GDS{_Ip53sWYSrx-Rokf&sj^rbBrRtUl}tukxYWYzo3DYk)brvBii3d)6>#n!|86@u5?;3KEq?fwXSPLr%kYIPSkPiJC2Q%%{i) z%X3lmb?^L3E+(kV^f{(isWq*@_^BgjpYi&S!4LAOjRDVzgtHz$F*RV$jy^yLCyeZd zU=Rp(1>s0U7l_;FZYHNB*EtcKE6074U>H;sHwxkds25mz7TR_>x0yqmaV9lA2cxfR zL3fqUO|zo5e(>Gd8pmiWiFYnmhQ(eWr|`2AqIxd=w}s8^VCsg#SMsM4hzq&xTCC%d zoT}`#JU2bVo|%~V@2i}#Q(sR($~~WQ(nEy9*>E*9W5Z6I>A20NbRw@ z$-KU3m*=rrDyv)5q=30&x?vS?P80Gf{UFz?Suv6DKd$62Ls_YUS0FTObGFo6D8tgw zvNSkgGrSvG*sxKZx6iw_h|dARYiCD=vMyUb5ez9BsgfeFmFuiTv5RpAxh6kgjVJqn z!;(DY%M5HVV|1Ux;6oJas`)AWaYT~SttuBvrDIFQbj`Xyu*T+X(vZJAk_QCaZP|u& zMu72IZnBDBpr~#mIW4Wn(JFXndrYU-zu@1rfG1>6(jTtm_LPbJ0<|8{?d!-0m;~x) zZ&Y^n`%l8C?3E?x=(Q8$xcA5J$CMZQ<1CfHY&;BR!s@X#(?rDVlLUJh6chk!jrLk0 zO64>pNWpypZN5tXygt{^j<1`F=4?kq&0^X`4*Zbi?NCW^6kEW8Ma!GPRg~X9&2Jm& z?`91B2P)8MrfwLY;_#dTGtN#t=AC~AYkih@?x&>HSRi-YL{QMhCUL>3!H6dtKh}drUf#}7iPtMB&Nr0uNVaN zdx~DN4s4(IxSGK>*xew}KwkVO?(xsFeWrI{{Bvaz#iJwXRIvn!oSt>t8d}4F*ym)6_Q~LX@Dadneq0Tt zzpL<^r8EC*Clzn_WbCL0f5Q&SU`JdK1BK{&Zwfu@biCK{7*HTNQ>e?IS1{~U>Bng- zqc5-0%!`WHta^(yXITod$Y(suQB_9>+BAR93GZlu4FnP3^qr&B)V@z0Dvzqo)2!_) zls;YD(A$<8)NP(~j3u7Fktr+-&^I!&I=ov83HtwU`tO0E;;HofQtV?n^a{lS59KYucjCimYr%vpx@4?EpHdF8<~ zrkVL9RIuzyki1>AWwZj8U3n`$gX_AD1`z-h2Ba-&{}n5sc+ z#RQ&?e@P+JG8^71KGRZhYe50z7*;zC9lph6eQBhsk)dTn?o2z4vr{$RwBdb`ofrar z+`YE;>gD8pz!oFB?Y3-ArEC$W}&*rN6ki;3rKr0*vx~w67?IlQC{X8ms zPPBEh=M!N&FgZJAd4+XTb2^*6SNZGXeLad9#~+__w{FCGob~_X)cC{L|M%B}^!9m( zMNjzAj-tv;;C}yN&rQ6Qs^;`7RlZbZ6$^pvG?Q5Sa}Ft@rM!DHwvay-@~8^-8BQ&X z4@7XkL?I+TI3P55^OZ}{P``5en)?g-s3J%3tKIZ%cZI>^%k62|qI?sbiO=QoFa*i! z+fpUA?<~h+^FDN2SU$Dz6Otkz8S4uuNeYum>Lh}#qn4v_ZX2DC#c!H939J1fiSV}2 zT7Ta7GHYH1HW`sc zIb38pXoPF1%V!ysILn_YrmxW<8RFQ0c~j_l&0+Nya6#e&Nxqwl8C`V>@XaLp7jMbq zMTrkz+(1_q=+}CY;5N7%xeR>jt`)pQ2xE7 zjm7E!YOOQRwQ0wcYfL`{_`TrM=Vpa<&~v73pbwC;rr9YgA6|*iFJREsQ6|wN?DF zw)^yV{M(jlgrh6tXAcrx=-^@!X`r--wP6(Y@wYJn;Ff=5;y3=7C-7HKFic#Z+gZlT zL8USH?YpH+dzQf^yDsgRSxZj$r10RX9t7T`vn#1_rD4h*e#Nr$1Xg;5M^#7GdPaZk z1OLAu?tcdq{~8&|((J~nHCrmfhFr`dt7VnO)bwalQu{!++bCx$c<%;LoXu`+Qxr2o zqB2N=8=~vm?^B?({r@RAS>6HW)FQd`Xf_^F_c7x%@r&9UP2nY6Z?}k2 z=Ezd?3Rd5t4SzBr3mH6ATy72fI$q!*`|d`?my0cjIyq_gnaAs9QZf=ol^9*VTBI>5 zKO9`R4L*f5WtK?YEUuBfD&&<$KSy_r5e)+zIl!9kL@%X;Poye{9a0 z2sQScD!pPT>PaeC&5(ZNS{8&nYx*S*F~_2e;=vNXjt5t&mpg)DLv2-Bh(ts9lZh305( z?WDZe7hzQmlQZ=Csm;H=b^bcsC^JpcrZmNdl-)V?!CGE6RAJ0M4y)gZ`M5dk%sdgM z2%#Lg!rs6Lz1`AoIp$eWVhl+_*wxp*UQP&bU=}F_CDFf7jiS})yApe2YhKQ+1HS>wg)Mx0z{=miaIafgL3woLS0zxoP>o3!lMBkDrj zsUvNEjHad?0L}2q7ojCFlk1!j+pPb2j@kjM9W~F#%)nt45D&;WtXwc22=NnqtGa5e zy+^>$_ZVo?wGFAZ*OOwq8so-BjvNiqPbBSX5m({+$r?=yKLfP}L3+a8^-`f#qk>!0 zrB>Unf+of$uzAo5Ppq#Y#(PY@z`BEX9)64&VV&ZMcbV65R-1XS`DvA{$@f&#c(G9Z z;uy!$!RHhk&y+@sj3mqFKF0@4%zN1}*TZ{wtuEV~gGvisbBn8l#UwU{_xS3#!#q-o zj&d{K>2m3`a_R7Rs~z2zgiY{cY5Gw~saV;blv~Ym@g5)~TA5QYf-d%U^WnXcfb2)} z8l_jA@`KATdzPWYA4ij}{Bk@j4BF|{20&wd1|NX993OC*p3d@gjqXwmR2XoTnceWx zu&cCA@a1Oc;icVt<*&u#{~_)|yE#XS11<6n?Q^=x*@t!uD!9lahb19tn#)DCX=`uS zhVDQzqJj+hi&tFGn{k^uP;AnsHOyG7o}*tm@Lz2<5<@xjnRCW`S$Ob;ugHK$>A|O2 z?k4!*t`Z$e9!C7K*5fv^8$*wT+sI$kg_5OUbNbK3(Z{z+Fba?zEiw_q+@%y3l%h9$P|)OhQRanXKRf0>UG(1{Wr=&qS@)n- zfz-|7h;O}z1L&0jNy*5Dz=@Bf0@ukafMBw{)yO?-W<8rC%vWrEiK;~oX6~arappIF zPiXtkPB9%ptFHNYr@LQApVppFnhjuSTi|#xRPq)%aRZ(r)eKKeS2W{`PZsZ*xu36Z zxSwpCoY5F;wm4B25^kdQDK_fb?IW(8@Fcfzlfy?uH>nfQ1o3O`3F6$Gek-J4pnu$^ zHsxCGMq@13g(5;gUMTOVoPqq0{mhc~x-PM^fb-Pi-805W#*H{Z(h+aAsD{lBBDTYMPN(KG0y`f_mr|x zv5Jp5R{1Q1^u=GF3KS*Afh;q*d}97JH~nNu|Mo_f=(T{LT^1r%bo<$>!|~!y#;4t?>d|UczS0C&)_)#>dJg@W&y=ON6W6YmZ9Mh1P{}g1 z*pq|FLPX_iX$Hrj2eU`gEYBwvCDER}yh1(byI77_8<(se!F_An)a69rvyGLPO`Rqz zCvrXHPsxkETFq1=;YD*H4fHr?pyhOPAc__ZMn#XrtI0liMf0@paUjm?KqH~TIQmNW ziZc)0&~VeW->O;HZkLXH2}}Ylen@JmJ^Cxp(#R);fPPMKN}n{SWd1tE`7sUdGv`Oz z4W2Nz^#&6Q+`E|!Sd(kDmJ<_z2f?}SN~KEfyR_Qx-_7s;u!6MkZHJH_R^8pV0OXN1GB$-Gx04AmyFn_aDPC_=CjbV9mu7T8Djw=UT zVpx5G3DT^y**E}|5a1K@Tq8qZCvpXR;hw!|AYbh>9s= zQD0s~vZ1)AwJT@Z;b`Rs7U>VnkDMzGxl4GutmlFfaD)V?$r%ujOIcq$*;jF*`GlVV zv>g{QyfbOB%x%$wn0RzuT;`5&KoP-Lp;vvn+VFe3;onT_e|*gvphgJpak`HDg7xI4NVRTox&u!xn=Qobe ze1ah`H=i&}L)~a4yMBEr$gzkp%r+bdKrRgj9JweiV_g3YnPfEzeQ`L-z7Lbev3uof z{=Rw8?$hUX5v5vLv1Q;~kR z3(J??J*}Ph(M`?!xmB;UStcD@RHDwmR zG5IqePhGZSWV9V{nH;nfWpv9|yGS4XM7>D{>KrP5>svrUVBDnEZ+;5JRdoaa(>Wa$ zzbyyHvEnUKYH$)~H@Ltx9n{pw|LilDR6yJ}rm@$*b5?W=D&TB>E^?ntz|7N?jVeLY z9`C9e*n!v}8&}BPk{4apkhnqNu*!Ck?0z<&*>jJ?O!ViKLHEA$rCR*eL#`F z?rYQ!mChq5rN?sKMn`doOl37)89bZZ^y-%qLST;N6CYY9shj>SutebF^OHH>gUElD z!uRN*&X+0!7M-S4S5t;y^{Tz>+;GyGgiKE~HY4;ssfefvw1C_atZ8KPSacjJZtew} z$mgrx|M?rBidT9{Tl$Y#}3iR9}K#+j?Co1oiP0u2@=@Z#-6iFyt{tKHUTo-W0~;&0d+?n6Z-+~0h}xji9R z+qozJ#ReorU@`@I4?JA?UA&ktFpFMTycpNw42CH&o>T3M%JukR!Mik#$pI;P2V-Oa zr<4>36Fj4KkY+7LlhT2%X%*u7mJaRvNieuU0FPkfx_SqYd9-}I3T*bC7CDcbD`Sk$ z`9`yk?UW4QKtuNKX5!tBv3m1|#evQYYte{34cam4n+xHk7-YvrXtu@w!jkvs>6Q!5 z`U4<01qWc|JNW%FC14D>_)x*szXUib88}!OfM0kMvR0hZ&F*y2H1+;i-=_NS9hZN` z91Mu_+#I)GV}V#(_sgT1`vq2(VV#wek}LFjpx!nPukj|Ftc#%J_{U@B0IOe4zrjj+ z%&_LK*s8G9YPde6JO9DVq|CCk**lG6`ur{67Q89&VKn?oeik>hn5}8(*^{JA9j22! z^Urfgzu0c2!jvVk31tP_3YBlu8r( zqFn)P?WKy*SfW=OCoL8?C__c3_c|57Is23j<2Vg@8Tqn0aTWuwb%ZvPwd0(ui!-ZD zT1K#C8&BG1%ms%e{&S#oJPeAtHLY0?VV@*mHNwt?756U(HfFgpz_R0a_f6f8viT26 z#f7Z^@m^rXq6kOV<*VhBiXGcZf2qfyidWg|w3sFI2?Fp44xjP>y%(SS!z)!KrwUc! zQ8wG6Hp5vZgZ+!%0OXPhA=7wX@%4?kyA4>e3a>I%tCA3>&!V3{9=biL*JQpx8pWIn zy>$YbcDjlnxkx)P5WX25t0LlAXPT^lnGVPSRJL=di2M`u)(d&%E7uhWgYDy3_l71u zRmwRJ=9s99Q9f}Y8$FFRKTCl$G^UdoP2>%(UMyEx)@|80$&&Ps9{AWeY7I%9fYpra z+xx}bX#+J5%30TMv_6kt3J#I@k8wL4!=%u)Q(i_QdJTqXzEhD76t96YJv+{2`EJg8 z<4%#~a4iM1RaWFDf%@-E$cE$VyZyXX!T5a%)gPXG4Zd=KOYZ5wqb?*lv)Msxw|c zUoWnT!)qhN{T72S^EJevRNd?ldn_#F1{6a$Zfrj;?2_zhkml?$TaFF5 zb@KA+0;P|}n?ws3{7y5_f=1m`XBWto_>|@r1gv;?Z-sHogUUN?(Pl*^B}V!U)$I4` zudFYfJz=z_Fyv?&X8>gF`z6*Nr!QOj*)`bgiw`o_5Md}OTzoj=cRo{VUi)^+Pif_U z%=iDm1+*J8%kP}4JzP}pRua&bLqMg~fbaY$4H^m1A3`n|X$5xJ4D$Mh!lx;+B z8runJ&wC%YMkKcO9W42~g2&X3h78X5%lw5j@%Y8oEoN^>Hl+O%OrlcDJ;RBRQHkTa zLoR~d=nS~(d{5PN>Q@dYH^MuOttgg~47-HJqf2UY+(oBfwwQexYEN}2d2svKqdntO zO?}DiVsAMbko-{59uS>Nz>yCr5gwl7oQlz(U2_R5lly1gQ{Y!Jm%03FbAFBbBc!Hr zHt^X@3W|+4^!h2=SX^G)ssr0JnE4+kz)WExZx!oxcE^RhV(As$+d|B=%|)N=`ELd= zn&>J}URAy$De>ZwTi4n5o5A@6k~Mr$rZqKYng1iZp zx1;Fr145}(aQ!AD7cf<&zmFz?0k3>R_BF=L*gn{5@lAqd^!LGuNBcg1cFv}Ydtz-F z6GoJ(tjIz>6*}JaI<8pnXJX3Z&V`fQX2#=lH{e#ODEQv{O57kQF94hCTG8@aIbcgd zZsFDiOF@82J;vU%mpKkgyNCVkMbm>3Q2?J`rrAdxujEP8$NpQYl3!V&R%g!DEAk)l z;yV5{nS#>}pWzx)V5|h~Y}H-SR#_}_5G@R)^$lq$+Cv+|x+mt}?Qiic`*}?)0=+t{ z$d5I(pvy!+c6?1UOiXz2=UZ>>9v_d#m?UK2kpLC^fmHt2%4ATU zPsNe1IxJG4M4WQW3)BfQE9R#A-poTPO?Q^2Su0q|9%G6aH#sz#t6vH7tG%NUrS`GN zS5LXXqz899?SMs*Uo~D-QiQu}WFh^Ol;@HyxnB)7wAwfysTI@1_ zl=PInSSE+=nlW|8d73WmEFu2qATs`1jSqL(C5@qNprLZ~m@C>(yiL{21ub!l-iMIx zG2V?jSD81r^qg4pl$<1u>Y7P&%XJt1|&;Z)C0X~<(i(>9*S6J`Mr0&|qs7;KnZ2sgEtbSR#Bv|n?&?3{Y0_mX zl_V{LQOg+*A)4qvXva59;sd>L*kq<& z=@yxCM^x5sei|IA+-Pr-5$h%bMW)^~Fwn;n(HAFvf#%Gh&0a!sFtf(Or;;tZai0{1 zQY!pi`4zlIS;#srsKW1Jl_T`^B3^PY_fkO(#L6DB3UFQoci03rXVl>=XzmYF4Gb>5 zFlqy$!L0EUP%|QvuDI!V-h9Lx#PH^YL0M9}g&k)E80kOc6nqX5_(z5LcRuxxHJfgt z-P?g>yODHs7+(a~8)xc7dd01VY1-m{w>A$xdM-&by2q_-K z#;lT4FZ^7c4|7xnMHL5NEg^9>WnRAE((%0^oG=A9Jmleh-z-1qi6(dXIA{2SV93zI z3(cO$2uk0qD+z8@bi^UHbu{WOW<%iMO@tJ%mp=4qUENVSW;q*kwX}~Tx6O78{B3i5 zx-#&t=abfcNat)4BIfZijJZdOl_Y*MBZOqGDmc71{gk6U{p3HE`1f#NNdMp@N9FcoUT(mJ z4V)xlKD<&_aPT%7CZYdm8L?M83v2w#%L@{)G%{Vpc@2lx;) zw(S=mFqbxO_{fbN<|%718&_Y#m79<+t@^kYt(XDb1v#CX@hN7AnQr6A&0v>CIqGME zDR#%j-C~q1a*d&U)Nn4jP)Sh5Wq9R9WiK~j#J#z*M%ujM2tqhqUD8wquj?YrSID-^tvazVDW=OK6d+es*0NzdZ0}96NHNQYaRl+X^>z2t#8IgpfcJ_FDo@oa z+3hY5Ub$WJ5$q5rbEGL)5UFG3db1-ukI9V-?L&>ZDWXHcxP9o*VgkYW?IvM}uQ@43oEj;xFV~-VOSWJfwJXVn_6T^UNhT~qw2-bKTc+ja4)$u%(< zIvsbkHtu0kpZ{~0`y%Ud?&#FI_JV)&oxgQVR4QhELk|LkG1%MZI5#Iq!QnV3G=w>2ADfF*W*at+ z%qw=T#b!Lb$f;XpBH}~1HT~X0ho@JrL1SMd2OIaux-`G0j|2FgIgq$IU0Hc<+24S% zFtSDqT%?obU4hPS_P>7Wyv<@q{;WrT{cVjxaq_Jx{sQgMxyRwxIU`s4(k-E%lM6BR ze+X=*KQR`*=qYhEKH^;&c(Q5qGc3--jQ>TcS`uiiq?{aP=1OgmFLt|R0V*n}6GsHa zU0aT-UBI>U+k}t6ifCRx{tDxF@j;GQSk7)S+0^BTiBzG_D#0YWqswvmJy)PXAh8m0 z3|hk@PVNt|rC#bZuQE z%Oz)x2(e~_7-Ke*<~+D~Q+B|;0w0rG_wx?!0Wh121FxhxtGEWLz|IjRVI^`@%YEl8`iN~}D$4eb+Ss-XvKcHF#zWhA z+cgF^RX#uD-axAM{js1nb@GNbPk)1Pw9DWiQj4=;Ej zj1SRpelnY+FKL3)=f1-TL8K>Hlx!w?wg`OdqA8x{5d+*fR8~B+oy&{wR@VO}Cg`hC z`pdxvutVpeH9g_z0@lMrXP^~&uHrBNi!5j&FMHpvN?etRq}{>@yFG3h9zHOo-4ZTw z_2uiOz0D$SuyHe$r!Ot2U6kI(vW9yf zI^-h_43qY=_^tblq0@VmVSyDnTN?LCGCa@c`d6vpXDQL&1eaoq##;60_CB4l}C{`RD>v-Zp5{ zI#0K8xLg}mkzeIRzzv!T>N$_paIBp7R%BFNYxni`R~yP!7^1;0msT~#@ZR9U1;J(S zq}mYOH(Dwx2LsW@x6=G*o|RZrbdVXLr!vIP85D|C%m+cVsep2>9|gUvboN<}@PRQt zyxG#ul~e7MqL9|NXp1fmdfBVj+&uxA%N373JQolXe+o3dr*HI{r$S%z^42M$DXFZv zBW7P#=-Qw*0UqUHhVZ*(KQ8QbhhDV>orXZxZ^@Edmo{YU6q+UIf0-r_+(c+9^Rs6b zTCSe(p}~A}dOPGtY4ZJ2G=Eu&enFD__Whw^YS(j?j2Gdfo$i;a2{QqMnhOHyj=q9* zN-j<(FQ0mHYnu(X?aIP#=+Z|?o0_V=_Y~vEtcOm!lZg;hUe%!7%Jrc{6mH$xF`?0m zdsX!PT(V#LgSqFOk$_CnRE;XR3g680e<(_u$g~iCBBOcIQi@p&QP7?15km%EPGMI7cA~YB!|h$qr7Tez&&fqBJRtf#iG z$b}5okc~M@hSRW?tmvx*X&cuL@jgG7BgGLlJ8*3Dw`8m-wQAntooT?w2Z4=)dIbRB zBlxB+a1mGBm9gxvGylDVy{f{(;e67K0BZ)_)%G8_?nP07JW?5J=RO{hX_o8FqG&iH zTgkHn6a(Ub%Kg$FCHubhdI@uXHojNUn1Pwvy4$h%qb$SbNJV~a)55p0>qGax#uIbcg90 zuV^>IU=bLPFmUMc+0KPpUME=h7I_~hz>VXvOU+9T$Hwd!r_u`X zv@<>X`nmzhN+PO#0p?=hwNLvg^yGr{IZ^~LHnp$z_&mY*W%2o#1WqfGarcvY~cE2L##aj7}d*NkZERb+p zL^T4wSQi#>BVtBi>DT<^{+WBnzNabMEQa{H8g(W=HvdJ0_p0r_m%pKyr$G6Q`S2z2 zGA~hf`F!RfE%eDdI!r5{oNv%HOxctYS)Gad1MKGeT2@t|^AXl7+efI)F#l^7Os~Sz z6t-0XnC7HGcdWQB;QIXd#8qgA39mm>N=%!Clj1Xrf#jTcZ#!k8O1POyN5<*Jm{v~x zA_LwrdQ*?>*rgi(SE73us4G&y}#Tp}(=Zgnt`qx7ixJ0_?CNKC{fpjK){*DAD{!lKtsfC*)3P70XMT z3RtRpL5SOccb0}{#BIODtp(JM`n;Vo%2=Obdi;;ny<=ia;;)aK)5@BO#^)IA+eP~g zl_pfy`a!#6iegsP4I4KB+HRp7G|HFznG2iD=%@I!QepGYVv3a^OXU#k&Welk*pi!b zg7<9=ixm@n(UDOrUV^@pMJ}g5tE@zf9f}MVC>yIhGY0+SbiL+|sW;6^Ac3UZL zeBE{Qq+`DEb43OZE!#}X1ycB`86w^NDEm(D(AA-2wTN&0m ze&Yu^tQ5~aY${=bk=Bw?1KwY&K)8)JgiX`xGJtqqMoD=GGi&?(KN};~@%xTKky2jrCRKj^@M!+&#oKrs-!`uy{>)j+-I#9Ht)odY z+8LQiOY|H|k@qTF!VGEMAkb;2x{JCXal>F>OX?Wi9HAfR0dzjB#*2!P0o=95^SX{j zHj<~V%Jp3e+|{}u!|VUy32}HcN{cw~igC=-nb+wPmE5vl9QI1_3Oj(ev}#J*-BaBv zy(3wLg0hjU910M6Qnr=iJ0|T=Vg$h@vEz@m5z zToST;(|;N8KBVmAAI;_!B*u?V2fZ0!bFTz(q`-!j!x*X;EL_o41=Ruba8sG1NU~qd zNX{2!dRgJ@Oi>-?uX+pO3m%oJ#mH22DGfj!xY#W~4;s77#R3zU} zR^V3ML5TtP>h$jBP0siG4vgi)4|)#qJ@sY=igL;?nc$!c;#T(2k0iq1;J967>*rk@ z^cE<$&Hj{3U}Da$N0UYwh=JyWA)4Zr>GqHTklTxww2_I|xFEKCop(7aZw|XvX`+%L z-TPIgkk$oL11eb*i7OE1ifl7>ztedhfS~tVx+zvsC@|4M!G6Ek6VR#~Gf=C+l6t+z z{LK%8RX!s(KxeJX%byyjKu7!)2GDfDPb&@Es5%{f>TVGjl8taipHyj(hlbJ%O`M_| zd%-fn<&mk$-{8yC=-xi@+wJmN!UWaIn_($(gkczLdEK0qVHVc(Eir#|b1 z!ZflFLlNR4G_~X#`e;z<9Z&Y{*z?<=jh}VMEi1nMF@Verq@TtI)jp*p+KtZS|7(msa20(ti zV=A0ng8cy`6Dx2*J%Rw-GObZn+~DfpDWy$e{wVENN+LmW<9%m=1zU$jl|*>F6(dY_ zkjZi)MPE3fB*1cPLvql7H;JHkh6X#%91q7I`Ic8!t20*QThR1$>EmY=BCtA92@vCM zC75QQF|9y9RDBJPFeGdLGAG#;p7$IO7k9=~$`AU~nA{$6{AHiT7LmOvw?;Ys38s_z z>ylirCAtfaXa#_(q+F2A1N+6)4(js)Tat0OU zCytg`4J=kg@DW7}ne7y7cE+018z$ z=10F29Ybl|8WIZVRGp1%;`n{y_K?<(v*|gcG$aH>wn~R5imr7xCHdcKRDjI)ar(rL z>eNc=)poilOVLD~1@C_!sl??R=6q61)4ydx!SNiQXhbX*A8V~<3wW&Izcc{FW-VfT zW}e3PWAE+iUl_DUhFDoe^@76i4C>8+SxIbu!wmXx)zUiSn93UQ?ES_~jd>OzIh)d3 z2(~vu*Rr5%YQA-owSF?s-mM6;dQZY;p!hey&VuMtn^p_JjI)t29EHX7;G5Zn6W8cK-pl&=vi9 zT^9C5Ajn158F>;ht~}H`V!ZE{bCt%r2YEs_lwPauRwRV%Jl_e&A`7i(6ClX>p|0z= zd$DlB3IELIZK=yiG+(MxE33`8?hc9F)=g&rYMMXNX;PxdwfQ-Hq2Z7(KmkV6M&X1%~Jgil(Qtq;jyOx1>;_8H3@ zSZk>v=(YU%VnB7Jsx~#fe;y1{=mM2Y*_n*e-+xT&1fpI<5`iyqg##f(^|6Uq(00KetSY*1T2Yk zli#33hI&^Qet^16l^#ILQd`%yxmfOMOz$w1Yq%|Gbe38MR~}7{3#TJ$mYb*yRrI*) z^xu2`$IP0oDg$loQS+%`jolk0(`+sTNaeMbE=MfzBH6; zna!_%&It{$(ry_3O##IzHfnah&w5AuAELkrRt70+4!W z{M)9CgbrE@cN)Rqx8j%)PZd11wrBw7KX$);+mYZZUXbtp?oTpfR~oM%&2 zgR}`4RFY}wk}35zC0S;U(MewV5(iD1W{xcGLyj5^WFLsYb0y?#EPgOq!6F=0bNxv^{jS0{Cg)=gx(R28^G2w6TzJ^kl`LBtFPE z5ut@N9H|m?>pvs;dtM8)#*jSCnOz`nv4b0`jE`0HL*WqZFrbB1GAm} zQ;howz80cZe}KGuQ5|fOKKI%0`WuWg$GeENt>G;9($mfFw?a;zr8y%eEo9NrGp2th zq_ylr2Q{5VZ!9M|=$M5boiT!Q&dqvR$ zLhZ0?7K(PvawgUzWF_kejipK#>+A(6y9m7r@eTVR(4!-ulH2- zbP;J*&f27KO;aP#RCJiapNy?7n6WUR3F=_J` zpL{|uA|($=LFd_g!~z6N5Y*wf?cE{ji zn8-G*CKr#7SA=bgQghrAs;TV}g-fA_0h959?ccN~KFw3+P$s|mcSOwb%(KkHeOs2f z&62y*IBxAff^0le`Lkf5#X3Rog_nd+C6kWC(c-ZIRNcPWkK?@#4vs%D2p?FI`$a_{ zp=ORAG5*ae6-Vx0`@BuQE-`;-$I=|0?kHwJg_S5Bs*?LrHKwbXFWW=)Kg}s~hbPAG z>a`0K)Ya>ksGdKDIRA%OQpH5i6j~Ku{`=s<&+o5C(9=%7h*dF<%nGG7K@GE~5(ViE z6G$I{scT`Q+7qfvDJYYT@S{RStWUZp#%+oqx4+`!ZGv0UL-Sdkl58OJk7M_n0C7I|aa3f-Ufdpil<`MVrJ7xyi@pHuqA$I_fzHEJ(+KU zMgrt~Yi(hWs?0&egtJvi|4r%f3BCT^*)N@M(omY9Jfcmb7>iHXSJ|P#P5k-|+(MHJ zsJ7q7zxbrZj5Q)4tukQsO|3yH6Sme47#QuVKStYYcQU%exssYz0JpNd@La{!nJVpB zpc7o#Jb)nPixa5(_}<$ASV0@59$DJSsS%(m4_T@%FHP4p>(i!%eaZ`6la1?KYPU}-{Qk9Qfajo%=z zRo&cCkV@QxrIn9&1{Qw(y)nBQr&dM@87Qh|Imd++TrO6tn2OS^Ura)_&d{cF_nQ+^ z(LNRYknJJ`eTR-=6k_f;#ZudZxwAfxUVUro$rYM}r~cA4{E%V*F@%m3!1(upBl2-RN9yJg)wG_{ah?$b9S&Vepku- zOLBnH$_FFF=eI~Z3RQQWZ|yYwKPZHstJ2jP%mBk&yiAyF85anT@9S zo&t}Vp_%1rL;f}$|4RVb8a>Y*)h*K^YiAXE@aCcM#K}AX@@E(z=7Xsqt4Dq`$^A*cP1~qN))=`lwtR%Kb87no)?#ri%87q~3t zU8Nc|zwDy0&8$6D?K>FFE5AP$?SF0XKry8-a=Kq-WH-MIjwn#j>k8a5U}o&H3E6E= z@}+)KJxqbDrMNCc5WuQp0$Rb^)U+K6xp(()QMUd=Bek65Stgh=D`6ugWg5U8k!ayT zJ8%f3I|P+mr0$s0^(ALD&PN$jr59w!bh6fhRlAwp!LbCNg>-VQ0k!(u*-mN-WGjoj zlO>ixCX%vF?(8)m_D`u8uA=5zD-(fxz4a?wnJL_z9oR;6@J`^Y0rLVXg-RI|m&|I+ zu`8=32rXv*$=A^s4Q~eAj5~6^vW7H`-X}ojt<2D>q@Aq&uB+I3xT}rkU?7^(`jB=u zV^+i*nmj`Vl%kNqoB-sd#m7Ker|!G8tVXHn2|lcRWi%|f+yE}vEVSx+>=S5c6^imC zZHHEcHjM=(Nz)j49sV`N)sGVR$My!4Pw`CK9ZYfj34O3%mH4U19@;V8^_OggS(zw; z`XGnHi9ShzyA*ETtoTrZ!19@=snpH3+asIc&MhKz6MawtL3Gnj7~N>`JS_A_kR5i3 z>)E}(dOCuq21yVIH32df&qkeC0}a3)`$CrYsb&Y}`-07Tp{mV&o1=Ea`P9Ik4ad&E z2&Dd5a0QxT;-P;^f&PW{fRZnJm3xG!Ln9q6CS>qE#B$g2qwgT)r!|@VMa0=YcHrnQ zl5P2qI!cq;Xy-sR(j+v}X?@5={{-@O^XM;G3MT^$I0AUKRSa(B{!+o+K~bn39v6wM z9w4_xP@cbFb^%#v*AWs8mitwQKO^J5sV>`v95mWo#zXVFx#eD$8y6;4u(|jjSNe@- zd2!cq%K&GfvvByaUNC&w)$%ZQiVPr{&8voy(2%J^Ds?#)QdQ>@Fw4V|p26QpOu{nX z@*wP!Jmr^+L$%Ktkea04XH3{?>MZ_ok!b*_fw3$ zL`N6gTLlMqTFBBL16vbr?Y5^#TM2%RxHMCIp36Lx`%T+ermY^OHF;wK9QJ5*s(y6NuDwzsq$64_DAV18P1itk z<5QJ~lV}n|Y^_5DM;((b6+ED>w6HYrwfj#6H#vTrjAeofiM|H1@o4^%T*)zduEK6P zbE9+ho&ya|-lKmP>R1>GDGGTyAbv&-PiNu3Ivh?iF$HFj zhD-3NsG_E42^^=N9ly(Pk^VIFncCe87uo-(ryiyZeO9K`#lZj5AAJ9J?zqSW{UTQD z!R(|DiqGwKMcy2}y_A_gfEjO>lIE#3KzpOIY$ZMsZxpGzcm11%HL#$jND&fZkxdL)E%Gtj+d ze@{g_G=r<&&g+2JB%@F*?IEwc^=~m-aT&O+=vqzFOXuC)FQsvfQ*G2jo0Qcj=vH5)&-1_R*!rNBZCvAf zheL(elliu|OoI%cf_3%tOx=4E3+=gEkd36_?J$f;Si{q@dw*>5I@3`o>5g-A+X?h= zw^?4{TuZl$LQ^K-gYWCBpQXD!1oPj2oYp$&C49nId=We-LsN~m&ueIuGeQlSf zW}~%(q8-*kW|YDDYEp$4ZAzSvzNvZCw=Vq|y#(oACTF@XJZh_XpfB`GS6c3$SNcDi z;~&O4ovfW5+~InT^X1?uCT#S-)f{d!q!Q< zf=K1|4{M=C+QzdMW(^neSdx#v_u82~O8wHWBq6V{%Efdel=AW9p^!Cg% zuNxg=7E;AUN166KISd+H<1JtvRW9aebP?r@!<& z@UVBT6!xCuLnA5{KTaE+%K|o_&X-PgoydAK&7Yvcjm<=@y{jw=IMHbReou6BOe%b< zU~C2^yPF!$lbIB8%%JDaoTv1TLO5hIyse%*cGITJo||B5fVsVvcrkpQy=S-V{LaHS zhrikhhDCaLs&BO9*B_HR#g5+8 z|9WTt>OuUvP}2;58}r6g*bGX8Fgq+TQ3E`+7HUm$qED$ched0bo?fh~l{LZD zoa@6Yy4R7;58KKY)@BjG%>Y25)}V8Zt%m8Q0d1Pkt=`eTZgtn*8-LFp5D+? zro}s=-vdV(d&i-4#-im=AL~=|GT%5KC7kB_DF61(1G>xB{fyX;?=R;V#elE!%@ z89ikI-k9U@Id!&SvFoy6U^fTPVcI@fuu*GWm2i0Q!7=Xh+14V;yY-T~afV=n(A&oC zb-$f!_y5?RyImmc$#>qg+a8WD6HYFlnpK?3odrHYc**%r*Cg3DMQ)LnHrj$izkRqa zDP8cz+u9e;W%*?l^A8fi9!(0ITt<77RU@|T8b4n}0tE&c7vl2b0*}wEsfI57 z_WapF-*42t?AiCMRyN$XWXD#H+z;|kJ-a#nwDH+r{lrw=HZJ&r$+urbRD#3rs6OCu z+CU~WR(`p3I%CT0&Nrf$#hi#7LjI!WkDQK))wZ>sN=;8e9Y#pi14K`u`|Ha*@Ijsk zQ~xrJuj`+}xp~*45ERVo`Bq!rq+2&4AZ#kei{zB66Gf91g7j|0QtPc5_q&P*t2Q$v zt!HdJE;V?kzTwU7C^wRN^&>OZ6yHhilV<@RU?6mA%r3N14&;=M`?W|bXwCf54CQq; znsywC*?W}kE7^`H;+v<-_rUTDTmfxYr(UP;wDJs8q8@l*WcfQEPA%@9)*m|uFMGRi zFz`ajK{{p^1)2K**`99aXNl{M*ggbB@t;i14cI_t=n_uUkjK`7C7`mCXp=8|0gkUx zIJ&JT5$~>+5A9q6!)~nw*2+wNv`PfxQb0YsZm=a3wjT3jx8{QMrnPrx*Q*$9)%CrR zURLclMvL`NG++GReW&^OEp+o}`?&DmK&3EFb|*mL2lW#1D{_yKmw@ePd#e|}&azLo z4<=lC^*+ltX>fuKc$M#yJhz-wDz+@jw*QLe(fG5eZ1K-+2A15s>!)wM6Pj_lw`$g3 z(Dy}#!H3T*9q$c{$iC;BSWosOk|kNVC}}?7@>{!88{G*BuORyeb1m;3XS}bT*Png> zVTy{vSuEv$u64KOVc{!B^k%K+izjl>0R$`5dAuh1D9Ps+E}~Q2M_u24w)&E~QjLqR zyFQck%5f$B*+FeggbMYo<4pA>pkK_WkFxivk5=+hkxygYPq4WB;#Hd;c*k7t*w$Aw zOptaw<5KqbIY%6>|VYRnj{Qu$WJHwjl8f8C4M5PHRO^Sjv zsZyi_5)lOv2?$Dui1gljNM1ldrAw2RfPew%9Rw13@1eKQLg*brDB*hVIp@bY&$-{v z{crEJ_IlRLteIKcVa-4j`ROX265#0*52}Na_N3tx4c4bG&ec^$OjcMTAje2g5oy?# zy&eOm0liYySfF{Ar$HVZoKYU5@$U9$va^%`8Tx%)uK9W*<_uo7Nz`P~B>TjTy`H^}|B>DsNTad&lmmklB{+;lOiD|1A zV>WJA;g^Uct?q<9B_Kj+ibs!xU`BM@*ll z$LVh+-rQgE-K5mw>pyB73U$;4zWZ|Vm-`%}_7chE!vq-K&u7yYw;ccOYoW(=+P|Rh zb!&ka^Y7N>b1n((ks31u5!Y&%We~U-)3`q(d7)OYE9GO&nAc3IiJ&J~@Vd8IF;lDsy`@U?+%hxe^vmuQYF zTpLVY&W)I`{K%|Hw<>Y)oyrKMXDQ^uoWJN@diy3JY}1gX+(KBDQv=xmueZG~2X@xe z0x$F$jySANCdU^y6|^73pUf(cXrSB~Ikkcw{ugHY54LB_7}VZkA)X8>fsqfxI-34- zCVlg76^^qd@B$|j59?FuebxhN>`iEo0yX`MX}Iqwy4vkpnf}Pj*_}!_(u5ej2ZNp` z&&zH?#7~cb20cBIwLt3ds9U?wfCSn{Sx6*JbG4X0$VSd%rS z^+yL2I1;=PWM%j|rSYlD!(C8$dXX=B`DBf$-6NWKvo%KP*KUy!!k}e%spI&eUrzFu zrX?j4%*Gddpw`pgBc+857U!BXpiMX5cOD1oaLP85#4zuQnUN*`1B0pI6Jzfv^Hd9n zJo0-*&U^w_GtZw8x0}R6dh-tYUZE#Qb=BdbNHl%DsEfR*Zy#WOQYdZ&GetK*9ibF2geaEnfP6|8Y|?RnQsdda}Uo4~Kt8k&W+PJ6!)(R#K+h`HIg} z`@$R`xsm6q3_H)T=mpoE)RdTrzJzVJ1#n{!trbMGIz%(T!>obWKk=Gaf+H0WV{ToA z(*w^Ytxh3hgu)A|F(nU>8?kGel0WMfuIs7`hvE0N z3^;D|cXG|WGMg_})m+jQ4!MC|PHQc-7_hSxs50XsQ-w}vTIThAYW{4YTt!{3aJ;TJ z7;(bw_5tuZj2euvc&j1AJwWpQ6bp>+v-t*LVvPP~zF0X9u>)kjUyfURZ@(TQe_3`H zD>%AeDMbBK{6)TcWS29r;ww{~UcwaXyonVmJ@`Ck#3uASd}O#Gb9$$W+c)O}U27Iy z31T^7_|v1K7cPy1t|Dh~VwQSFD-$rF^>B2y_5cqO{JNh`>u?0(`nl*(neO<#QsO9G z!p5X4iBZc7d^26r{cOuy`;v3f=r_S&EsL(8`>5#G1ZSb5$!?+F zT?EeVb#L8$TXSw|bY6*?JkveL!A;0A%7#||{DWEexUauuyRy22Q_F{p7c) zMNz-lkxnl*_x$#_?^ZXdoCn?Z`c0A>t?tliWm(3zpqWo%_8|ubIWn^fEXvej}Ph2~# zfxk=szI;6^y)?HZXGhwRhz2QBjmQaEY0X*qI}(%@B`dm8#_u z6n)uiPkiW093Yzoi`nw?YJ_z?_1wh*$%{zuasMZx(?NvyuP0JwTsi`yeaAXoq0dB* zOjZu3_G`X13>{V+50lMr9eLbfIkh(k9IYMZzV2+_`R0sc*!OQORZ4h?TT#xot}dWW ze1~E^HpUNF?JQp<4xkSZa(p*{nwW@PJW<4kDospJcyE3+J_;xbSJn#{cWupSbCP?Hsd&JJyk82u3a9jv${zjs-$9i2w1~^}Q_{Ax67nnYgUtF@WeM=vp4ekx| z9uaOWQ?32Jy4*TO0NDw#mmFUi@w`$#2KJcCjg~7BD5E2$*LHgq8lv@Qnb-dYG*%g` zfdk`t!Z4Zn2tr}lW?(AjKp`n2`8D-9gpXTlu(x%rII+^~O@x~k_CfS3kU<;fF8Fa} zDg10|7HA*E;$5R4?nHTh<~iaI6S93r<|%2HtIX?cL63nGneonU+wyw(K_L@@uFZ*r zhPB;@JyD|`Mmnx61pAI$HNhu(l|)Y<#;l6g*b*tD$)t(l1R_6JMF;>c*s^P z3o)jatTRM?qD{yfRMG0N$GnL+VA)3hP;-ELKYCS!`E{gRyqm3b9Y`HmW$krFSsZb$ z@CX`rwb20StAO1uERK0ZrDU%@lOOVad24aGZa%_|eLH0Scg*s0q;|=6-K-x_;Cg1i z#KD-a{0hr~;nCzD^tbGe8q%R_KhE{}@h<-C>=km1Op8I;CAYO`B{>OoZ9^-VdH^Xj zBausom*tkX!#%HAWJcl+^e+0EO{JiMQ8Br79|;lrjbKvy;BTt;Uh&mvPJK*)QaT+c1F4xvO zQgWInVnN7q7+IC^{@I~-Cos5BG=H&*ukoXry`9+SiS;!|GvY$g@z~ESSp}VSDboPf z4R=6WBTj^yD`7^6aeX`U#!-{wRxZ^)v5BEABM<+?$rf3f2>L1IHb<-L+6E~3T!~-{ zQy+ZQkeVl^Cz)@&Vrj9K!hiF)sh|Eq&!j)S6)m{#>-;)*Ir*SnuBxMIc6@6Lgm`wuD!JwMK*maOcJm%>fT=7&Z+?Ea!e-b?CAL z&I6HzpBx!#g82yM`9%qiZ}H)q8E>f1pMC~dw)ckbDZs^CzA*cuV_gDguG4QlT~Oqi z^oShlYGx?{(0$1V@+*puiYazd9~bJ1Z7kPe88Acc!$616Y|;OAw?%^)USq(UoCTc! zn@s&5d+~(S_1eV8tJr@@)F$4qN@wM`GFeJeqO(kkDpl#$ncql$!V(2uUm&oXn#xTo z;%))5r8O%uc*Ljl#vj6VZR?8Y-c`iW6ue#8pM})fza)3W(_;c2kXm=*QxpoNp{Z1A zl?~tX?~_*hSiRl{c4ndkfvCt1VR`|PR>_WZd?HjBouxnMlEPlBI`b;rr($cBcr zYcE@cD5XoD^1ENtr^2wP9cS=v^~GQP!|5Q6}~c+mDG|8 zyG2`jJMN?J9v=im^O8r8HP0q<1)#YbpU;**mYgjwY*k(H6?|CuJf$52Jh86DjYrr0 z?euwDIp^-=BmXXnooi-6D6958ulLfptL}_id8+62;+rPY(8Oi>>rTP{=mwahDueG7 zmDPM7-?U`h%2EK;sEKos42?ZPSq1cZ6+wZZax1LeWQ5zOL=J1R*6d=W#=}+H%%`}EWw7n?(ki^&c$OmbY(jS zy5ITPQ(-;~TH7Ervd{W^!0pL`3SySaIi-^!A-!ZXqR4AlxwHGlwpixwYl$1Tscmek z?)in2LY)F!|zB#eD`y!sRj9WO`;k$ipLKUADPx=(AcnTe|S8XV2hC2jx{@$ z;+V-?S|qgZqqqy#KJV3$KSRCjXr1~{`K3c14AMN~Au7!tJQLNQYycGcvy0!%ZE+sz z`c??~Rzt7>cYyfIJSR}wAaZjugLb_V5{GzKQJsB1mQQ~B-HnFX2BiF!FfWGoz#|7_ z>XnM{R3P)>r2E}Eoex|w0s{W&8t4yCl|Zl*!hgkM#O2-|!*t#S{+GP-1!651 z(E=X53_)S?(DNCXx<<|4vfQO|YcAn+*KGz_g2VS)IU z4cbI-KoRHIM6o%3&ZbrRu!Z*4y=!T2k-`SJhst7_pQN7DN4dE`^P%}ps1!ww=(jkNe1U0E|hIC`GE7C=!NUi*XwPtvqqP1QV_4+f# z#mz{Tu1f16UZ;senvNO?a2P3s@ABJ9?yo^VSR6-2`UdJyBeAT^2;RZ84O+udFB*S9 zW$kCTQC|GO+-#VsGJ844A-dH(hTos9_?BjrGA?!TO=uyBq)&%yauzvrJk(%&x}G#Q z>e?)KcLe+Wt3F$OcNf7@@`vH6FK}nSzIag@y~BMJ?_67=Yc165o{C#eIx_HCW3k7F zEwAQR=Qz2#uh?w*Jzg%>Pr(u9vpm}i__PXo-;e#<_@TUi*_V;({v^vi@ z&fi6delg$!`Tlt~eoWaI_UO{E1IuAHV!UH|O%tGr&jqN<5M5q4I>xmots>4T5 z+yq5WYnefWhSGxgC26ts#BKhDDXlZz-sqZEOSxAF+7Vd6kXy-9d-fwh+({CL3A@Ue z&!1sQrbqKXIo(YGr^yklR4?R>`!JmTC42P`Q4(*oX#CSP3p=F5?F#zVl2OdXhsQLq z_x`tOHc;|5{-{-oJK)WD)`RXkc+`*Uz?L13Sw4#PP}ryU{KTy3h?DG(AQPCOI?KZs zYvx`JG|MP8T-Jc^f`OHK?Ld48f?`8MvgMlu{er@zXt{f-#MecoLBZ}Gn)x(*7P{c; z@Wo`%OhHDFRa!-~Kt@|Eyu?hRSB}f|ObfmHuAVorPTAR?`|wSmn3VB)PSPIJs9LKR zV)NDcdPH^|XSTzy?T%B~*NUX#y$koQw7v+B9zHnYnh`?aeGinJE>G*+6?uKT%{^|A zkn;P=MrW<&VqoAsJP=ZVmmsq?#%#iZCv8y~)*a{5P+wnZJ#*c5p*l)zeb8W{_`%GX;EP=&$b+FfyJyu+9O}FfL z)DE~P5;tX_-od2u#pz*gjzx!uw3ODQ#)*^()LQ7q?8Bn*WffmC`vKnPZE5`{G8gG{ z61aAev>@mr_)4mkt4V3HJ{v-Kyg)+LGEFB&9)(y=mM(a?1DzeEAVa54QM5;)GCMjj zhLPitn|%+epl7dGli#@B9@K>qCY`sbwuM65d(dy-Hy---7y&)z=;Y zCS8ShodRBe&P;UFBwB1xOexK7hjG6I49x%+rT;1c^nSI;67uWWa$FxXxBC;V5%p?k ziRYV1QC3a3%kpGSCHsIZe7b{S?i~i3`wq%KlRNXOcp&*zs*rQVi_J7d0ZVzX@pde~ zth%sQ#4kDj{@N<(d_i#3!28jC+mX1%;$eUAOwo%?(M!%HxA@*F(==hcwp(h(OWt6& zds0SM3mw)Akb+9HWy#G6x;Zi1ptMHv;;d)KRqu<*_HNJUP_ck_n3P660@qy$-$BfDS8-YS z)Tm@w`gYC5yM<-gsz{PR8RZXS_*13heVYE4bkjM~qqnu}9dU8^b(OAQV-*>9Tq-)2k; zWvf82%cav37rMH%Ni+@NE!{`|)di3thZl+MB{3D&7o31+YN{?>QpY#FQ!)^Q2^*kJ z9vT1eQH2m)lN9PWJ=D#)Je8(Q`iwz}Ye{&kASKkzGVk(fm2Mh)(O`}^c-vASQeR)c zlN5RC@PG-UadFI4Vd6GPN!wmwgv1L;%F;ZbG-26miFX^*J%8i)U4SkStf7A{bE%|% zkrkKZfvxQ5Yt|O89QT(#k0emC2#?t&g`WMr^&;4^4g_xn1uhd|?`ehN9mmMHFQBIkWh=UG z0X<{>?DF`M@&zSc9GBQ>mxzf3t;Xr_d;Ttwwu+u%`Ua=#JZJ}v(1$@x^>@42qq zHFm}`Ql==XW(`%lqKTCiIS1B0FAEVPoP(Nxck*6=vpqkZU!!{#=R^}_U7cwi^SZ%M z9A8d$j^e0Bt7KyL41@g}Bx{Sva%}P+kRaxRU7A}@woj73(}c8z4OqBRKlMWwAGPW) zE|O*AKbAegX>->DK%mVXcGr!qZ}UXQ0NI&GQ)7q6hl~C$HQ1x~Al$a?)oOV2wXKf63!5m){=NqpPvM zV!Dp^E3@%Cg?iv~zDoh>3zJ6eNa?JM=TB$DKgp^sFup!KtQ=%MJP&q%_WPrYi0_s; zQ;SGG${VOOy_T5dn?{!`wNd}wI`W33JcO-16w=CDmAr{UsqWW5c zP|cbfR5#v7rf2wz!rh}&Le!AnW5cIC-{_YoZyuJV@4?293g{N-iB|f zHv&CufFm!$4DGig-& zRBKEyc5;dl+OAz5@`&{vb3r)#@_~n}5p_&>{#1h=Nq}Ce`K8aRM z@xzY-ud|Ju`!5PSi_?EXI6m*2%kC}}c@0`+@%=^GN2`6Yd9UelfDg1yy*>CYNseW2 z@gi{Wj*L$iQd6xgpQfI*&!m)E1;}+?#^XBws+avg0@F#mP!IK8G1`!QyxrG~T5Bx+6^ z(F&5B`V_KE2flaka9aVD6~~|1T6d)-gxvDdeQ;`1P5dFzI&6(_9QM%sW29AiJWY<& zs=R@((kMBR!4iI>3gZ>ww_VbOGm=7_Df+_|IpC>;FNgiuJ3b1|GfTwlgNk$A!MbvW#V)(BY+dDfIi3OwEt%K#U#(EMZR>GK9x8t-lZd?( z4XTY;EPMY=(GqG@F+E@BHNsjB3rCP=Py%1`ljygU|JQZQ0<4=ZQ<%zmKT_iD!u?FD z#{u;!`#Gi}7ZSEhCqVwgR9EgNx{}tDezCN4vrZw*jh=4xm2m5$9s#bxl_p!4Ec}j) zaK;V8WVkKc*2kp5*b*AV{a6-eGva7g-e{4trmczxik9kVU3vBM8RFhcS&CgLFKke-` zAKYbg>!4vAvGBB5!7R}JxQ(L%}uNGXnN5L>d>k zySjmkcd?a5Ory_abJ4?0-Lt0$0?+=o!dfo)plOz$mp{_m-t&`f4sGRC&f-)Pu@rv) zF`;W+P0c2QFMLvC7OY%9O`;QOREKvnqSfnLAyajP7p=Nmi~0nr+pz7F050eIJXG|% zpd9~!fv!hRyEr0J&|7gCyFeU_{Cf4AoMrjxCD6}*RIgrLwO=t(Uru{K@`&q$>Y)`C zL&>p4`Vhlfhh05b3vgo=d!PBU{K3py|N1?E5mq`P1JoT6dufbn22@XNXZ5k!74QqPG&k?SIPK z$=`*U4_x|DeWgnhFu3=#+El#3>QUp{+Y^DNqu|H91I?WrVapCt(^VA0(bJqCl;SE; z$1UVDT{ZYx>AlWi!YX2KR-!SWAc=*v8V>O|eRzSs5W{vEOu7b=;_msm-z*3Mk-DBG z2^^$lqrghWU!X&Z$8?TALJRc+z6Dss3l!<9jkiHQ_|PEqAS|2R4YYtb>=H?#P#e9(K z;ZEi(>dYXVgu_VV{Vs~Xj$whv-|VNp$S@pa2t-rmH>VcaRII$PHZYSujUo2 z-=41FfF7|)i2`EKmD=i=fbRm|ZQ_sz$Ubk8V+Esk6g}(Zu^Q6wxlNjS!$rS^AqxXG zX{@)S$Exz(0a^Fo*Z_{-QU{=vu>GB#ljawlQeN@6#2H3-U+n{_l!=>7gu6| z_Q~lA{)4IjRYE}TD=?!aSne1=Mi66_(9{83Xco%rozx$&bVPel$+tQ-C-6UOEJ z74c~PYT*`1QbR(ZrB>==bD=VK>sw*okERO0kzzPa_l=p7Z#|5Ia*4hzE)D3%WX6$M zWm6wCqXs%~ntK2`YS)nZh^gUN|CMFwx^m|7Jj}jQ+k(;wWVdOpdh9$nYYL>G% zTPHR{>MwezPF8rtL0I5ec_ivp>iVVrPM!6A6n$4`zgG*qf=JewzCtRVmm$O?J{h8& zB1;vk}!0*^et7ea% z#`o>7^uZ7r1$4jOy5CKXoJARE`M`Di79wlm&%1udMYq*sm#Wz8iRfjP?^%~eR}7Ab`^c?+na-P{1XZ$`!c^z-`93Cnu78FFb}MYz{jD7;^&^JtjLB zE*r~G+%!nHdP+RLAFPs@EmEm=GopA&0$@xUWt!KjxE;A4kVEq)pWJWzVNEk&P&RCO z*BJmW#RXfK`dRtT`zQUpzc9~f++7JO%^Awn50Fg7uMKMfM0+oC;RJ@joy*1W3GlY8 zB2^47pl;ERj>FMp++Qifv^ce{tDSsKzb3rZ{W9Kr)^nkW~)udT@Fsc7jF!eLI%n=1rn#5v7qWeA-6t| zEXZ}$@bvrwJ7-h0H*bkD2-eRI8}r<%w5{Y=Z9gR6z%WQgM%+c3KKXr}1DrD_t#aj2 z@dwTvsfB>*7kF1>&drKxNgiz`Wn@Gi0cG+f5GT`h2UYXJVzL~AA-yFcJC&cg>o#Mj z2Yd2!si)~C%rFjP)=05xdi4R1qdD%{!a)LV(}@K@Ny>Xj4_a`44yPyG zg|$lm?mTbXJMYfED&4ZL`*ZQ`Fyr7+ve3m&^E{c$H&vWiH5-<)Dy4C?X-2fiO{if- z65u~KBIDx6%CUX5tSI1qWXy8%2U^~PqTPU^ErC;Dz;2wC+POchkr95pcdQ|G8czz} zt_ofp0GfM8cAa0UkyxpggK~KL#SIzsSJ%80jzvqBMFp7#z$;;gv`he~k(;8=Oh5U1 zIMP;Kr&QZf(3$2cj64^9V$jprkYIOZQElvDE}#)JZ>?3m*<^KWRX6U?U1H!Q@Yh7` z&uUj`Ci0MrpY4>UGiBp)_C#jbjrZDmW=)^EvT^L}`^oQ8-_6Hr zQL|6y>mDDI;++R(!2^l~fkjALUl+Yw3F)g?LCDReRyAdAn0_@j_<$UWnKBG(Kdh026{lNm0_1#IwdhzqHCBqPafEhi(TfP?>;cH_Yu58wiPWqCKr zx+i~78H1k)T~W%tcJMb7J#o>pk?3dLiSPV`}Wrz-NB&)NHjF zdQ-VGoFOoOxz1~pL+^9VK*d7^rYVpC-L}Ne*2#k;LI^I+E)>&0|S(E!KG4%r> zMfrKrzI&YS{KO9>{#OXP4f;ow9bYH**Xu5fj5ocC0MDA8Lr23t%f6X0D7=^JfQ)jdr%C+D1{`J)ZnDpJ`3^efck*+WGIZ^u>xQU-tTq%S zTGMpVo~>sT@1uB}YHlg``a_J7T73aCyww$j%XFy+Pwyp# zi@%1~u-$-!`dMkP2Nvy`PC5CtGDIg8z3}=y+a?MAk>Smo%^|g8CY4a}omCk;bC!R* z>H*N{@mh$fZ7mvdC#Tkz4ha3;a@^`n`_fxgyeHD%`aFWKr69XMq}eRGr#`hUxz)~w z1*kwuAA<^62+E&4T~&%&miPWnuW7&&_7^7I{Ax9;irwwk3p2vagbBAZLdUc4A~B&* zo66;~`kmT%#(CCUv(E7SJjY!|^e4X;58`T^;krK{4eO#M@t5*rmvIzo-miT~R0#R% zCEM|1ocv*-M2ykp+>1xHo{Zb?zG-xjC`ag(ST`^O!MMneF_*r+4;&Yv{8`5GOIrNf z{l1|4${eX_Df%SgE=3^slyBRRrlU~c+$o{#*(8Be*PR=mgl3L;)2l_ zrPEBmUmwwbjT>&!a6|gAPZBGk7;9nY-LiYFVw64>p?Ii&&|s1UVwlo6R>B^`mcv80%ca z-4T0f0%b1h<8&~T%UbX0&z+BMXUJ1x6Y-1NomKSwt$vDAB(rP@b414^e-FoUs3EC~ zLN=DLvN0Tf>?9QTnS9E9xydesSh3poyv+s{MfcHmLWJ&DilkpIHs_D4c&<(lVoYmg zTiv?FKRl6rdpL5B96{O}VI?oeT*mLHc|3wMt2R0NcfRN7XWT*3vS+&mW#c-Ii^n$y zL3@E?y$xLeG0gVpH8m)(|2vIZek=CxR~;pX|IGtvp1L3#EI-5q3b<+Uz`T<<6#CmnqGz)1)?yIe`0^aBh;@>$x64M}yAe%7#y9iTFL^M7?)?+DO{7?A*qQk)6sW zvG6ULo!dSW5qOi881Ac`5URMV(Uh&lz%CI;ZO-ML`T=9T8$|37_Y~DrIlX6;RLU({ zrl(S?h+ycc2Ipnzo9OpkRBckVql{N8tur6&UXstx$;#*X*E=->8cViYVb4QSvN;uU z_|sv|a@ZjGzsf7M%2l(u4t{j8$M!4GG?mZS-TV9Sh`Ston@y(+0B)R{qlJJjqP*eC zR~`W>r0aZUgKK(Hc5-4g)HWiDHj6YDtv0~*D$r#*$?M!vOj7Qwcef$6Y-n{ws&!Ns z=F+W2DH#d4S?oVg<5fEt0;2xzIcs6_Ec-GZ|HAK1@)&3R4S1Mqi_J3>v!o4uV|oS)&#S;@Wb%56diC$2;9 zFA^(f34PALw#k318kVw=<#I*{>vf%IAVsBAuo@vMDj?@#BsRL7E`W8MdUVPyGD*OZ zBK(cYWesXum6_S|UWLgDfIJR|sk0Qrli?Nhb6B$b>l4%f)w3w78%v850~QhHoRvsBm1_g_OxoxBd1NS>2ASUMuffa=&IpN(Ib!3cj@tzta$1WYJZPwE;87IMO+>M=AYjW2LmXNlH|2!f;FE3} z5wRu)P{8zB%k~warNnxWflN*B1UyUsE2lP$owUwjvb`r(gdUtV?%Yb(aJ{S77(B-I zmv%k5-B>LIFt>`7B^U;OkGN=DhSwRrB8T17|EQ*+14^DGl+?UvNVgWpU!PATLrv^?=j5VZ+mDK2 zi^pqb5mUb=ylpK3FT01;>py&HD7w@%Z$3gQ9G~#|urjkF{WXUV{w%z74DofBP^a^l zbyygc^^(zwjK=EsbAG`riE;hW`Ep@-a+qxs3o7@|#l)9sXZ3RRMw8~gjtWJuNe}I_ z5;ucB@hv~#P}AG+v{H7Fl~YA3N$8}*Hb!EUpePHdLRGqWGYFw%!DqpBIDjnWW=MtY zdAdv-axB9*1)^y%>r2W@@Y610nA>I4$vhR^-I(Qu3E##Vot;t(Y83jMdVtL-o#h+({(K?``%+dXY@0^v=acc<%s_D^w>7Q9gYkx|G8MX z!D|fm7Kk^3tb#r$XXpz%J*dJ(R%{*hINEzIn)j~Don?S7MZ=vBn@TUjwPZxRdBP=4 zeX&6FU`^~JDX$=n)MgL5R^{maw}$w8M2Dn|cX8zY%_~qqyM*QZRmuFZ`f2C3S4Bd| z@>gq@rF(-TvbV%*dWNnn0Z+3aLeVL+5+4Y8oTSo0{TTKhkmBEQ+&K}6-E+c~i+qu5 zy{^qb8lJg|yR7ZZ0>YQR0ddBDRz}g3Rt_$5zfR6oKqpFi=bdTW4*il)b#}ugzR6dm z@sXS9A!lK35(NZ4tu!s`bIG&7eS>G^ifZ%Q<(zVW`adb|$&=dLRd-tVbALuDWKS85 zV4*01UPQHuMPlx)x-KH(>_kJMgaiw?qEINt%%gt~(Q}oG%=hhknNVgtp`PHy>J@JK z}@CSY-6 zT*0d?n|K1fHeL5bpT@gBUx>ORt-o^O1-Y3QzH*I|{!jbNw`9D?=Q^m(u;9ym9#1f( zBK>6OKcj*LEvFUnS`BYlE}7^z4;LX$m+TSptXdP?H4}Hv7X1_ZC66XW)P(j$R&H%~ z*RF$#Zt$RQtp{Twb+j~WlEVG1zJUPae*GXrg3m7-Gx*lb!0h%*^2#FU6Y=iV6T@ST zwq7>o1cqYbXM#j>YRpKGNa@cbXkL5ZQqbm?t3Rh>Arqp9%Rc1#tv7!`L%dWrvBn+v z@VZN3zt0&*SnlPwm<+#swN4sXNE_83$uWX4p4KL*uMeF3Wy8^yW)?&tC_PH>i5@2A9mDkw|}0mdj

<^8yIelW4|bA9|_eTJ3r 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%0D!r_pm^?8A2X{VKDmFTOj+B&SrDgiQs5afLc? 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

w=8*dLYn8H7MKg*7 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 Huh0Dsp%F~^ literal 0 HcmV?d00001 diff --git a/apps/venus/src/index.tsx b/apps/venus/src/index.tsx index 5fdc926e59..2bd7c320cd 100644 --- a/apps/venus/src/index.tsx +++ b/apps/venus/src/index.tsx @@ -3,7 +3,7 @@ import { createRoot } from 'react-dom/client'; import { BrowserRouter } from 'react-router-dom'; import './app/i18n'; -import App from './app'; +import { VenusRoutes } from './app'; const container = document.getElementById('root'); if (!container) { @@ -13,7 +13,7 @@ const root = createRoot(container); root.render( - + ); diff --git a/apps/venus/src/mdx.d.ts b/apps/venus/src/mdx.d.ts new file mode 100644 index 0000000000..e6f1511e1d --- /dev/null +++ b/apps/venus/src/mdx.d.ts @@ -0,0 +1,4 @@ +declare module '*.mdx' { + let MDXComponent: (props: any) => JSX.Element; + export default MDXComponent; +} diff --git a/apps/venus/tsconfig.app.json b/apps/venus/tsconfig.app.json index 054e3ea559..a4f9eff7dc 100644 --- a/apps/venus/tsconfig.app.json +++ b/apps/venus/tsconfig.app.json @@ -19,5 +19,5 @@ "**/*.spec.jsx", "**/*.test.jsx" ], - "include": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"] + "include": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx", "**/*.d.ts"] } diff --git a/apps/venus/webpack.config.js b/apps/venus/webpack.config.js index 88df817a12..def037d387 100644 --- a/apps/venus/webpack.config.js +++ b/apps/venus/webpack.config.js @@ -9,7 +9,6 @@ const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); const CompressionPlugin = require('compression-webpack-plugin'); const ImageMinimizerPlugin = require('image-minimizer-webpack-plugin'); const TerserPlugin = require('terser-webpack-plugin'); -const Style9Plugin = require('style9/webpack'); const enableBundleAnalyzer = process.env.BUNDLE_ANALYZER; @@ -18,15 +17,13 @@ module.exports = function (webpackConfig) { const isProd = config.mode === 'production'; - const style9 = { - test: /\.(tsx|ts|js|mjs|jsx)$/, + const mdx = { + test: /\.mdx?$/, use: [ { - loader: Style9Plugin.loader, - options: { - minifyProperties: isProd, - incrementalClassnames: isProd, - }, + loader: '@mdx-js/loader', + /** @type {import('@mdx-js/loader').Options} */ + options: {}, }, ], }; @@ -34,7 +31,6 @@ module.exports = function (webpackConfig) { config.experiments.topLevelAwait = true; if (isProd) { - config.module.rules.unshift(style9); config.entry = { main: [...config.entry.main, ...config.entry.polyfills], }; @@ -119,7 +115,6 @@ module.exports = function (webpackConfig) { }); config.module.rules.splice(6); } else { - config.module.rules.push(style9); config.output = { ...config.output, publicPath: '/', @@ -138,6 +133,8 @@ module.exports = function (webpackConfig) { } } + config.module.rules.push(mdx); + addEmotionBabelPlugin(config); config.plugins = [ @@ -158,7 +155,6 @@ module.exports = function (webpackConfig) { template: path.resolve(__dirname, './src/template.html'), publicPath: '/', }), - new Style9Plugin(), isProd && new MiniCssExtractPlugin(), isProd && new CompressionPlugin({ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 802d964374..2d207ed618 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -219,9 +219,11 @@ importers: specifiers: '@emotion/react': ^11.10.0 '@emotion/styled': ^11.10.0 - '@mui/joy': ^5.0.0-alpha.39 + '@mdx-js/loader': ^2.1.3 + '@mui/joy': ^5.0.0-alpha.42 + github-markdown-css: ^5.1.0 i18next: ^21.9.1 - image-minimizer-webpack-plugin: ^3.2.3 + image-minimizer-webpack-plugin: ^3.3.0 imagemin: ^8.0.1 imagemin-optipng: ^8.0.0 lozad: ^1.16.0 @@ -231,12 +233,14 @@ importers: dependencies: '@emotion/react': 11.10.0 '@emotion/styled': 11.10.0_@emotion+react@11.10.0 - '@mui/joy': 5.0.0-alpha.39_72v32ofbtgpmxm7mhvtx474vfu + '@mui/joy': 5.0.0-alpha.42_72v32ofbtgpmxm7mhvtx474vfu i18next: 21.9.1 lozad: 1.16.0 react-i18next: 11.18.4_i18next@21.9.1 devDependencies: - image-minimizer-webpack-plugin: 3.2.3_5emixpjl54fjyhdvj76qjbw4py + '@mdx-js/loader': 2.1.3_webpack@5.74.0 + github-markdown-css: 5.1.0 + image-minimizer-webpack-plugin: 3.3.0_5emixpjl54fjyhdvj76qjbw4py imagemin: 8.0.1 imagemin-optipng: 8.0.0 mini-css-extract-plugin: 2.6.1_webpack@5.74.0 @@ -358,7 +362,7 @@ importers: '@emotion/styled': 11.9.3_@emotion+react@11.9.3 '@mui/icons-material': 5.8.4_@mui+material@5.8.7 '@mui/material': 5.8.7_d6menda4vqwq6peqnkbe7mkj4i - '@mui/x-data-grid': 5.12.3_7ff6pt5vb3e5jymp4h3bl3mztq + '@mui/x-data-grid': 5.12.3_d23hrjcoore4j5fpg35ldaa7fa is-hotkey: 0.2.0 is-url: 1.2.4 slate: 0.81.1 @@ -4217,6 +4221,45 @@ packages: '@lezer/lr': 1.2.0 dev: false + /@mdx-js/loader/2.1.3_webpack@5.74.0: + resolution: {integrity: sha512-7LtklcfzZC9aWWFREop0ivemhwcp/cke2tICHEhnDyGn+hTg7LIbWCfSos68kJv9w7Z47KYfNcg9/8zBD+8eXA==} + peerDependencies: + webpack: '>=4' + peerDependenciesMeta: + webpack: + optional: true + dependencies: + '@mdx-js/mdx': 2.1.3 + source-map: 0.7.4 + webpack: 5.74.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@mdx-js/mdx/2.1.3: + resolution: {integrity: sha512-ahbb47HJIJ4xnifaL06tDJiSyLEy1EhFAStO7RZIm3GTa7yGW3NGhZaj+GUCveFgl5oI54pY4BgiLmYm97y+zg==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/mdx': 2.0.2 + estree-util-build-jsx: 2.2.0 + estree-util-is-identifier-name: 2.0.1 + estree-util-to-js: 1.1.0 + estree-walker: 3.0.1 + hast-util-to-estree: 2.1.0 + markdown-extensions: 1.1.1 + periscopic: 3.0.4 + remark-mdx: 2.1.3 + remark-parse: 10.0.1 + remark-rehype: 10.1.0 + unified: 10.1.2 + unist-util-position-from-estree: 1.1.1 + unist-util-stringify-position: 3.0.2 + unist-util-visit: 4.1.1 + vfile: 5.3.4 + transitivePeerDependencies: + - supports-color + dev: true + /@mui/base/5.0.0-alpha.88: resolution: {integrity: sha512-uL7ej2F/3GUnZewsDQSHUVHoSBT3AQcTIdfdy6QeCHy7X26mtbcIvTRcjl2PzbbNQplppavSTibPiQG/giJ+ng==} engines: {node: '>=12.0.0'} @@ -4270,8 +4313,8 @@ packages: react-is: 17.0.2 dev: false - /@mui/base/5.0.0-alpha.92: - resolution: {integrity: sha512-ZgnSLrTXL4iUdLQhjp01dAOTQPQlnwrqjZRwDT3E6LZXEYn6cMv1MY6LZkWcF/zxrUnyasnsyMAgZ5d8AXS7bA==} + /@mui/base/5.0.0-alpha.94: + resolution: {integrity: sha512-IJXmgTF07H1Iv5zjDV7zJZGUmb9cN8ERzd2dgA1akh6NWZgwyIGyQx+Au9+QSDoM5vN3FqZvU/0YCU6inUwgeQ==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -4289,12 +4332,16 @@ packages: '@emotion/is-prop-valid': 1.2.0 '@mui/types': 7.1.5 '@mui/utils': 5.9.3 - '@popperjs/core': 2.11.5 + '@popperjs/core': 2.11.6 clsx: 1.2.1 prop-types: 15.8.1 react-is: 18.2.0 dev: false + /@mui/core-downloads-tracker/5.10.2: + resolution: {integrity: sha512-1guoGvL3QZ7VjA3y9zye9Rpm+jz18rVZIo3AauTGyW5ntDMxr/cR0M18nuc/NH2KqpMt+coh4NwPEO1uPuKM5w==} + dev: false + /@mui/icons-material/5.8.4: resolution: {integrity: sha512-9Z/vyj2szvEhGWDvb+gG875bOGm8b8rlHBKOD1+nA3PcgC3fV6W1AU6pfOorPeBfH2X4mb9Boe97vHvaSndQvA==} engines: {node: '>=12.0.0'} @@ -4353,8 +4400,8 @@ packages: react: 18.2.0 dev: false - /@mui/joy/5.0.0-alpha.39_72v32ofbtgpmxm7mhvtx474vfu: - resolution: {integrity: sha512-F/cjEwvH9UFxIRJ30P8fuGOEDtgDBJCd++yTq8JYXARGCSlUMtbpijkPvnYFz69j3BtHCDhSaz3JA0cxcwVjaQ==} + /@mui/joy/5.0.0-alpha.42_72v32ofbtgpmxm7mhvtx474vfu: + resolution: {integrity: sha512-9AvkBuGWIPB8v4kaa3hde5saGgUo8chpczVC6TCpWIoFAuQsLM+QWQzW7TpXD0j72FhOgcwsIaj8LSiJVTjbRQ==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -4377,8 +4424,9 @@ packages: '@babel/runtime': 7.18.6 '@emotion/react': 11.10.0 '@emotion/styled': 11.10.0_@emotion+react@11.10.0 - '@mui/base': 5.0.0-alpha.92 - '@mui/system': 5.9.3_72v32ofbtgpmxm7mhvtx474vfu + '@mui/base': 5.0.0-alpha.94 + '@mui/core-downloads-tracker': 5.10.2 + '@mui/system': 5.10.2_72v32ofbtgpmxm7mhvtx474vfu '@mui/types': 7.1.5 '@mui/utils': 5.9.3 clsx: 1.2.1 @@ -4515,8 +4563,8 @@ packages: prop-types: 15.8.1 dev: false - /@mui/styled-engine/5.8.7_72v32ofbtgpmxm7mhvtx474vfu: - resolution: {integrity: sha512-tVqtowjbYmiRq+qcqXK731L9eWoL9H8xTRhuTgaDGKdch1zlt4I2UwInUe1w2N9N/u3/jHsFbLcl1Un3uOwpQg==} + /@mui/styled-engine/5.10.2_72v32ofbtgpmxm7mhvtx474vfu: + resolution: {integrity: sha512-YqnptNQ2E0cWwOTmLCEvrddiiR/neUfn2AD/4TDUXZu8B2n7NfDb9d3bAUfWZV+KmulQdAedoaZDqyXBFGLdbQ==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.4.1 @@ -4531,13 +4579,36 @@ packages: optional: true dependencies: '@babel/runtime': 7.18.6 - '@emotion/cache': 11.9.3 + '@emotion/cache': 11.10.1 '@emotion/react': 11.10.0 '@emotion/styled': 11.10.0_@emotion+react@11.10.0 csstype: 3.1.0 prop-types: 15.8.1 dev: false + /@mui/styled-engine/5.10.2_d6menda4vqwq6peqnkbe7mkj4i: + resolution: {integrity: sha512-YqnptNQ2E0cWwOTmLCEvrddiiR/neUfn2AD/4TDUXZu8B2n7NfDb9d3bAUfWZV+KmulQdAedoaZDqyXBFGLdbQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.4.1 + '@emotion/styled': ^11.3.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + react: + optional: true + dependencies: + '@babel/runtime': 7.18.6 + '@emotion/cache': 11.10.1 + '@emotion/react': 11.9.3 + '@emotion/styled': 11.9.3_@emotion+react@11.9.3 + csstype: 3.1.0 + prop-types: 15.8.1 + dev: false + /@mui/styled-engine/5.8.7_d6menda4vqwq6peqnkbe7mkj4i: resolution: {integrity: sha512-tVqtowjbYmiRq+qcqXK731L9eWoL9H8xTRhuTgaDGKdch1zlt4I2UwInUe1w2N9N/u3/jHsFbLcl1Un3uOwpQg==} engines: {node: '>=12.0.0'} @@ -4555,8 +4626,8 @@ packages: dependencies: '@babel/runtime': 7.18.6 '@emotion/cache': 11.9.3 - '@emotion/react': 11.9.3 - '@emotion/styled': 11.9.3_@emotion+react@11.9.3 + '@emotion/react': 11.9.3_@babel+core@7.18.6 + '@emotion/styled': 11.9.3_dc5dh2wp562rsjxvguwi2i3yzq csstype: 3.1.0 prop-types: 15.8.1 dev: false @@ -4585,6 +4656,66 @@ packages: react: 18.2.0 dev: false + /@mui/system/5.10.2_72v32ofbtgpmxm7mhvtx474vfu: + resolution: {integrity: sha512-YudwJhLcEoQiwCAmzeMr9P3ISiVGNsxBIIPzFxaGwJ8+mMrx3qoPVOV2sfm0ZuNiQuABshEw4KqHa5ftNC+pOQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + react: + optional: true + dependencies: + '@babel/runtime': 7.18.6 + '@emotion/react': 11.10.0 + '@emotion/styled': 11.10.0_@emotion+react@11.10.0 + '@mui/private-theming': 5.9.3 + '@mui/styled-engine': 5.10.2_72v32ofbtgpmxm7mhvtx474vfu + '@mui/types': 7.1.5 + '@mui/utils': 5.9.3 + clsx: 1.2.1 + csstype: 3.1.0 + prop-types: 15.8.1 + dev: false + + /@mui/system/5.10.2_d6menda4vqwq6peqnkbe7mkj4i: + resolution: {integrity: sha512-YudwJhLcEoQiwCAmzeMr9P3ISiVGNsxBIIPzFxaGwJ8+mMrx3qoPVOV2sfm0ZuNiQuABshEw4KqHa5ftNC+pOQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + react: + optional: true + dependencies: + '@babel/runtime': 7.18.6 + '@emotion/react': 11.9.3 + '@emotion/styled': 11.9.3_@emotion+react@11.9.3 + '@mui/private-theming': 5.9.3 + '@mui/styled-engine': 5.10.2_d6menda4vqwq6peqnkbe7mkj4i + '@mui/types': 7.1.5 + '@mui/utils': 5.9.3 + clsx: 1.2.1 + csstype: 3.1.0 + prop-types: 15.8.1 + dev: false + /@mui/system/5.8.7_2n63gx4a5hafw7crejwh35wbou: resolution: {integrity: sha512-yFoFbfO42FWeSUDrFPixYjpqySQMqVMOSbSlAxiKnwFpvXGGn/bkfQTboCRNO31fvES29FJLQd4mwwMHd5mXng==} engines: {node: '>=12.0.0'} @@ -4647,66 +4778,6 @@ packages: prop-types: 15.8.1 dev: false - /@mui/system/5.9.3_72v32ofbtgpmxm7mhvtx474vfu: - resolution: {integrity: sha512-EXQV2POwncstHLYII+G4VSYdEFun1TjBbQSBDK76DbIkug8nPjtjAZ+3Kgk3/NoFIigW+vQ9cDVUZtlbRH6YMQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true - react: - optional: true - dependencies: - '@babel/runtime': 7.18.6 - '@emotion/react': 11.10.0 - '@emotion/styled': 11.10.0_@emotion+react@11.10.0 - '@mui/private-theming': 5.9.3 - '@mui/styled-engine': 5.8.7_72v32ofbtgpmxm7mhvtx474vfu - '@mui/types': 7.1.5 - '@mui/utils': 5.9.3 - clsx: 1.2.1 - csstype: 3.1.0 - prop-types: 15.8.1 - dev: false - - /@mui/system/5.9.3_d6menda4vqwq6peqnkbe7mkj4i: - resolution: {integrity: sha512-EXQV2POwncstHLYII+G4VSYdEFun1TjBbQSBDK76DbIkug8nPjtjAZ+3Kgk3/NoFIigW+vQ9cDVUZtlbRH6YMQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true - react: - optional: true - dependencies: - '@babel/runtime': 7.18.6 - '@emotion/react': 11.9.3 - '@emotion/styled': 11.9.3_@emotion+react@11.9.3 - '@mui/private-theming': 5.9.3 - '@mui/styled-engine': 5.8.7_d6menda4vqwq6peqnkbe7mkj4i - '@mui/types': 7.1.5 - '@mui/utils': 5.9.3 - clsx: 1.2.1 - csstype: 3.1.0 - prop-types: 15.8.1 - dev: false - /@mui/types/7.1.4: resolution: {integrity: sha512-uveM3byMbthO+6tXZ1n2zm0W3uJCQYtwt/v5zV5I77v2v18u0ITkb8xwhsDD2i3V2Kye7SaNR6FFJ6lMuY/WqQ==} peerDependencies: @@ -4785,7 +4856,7 @@ packages: react-is: 18.2.0 dev: false - /@mui/x-data-grid/5.12.3_7ff6pt5vb3e5jymp4h3bl3mztq: + /@mui/x-data-grid/5.12.3_d23hrjcoore4j5fpg35ldaa7fa: resolution: {integrity: sha512-57A2MkRR/uUNC/dECFV0YDJvi1Q+gQgmgw1OHmZ1uSnKh29PcHpswkdapO0LueLpxAy8tfH+fTtnnPDmYgJeUg==} engines: {node: '>=12.0.0'} peerDependencies: @@ -4803,7 +4874,7 @@ packages: dependencies: '@babel/runtime': 7.18.6 '@mui/material': 5.8.7_d6menda4vqwq6peqnkbe7mkj4i - '@mui/system': 5.9.3_d6menda4vqwq6peqnkbe7mkj4i + '@mui/system': 5.10.2_d6menda4vqwq6peqnkbe7mkj4i '@mui/utils': 5.8.6 clsx: 1.2.0 prop-types: 15.8.1 @@ -5580,6 +5651,10 @@ packages: resolution: {integrity: sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==} dev: false + /@popperjs/core/2.11.6: + resolution: {integrity: sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==} + dev: false + /@portabletext/react/1.0.6_react@18.2.0: resolution: {integrity: sha512-j6BprLiwFz3zr1Lo6BxM2sQ1b3g1JIjGwePeuxqSfbBiEYbGXn2izEckMJ02hSa1f7+RCEUJ+Bojvtzz6BBUaw==} peerDependencies: @@ -6290,6 +6365,12 @@ packages: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true + /@types/acorn/4.0.6: + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + dependencies: + '@types/estree': 1.0.0 + dev: true + /@types/aria-query/4.2.2: resolution: {integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==} dev: true @@ -6388,6 +6469,12 @@ packages: '@types/estree': 0.0.52 '@types/json-schema': 7.0.11 + /@types/estree-jsx/1.0.0: + resolution: {integrity: sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==} + dependencies: + '@types/estree': 0.0.52 + dev: true + /@types/estree/0.0.39: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} @@ -6397,6 +6484,10 @@ packages: /@types/estree/0.0.52: resolution: {integrity: sha512-BZWrtCU0bMVAIliIV+HJO1f1PR41M7NKjfxrFJwwhKI1KwhwOxYw1SXg9ao+CIMt774nFuGiG6eU+udtbEI9oQ==} + /@types/estree/1.0.0: + resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} + dev: true + /@types/express-serve-static-core/4.17.29: resolution: {integrity: sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==} dependencies: @@ -6439,6 +6530,12 @@ packages: '@types/node': 18.0.1 dev: true + /@types/hast/2.3.4: + resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} + dependencies: + '@types/unist': 2.0.6 + dev: true + /@types/history/4.7.11: resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} dev: true @@ -6521,6 +6618,20 @@ packages: /@types/long/4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + /@types/mdast/3.0.10: + resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==} + dependencies: + '@types/unist': 2.0.6 + dev: true + + /@types/mdurl/1.0.2: + resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==} + dev: true + + /@types/mdx/2.0.2: + resolution: {integrity: sha512-mJGfgj4aWpiKb8C0nnJJchs1sHBHn0HugkVfqqyQi7Wn6mBRksLeQsPOFvih/Pu8L1vlDzfe/LidhVHBeUk3aQ==} + dev: true + /@types/mime/1.3.2: resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} @@ -6694,6 +6805,10 @@ packages: resolution: {integrity: sha512-N8Ad4e3oJxh9n9BiZx9cbe/0M3kqDpOTm2wzj13wdDUxDPjfjloWIJaquZzWE1cYTAHpjOH3rcTnXQdpEfS/SQ==} dev: true + /@types/unist/2.0.6: + resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} + dev: true + /@types/uuid/8.3.4: resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} dev: true @@ -7334,6 +7449,11 @@ packages: engines: {node: '>=8'} dev: true + /astring/1.8.3: + resolution: {integrity: sha512-sRpyiNrx2dEYIMmUXprS8nlpRg2Drs8m9ElX9vVEXaCB4XEAJhKfs7IcX0IwShjuOAjLR6wzIrgoptz1n19i1A==} + hasBin: true + dev: true + /async-retry/1.3.3: resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} dependencies: @@ -7702,6 +7822,10 @@ packages: babel-preset-current-node-syntax: 1.0.1_@babel+core@7.18.6 dev: true + /bail/2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + dev: true + /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true @@ -8067,6 +8191,10 @@ packages: url-to-options: 1.0.1 dev: true + /ccount/2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: true + /chalk/2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -8113,6 +8241,22 @@ packages: engines: {node: '>=10'} dev: true + /character-entities-html4/2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + dev: true + + /character-entities-legacy/3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + dev: true + + /character-entities/2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + dev: true + + /character-reference-invalid/2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + dev: true + /chardet/0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true @@ -8335,6 +8479,10 @@ packages: delayed-stream: 1.0.0 dev: true + /comma-separated-tokens/2.0.2: + resolution: {integrity: sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==} + dev: true + /commander/2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -8985,6 +9133,12 @@ packages: resolution: {integrity: sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==} dev: true + /decode-named-character-reference/1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dependencies: + character-entities: 2.0.2 + dev: true + /decode-uri-component/0.2.0: resolution: {integrity: sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==} engines: {node: '>=0.10'} @@ -9113,6 +9267,11 @@ packages: engines: {node: '>= 0.8'} dev: true + /dequal/2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: true + /destroy/1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -9145,7 +9304,6 @@ packages: /diff/5.1.0: resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} engines: {node: '>=0.3.1'} - dev: false /dir-glob/3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} @@ -9834,6 +9992,39 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + /estree-util-attach-comments/2.1.0: + resolution: {integrity: sha512-rJz6I4L0GaXYtHpoMScgDIwM0/Vwbu5shbMeER596rB2D1EWF6+Gj0e0UKzJPZrpoOc87+Q2kgVFHfjAymIqmw==} + dependencies: + '@types/estree': 1.0.0 + dev: true + + /estree-util-build-jsx/2.2.0: + resolution: {integrity: sha512-apsfRxF9uLrqosApvHVtYZjISPvTJ+lBiIydpC+9wE6cF6ssbhnjyQLqaIjgzGxvC2Hbmec1M7g91PoBayYoQQ==} + dependencies: + '@types/estree-jsx': 1.0.0 + estree-util-is-identifier-name: 2.0.1 + estree-walker: 3.0.1 + dev: true + + /estree-util-is-identifier-name/2.0.1: + resolution: {integrity: sha512-rxZj1GkQhY4x1j/CSnybK9cGuMFQYFPLq0iNyopqf14aOVLFtMv7Esika+ObJWPWiOHuMOAHz3YkWoLYYRnzWQ==} + dev: true + + /estree-util-to-js/1.1.0: + resolution: {integrity: sha512-490lbfCcpLk+ofK6HCgqDfYs4KAfq6QVvDw3+Bm1YoKRgiOjKiKYGAVQE1uwh7zVxBgWhqp4FDtp5SqunpUk1A==} + dependencies: + '@types/estree-jsx': 1.0.0 + astring: 1.8.3 + source-map: 0.7.4 + dev: true + + /estree-util-visit/1.2.0: + resolution: {integrity: sha512-wdsoqhWueuJKsh5hqLw3j8lwFqNStm92VcwtAOAny8g/KS/l5Y8RISjR4k5W6skCj3Nirag/WUCMS0Nfy3sgsg==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/unist': 2.0.6 + dev: true + /estree-walker/0.6.1: resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} dev: true @@ -9845,6 +10036,10 @@ packages: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} dev: true + /estree-walker/3.0.1: + resolution: {integrity: sha512-woY0RUD87WzMBUiZLx8NsYr23N5BKsOMZHhu2hoNRVh6NXGfoiT1KOL8G3UHlJAnEDGmfa5ubNA/AacfG+Kb0g==} + dev: true + /esutils/2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -10749,6 +10944,10 @@ packages: ini: 1.3.8 dev: true + /github-markdown-css/5.1.0: + resolution: {integrity: sha512-QLtORwHHtUHhPMHu7i4GKfP6Vx5CWZn+NKQXe+cBhslY1HEt0CTEkP4d/vSROKV0iIJSpl4UtlQ16AD8C6lMug==} + dev: true + /glob-parent/5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -11080,6 +11279,32 @@ packages: dependencies: function-bind: 1.1.1 + /hast-util-to-estree/2.1.0: + resolution: {integrity: sha512-Vwch1etMRmm89xGgz+voWXvVHba2iiMdGMKmaMfYt35rbVtFDq8JNwwAIvi8zHMkO6Gvqo9oTMwJTmzVRfXh4g==} + dependencies: + '@types/estree': 1.0.0 + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.4 + '@types/unist': 2.0.6 + comma-separated-tokens: 2.0.2 + estree-util-attach-comments: 2.1.0 + estree-util-is-identifier-name: 2.0.1 + hast-util-whitespace: 2.0.0 + mdast-util-mdx-expression: 1.3.0 + mdast-util-mdxjs-esm: 1.3.0 + property-information: 6.1.1 + space-separated-tokens: 2.0.1 + style-to-object: 0.3.0 + unist-util-position: 4.0.3 + zwitch: 2.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /hast-util-whitespace/2.0.0: + resolution: {integrity: sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==} + dev: true + /he/1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -11410,18 +11635,21 @@ packages: engines: {node: '>= 4'} dev: true - /image-minimizer-webpack-plugin/3.2.3_5emixpjl54fjyhdvj76qjbw4py: - resolution: {integrity: sha512-a8mG+lTvIGLFnlU4BpDqbw2tr0IC+R2T57Lx+xGNCR5R6WccZ/gmL8P3y8ic0bOYL1azmh2L6+PptccdjIYqqw==} + /image-minimizer-webpack-plugin/3.3.0_5emixpjl54fjyhdvj76qjbw4py: + resolution: {integrity: sha512-WFLJoOhF2f3c2K4NqpqnJdsBkGcBz/i9+qnhS50qQvC+5FEPQZxcsyKaYrUjvIpox6d3kIoEdip3GbxXwHAEpA==} engines: {node: '>= 12.13.0'} peerDependencies: '@squoosh/lib': '*' imagemin: '*' + sharp: '*' webpack: ^5.1.0 peerDependenciesMeta: '@squoosh/lib': optional: true imagemin: optional: true + sharp: + optional: true webpack: optional: true dependencies: @@ -11545,6 +11773,10 @@ packages: resolution: {integrity: sha512-FBxbgh1+ziiPFA09s0JgYtB7gRYfbfVrcO1sTv2JnPwbbz0M35zSYVUR3oyrTfLo/S+sbY4JG1W16hY91Hbh/Q==} dev: false + /inline-style-parser/0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + dev: true + /inquirer/6.5.2: resolution: {integrity: sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==} engines: {node: '>=6.0.0'} @@ -11590,6 +11822,17 @@ packages: engines: {node: '>= 10'} dev: true + /is-alphabetical/2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + dev: true + + /is-alphanumerical/2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + dev: true + /is-arguments/1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} @@ -11623,7 +11866,6 @@ packages: /is-buffer/2.0.5: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} - dev: false /is-builtin-module/3.1.0: resolution: {integrity: sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg==} @@ -11654,6 +11896,10 @@ packages: dependencies: has-tostringtag: 1.0.0 + /is-decimal/2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + dev: true + /is-docker/2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -11705,6 +11951,10 @@ packages: is-extglob: 2.1.1 dev: true + /is-hexadecimal/2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + dev: true + /is-hotkey/0.1.8: resolution: {integrity: sha512-qs3NZ1INIS+H+yeo7cD9pDfwYV/jqRh1JG9S9zYrNudkoUQg7OL7ziXqRKu+InFjUIDoP2o6HIkLYMh1pcWgyQ==} dev: false @@ -11771,6 +12021,11 @@ packages: engines: {node: '>=10'} dev: true + /is-plain-obj/4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: true + /is-plain-object/2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} @@ -11803,6 +12058,12 @@ packages: '@types/estree': 0.0.52 dev: true + /is-reference/3.0.0: + resolution: {integrity: sha512-Eo1W3wUoHWoCoVM4GVl/a+K0IgiqE5aIo4kJABFyMum1ZORlPkC+UC357sSQUL5w5QCE5kCC9upl75b7+7CY/Q==} + dependencies: + '@types/estree': 0.0.52 + dev: true + /is-regex/1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -13090,6 +13351,11 @@ packages: engines: {node: '>=6'} dev: true + /kleur/4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: true + /klona/2.0.5: resolution: {integrity: sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==} engines: {node: '>= 8'} @@ -13517,6 +13783,10 @@ packages: /long/4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + /longest-streak/3.0.1: + resolution: {integrity: sha512-cHlYSUpL2s7Fb3394mYxwTYj8niTaNHUCLr0qdiCXQfSjfuA7CKofpX2uSwEfFDQ0EB7JcnMnm+GjbqqoinYYg==} + dev: true + /loose-envify/1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -13626,10 +13896,127 @@ packages: tmpl: 1.0.5 dev: true + /markdown-extensions/1.1.1: + resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} + engines: {node: '>=0.10.0'} + dev: true + + /mdast-util-definitions/5.1.1: + resolution: {integrity: sha512-rQ+Gv7mHttxHOBx2dkF4HWTg+EE+UR78ptQWDylzPKaQuVGdG4HIoY3SrS/pCp80nZ04greFvXbVFHT+uf0JVQ==} + dependencies: + '@types/mdast': 3.0.10 + '@types/unist': 2.0.6 + unist-util-visit: 4.1.1 + dev: true + + /mdast-util-from-markdown/1.2.0: + resolution: {integrity: sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==} + dependencies: + '@types/mdast': 3.0.10 + '@types/unist': 2.0.6 + decode-named-character-reference: 1.0.2 + mdast-util-to-string: 3.1.0 + micromark: 3.0.10 + micromark-util-decode-numeric-character-reference: 1.0.0 + micromark-util-decode-string: 1.0.2 + micromark-util-normalize-identifier: 1.0.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + unist-util-stringify-position: 3.0.2 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-mdx-expression/1.3.0: + resolution: {integrity: sha512-9kTO13HaL/ChfzVCIEfDRdp1m5hsvsm6+R8yr67mH+KS2ikzZ0ISGLPTbTswOFpLLlgVHO9id3cul4ajutCvCA==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.4 + '@types/mdast': 3.0.10 + mdast-util-from-markdown: 1.2.0 + mdast-util-to-markdown: 1.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-mdx-jsx/2.1.0: + resolution: {integrity: sha512-KzgzfWMhdteDkrY4mQtyvTU5bc/W4ppxhe9SzelO6QUUiwLAM+Et2Dnjjprik74a336kHdo0zKm7Tp+n6FFeRg==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.4 + '@types/mdast': 3.0.10 + ccount: 2.0.1 + mdast-util-to-markdown: 1.3.0 + parse-entities: 4.0.0 + stringify-entities: 4.0.3 + unist-util-remove-position: 4.0.1 + unist-util-stringify-position: 3.0.2 + vfile-message: 3.1.2 + dev: true + + /mdast-util-mdx/2.0.0: + resolution: {integrity: sha512-M09lW0CcBT1VrJUaF/PYxemxxHa7SLDHdSn94Q9FhxjCQfuW7nMAWKWimTmA3OyDMSTH981NN1csW1X+HPSluw==} + dependencies: + mdast-util-mdx-expression: 1.3.0 + mdast-util-mdx-jsx: 2.1.0 + mdast-util-mdxjs-esm: 1.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-mdxjs-esm/1.3.0: + resolution: {integrity: sha512-7N5ihsOkAEGjFotIX9p/YPdl4TqUoMxL4ajNz7PbT89BqsdWJuBC9rvgt6wpbwTZqWWR0jKWqQbwsOWDBUZv4g==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.4 + '@types/mdast': 3.0.10 + mdast-util-from-markdown: 1.2.0 + mdast-util-to-markdown: 1.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-to-hast/12.2.0: + resolution: {integrity: sha512-YDwT5KhGzLgPpSnQhAlK1+WpCW4gsPmNNAxUNMkMTDhxQyPp2eX86WOelnKnLKEvSpfxqJbPbInHFkefXZBhEA==} + dependencies: + '@types/hast': 2.3.4 + '@types/mdast': 3.0.10 + '@types/mdurl': 1.0.2 + mdast-util-definitions: 5.1.1 + mdurl: 1.0.1 + micromark-util-sanitize-uri: 1.0.0 + trim-lines: 3.0.1 + unist-builder: 3.0.0 + unist-util-generated: 2.0.0 + unist-util-position: 4.0.3 + unist-util-visit: 4.1.1 + dev: true + + /mdast-util-to-markdown/1.3.0: + resolution: {integrity: sha512-6tUSs4r+KK4JGTTiQ7FfHmVOaDrLQJPmpjD6wPMlHGUVXoG9Vjc3jIeP+uyBWRf8clwB2blM+W7+KrlMYQnftA==} + dependencies: + '@types/mdast': 3.0.10 + '@types/unist': 2.0.6 + longest-streak: 3.0.1 + mdast-util-to-string: 3.1.0 + micromark-util-decode-string: 1.0.2 + unist-util-visit: 4.1.1 + zwitch: 2.0.2 + dev: true + + /mdast-util-to-string/3.1.0: + resolution: {integrity: sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==} + dev: true + /mdn-data/2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} dev: true + /mdurl/1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + dev: true + /media-typer/0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -13663,6 +14050,265 @@ packages: engines: {node: '>= 0.6'} dev: true + /micromark-core-commonmark/1.0.6: + resolution: {integrity: sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-factory-destination: 1.0.0 + micromark-factory-label: 1.0.2 + micromark-factory-space: 1.0.0 + micromark-factory-title: 1.0.2 + micromark-factory-whitespace: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-chunked: 1.0.0 + micromark-util-classify-character: 1.0.0 + micromark-util-html-tag-name: 1.1.0 + micromark-util-normalize-identifier: 1.0.0 + micromark-util-resolve-all: 1.0.0 + micromark-util-subtokenize: 1.0.2 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: true + + /micromark-extension-mdx-expression/1.0.3: + resolution: {integrity: sha512-TjYtjEMszWze51NJCZmhv7MEBcgYRgb3tJeMAJ+HQCAaZHHRBaDCccqQzGizR/H4ODefP44wRTgOn2vE5I6nZA==} + dependencies: + micromark-factory-mdx-expression: 1.0.6 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-events-to-acorn: 1.2.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: true + + /micromark-extension-mdx-jsx/1.0.3: + resolution: {integrity: sha512-VfA369RdqUISF0qGgv2FfV7gGjHDfn9+Qfiv5hEwpyr1xscRj/CiVRkU7rywGFCO7JwJ5L0e7CJz60lY52+qOA==} + dependencies: + '@types/acorn': 4.0.6 + estree-util-is-identifier-name: 2.0.1 + micromark-factory-mdx-expression: 1.0.6 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + vfile-message: 3.1.2 + dev: true + + /micromark-extension-mdx-md/1.0.0: + resolution: {integrity: sha512-xaRAMoSkKdqZXDAoSgp20Azm0aRQKGOl0RrS81yGu8Hr/JhMsBmfs4wR7m9kgVUIO36cMUQjNyiyDKPrsv8gOw==} + dependencies: + micromark-util-types: 1.0.2 + dev: true + + /micromark-extension-mdxjs-esm/1.0.3: + resolution: {integrity: sha512-2N13ol4KMoxb85rdDwTAC6uzs8lMX0zeqpcyx7FhS7PxXomOnLactu8WI8iBNXW8AVyea3KIJd/1CKnUmwrK9A==} + dependencies: + micromark-core-commonmark: 1.0.6 + micromark-util-character: 1.1.0 + micromark-util-events-to-acorn: 1.2.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + unist-util-position-from-estree: 1.1.1 + uvu: 0.5.6 + vfile-message: 3.1.2 + dev: true + + /micromark-extension-mdxjs/1.0.0: + resolution: {integrity: sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ==} + dependencies: + acorn: 8.7.1 + acorn-jsx: 5.3.2_acorn@8.7.1 + micromark-extension-mdx-expression: 1.0.3 + micromark-extension-mdx-jsx: 1.0.3 + micromark-extension-mdx-md: 1.0.0 + micromark-extension-mdxjs-esm: 1.0.3 + micromark-util-combine-extensions: 1.0.0 + micromark-util-types: 1.0.2 + dev: true + + /micromark-factory-destination/1.0.0: + resolution: {integrity: sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + dev: true + + /micromark-factory-label/1.0.2: + resolution: {integrity: sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: true + + /micromark-factory-mdx-expression/1.0.6: + resolution: {integrity: sha512-WRQIc78FV7KrCfjsEf/sETopbYjElh3xAmNpLkd1ODPqxEngP42eVRGbiPEQWpRV27LzqW+XVTvQAMIIRLPnNA==} + dependencies: + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-events-to-acorn: 1.2.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + unist-util-position-from-estree: 1.1.1 + uvu: 0.5.6 + vfile-message: 3.1.2 + dev: true + + /micromark-factory-space/1.0.0: + resolution: {integrity: sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-types: 1.0.2 + dev: true + + /micromark-factory-title/1.0.2: + resolution: {integrity: sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==} + dependencies: + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: true + + /micromark-factory-whitespace/1.0.0: + resolution: {integrity: sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==} + dependencies: + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + dev: true + + /micromark-util-character/1.1.0: + resolution: {integrity: sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==} + dependencies: + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + dev: true + + /micromark-util-chunked/1.0.0: + resolution: {integrity: sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==} + dependencies: + micromark-util-symbol: 1.0.1 + dev: true + + /micromark-util-classify-character/1.0.0: + resolution: {integrity: sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + dev: true + + /micromark-util-combine-extensions/1.0.0: + resolution: {integrity: sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==} + dependencies: + micromark-util-chunked: 1.0.0 + micromark-util-types: 1.0.2 + dev: true + + /micromark-util-decode-numeric-character-reference/1.0.0: + resolution: {integrity: sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==} + dependencies: + micromark-util-symbol: 1.0.1 + dev: true + + /micromark-util-decode-string/1.0.2: + resolution: {integrity: sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.0.0 + micromark-util-symbol: 1.0.1 + dev: true + + /micromark-util-encode/1.0.1: + resolution: {integrity: sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==} + dev: true + + /micromark-util-events-to-acorn/1.2.0: + resolution: {integrity: sha512-WWp3bf7xT9MppNuw3yPjpnOxa8cj5ACivEzXJKu0WwnjBYfzaBvIAT9KfeyI0Qkll+bfQtfftSwdgTH6QhTOKw==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.0 + estree-util-visit: 1.2.0 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + vfile-location: 4.0.1 + vfile-message: 3.1.2 + dev: true + + /micromark-util-html-tag-name/1.1.0: + resolution: {integrity: sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==} + dev: true + + /micromark-util-normalize-identifier/1.0.0: + resolution: {integrity: sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==} + dependencies: + micromark-util-symbol: 1.0.1 + dev: true + + /micromark-util-resolve-all/1.0.0: + resolution: {integrity: sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==} + dependencies: + micromark-util-types: 1.0.2 + dev: true + + /micromark-util-sanitize-uri/1.0.0: + resolution: {integrity: sha512-cCxvBKlmac4rxCGx6ejlIviRaMKZc0fWm5HdCHEeDWRSkn44l6NdYVRyU+0nT1XC72EQJMZV8IPHF+jTr56lAg==} + dependencies: + micromark-util-character: 1.1.0 + micromark-util-encode: 1.0.1 + micromark-util-symbol: 1.0.1 + dev: true + + /micromark-util-subtokenize/1.0.2: + resolution: {integrity: sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==} + dependencies: + micromark-util-chunked: 1.0.0 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + dev: true + + /micromark-util-symbol/1.0.1: + resolution: {integrity: sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==} + dev: true + + /micromark-util-types/1.0.2: + resolution: {integrity: sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==} + dev: true + + /micromark/3.0.10: + resolution: {integrity: sha512-ryTDy6UUunOXy2HPjelppgJ2sNfcPz1pLlMdA6Rz9jPzhLikWXv/irpWV/I2jd68Uhmny7hHxAlAhk4+vWggpg==} + dependencies: + '@types/debug': 4.1.7 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + micromark-core-commonmark: 1.0.6 + micromark-factory-space: 1.0.0 + micromark-util-character: 1.1.0 + micromark-util-chunked: 1.0.0 + micromark-util-combine-extensions: 1.0.0 + micromark-util-decode-numeric-character-reference: 1.0.0 + micromark-util-encode: 1.0.1 + micromark-util-normalize-identifier: 1.0.0 + micromark-util-resolve-all: 1.0.0 + micromark-util-sanitize-uri: 1.0.0 + micromark-util-subtokenize: 1.0.2 + micromark-util-symbol: 1.0.1 + micromark-util-types: 1.0.2 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: true + /micromatch/4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -13875,6 +14521,11 @@ packages: engines: {node: '>=10'} dev: false + /mri/1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: true + /mrmime/1.0.1: resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} engines: {node: '>=10'} @@ -14479,6 +15130,19 @@ packages: dependencies: callsites: 3.1.0 + /parse-entities/4.0.0: + resolution: {integrity: sha512-5nk9Fn03x3rEhGaX1FU6IDwG/k+GxLXlFAkgrbM1asuAFl3BhdQWvASaIsmwWypRNcZKHPYnIuOSfIWEyEQnPQ==} + dependencies: + '@types/unist': 2.0.6 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + dev: true + /parse-json/5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -14598,6 +15262,13 @@ packages: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} dev: true + /periscopic/3.0.4: + resolution: {integrity: sha512-SFx68DxCv0Iyo6APZuw/AKewkkThGwssmU0QWtTlvov3VAtPX+QJ4CadwSaz8nrT5jPIuxdvJWB4PnD2KNDxQg==} + dependencies: + estree-walker: 3.0.1 + is-reference: 3.0.0 + dev: true + /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -15174,6 +15845,10 @@ packages: object-assign: 4.1.1 react-is: 16.13.1 + /property-information/6.1.1: + resolution: {integrity: sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==} + dev: true + /proto-list/1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} dev: true @@ -15690,6 +16365,34 @@ packages: engines: {node: '>= 0.10'} dev: true + /remark-mdx/2.1.3: + resolution: {integrity: sha512-3SmtXOy9+jIaVctL8Cs3VAQInjRLGOwNXfrBB9KCT+EpJpKD3PQiy0x8hUNGyjQmdyOs40BqgPU7kYtH9uoR6w==} + dependencies: + mdast-util-mdx: 2.0.0 + micromark-extension-mdxjs: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /remark-parse/10.0.1: + resolution: {integrity: sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==} + dependencies: + '@types/mdast': 3.0.10 + mdast-util-from-markdown: 1.2.0 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /remark-rehype/10.1.0: + resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + dependencies: + '@types/hast': 2.3.4 + '@types/mdast': 3.0.10 + mdast-util-to-hast: 12.2.0 + unified: 10.1.2 + dev: true + /renderkid/3.0.0: resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} dependencies: @@ -15978,6 +16681,13 @@ packages: dependencies: tslib: 2.4.0 + /sade/1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + dev: true + /safari-14-idb-fix/3.0.0: resolution: {integrity: sha512-eBNFLob4PMq8JA1dGyFn6G97q3/WzNtFK4RnzT1fnLq+9RyrGknzYiM/9B12MnKAxuj1IXr7UKYtTNtjyKMBog==} dev: false @@ -16503,6 +17213,10 @@ packages: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} dev: true + /space-separated-tokens/2.0.1: + resolution: {integrity: sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==} + dev: true + /spdy-transport/3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} dependencies: @@ -16697,6 +17411,13 @@ packages: dependencies: safe-buffer: 5.2.1 + /stringify-entities/4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + dev: true + /strip-ansi/3.0.1: resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} engines: {node: '>=0.10.0'} @@ -16811,6 +17532,12 @@ packages: resolution: {integrity: sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==} dev: false + /style-to-object/0.3.0: + resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} + dependencies: + inline-style-parser: 0.1.1 + dev: true + /style9/0.13.3: resolution: {integrity: sha512-mQ39P2a4o5vHzy80vdpG4JfolQkBNxjvIvQen2JkM4/EdF4KEl0vOBCobD4Dd43aW2HoOzFuEVYHmsdmJoMs2g==} engines: {node: '>=12'} @@ -17254,6 +17981,10 @@ packages: hasBin: true dev: true + /trim-lines/3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: true + /trim-repeated/1.0.0: resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} engines: {node: '>=0.10.0'} @@ -17261,6 +17992,10 @@ packages: escape-string-regexp: 1.0.5 dev: true + /trough/2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + dev: true + /ts-debounce/4.0.0: resolution: {integrity: sha512-+1iDGY6NmOGidq7i7xZGA4cm8DAa6fqdYcvO5Z6yBevH++Bdo9Qt/mN0TzHUgcCcKv1gmh9+W5dHqz8pMWbCbg==} dev: true @@ -17488,6 +18223,18 @@ packages: engines: {node: '>=4'} dev: true + /unified/10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + dependencies: + '@types/unist': 2.0.6 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 5.3.4 + dev: true + /union/0.5.0: resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} engines: {node: '>= 0.8.0'} @@ -17495,6 +18242,60 @@ packages: qs: 6.11.0 dev: true + /unist-builder/3.0.0: + resolution: {integrity: sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ==} + dependencies: + '@types/unist': 2.0.6 + dev: true + + /unist-util-generated/2.0.0: + resolution: {integrity: sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw==} + dev: true + + /unist-util-is/5.1.1: + resolution: {integrity: sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==} + dev: true + + /unist-util-position-from-estree/1.1.1: + resolution: {integrity: sha512-xtoY50b5+7IH8tFbkw64gisG9tMSpxDjhX9TmaJJae/XuxQ9R/Kc8Nv1eOsf43Gt4KV/LkriMy9mptDr7XLcaw==} + dependencies: + '@types/unist': 2.0.6 + dev: true + + /unist-util-position/4.0.3: + resolution: {integrity: sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ==} + dependencies: + '@types/unist': 2.0.6 + dev: true + + /unist-util-remove-position/4.0.1: + resolution: {integrity: sha512-0yDkppiIhDlPrfHELgB+NLQD5mfjup3a8UYclHruTJWmY74je8g+CIFr79x5f6AkmzSwlvKLbs63hC0meOMowQ==} + dependencies: + '@types/unist': 2.0.6 + unist-util-visit: 4.1.1 + dev: true + + /unist-util-stringify-position/3.0.2: + resolution: {integrity: sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==} + dependencies: + '@types/unist': 2.0.6 + dev: true + + /unist-util-visit-parents/5.1.1: + resolution: {integrity: sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 5.1.1 + dev: true + + /unist-util-visit/4.1.1: + resolution: {integrity: sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 5.1.1 + unist-util-visit-parents: 5.1.1 + dev: true + /universalify/0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -17644,6 +18445,17 @@ packages: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true + /uvu/0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + dequal: 2.0.3 + diff: 5.1.0 + kleur: 4.1.5 + sade: 1.8.1 + dev: true + /v8-compile-cache-lib/3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true @@ -17684,6 +18496,29 @@ packages: extsprintf: 1.3.0 dev: true + /vfile-location/4.0.1: + resolution: {integrity: sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==} + dependencies: + '@types/unist': 2.0.6 + vfile: 5.3.4 + dev: true + + /vfile-message/3.1.2: + resolution: {integrity: sha512-QjSNP6Yxzyycd4SVOtmKKyTsSvClqBPJcd00Z0zuPj3hOIjg0rUPG6DbFGPvUKRgYyaIWLPKpuEclcuvb3H8qA==} + dependencies: + '@types/unist': 2.0.6 + unist-util-stringify-position: 3.0.2 + dev: true + + /vfile/5.3.4: + resolution: {integrity: sha512-KI+7cnst03KbEyN1+JE504zF5bJBZa+J+CrevLeyIMq0aPU681I2rQ5p4PlnQ6exFtWiUrg26QUdFMnAKR6PIw==} + dependencies: + '@types/unist': 2.0.6 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.2 + vfile-message: 3.1.2 + dev: true + /void-elements/3.1.0: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} @@ -18244,3 +19079,7 @@ packages: react: optional: true dev: false + + /zwitch/2.0.2: + resolution: {integrity: sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA==} + dev: true From 85838c77a101cad77941ba2c4f3b3f13ff462ca0 Mon Sep 17 00:00:00 2001 From: mitsuha Date: Tue, 23 Aug 2022 21:25:38 +0800 Subject: [PATCH 13/81] opti: 1.adjust eventlistener; --- .../workspace/docs/components/toc/TOC.tsx | 15 +++- .../src/pages/workspace/docs/utils/toc.ts | 79 +++++++++++++------ 2 files changed, 66 insertions(+), 28 deletions(-) diff --git a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx index 513e2913a6..be567780f7 100644 --- a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx +++ b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx @@ -11,8 +11,10 @@ import { import { useParams } from 'react-router'; import { BLOCK_TYPES, + destroyEventList, getContentByAsyncBlocks, getPageTOC, + type TocType, } from '../../utils/toc'; const StyledTOCItem = styled('a')<{ type?: string; isActive?: boolean }>( @@ -119,19 +121,24 @@ const renderTOCContent = tocDataSource => { export const Toc = (props: Props) => { const { editor } = props; const { page_id } = useParams(); - const [tocDataSource, setTocDataSource] = useState([]); - const [activeBlockId, setActiveBlockId] = useState('blockId'); + const [tocDataSource, setTocDataSource] = useState([]); + const [activeBlockId, setActiveBlockId] = useState(''); + const [blockEventListeners, setBlockEventListeners] = useState([]); const updateTocDataSource = useCallback(async () => { + destroyEventList(blockEventListeners); + const { children = [] } = (await editor.queryByPageId(page_id))?.[0] || {}; const asyncBlocks = (await editor.getBlockByIds(children)) || []; - const tocDataSource = getPageTOC( + const { tocContents, eventListeners } = await getContentByAsyncBlocks( asyncBlocks, - await getContentByAsyncBlocks(asyncBlocks, updateTocDataSource) + updateTocDataSource ); + const tocDataSource = getPageTOC(asyncBlocks, tocContents); setTocDataSource(tocDataSource); + setBlockEventListeners(eventListeners); }, [editor, page_id]); useEffect(() => { diff --git a/apps/ligo-virgo/src/pages/workspace/docs/utils/toc.ts b/apps/ligo-virgo/src/pages/workspace/docs/utils/toc.ts index 8331b0726d..2ef9a39032 100644 --- a/apps/ligo-virgo/src/pages/workspace/docs/utils/toc.ts +++ b/apps/ligo-virgo/src/pages/workspace/docs/utils/toc.ts @@ -1,5 +1,11 @@ import { AsyncBlock } from '@toeverything/components/editor-core'; +export type TocType = { + id: string; + type: string; + text: string; +}; + export const BLOCK_TYPES = { GROUP: 'group', HEADING1: 'heading1', @@ -11,36 +17,51 @@ export const BLOCK_TYPES = { const getContentByAsyncBlocks = async ( asyncBlocks: AsyncBlock[] = [], callback: () => void -): Promise => { - /* maybe should recast it to tail recursion */ - return await Promise.all( - asyncBlocks.map(async (asyncBlock: AsyncBlock) => { - const asyncBlocks = await asyncBlock.children(); +): Promise<{ + tocContents: any[]; + eventListeners: (() => void | undefined)[]; +}> => { + const eventListeners = []; - if (asyncBlocks?.length) { - return getContentByAsyncBlocks(asyncBlocks, callback); - } + const collect = async (asyncBlocks): Promise => { + /* maybe should recast it to tail recursion */ + return await Promise.all( + asyncBlocks.map(async (asyncBlock: AsyncBlock) => { + const asyncBlocks = await asyncBlock.children(); - /* get update notice */ - asyncBlock.onUpdate(callback); + if (asyncBlocks?.length) { + return collect(asyncBlocks); + } - const { id, type } = asyncBlock; - if (Object.values(BLOCK_TYPES).includes(type)) { - const properties = await asyncBlock.getProperties(); + /* get update notice */ + const destroyHandler = asyncBlock.onUpdate(callback); - return { - id, - type, - text: properties?.text?.value?.[0]?.text || '', - }; - } + /* collect destroy handlers */ + eventListeners.push(destroyHandler); - return null; - }) - ); + const { id, type } = asyncBlock; + if (Object.values(BLOCK_TYPES).includes(type)) { + const properties = await asyncBlock.getProperties(); + + return { + id, + type, + text: properties?.text?.value?.[0]?.text || '', + }; + } + + return null; + }) + ); + }; + + return { + tocContents: await collect(asyncBlocks), + eventListeners, + }; }; -const getPageTOC = (asyncBlocks: AsyncBlock[], tocContents) => { +const getPageTOC = (asyncBlocks: AsyncBlock[], tocContents): TocType[] => { return tocContents .reduce((tocGroupContent, tocContent, index) => { const { id, type } = asyncBlocks[index]; @@ -62,4 +83,14 @@ const getPageTOC = (asyncBlocks: AsyncBlock[], tocContents) => { .filter(Boolean); }; -export { getPageTOC, getContentByAsyncBlocks }; +const destroyEventList = ( + eventListeners: (() => void | undefined)[] = [] +): boolean => { + for (const eventListener of eventListeners) { + eventListener?.(); + } + + return true; +}; + +export { getPageTOC, getContentByAsyncBlocks, destroyEventList }; From ab1fe668b4fb37fc3dac349c39e39d50d9f8f80a Mon Sep 17 00:00:00 2001 From: mitsuha Date: Wed, 24 Aug 2022 01:54:10 +0800 Subject: [PATCH 14/81] opti: 1.adjust eventlistener; --- .../workspace/docs/components/toc/TOC.tsx | 20 ++++++++++--- .../src/pages/workspace/docs/utils/toc.ts | 30 ++++++++++++------- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx index be567780f7..dd12469d90 100644 --- a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx +++ b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx @@ -14,6 +14,7 @@ import { destroyEventList, getContentByAsyncBlocks, getPageTOC, + listenerMap, type TocType, } from '../../utils/toc'; @@ -123,24 +124,35 @@ export const Toc = (props: Props) => { const { page_id } = useParams(); const [tocDataSource, setTocDataSource] = useState([]); const [activeBlockId, setActiveBlockId] = useState(''); - const [blockEventListeners, setBlockEventListeners] = useState([]); const updateTocDataSource = useCallback(async () => { - destroyEventList(blockEventListeners); + /* page listener: trigger update-notice when add new group */ + const pageAsyncBlock = (await editor.getBlockByIds([page_id]))?.[0]; + if (!listenerMap.has(pageAsyncBlock.id)) { + listenerMap.set( + pageAsyncBlock.id, + pageAsyncBlock.onUpdate(updateTocDataSource) + ); + } + /* block listener: trigger update-notice when change block content */ const { children = [] } = (await editor.queryByPageId(page_id))?.[0] || {}; const asyncBlocks = (await editor.getBlockByIds(children)) || []; - const { tocContents, eventListeners } = await getContentByAsyncBlocks( + const { tocContents } = await getContentByAsyncBlocks( asyncBlocks, updateTocDataSource ); + /* toc: flat content */ const tocDataSource = getPageTOC(asyncBlocks, tocContents); setTocDataSource(tocDataSource); - setBlockEventListeners(eventListeners); + + /* remove listener when unmount component */ + return destroyEventList; }, [editor, page_id]); + /* init toc and add page/block update-listener & unmount-listener */ useEffect(() => { (async () => { await updateTocDataSource(); diff --git a/apps/ligo-virgo/src/pages/workspace/docs/utils/toc.ts b/apps/ligo-virgo/src/pages/workspace/docs/utils/toc.ts index 2ef9a39032..b9a6e5dd56 100644 --- a/apps/ligo-virgo/src/pages/workspace/docs/utils/toc.ts +++ b/apps/ligo-virgo/src/pages/workspace/docs/utils/toc.ts @@ -13,16 +13,16 @@ export const BLOCK_TYPES = { HEADING3: 'heading3', }; +/* store page/block unmount-listener */ +export const listenerMap = new Map void>(); + /* 😞😞sorry, I don't know how to define unlimited dimensions array */ const getContentByAsyncBlocks = async ( asyncBlocks: AsyncBlock[] = [], callback: () => void ): Promise<{ tocContents: any[]; - eventListeners: (() => void | undefined)[]; }> => { - const eventListeners = []; - const collect = async (asyncBlocks): Promise => { /* maybe should recast it to tail recursion */ return await Promise.all( @@ -33,11 +33,14 @@ const getContentByAsyncBlocks = async ( return collect(asyncBlocks); } - /* get update notice */ - const destroyHandler = asyncBlock.onUpdate(callback); + /* add only once event listener for every block */ + if (!listenerMap.has(asyncBlock.id)) { + /* get update notice */ + const destroyHandler = asyncBlock.onUpdate(callback); - /* collect destroy handlers */ - eventListeners.push(destroyHandler); + /* collect destroy handlers */ + listenerMap.set(asyncBlock.id, destroyHandler); + } const { id, type } = asyncBlock; if (Object.values(BLOCK_TYPES).includes(type)) { @@ -57,10 +60,14 @@ const getContentByAsyncBlocks = async ( return { tocContents: await collect(asyncBlocks), - eventListeners, }; }; +/** + * get flat toc + * @param asyncBlocks + * @param tocContents + */ const getPageTOC = (asyncBlocks: AsyncBlock[], tocContents): TocType[] => { return tocContents .reduce((tocGroupContent, tocContent, index) => { @@ -83,9 +90,10 @@ const getPageTOC = (asyncBlocks: AsyncBlock[], tocContents): TocType[] => { .filter(Boolean); }; -const destroyEventList = ( - eventListeners: (() => void | undefined)[] = [] -): boolean => { +/* destroy page/block update-listener */ +const destroyEventList = (): boolean => { + const eventListeners = listenerMap.values(); + for (const eventListener of eventListeners) { eventListener?.(); } From a6848dda51ae409ffbd8fe1c550db1904f906031 Mon Sep 17 00:00:00 2001 From: Felix Yan Date: Tue, 23 Aug 2022 21:05:20 +0300 Subject: [PATCH 15/81] Correct a typo in README (#317) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b2507efa5b..8789712501 100644 --- a/README.md +++ b/README.md @@ -119,7 +119,7 @@ That's why we are making AFFiNE. Some of the most important features are: - Data is always stored locally by default - CRDTs are applied so that peer-to-peer collaboration is possible. -We appreciate the ideas of Monday, Airtable, and Notion databases. They have inspired us and shaped our product, helping us get it right when it comes to task management. But we also do things differently. We don't like doing things again and again. It's easy to set a todo with Markdown, but then why do you need to repeat and recreate data for a kanban or other databases. This is the power of AFFiNE. With AFFiNE, every block group has infinite views, for you to keep your single source of data, a signle source of truth. +We appreciate the ideas of Monday, Airtable, and Notion databases. They have inspired us and shaped our product, helping us get it right when it comes to task management. But we also do things differently. We don't like doing things again and again. It's easy to set a todo with Markdown, but then why do you need to repeat and recreate data for a kanban or other databases. This is the power of AFFiNE. With AFFiNE, every block group has infinite views, for you to keep your single source of data, a single source of truth. We would like to give special thanks to the innovators and pioneers who greatly inspired us: From eb02e62a0e0b17e58104bfa5c3353837fc1e17d5 Mon Sep 17 00:00:00 2001 From: lawvs <18554747+lawvs@users.noreply.github.com> Date: Wed, 24 Aug 2022 01:20:52 +0800 Subject: [PATCH 16/81] feat: new useBlockRender API --- .../editor-core/src/render-block/Context.tsx | 32 ++++ .../src/render-block/RenderBlock.tsx | 9 +- .../src/render-block/RenderBlockChildren.tsx | 35 +++- .../src/render-block/RenderKanbanBlock.tsx | 56 ++++++ .../src/render-block/WithTreeViewChildren.tsx | 181 ++++++++++++++++++ .../editor-core/src/render-block/index.ts | 2 + 6 files changed, 307 insertions(+), 8 deletions(-) create mode 100644 libs/components/editor-core/src/render-block/Context.tsx create mode 100644 libs/components/editor-core/src/render-block/RenderKanbanBlock.tsx create mode 100644 libs/components/editor-core/src/render-block/WithTreeViewChildren.tsx diff --git a/libs/components/editor-core/src/render-block/Context.tsx b/libs/components/editor-core/src/render-block/Context.tsx new file mode 100644 index 0000000000..8a1b68465c --- /dev/null +++ b/libs/components/editor-core/src/render-block/Context.tsx @@ -0,0 +1,32 @@ +import { genErrorObj } from '@toeverything/utils'; +import { createContext, PropsWithChildren, useContext } from 'react'; +import { RenderBlockProps } from './RenderBlock'; + +type BlockRenderProps = { + blockRender: (args: RenderBlockProps) => JSX.Element | null; +}; + +export const BlockRenderContext = createContext( + genErrorObj( + 'Failed to get BlockChildrenContext! The context only can use under the "render-root"' + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ) as any +); + +export const BlockRenderProvider = ({ + blockRender, + children, +}: PropsWithChildren) => { + return ( + + {children} + + ); +}; + +export const useBlockRender = () => { + const { blockRender } = useContext(BlockRenderContext); + return { + BlockRender: blockRender, + }; +}; diff --git a/libs/components/editor-core/src/render-block/RenderBlock.tsx b/libs/components/editor-core/src/render-block/RenderBlock.tsx index 0a1531a709..1dc945e870 100644 --- a/libs/components/editor-core/src/render-block/RenderBlock.tsx +++ b/libs/components/editor-core/src/render-block/RenderBlock.tsx @@ -4,7 +4,12 @@ import { useCallback, useMemo } from 'react'; import { useEditor } from '../Contexts'; import { useBlock } from '../hooks'; -interface RenderBlockProps { +/** + * Render nothing + */ +export const NullBlockRender = (): null => null; + +export interface RenderBlockProps { blockId: string; hasContainer?: boolean; } @@ -29,7 +34,7 @@ export function RenderBlock({ if (block?.type) { return editor.getView(block.type).View; } - return () => null; + return (): null => null; }, [editor, block?.type]); if (!block) { diff --git a/libs/components/editor-core/src/render-block/RenderBlockChildren.tsx b/libs/components/editor-core/src/render-block/RenderBlockChildren.tsx index 4c87ccc8e8..d79d0cd002 100644 --- a/libs/components/editor-core/src/render-block/RenderBlockChildren.tsx +++ b/libs/components/editor-core/src/render-block/RenderBlockChildren.tsx @@ -1,16 +1,39 @@ +import { styled } from '@toeverything/components/ui'; import type { AsyncBlock } from '../editor'; -import { RenderBlock } from './RenderBlock'; +import { useBlockRender } from './Context'; +import { NullBlockRender } from './RenderBlock'; -interface RenderChildrenProps { +export interface RenderChildrenProps { block: AsyncBlock; + indent?: boolean; } -export const RenderBlockChildren = ({ block }: RenderChildrenProps) => { +export const RenderBlockChildren = ({ + block, + indent = true, +}: RenderChildrenProps) => { + const { BlockRender } = useBlockRender(); + if (BlockRender === NullBlockRender) { + return null; + } + return block.childrenIds.length ? ( - <> + {block.childrenIds.map(childId => { - return ; + return ; })} - + ) : null; }; + +/** + * Indent rendering child nodes + */ +const StyledIdentWrapper = styled('div')<{ indent?: boolean }>( + ({ indent }) => ({ + display: 'flex', + flexDirection: 'column', + // TODO: marginLeft should use theme provided by styled + ...(indent && { marginLeft: '30px' }), + }) +); diff --git a/libs/components/editor-core/src/render-block/RenderKanbanBlock.tsx b/libs/components/editor-core/src/render-block/RenderKanbanBlock.tsx new file mode 100644 index 0000000000..54f9e2276e --- /dev/null +++ b/libs/components/editor-core/src/render-block/RenderKanbanBlock.tsx @@ -0,0 +1,56 @@ +import { styled } from '@toeverything/components/ui'; +import { useBlock } from '../hooks'; +import { BlockRenderProvider } from './Context'; +import { NullBlockRender, RenderBlock, RenderBlockProps } from './RenderBlock'; + +/** + * Render block without children. + */ +const BlockWithoutChildrenRender = ({ blockId }: RenderBlockProps) => { + return ( + + + + ); +}; + +/** + * Render a block, but only one level of children. + */ +const OneLevelBlockRender = ({ blockId }: RenderBlockProps) => { + return ( + + + + ); +}; + +export const KanbanBlockRender = ({ blockId }: RenderBlockProps) => { + const { block } = useBlock(blockId); + + if (!block) { + return ( + + + + ); + } + + return ( + + + {block?.childrenIds.map(childId => ( + + + + ))} + + ); +}; + +const StyledBorder = styled('div')({ + border: '1px solid #E0E6EB', + borderRadius: '5px', + margin: '4px', + padding: '0 4px', +}); diff --git a/libs/components/editor-core/src/render-block/WithTreeViewChildren.tsx b/libs/components/editor-core/src/render-block/WithTreeViewChildren.tsx new file mode 100644 index 0000000000..8c3642ef6d --- /dev/null +++ b/libs/components/editor-core/src/render-block/WithTreeViewChildren.tsx @@ -0,0 +1,181 @@ +import { styled } from '@toeverything/components/ui'; +import type { + ComponentPropsWithoutRef, + ComponentPropsWithRef, + CSSProperties, + ReactElement, +} from 'react'; +import { forwardRef } from 'react'; +import { CreateView } from '../editor'; +import { useBlockRender } from './Context'; +import { NullBlockRender } from './RenderBlock'; + +type WithChildrenConfig = { + indent: CSSProperties['marginLeft']; +}; + +const defaultConfig: WithChildrenConfig = { + indent: '30px', +}; + +const TreeView = forwardRef< + HTMLDivElement, + { lastItem?: boolean } & ComponentPropsWithRef<'div'> +>(({ lastItem = false, children, onClick, ...restProps }, ref) => { + return ( + + + + + {lastItem && } + + {/* maybe need a child wrapper */} + {children} + + ); +}); + +const CollapsedNode = forwardRef< + HTMLDivElement, + ComponentPropsWithoutRef<'div'> +>((props, ref) => { + return ( + + ··· + + ); +}); + +/** + * Indent rendering child nodes + */ +export const withTreeViewChildren = ( + creator: (props: CreateView) => ReactElement, + customConfig: Partial = {} +) => { + const config = { + ...defaultConfig, + ...customConfig, + }; + + return (props: CreateView) => { + const { block } = props; + const { BlockRender } = useBlockRender(); + const collapsed = block.getProperty('collapsed')?.value; + const childrenIds = block.childrenIds; + const showChildren = + !collapsed && + childrenIds.length > 0 && + BlockRender !== NullBlockRender; + + const handleCollapse = () => { + block.setProperty('collapsed', { value: true }); + }; + + const handleExpand = () => { + block.setProperty('collapsed', { value: false }); + }; + + return ( + <> + {creator(props)} + + {collapsed && ( + + )} + {showChildren && + childrenIds.map((childId, idx) => { + return ( + + + + ); + })} + + ); + }; +}; + +const TREE_COLOR = '#D5DFE6'; +// adjust left and right margins of the the tree line +const TREE_LINE_LEFT_OFFSET = '-16px'; +// determine the position of the horizontal line by the type of the item +const TREE_LINE_TOP_OFFSET = '20px'; // '50%' +const TREE_LINE_WIDTH = '12px'; + +const TreeWrapper = styled('div')({ + position: 'relative', + display: 'flex', +}); + +const StyledTreeView = styled('div')({ + position: 'absolute', + left: TREE_LINE_LEFT_OFFSET, + height: '100%', +}); + +const Line = styled('div')({ + position: 'absolute', + cursor: 'pointer', + backgroundColor: TREE_COLOR, + // somehow tldraw would override this + boxSizing: 'content-box!important' as any, + // See [Can I add background color only for padding?](https://stackoverflow.com/questions/14628601/can-i-add-background-color-only-for-padding) + backgroundClip: 'content-box', + backgroundOrigin: 'content-box', + // Increase click hot spot + padding: '10px', +}); + +const VerticalLine = styled(Line)<{ last: boolean }>(({ last }) => ({ + width: '1px', + height: last ? TREE_LINE_TOP_OFFSET : '100%', + paddingTop: 0, + paddingBottom: 0, + transform: 'translate(-50%, 0)', + + opacity: last ? 0 : 'unset', +})); + +const HorizontalLine = styled(Line)<{ last: boolean }>(({ last }) => ({ + width: TREE_LINE_WIDTH, + height: '1px', + paddingLeft: 0, + paddingRight: 0, + top: TREE_LINE_TOP_OFFSET, + transform: 'translate(0, -50%)', + opacity: last ? 0 : 'unset', +})); + +const Collapsed = styled('div')({ + cursor: 'pointer', + display: 'inline-block', + color: '#98ACBD', + padding: '8px', +}); + +const LastItemRadius = styled('div')({ + boxSizing: 'content-box', + position: 'absolute', + left: '-0.5px', + top: 0, + height: TREE_LINE_TOP_OFFSET, + bottom: '50%', + width: TREE_LINE_WIDTH, + borderWidth: '1px', + borderStyle: 'solid', + borderLeftColor: TREE_COLOR, + borderBottomColor: TREE_COLOR, + borderTop: 'none', + borderRight: 'none', + borderRadius: '0 0 0 3px', + pointerEvents: 'none', +}); diff --git a/libs/components/editor-core/src/render-block/index.ts b/libs/components/editor-core/src/render-block/index.ts index 820bac8b57..0d5c809c4c 100644 --- a/libs/components/editor-core/src/render-block/index.ts +++ b/libs/components/editor-core/src/render-block/index.ts @@ -1,2 +1,4 @@ +export { BlockRenderProvider, useBlockRender } from './Context'; export * from './RenderBlock'; export * from './RenderBlockChildren'; +export { withTreeViewChildren } from './WithTreeViewChildren'; From dd24711f21ef6097c99edade1a40202b23802374 Mon Sep 17 00:00:00 2001 From: lawvs <18554747+lawvs@users.noreply.github.com> Date: Wed, 24 Aug 2022 01:25:25 +0800 Subject: [PATCH 17/81] refactor: update editor --- libs/components/affine-editor/src/Editor.tsx | 5 +- libs/components/editor-core/src/Contexts.tsx | 28 +++++-- .../components/editor-core/src/RenderRoot.tsx | 82 +++++++++---------- libs/components/editor-core/src/index.ts | 27 +++--- .../editor-core/src/kanban/Context.tsx | 10 ++- 5 files changed, 81 insertions(+), 71 deletions(-) diff --git a/libs/components/affine-editor/src/Editor.tsx b/libs/components/affine-editor/src/Editor.tsx index c280bea984..f1edb2ce74 100644 --- a/libs/components/affine-editor/src/Editor.tsx +++ b/libs/components/affine-editor/src/Editor.tsx @@ -1,7 +1,6 @@ import { forwardRef, useEffect, useImperativeHandle, useRef } from 'react'; import { - RenderBlock, RenderRoot, type BlockEditor, } from '@toeverything/components/editor-core'; @@ -88,9 +87,7 @@ export const AffineEditor = forwardRef( editor={editor} editorElement={AffineEditor as any} scrollBlank={scrollBlank} - > - - + /> ); } ); diff --git a/libs/components/editor-core/src/Contexts.tsx b/libs/components/editor-core/src/Contexts.tsx index 418fe0e8b4..0b7c7d2270 100644 --- a/libs/components/editor-core/src/Contexts.tsx +++ b/libs/components/editor-core/src/Contexts.tsx @@ -1,22 +1,34 @@ -import { createContext, useContext } from 'react'; -import type { BlockEditor, AsyncBlock } from './editor'; import { genErrorObj } from '@toeverything/utils'; +import { createContext, PropsWithChildren, useContext } from 'react'; +import type { AsyncBlock, BlockEditor } from './editor'; -const RootContext = createContext<{ +type EditorProps = { editor: BlockEditor; // TODO: Temporary fix, dependencies in the new architecture are bottom-up, editors do not need to be passed down from the top editorElement: () => JSX.Element; -}>( +}; + +const EditorContext = createContext( genErrorObj( - 'Failed to get context! The context only can use under the "render-root"' + 'Failed to get EditorContext! The context only can use under the "render-root"' // eslint-disable-next-line @typescript-eslint/no-explicit-any ) as any ); -export const EditorProvider = RootContext.Provider; - export const useEditor = () => { - return useContext(RootContext); + return useContext(EditorContext); +}; + +export const EditorProvider = ({ + editor, + editorElement, + children, +}: PropsWithChildren) => { + return ( + + {children} + + ); }; /** diff --git a/libs/components/editor-core/src/RenderRoot.tsx b/libs/components/editor-core/src/RenderRoot.tsx index cbafd3ea75..c1f1dd0d49 100644 --- a/libs/components/editor-core/src/RenderRoot.tsx +++ b/libs/components/editor-core/src/RenderRoot.tsx @@ -4,12 +4,12 @@ import { services, type ReturnUnobserve, } from '@toeverything/datasource/db-service'; -import type { PropsWithChildren } from 'react'; import React, { useCallback, useEffect, useRef, useState } from 'react'; import { EditorProvider } from './Contexts'; import type { BlockEditor } from './editor'; import { useIsOnDrag } from './hooks'; import { addNewGroup, appendNewGroup } from './recast-block'; +import { BlockRenderProvider, RenderBlock } from './render-block'; import { SelectionRect, SelectionRef } from './Selection'; interface RenderRootProps { @@ -24,11 +24,7 @@ interface RenderRootProps { const MAX_PAGE_WIDTH = 5000; export const MIN_PAGE_WIDTH = 1480; -export const RenderRoot = ({ - editor, - editorElement, - children, -}: PropsWithChildren) => { +export const RenderRoot = ({ editor, editorElement }: RenderRootProps) => { const selectionRef = useRef(null); const triggeredBySelect = useRef(false); const [pageWidth, setPageWidth] = useState(MIN_PAGE_WIDTH); @@ -158,39 +154,43 @@ export const RenderRoot = ({ }; return ( - - { - if (ref != null && ref !== editor.container) { - editor.container = ref; - editor.getHooks().render(); - } - }} - onMouseMove={onMouseMove} - onMouseDown={onMouseDown} - onMouseUp={onMouseUp} - onMouseLeave={onMouseLeave} - onMouseOut={onMouseOut} - onContextMenu={onContextmenu} - onKeyDown={onKeyDown} - onKeyDownCapture={onKeyDownCapture} - onKeyUp={onKeyUp} - onDragOver={onDragOver} - onDragLeave={onDragLeave} - onDragOverCapture={onDragOverCapture} - onDragEnd={onDragEnd} - onDrop={onDrop} - isOnDrag={isOnDrag} - > - - {children} - - {/** TODO: remove selectionManager insert */} - {editor && } - {editor.isEdgeless ? null : } - {patchedNodes} - + + + { + if (ref != null && ref !== editor.container) { + editor.container = ref; + editor.getHooks().render(); + } + }} + onMouseMove={onMouseMove} + onMouseDown={onMouseDown} + onMouseUp={onMouseUp} + onMouseLeave={onMouseLeave} + onMouseOut={onMouseOut} + onContextMenu={onContextmenu} + onKeyDown={onKeyDown} + onKeyDownCapture={onKeyDownCapture} + onKeyUp={onKeyUp} + onDragOver={onDragOver} + onDragLeave={onDragLeave} + onDragOverCapture={onDragOverCapture} + onDragEnd={onDragEnd} + onDrop={onDrop} + isOnDrag={isOnDrag} + > + + + + {/** TODO: remove selectionManager insert */} + {editor && ( + + )} + {editor.isEdgeless ? null : } + {patchedNodes} + + ); }; @@ -251,7 +251,7 @@ function ScrollBlank({ editor }: { editor: BlockEditor }) { ); return ( - - {children} - + + + {children} + + ); }; From a4dc7bf127d2c2905527919dc01fd06e9324534e Mon Sep 17 00:00:00 2001 From: lawvs <18554747+lawvs@users.noreply.github.com> Date: Wed, 24 Aug 2022 01:35:04 +0800 Subject: [PATCH 18/81] refactor: update block --- .../src/blocks/bullet/BulletView.tsx | 27 +- .../editor-blocks/src/blocks/bullet/index.ts | 14 +- .../src/blocks/grid-item/GridItemRender.tsx | 5 +- .../editor-blocks/src/blocks/grid/Grid.tsx | 17 +- .../src/blocks/group/ScenePage.tsx | 2 +- .../blocks/group/scene-kanban/CardItem.tsx | 5 +- .../src/blocks/numbered/NumberedView.tsx | 17 +- .../src/blocks/numbered/index.ts | 11 +- .../src/blocks/text/TextView.tsx | 5 +- .../src/blocks/todo/TodoView.tsx | 62 +++-- .../editor-blocks/src/blocks/todo/index.ts | 16 +- .../BlockContainer/BlockContainer.tsx | 2 +- .../IndentWrapper/IndentWrapper.tsx | 17 -- .../src/components/IndentWrapper/index.ts | 1 - .../source-view/format-url/youtube.ts | 1 + .../src/utils/WithTreeViewChildren.tsx | 236 ------------------ .../src/render-block/RenderBlock.tsx | 1 + 17 files changed, 96 insertions(+), 343 deletions(-) delete mode 100644 libs/components/editor-blocks/src/components/IndentWrapper/IndentWrapper.tsx delete mode 100644 libs/components/editor-blocks/src/components/IndentWrapper/index.ts delete mode 100644 libs/components/editor-blocks/src/utils/WithTreeViewChildren.tsx diff --git a/libs/components/editor-blocks/src/blocks/bullet/BulletView.tsx b/libs/components/editor-blocks/src/blocks/bullet/BulletView.tsx index 9f77eda6cb..b2f76e46f9 100644 --- a/libs/components/editor-blocks/src/blocks/bullet/BulletView.tsx +++ b/libs/components/editor-blocks/src/blocks/bullet/BulletView.tsx @@ -1,29 +1,28 @@ import type { TextProps } from '@toeverything/components/common'; import { ContentColumnValue, - services, Protocol, + services, } from '@toeverything/datasource/db-service'; import { type CreateView } from '@toeverything/framework/virgo'; import { useEffect, useRef, useState } from 'react'; +import { + BlockPendantProvider, + RenderBlockChildren, + supportChildren, + useOnSelect, +} from '@toeverything/components/editor-core'; +import { styled } from '@toeverything/components/ui'; +import { BlockContainer } from '../../components/BlockContainer'; +import { List } from '../../components/style-container'; import { TextManage, type ExtendedTextUtils, } from '../../components/text-manage'; import { tabBlock } from '../../utils/indent'; +import { BulletIcon, getChildrenType, NumberType } from './data'; import { BulletBlock, BulletProperties } from './types'; -import { - supportChildren, - RenderBlockChildren, - useOnSelect, - BlockPendantProvider, -} from '@toeverything/components/editor-core'; -import { List } from '../../components/style-container'; -import { getChildrenType, BulletIcon, NumberType } from './data'; -import { IndentWrapper } from '../../components/IndentWrapper'; -import { BlockContainer } from '../../components/BlockContainer'; -import { styled } from '@toeverything/components/ui'; export const defaultBulletProps: BulletProperties = { text: { value: [{ text: '' }] }, @@ -208,9 +207,7 @@ export const BulletView = ({ block, editor }: CreateView) => {
- - - + ); }; diff --git a/libs/components/editor-blocks/src/blocks/bullet/index.ts b/libs/components/editor-blocks/src/blocks/bullet/index.ts index 087afb3056..761aab03a1 100644 --- a/libs/components/editor-blocks/src/blocks/bullet/index.ts +++ b/libs/components/editor-blocks/src/blocks/bullet/index.ts @@ -1,18 +1,16 @@ +import { + DefaultColumnsValue, + Protocol, +} from '@toeverything/datasource/db-service'; import { AsyncBlock, BaseView, - CreateView, + getTextHtml, getTextProperties, SelectBlock, - getTextHtml, } from '@toeverything/framework/virgo'; -import { - Protocol, - DefaultColumnsValue, -} from '@toeverything/datasource/db-service'; // import { withTreeViewChildren } from '../../utils/with-tree-view-children'; -import { defaultBulletProps, BulletView } from './BulletView'; -import { IndentWrapper } from '../../components/IndentWrapper'; +import { BulletView, defaultBulletProps } from './BulletView'; export class BulletBlock extends BaseView { public type = Protocol.Block.Type.bullet; diff --git a/libs/components/editor-blocks/src/blocks/grid-item/GridItemRender.tsx b/libs/components/editor-blocks/src/blocks/grid-item/GridItemRender.tsx index 3a598b3145..1dece91699 100644 --- a/libs/components/editor-blocks/src/blocks/grid-item/GridItemRender.tsx +++ b/libs/components/editor-blocks/src/blocks/grid-item/GridItemRender.tsx @@ -1,4 +1,4 @@ -import { RenderBlock } from '@toeverything/components/editor-core'; +import { useBlockRender } from '@toeverything/components/editor-core'; import { ChildrenView, CreateView } from '@toeverything/framework/virgo'; export const GridItemRender = function ( @@ -6,10 +6,11 @@ export const GridItemRender = function ( ) { const GridItem = function (props: CreateView) { const { block } = props; + const { BlockRender } = useBlockRender(); const children = ( <> {block.childrenIds.map(id => { - return ; + return ; })} ); diff --git a/libs/components/editor-blocks/src/blocks/grid/Grid.tsx b/libs/components/editor-blocks/src/blocks/grid/Grid.tsx index 4ecf47f3b5..4b5bfd49b3 100644 --- a/libs/components/editor-blocks/src/blocks/grid/Grid.tsx +++ b/libs/components/editor-blocks/src/blocks/grid/Grid.tsx @@ -1,16 +1,16 @@ -import { RenderBlock } from '@toeverything/components/editor-core'; -import { CreateView } from '@toeverything/framework/virgo'; -import React, { useEffect, useRef, useState } from 'react'; -import { GridHandle } from './GirdHandle'; +import { useBlockRender } from '@toeverything/components/editor-core'; import { styled } from '@toeverything/components/ui'; +import { Protocol } from '@toeverything/datasource/db-service'; +import { CreateView } from '@toeverything/framework/virgo'; +import { debounce, domToRect, Point } from '@toeverything/utils'; +import clsx from 'clsx'; +import React, { useEffect, useRef, useState } from 'react'; import ReactDOM from 'react-dom'; import { GRID_ITEM_CLASS_NAME, GRID_ITEM_CONTENT_CLASS_NAME, } from '../grid-item/GridItem'; -import { debounce, domToRect, Point } from '@toeverything/utils'; -import clsx from 'clsx'; -import { Protocol } from '@toeverything/datasource/db-service'; +import { GridHandle } from './GirdHandle'; const DB_UPDATE_DELAY = 50; const GRID_ON_DRAG_CLASS = 'grid-layout-on-drag'; @@ -31,6 +31,7 @@ export const Grid = function (props: CreateView) { const originalLeftWidth = useRef(gridItemMinWidth); const originalRightWidth = useRef(gridItemMinWidth); const [alertHandleId, setAlertHandleId] = useState(null); + const { BlockRender } = useBlockRender(); const getLeftRightGridItemDomByIndex = (index: number) => { const gridItems = Array.from(gridContainerRef.current?.children).filter( @@ -226,7 +227,7 @@ export const Grid = function (props: CreateView) { key={id} className={GRID_ITEM_CLASS_NAME} > - + handleDragGrid(event, i)} editor={editor} diff --git a/libs/components/editor-blocks/src/blocks/group/ScenePage.tsx b/libs/components/editor-blocks/src/blocks/group/ScenePage.tsx index 6145bec114..739927626d 100644 --- a/libs/components/editor-blocks/src/blocks/group/ScenePage.tsx +++ b/libs/components/editor-blocks/src/blocks/group/ScenePage.tsx @@ -2,5 +2,5 @@ import { RenderBlockChildren } from '@toeverything/components/editor-core'; import type { CreateView } from '@toeverything/framework/virgo'; export const ScenePage = ({ block }: CreateView) => { - return ; + return ; }; diff --git a/libs/components/editor-blocks/src/blocks/group/scene-kanban/CardItem.tsx b/libs/components/editor-blocks/src/blocks/group/scene-kanban/CardItem.tsx index 837772bed2..8f79a6c208 100644 --- a/libs/components/editor-blocks/src/blocks/group/scene-kanban/CardItem.tsx +++ b/libs/components/editor-blocks/src/blocks/group/scene-kanban/CardItem.tsx @@ -1,6 +1,6 @@ import { KanbanCard, - RenderBlock, + useBlockRender, useEditor, useKanban, } from '@toeverything/components/editor-core'; @@ -94,6 +94,7 @@ export const CardItem = ({ const [editable, setEditable] = useState(false); const showKanbanRefPageFlag = useFlag('ShowKanbanRefPage', false); const { editor } = useEditor(); + const { BlockRender } = useBlockRender(); const onAddItem = async () => { setEditable(true); @@ -114,7 +115,7 @@ export const CardItem = ({ setEditable(false)}> - + {showKanbanRefPageFlag && !editable && ( diff --git a/libs/components/editor-blocks/src/blocks/numbered/NumberedView.tsx b/libs/components/editor-blocks/src/blocks/numbered/NumberedView.tsx index 38dac6fc75..74bcfab504 100644 --- a/libs/components/editor-blocks/src/blocks/numbered/NumberedView.tsx +++ b/libs/components/editor-blocks/src/blocks/numbered/NumberedView.tsx @@ -1,8 +1,8 @@ import { TextProps } from '@toeverything/components/common'; import { ContentColumnValue, - services, Protocol, + services, } from '@toeverything/datasource/db-service'; import { type CreateView } from '@toeverything/framework/virgo'; import { useEffect, useRef, useState } from 'react'; @@ -11,18 +11,17 @@ import { type ExtendedTextUtils, } from '../../components/text-manage'; import { tabBlock } from '../../utils/indent'; -import { IndentWrapper } from '../../components/IndentWrapper'; import type { Numbered, NumberedAsyncBlock } from './types'; -import { getChildrenType, getNumber } from './data'; import { - supportChildren, - RenderBlockChildren, - useOnSelect, BlockPendantProvider, + RenderBlockChildren, + supportChildren, + useOnSelect, } from '@toeverything/components/editor-core'; -import { List } from '../../components/style-container'; import { BlockContainer } from '../../components/BlockContainer'; +import { List } from '../../components/style-container'; +import { getChildrenType, getNumber } from './data'; export const defaultTodoProps: Numbered = { text: { value: [{ text: '' }] }, @@ -204,9 +203,7 @@ export const NumberedView = ({ block, editor }: CreateView) => { - - - + ); }; diff --git a/libs/components/editor-blocks/src/blocks/numbered/index.ts b/libs/components/editor-blocks/src/blocks/numbered/index.ts index b8b3c3dc0a..92187be81b 100644 --- a/libs/components/editor-blocks/src/blocks/numbered/index.ts +++ b/libs/components/editor-blocks/src/blocks/numbered/index.ts @@ -1,17 +1,16 @@ +import { + DefaultColumnsValue, + Protocol, +} from '@toeverything/datasource/db-service'; import { AsyncBlock, BaseView, + getTextHtml, getTextProperties, SelectBlock, - getTextHtml, } from '@toeverything/framework/virgo'; -import { - Protocol, - DefaultColumnsValue, -} from '@toeverything/datasource/db-service'; // import { withTreeViewChildren } from '../../utils/with-tree-view-children'; import { defaultTodoProps, NumberedView } from './NumberedView'; -import { IndentWrapper } from '../../components/IndentWrapper'; export class NumberedBlock extends BaseView { public type = Protocol.Block.Type.numbered; diff --git a/libs/components/editor-blocks/src/blocks/text/TextView.tsx b/libs/components/editor-blocks/src/blocks/text/TextView.tsx index 5edf231217..fcb06238e2 100644 --- a/libs/components/editor-blocks/src/blocks/text/TextView.tsx +++ b/libs/components/editor-blocks/src/blocks/text/TextView.tsx @@ -12,7 +12,6 @@ import { styled } from '@toeverything/components/ui'; import { Protocol } from '@toeverything/datasource/db-service'; import { CreateView } from '@toeverything/framework/virgo'; import { BlockContainer } from '../../components/BlockContainer'; -import { IndentWrapper } from '../../components/IndentWrapper'; import { TextManage } from '../../components/text-manage'; import { dedentBlock, tabBlock } from '../../utils/indent'; interface CreateTextView extends CreateView { @@ -255,9 +254,7 @@ export const TextView = ({ handleTab={onTab} /> - - - + ); }; diff --git a/libs/components/editor-blocks/src/blocks/todo/TodoView.tsx b/libs/components/editor-blocks/src/blocks/todo/TodoView.tsx index 8982f4695e..9bf24a37ec 100644 --- a/libs/components/editor-blocks/src/blocks/todo/TodoView.tsx +++ b/libs/components/editor-blocks/src/blocks/todo/TodoView.tsx @@ -1,11 +1,17 @@ import { TextProps } from '@toeverything/components/common'; +import { + AsyncBlock, + BlockPendantProvider, + CreateView, + useOnSelect, +} from '@toeverything/components/editor-core'; import { styled } from '@toeverything/components/ui'; import { ContentColumnValue, Protocol, } from '@toeverything/datasource/db-service'; -import { AsyncBlock, type CreateView } from '@toeverything/framework/virgo'; -import { useRef } from 'react'; +import { useRef, useState } from 'react'; +import { BlockContainer } from '../../components/BlockContainer'; import { TextManage, type ExtendedTextUtils, @@ -36,6 +42,10 @@ const todoIsEmpty = (contentValue: ContentColumnValue): boolean => { export const TodoView = ({ block, editor }: CreateView) => { const properties = { ...defaultTodoProps, ...block.getProperties() }; const text_ref = useRef(null); + const [isSelect, setIsSelect] = useState(false); + useOnSelect(block.id, (isSelect: boolean) => { + setIsSelect(isSelect); + }); const turn_into_text_block = async () => { // Convert to text block @@ -121,28 +131,34 @@ export const TodoView = ({ block, editor }: CreateView) => { }; return ( - -
- -
+ + + +
+ +
-
- -
-
+
+ +
+
+ + ); }; diff --git a/libs/components/editor-blocks/src/blocks/todo/index.ts b/libs/components/editor-blocks/src/blocks/todo/index.ts index c6580009d0..78f317103a 100644 --- a/libs/components/editor-blocks/src/blocks/todo/index.ts +++ b/libs/components/editor-blocks/src/blocks/todo/index.ts @@ -1,18 +1,16 @@ import { - BaseView, - getTextProperties, AsyncBlock, - SelectBlock, + BaseView, getTextHtml, -} from '@toeverything/framework/virgo'; -// import type { CreateView } from '@toeverything/framework/virgo'; + getTextProperties, + SelectBlock, + withTreeViewChildren, +} from '@toeverything/components/editor-core'; import { - Protocol, DefaultColumnsValue, + Protocol, } from '@toeverything/datasource/db-service'; -// import { withTreeViewChildren } from '../../utils/with-tree-view-children'; -import { withTreeViewChildren } from '../../utils/WithTreeViewChildren'; -import { TodoView, defaultTodoProps } from './TodoView'; +import { defaultTodoProps, TodoView } from './TodoView'; import type { TodoAsyncBlock } from './types'; export class TodoBlock extends BaseView { diff --git a/libs/components/editor-blocks/src/components/BlockContainer/BlockContainer.tsx b/libs/components/editor-blocks/src/components/BlockContainer/BlockContainer.tsx index 00da92a813..4c043ce163 100644 --- a/libs/components/editor-blocks/src/components/BlockContainer/BlockContainer.tsx +++ b/libs/components/editor-blocks/src/components/BlockContainer/BlockContainer.tsx @@ -23,7 +23,7 @@ export const BlockContainer = function ({ ); }; -export const Container = styled('div')<{ selected: boolean }>( +export const Container = styled('div')<{ selected?: boolean }>( ({ selected, theme }) => ({ backgroundColor: selected ? theme.affine.palette.textSelected : '', marginBottom: '2px', diff --git a/libs/components/editor-blocks/src/components/IndentWrapper/IndentWrapper.tsx b/libs/components/editor-blocks/src/components/IndentWrapper/IndentWrapper.tsx deleted file mode 100644 index 93aa9d34a1..0000000000 --- a/libs/components/editor-blocks/src/components/IndentWrapper/IndentWrapper.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { PropsWithChildren } from 'react'; -import { ChildrenView } from '@toeverything/framework/virgo'; -import { styled } from '@toeverything/components/ui'; - -/** - * Indent rendering child nodes - */ -export const IndentWrapper = (props: PropsWithChildren) => { - return {props.children}; -}; - -const StyledIdentWrapper = styled('div')({ - display: 'flex', - flexDirection: 'column', - // TODO: marginLeft should use theme provided by styled - marginLeft: '30px', -}); diff --git a/libs/components/editor-blocks/src/components/IndentWrapper/index.ts b/libs/components/editor-blocks/src/components/IndentWrapper/index.ts deleted file mode 100644 index e4234a916d..0000000000 --- a/libs/components/editor-blocks/src/components/IndentWrapper/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './IndentWrapper'; diff --git a/libs/components/editor-blocks/src/components/source-view/format-url/youtube.ts b/libs/components/editor-blocks/src/components/source-view/format-url/youtube.ts index 56f165a515..7cd540b12e 100644 --- a/libs/components/editor-blocks/src/components/source-view/format-url/youtube.ts +++ b/libs/components/editor-blocks/src/components/source-view/format-url/youtube.ts @@ -1,4 +1,5 @@ export const isYoutubeUrl = (url?: string): boolean => { + if (!url) return false; const allowedHosts = ['www.youtu.be', 'www.youtube.com']; const host = new URL(url).host; return allowedHosts.includes(host); diff --git a/libs/components/editor-blocks/src/utils/WithTreeViewChildren.tsx b/libs/components/editor-blocks/src/utils/WithTreeViewChildren.tsx deleted file mode 100644 index e7e497f2ef..0000000000 --- a/libs/components/editor-blocks/src/utils/WithTreeViewChildren.tsx +++ /dev/null @@ -1,236 +0,0 @@ -import { - BlockPendantProvider, - CreateView, - RenderBlock, - useCurrentView, - useOnSelect, -} from '@toeverything/components/editor-core'; -import { styled } from '@toeverything/components/ui'; -import type { - ComponentPropsWithoutRef, - ComponentPropsWithRef, - CSSProperties, - ReactElement, -} from 'react'; -import { forwardRef, useState } from 'react'; -import { SCENE_CONFIG } from '../blocks/group/config'; -import { BlockContainer } from '../components/BlockContainer'; - -type WithChildrenConfig = { - indent: CSSProperties['marginLeft']; -}; - -const defaultConfig: WithChildrenConfig = { - indent: '30px', -}; - -const TreeView = forwardRef< - HTMLDivElement, - { lastItem?: boolean } & ComponentPropsWithRef<'div'> ->(({ lastItem = false, children, onClick, ...restProps }, ref) => { - return ( - - - - - {lastItem && } - - {/* maybe need a child wrapper */} - {children} - - ); -}); - -interface ChildrenViewProp { - childrenIds: string[]; - handleCollapse: () => void; - indent?: string | number; -} - -const ChildrenView = ({ - childrenIds, - handleCollapse, - indent, -}: ChildrenViewProp) => { - const [currentView] = useCurrentView(); - const isKanbanScene = currentView.type === SCENE_CONFIG.KANBAN; - - return ( - - {childrenIds.map((childId, idx) => { - if (isKanbanScene) { - return ( - - - - ); - } - - return ( - - - - ); - })} - - ); -}; - -const CollapsedNode = forwardRef< - HTMLDivElement, - ComponentPropsWithoutRef<'div'> ->((props, ref) => { - return ( - - ··· - - ); -}); - -/** - * Indent rendering child nodes - */ -export const withTreeViewChildren = ( - creator: (props: CreateView) => ReactElement, - customConfig: Partial = {} -) => { - const config = { - ...defaultConfig, - ...customConfig, - }; - - return (props: CreateView) => { - const { block, editor } = props; - const collapsed = block.getProperty('collapsed')?.value; - const childrenIds = block.childrenIds; - const showChildren = !collapsed && childrenIds.length > 0; - - const [isSelect, setIsSelect] = useState(false); - useOnSelect(block.id, (isSelect: boolean) => { - setIsSelect(isSelect); - }); - const handleCollapse = () => { - block.setProperty('collapsed', { value: true }); - }; - - const handleExpand = () => { - block.setProperty('collapsed', { value: false }); - }; - - return ( - - -
{creator(props)}
-
- - {collapsed && ( - - )} - {showChildren && ( - - )} -
- ); - }; -}; - -const Wrapper = styled('div')({ display: 'flex', flexDirection: 'column' }); - -const Children = Wrapper; - -const TREE_COLOR = '#D5DFE6'; -// adjust left and right margins of the the tree line -const TREE_LINE_LEFT_OFFSET = '-16px'; -// determine the position of the horizontal line by the type of the item -const TREE_LINE_TOP_OFFSET = '20px'; // '50%' -const TREE_LINE_WIDTH = '12px'; - -const TreeWrapper = styled('div')({ - position: 'relative', -}); - -const StyledTreeView = styled('div')({ - position: 'absolute', - left: TREE_LINE_LEFT_OFFSET, - height: '100%', -}); - -const Line = styled('div')({ - position: 'absolute', - cursor: 'pointer', - backgroundColor: TREE_COLOR, - // somehow tldraw would override this - boxSizing: 'content-box!important' as any, - // See [Can I add background color only for padding?](https://stackoverflow.com/questions/14628601/can-i-add-background-color-only-for-padding) - backgroundClip: 'content-box', - backgroundOrigin: 'content-box', - // Increase click hot spot - padding: '10px', -}); - -const VerticalLine = styled(Line)<{ last: boolean }>(({ last }) => ({ - width: '1px', - height: last ? TREE_LINE_TOP_OFFSET : '100%', - paddingTop: 0, - paddingBottom: 0, - transform: 'translate(-50%, 0)', - - opacity: last ? 0 : 'unset', -})); - -const HorizontalLine = styled(Line)<{ last: boolean }>(({ last }) => ({ - width: TREE_LINE_WIDTH, - height: '1px', - paddingLeft: 0, - paddingRight: 0, - top: TREE_LINE_TOP_OFFSET, - transform: 'translate(0, -50%)', - opacity: last ? 0 : 'unset', -})); - -const Collapsed = styled('div')({ - cursor: 'pointer', - display: 'inline-block', - color: '#98ACBD', - padding: '8px', -}); - -const LastItemRadius = styled('div')({ - boxSizing: 'content-box', - position: 'absolute', - left: '-0.5px', - top: 0, - height: TREE_LINE_TOP_OFFSET, - bottom: '50%', - width: TREE_LINE_WIDTH, - borderWidth: '1px', - borderStyle: 'solid', - borderLeftColor: TREE_COLOR, - borderBottomColor: TREE_COLOR, - borderTop: 'none', - borderRight: 'none', - borderRadius: '0 0 0 3px', - pointerEvents: 'none', -}); - -const StyledBorder = styled('div')({ - border: '1px solid #E0E6EB', - borderRadius: '5px', - margin: '4px', -}); diff --git a/libs/components/editor-core/src/render-block/RenderBlock.tsx b/libs/components/editor-core/src/render-block/RenderBlock.tsx index 1dc945e870..c843274166 100644 --- a/libs/components/editor-core/src/render-block/RenderBlock.tsx +++ b/libs/components/editor-core/src/render-block/RenderBlock.tsx @@ -69,4 +69,5 @@ export function RenderBlock({ const BlockContainer = styled('div')(({ theme }) => ({ fontSize: theme.typography.body1.fontSize, + flex: 1, })); From 123091c1aaa37bfd80da7c891542a9f33cde8d8f Mon Sep 17 00:00:00 2001 From: lawvs <18554747+lawvs@users.noreply.github.com> Date: Wed, 24 Aug 2022 02:07:37 +0800 Subject: [PATCH 19/81] chore: add warn comment --- libs/components/editor-core/src/render-block/Context.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libs/components/editor-core/src/render-block/Context.tsx b/libs/components/editor-core/src/render-block/Context.tsx index 8a1b68465c..90c89eec0e 100644 --- a/libs/components/editor-core/src/render-block/Context.tsx +++ b/libs/components/editor-core/src/render-block/Context.tsx @@ -13,6 +13,9 @@ export const BlockRenderContext = createContext( ) as any ); +/** + * CAUTION! DO NOT PROVIDE A DYNAMIC BLOCK RENDER! + */ export const BlockRenderProvider = ({ blockRender, children, From 86d4449db4cfef61f9a23c17b405eb883dd91875 Mon Sep 17 00:00:00 2001 From: DarkSky Date: Wed, 24 Aug 2022 04:14:14 +0800 Subject: [PATCH 20/81] chore: ci fix & module split --- apps/ligo-virgo/webpack.config.js | 23 ++++++++----- apps/venus/webpack.config.js | 33 ++++--------------- libs/datasource/jwt/src/adapter/yjs/binary.ts | 9 ++--- 3 files changed, 26 insertions(+), 39 deletions(-) diff --git a/apps/ligo-virgo/webpack.config.js b/apps/ligo-virgo/webpack.config.js index 4bf721409c..11be2e1c76 100644 --- a/apps/ligo-virgo/webpack.config.js +++ b/apps/ligo-virgo/webpack.config.js @@ -43,6 +43,7 @@ module.exports = function (webpackConfig) { ...config.output, filename: '[name].[contenthash:8].js', chunkFilename: '[name].[chunkhash:8].js', + hashDigestLength: 8, hashFunction: undefined, }; config.optimization = { @@ -67,21 +68,21 @@ module.exports = function (webpackConfig) { chunks: 'all', enforce: true, }, - auth: { - test: /[\\/]node_modules[\\/](@authing|@?firebase)/, - name: 'auth', - priority: -5, - chunks: 'all', - }, + // auth: { + // test: /[\\/]node_modules[\\/](@authing|@?firebase)/, + // name: 'auth', + // priority: -5, + // chunks: 'all', + // }, edgeless: { test: /(libs\/components\/board-|[\\/]node_modules[\\/]@tldraw)/, name: 'edgeless', priority: -7, chunks: 'all', }, - editor: { + paper: { test: /(libs\/framework\/(ligo|virgo|editor)|[\\/]node_modules[\\/](@codemirror|@lezer|slate))/, - name: 'editor', + name: 'paper', priority: -8, chunks: 'all', }, @@ -176,7 +177,11 @@ module.exports = function (webpackConfig) { publicPath: '/', }), new Style9Plugin(), - isProd && new MiniCssExtractPlugin(), + isProd && + new MiniCssExtractPlugin({ + filename: '[name].[contenthash:8].css', + chunkFilename: '[id].[chunkhash:8].css', + }), isProd && new CompressionPlugin({ test: /\.(js|css|html|svg|ttf|woff)$/, diff --git a/apps/venus/webpack.config.js b/apps/venus/webpack.config.js index def037d387..57c78f9f3b 100644 --- a/apps/venus/webpack.config.js +++ b/apps/venus/webpack.config.js @@ -39,6 +39,7 @@ module.exports = function (webpackConfig) { ...config.output, filename: '[name].[contenthash:8].js', chunkFilename: '[name].[chunkhash:8].js', + hashDigestLength: 8, hashFunction: undefined, }; config.optimization = { @@ -98,22 +99,7 @@ module.exports = function (webpackConfig) { }, ], }); - config.module.rules.unshift({ - test: /\.scss$/i, - use: [ - 'style-loader', - { - loader: 'css-loader', - options: { - sourceMap: false, - }, - }, - { - loader: 'postcss-loader', - }, - ], - }); - config.module.rules.splice(6); + config.module.rules.splice(4); } else { config.output = { ...config.output, @@ -155,7 +141,11 @@ module.exports = function (webpackConfig) { template: path.resolve(__dirname, './src/template.html'), publicPath: '/', }), - isProd && new MiniCssExtractPlugin(), + isProd && + new MiniCssExtractPlugin({ + filename: '[name].[contenthash:8].css', + chunkFilename: '[id].[chunkhash:8].css', + }), isProd && new CompressionPlugin({ test: /\.(js|css|html|svg|ttf|woff)$/, @@ -201,15 +191,6 @@ const addEmotionBabelPlugin = config => { // See https://github.com/mui/material-ui/issues/27380#issuecomment-928973157 // See https://github.com/emotion-js/emotion/tree/main/packages/babel-plugin#importmap importMap: { - '@toeverything/components/ui': { - styled: { - canonicalImport: ['@emotion/styled', 'default'], - styledBaseImport: [ - '@toeverything/components/ui', - 'styled', - ], - }, - }, '@mui/material': { styled: { canonicalImport: ['@emotion/styled', 'default'], diff --git a/libs/datasource/jwt/src/adapter/yjs/binary.ts b/libs/datasource/jwt/src/adapter/yjs/binary.ts index 468710ac4a..26f82684af 100644 --- a/libs/datasource/jwt/src/adapter/yjs/binary.ts +++ b/libs/datasource/jwt/src/adapter/yjs/binary.ts @@ -1,15 +1,16 @@ import { Array as YArray, Map as YMap } from 'yjs'; -import { RemoteKvService } from '@toeverything/datasource/remote-kv'; +import type { RemoteKvService } from '@toeverything/datasource/remote-kv'; export class YjsRemoteBinaries { private readonly _binaries: YMap>; // binary instance private readonly _remoteStorage?: RemoteKvService; - constructor(binaries: YMap>, remote_token?: string) { + constructor(binaries: YMap>, remoteToken?: string) { this._binaries = binaries; - if (remote_token) { - this._remoteStorage = new RemoteKvService(remote_token); + if (remoteToken) { + // TODO: remote kv need to refactor, we may use cloudflare kv + // this._remoteStorage = new RemoteKvService(remote_token); } else { console.warn(`Remote storage is not ready`); } From c4de1a606166cd7ec6e5f8c1308d98200e53738e Mon Sep 17 00:00:00 2001 From: mitsuha Date: Wed, 24 Aug 2022 09:08:12 +0800 Subject: [PATCH 21/81] opti: 1.adjust eventlistener; --- apps/ligo-virgo/src/pages/workspace/docs/utils/toc.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/ligo-virgo/src/pages/workspace/docs/utils/toc.ts b/apps/ligo-virgo/src/pages/workspace/docs/utils/toc.ts index b9a6e5dd56..9b550e9bbe 100644 --- a/apps/ligo-virgo/src/pages/workspace/docs/utils/toc.ts +++ b/apps/ligo-virgo/src/pages/workspace/docs/utils/toc.ts @@ -93,6 +93,7 @@ const getPageTOC = (asyncBlocks: AsyncBlock[], tocContents): TocType[] => { /* destroy page/block update-listener */ const destroyEventList = (): boolean => { const eventListeners = listenerMap.values(); + listenerMap.clear(); for (const eventListener of eventListeners) { eventListener?.(); From f2a21e6c3bf6a4c16dda09d405b1b2c4477c0d48 Mon Sep 17 00:00:00 2001 From: mitsuha Date: Wed, 24 Aug 2022 10:40:14 +0800 Subject: [PATCH 22/81] opti: 1.adjust eventlistener; --- apps/ligo-virgo/src/pages/workspace/docs/Page.tsx | 4 ++-- .../src/pages/workspace/docs/components/toc/TOC.tsx | 2 +- .../src/pages/workspace/docs/components/toc/index.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/ligo-virgo/src/pages/workspace/docs/Page.tsx b/apps/ligo-virgo/src/pages/workspace/docs/Page.tsx index 0bbcfb5d75..6d9d2fac90 100644 --- a/apps/ligo-virgo/src/pages/workspace/docs/Page.tsx +++ b/apps/ligo-virgo/src/pages/workspace/docs/Page.tsx @@ -23,7 +23,7 @@ import { useFlag } from '@toeverything/datasource/feature-flags'; import { CollapsiblePageTree } from './collapsible-page-tree'; import { Tabs } from './components/tabs'; import { TabMap, TAB_TITLE } from './components/tabs/Tabs'; -import { Toc } from './components/toc'; +import { TOC } from './components/toc'; import { WorkspaceName } from './workspace-name'; type PageProps = { @@ -92,7 +92,7 @@ export function Page(props: PageProps) { )} {activeTab === TabMap.get(TAB_TITLE.TOC).value && ( - TOC + TOC )} diff --git a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx index dd12469d90..a4c4fba27e 100644 --- a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx +++ b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx @@ -119,7 +119,7 @@ const renderTOCContent = tocDataSource => { ); }; -export const Toc = (props: Props) => { +export const TOC = (props: Props) => { const { editor } = props; const { page_id } = useParams(); const [tocDataSource, setTocDataSource] = useState([]); diff --git a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/index.ts b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/index.ts index 1e45e9bd09..e603af8242 100644 --- a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/index.ts +++ b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/index.ts @@ -1 +1 @@ -export { Toc } from './Toc'; +export { TOC } from './TOC'; From 617e9a06125671066787f097ef537c72e1d0baf9 Mon Sep 17 00:00:00 2001 From: DiamondThree Date: Wed, 24 Aug 2022 13:47:47 +0800 Subject: [PATCH 23/81] Bugfix/delete log (#315) * fix delete log * fix delete log --- libs/components/affine-board/src/Board.tsx | 5 +++-- libs/components/affine-board/src/hooks/use-shapes.ts | 3 ++- .../board-draw/src/components/command-panel/ArrowTo.tsx | 8 +++++--- libs/components/board-state/src/tldraw-app.ts | 4 ++-- libs/components/common/src/lib/text/EditableText.tsx | 2 +- 5 files changed, 13 insertions(+), 9 deletions(-) diff --git a/libs/components/affine-board/src/Board.tsx b/libs/components/affine-board/src/Board.tsx index 101d54d37b..9936d115a0 100644 --- a/libs/components/affine-board/src/Board.tsx +++ b/libs/components/affine-board/src/Board.tsx @@ -52,6 +52,7 @@ const AffineBoard = ({ }); const { shapes, bindings } = useShapes(workspace, rootBlockId); + useEffect(() => { if (app) { app.replacePageContent(shapes || {}, bindings, {}); @@ -109,7 +110,6 @@ const AffineBoard = ({ }); } shape.affineId = block.id; - Object.keys(bindings).forEach(bilingKey => { if ( bindings[bilingKey]?.fromId === shape.id @@ -148,7 +148,8 @@ const AffineBoard = ({ Object.assign(pageBindings, bindings); } }); - services.api.editorBlock.update({ + + await services.api.editorBlock.update({ workspace: workspace, id: rootBlockId, properties: { diff --git a/libs/components/affine-board/src/hooks/use-shapes.ts b/libs/components/affine-board/src/hooks/use-shapes.ts index beb8c50efa..ba1bf066ff 100644 --- a/libs/components/affine-board/src/hooks/use-shapes.ts +++ b/libs/components/affine-board/src/hooks/use-shapes.ts @@ -12,7 +12,7 @@ const getBindings = (workspace: string, rootBlockId: string) => { ids: [rootBlockId], }) .then(blcoks => { - return blcoks[0].properties.bindings?.value; + return blcoks[0]?.properties.bindings?.value; }); }; @@ -104,6 +104,7 @@ export const useShapes = (workspace: string, rootBlockId: string) => { return acc; }, {} as Record); + return { shapes: blocksShapes, bindings: JSON.parse(blocks?.bindings ?? '{}'), diff --git a/libs/components/board-draw/src/components/command-panel/ArrowTo.tsx b/libs/components/board-draw/src/components/command-panel/ArrowTo.tsx index 21f37a9fbc..84ef142ef0 100644 --- a/libs/components/board-draw/src/components/command-panel/ArrowTo.tsx +++ b/libs/components/board-draw/src/components/command-panel/ArrowTo.tsx @@ -21,6 +21,9 @@ export const ArrowTo = ({ app, shapes }: GroupAndUnGroupProps) => { let activeShape = shapes[0]; let toNextShapBindings: ArrowBinding[] = []; let bindingId = ''; + if (!activeShape) { + return; + } Object.keys(bindings).forEach(key => { if (bindings[key].toId === activeShape.id) { bindingId = bindings[key].fromId; @@ -35,7 +38,6 @@ export const ArrowTo = ({ app, shapes }: GroupAndUnGroupProps) => { toNextShapBindings.forEach(binding => { if (binding.toId !== activeShape.id) { allShape.forEach(item => { - console.log(item); if (item.id === binding.toId) { ArrowToArr.push(item); } @@ -44,7 +46,7 @@ export const ArrowTo = ({ app, shapes }: GroupAndUnGroupProps) => { }); setarrowToArr(ArrowToArr); return () => {}; - }, [app.page.bindings, app.shapes]); + }, [app.page.bindings]); const jumpToNextShap = (shape: TDShape) => { app.zoomToShapes([shape]); }; @@ -68,7 +70,7 @@ export const ArrowTo = ({ app, shapes }: GroupAndUnGroupProps) => {
} > - + diff --git a/libs/components/board-state/src/tldraw-app.ts b/libs/components/board-state/src/tldraw-app.ts index 34a392db72..98bffcf654 100644 --- a/libs/components/board-state/src/tldraw-app.ts +++ b/libs/components/board-state/src/tldraw-app.ts @@ -626,7 +626,7 @@ export class TldrawApp extends StateManager { private prev_bindings = this.page.bindings; private prev_assets = this.document.assets; - private _broadcastPageChanges = () => { + private _broadcastPageChanges = async () => { const visited = new Set(); const changedShapes: Record = {}; @@ -683,7 +683,7 @@ export class TldrawApp extends StateManager { Object.keys(changedAssets).length > 0 ) { this.just_sent = true; - this.callbacks.onChangePage?.( + await this.callbacks.onChangePage?.( this, changedShapes, changedBindings, diff --git a/libs/components/common/src/lib/text/EditableText.tsx b/libs/components/common/src/lib/text/EditableText.tsx index 8637246d7d..b2b2229fec 100644 --- a/libs/components/common/src/lib/text/EditableText.tsx +++ b/libs/components/common/src/lib/text/EditableText.tsx @@ -804,7 +804,7 @@ const EditorLeaf = ({ attributes, children, leaf }: any) => { backgroundColor: '#F2F5F9', borderRadius: '5px', color: '#3A4C5C', - padding: '3px 8px', + padding: '1px 8px', margin: '0 2px', }} > From 012c0441d0e96a4b6f2dead990ab69a32d064ad8 Mon Sep 17 00:00:00 2001 From: QiShaoXuan Date: Wed, 24 Aug 2022 14:41:21 +0800 Subject: [PATCH 24/81] refactor: recode html2block --- .../editor-blocks/src/blocks/bullet/index.ts | 78 +++--- .../editor-blocks/src/blocks/code/index.ts | 54 ++-- .../editor-blocks/src/blocks/divider/index.ts | 36 +-- .../src/blocks/embed-link/index.ts | 23 -- .../editor-blocks/src/blocks/figma/index.ts | 29 --- .../src/blocks/groupDvider/index.ts | 18 -- .../editor-blocks/src/blocks/image/index.ts | 34 ++- .../src/blocks/numbered/index.ts | 83 +++--- .../src/blocks/text/QuoteBlock.tsx | 105 +++----- .../src/blocks/text/TextBlock.tsx | 246 +++++------------- .../editor-blocks/src/blocks/todo/index.ts | 84 +++--- .../editor-blocks/src/blocks/youtube/index.ts | 29 --- .../src/utils/commonBlockClip.ts | 27 ++ libs/components/editor-core/package.json | 2 + .../src/editor/clipboard/clipboard-parse.ts | 134 ---------- .../src/editor/clipboard/clipboard.ts | 14 +- .../src/editor/clipboard/clipboardUtils.ts | 60 +++++ .../editor-core/src/editor/clipboard/copy.ts | 6 - .../editor-core/src/editor/clipboard/paste.ts | 172 +++++------- .../editor-core/src/editor/clipboard/types.ts | 7 +- .../editor-core/src/editor/clipboard/utils.ts | 150 +++++++++++ .../editor-core/src/editor/editor.ts | 8 + .../editor-core/src/editor/index.ts | 5 +- .../editor-core/src/editor/views/base-view.ts | 16 +- pnpm-lock.yaml | 101 +++++++ 25 files changed, 693 insertions(+), 828 deletions(-) delete mode 100644 libs/components/editor-core/src/editor/clipboard/clipboard-parse.ts create mode 100644 libs/components/editor-core/src/editor/clipboard/utils.ts diff --git a/libs/components/editor-blocks/src/blocks/bullet/index.ts b/libs/components/editor-blocks/src/blocks/bullet/index.ts index 1577263af3..212575da31 100644 --- a/libs/components/editor-blocks/src/blocks/bullet/index.ts +++ b/libs/components/editor-blocks/src/blocks/bullet/index.ts @@ -1,9 +1,15 @@ -import { AsyncBlock, BaseView } from '@toeverything/framework/virgo'; +import { + AsyncBlock, + BaseView, + BlockEditor, + HTML2BlockResult, +} from '@toeverything/framework/virgo'; import { Protocol } from '@toeverything/datasource/db-service'; import { defaultBulletProps, BulletView } from './BulletView'; import { Block2HtmlProps, commonBlock2HtmlContent, + commonHTML2block, } from '../../utils/commonBlockClip'; export class BulletBlock extends BaseView { public type = Protocol.Block.Type.bullet; @@ -18,49 +24,41 @@ export class BulletBlock extends BaseView { } return block; } + override async html2block2({ + element, + editor, + }: { + element: Element; + editor: BlockEditor; + }): Promise { + if (element.tagName === 'UL') { + const firstList = element.querySelector('li'); - override html2block( - el: Element, - parseEl: (el: Element) => any[] - ): any[] | null { - const tag_name = el.tagName; - if (tag_name === 'UL') { - const result = []; - for (let i = 0; i < el.children.length; i++) { - const blocks_info = parseEl(el.children[i]); - result.push(...blocks_info); + if (!firstList || firstList.innerText.startsWith('[ ] ')) { + return null; } - return result.length > 0 ? result : null; + const children = Array.from(element.children); + const childrenBlockInfos = ( + await Promise.all( + children.map(childElement => + this.html2block2({ + editor, + element: childElement, + }) + ) + ) + ) + .flat() + .filter(v => v); + return childrenBlockInfos.length ? childrenBlockInfos : null; } - if (tag_name == 'LI' && !el.textContent.startsWith('[ ] ')) { - const childNodes = el.childNodes; - const texts = []; - const children = []; - for (let i = 0; i < childNodes.length; i++) { - const blocks_info = parseEl(childNodes[i] as Element); - for (let j = 0; j < blocks_info.length; j++) { - if (blocks_info[j].type === 'text') { - const block_texts = - blocks_info[j].properties.text.value; - texts.push(...block_texts); - } else { - children.push(blocks_info[j]); - } - } - } - return [ - { - type: this.type, - properties: { - text: { value: texts }, - }, - children: children, - }, - ]; - } - - return null; + return commonHTML2block({ + element, + editor, + type: this.type, + tagName: 'LI', + }); } override async block2html(props: Block2HtmlProps) { diff --git a/libs/components/editor-blocks/src/blocks/code/index.ts b/libs/components/editor-blocks/src/blocks/code/index.ts index a204779656..306d909716 100644 --- a/libs/components/editor-blocks/src/blocks/code/index.ts +++ b/libs/components/editor-blocks/src/blocks/code/index.ts @@ -1,9 +1,15 @@ -import { BaseView, AsyncBlock } from '@toeverything/framework/virgo'; +import { + BaseView, + AsyncBlock, + BlockEditor, + HTML2BlockResult, +} from '@toeverything/framework/virgo'; import { Protocol } from '@toeverything/datasource/db-service'; import { CodeView } from './CodeView'; import { Block2HtmlProps, commonBlock2HtmlContent, + commonHTML2block, } from '../../utils/commonBlockClip'; export class CodeBlock extends BaseView { @@ -21,39 +27,19 @@ export class CodeBlock extends BaseView { return block; } - // TODO: internal format not implemented yet - override html2block( - el: Element, - parseEl: (el: Element) => any[] - ): any[] | null { - const tag_name = el.tagName; - if (tag_name === 'CODE') { - const childNodes = el.childNodes; - let text_value = ''; - for (let i = 0; i < childNodes.length; i++) { - const blocks_info = parseEl(childNodes[i] as Element); - for (let j = 0; j < blocks_info.length; j++) { - if (blocks_info[j].type === 'text') { - const block_texts = - blocks_info[j].properties.text.value; - if (block_texts.length > 0) { - text_value += block_texts[0].text; - } - } - } - } - return [ - { - type: this.type, - properties: { - text: { value: [{ text: text_value }] }, - }, - children: [], - }, - ]; - } - - return null; + override async html2block2({ + element, + editor, + }: { + element: Element; + editor: BlockEditor; + }): Promise { + return commonHTML2block({ + element, + editor, + type: this.type, + tagName: 'CODE', + }); } override async block2html(props: Block2HtmlProps) { diff --git a/libs/components/editor-blocks/src/blocks/divider/index.ts b/libs/components/editor-blocks/src/blocks/divider/index.ts index eb4615963c..14f29b8807 100644 --- a/libs/components/editor-blocks/src/blocks/divider/index.ts +++ b/libs/components/editor-blocks/src/blocks/divider/index.ts @@ -1,34 +1,34 @@ import { AsyncBlock, BaseView, + BlockEditor, + HTML2BlockResult, SelectBlock, } from '@toeverything/framework/virgo'; import { Protocol } from '@toeverything/datasource/db-service'; import { DividerView } from './divider-view'; -import { Block2HtmlProps } from '../../utils/commonBlockClip'; +import { Block2HtmlProps, commonHTML2block } from '../../utils/commonBlockClip'; export class DividerBlock extends BaseView { type = Protocol.Block.Type.divider; View = DividerView; - override html2block( - el: Element, - parseEl: (el: Element) => any[] - ): any[] | null { - const tag_name = el.tagName; - if (tag_name === 'HR') { - return [ - { - type: this.type, - properties: { - text: {}, - }, - children: [], - }, - ]; - } - return null; + override async html2block2({ + element, + editor, + }: { + element: Element; + editor: BlockEditor; + }): Promise { + return commonHTML2block({ + element, + editor, + type: this.type, + tagName: 'HR', + ignoreEmptyElement: false, + }); } + override async block2html(props: Block2HtmlProps) { return `
`; } diff --git a/libs/components/editor-blocks/src/blocks/embed-link/index.ts b/libs/components/editor-blocks/src/blocks/embed-link/index.ts index 7674c71c3e..8b6e23f527 100644 --- a/libs/components/editor-blocks/src/blocks/embed-link/index.ts +++ b/libs/components/editor-blocks/src/blocks/embed-link/index.ts @@ -13,29 +13,6 @@ export class EmbedLinkBlock extends BaseView { type = Protocol.Block.Type.embedLink; View = EmbedLinkView; - override html2block( - el: Element, - parseEl: (el: Element) => any[] - ): any[] | null { - const tag_name = el.tagName; - if (tag_name === 'A' && el.parentElement?.childElementCount === 1) { - return [ - { - type: this.type, - properties: { - // TODO: Not sure what value to fill for name - embedLink: { - name: this.type, - value: el.getAttribute('href'), - }, - }, - children: [], - }, - ]; - } - - return null; - } override async block2html({ block }: Block2HtmlProps) { const url = block.getProperty('embedLink')?.value; return `
`; diff --git a/libs/components/editor-blocks/src/blocks/figma/index.ts b/libs/components/editor-blocks/src/blocks/figma/index.ts index 652abfbc1d..382429b137 100644 --- a/libs/components/editor-blocks/src/blocks/figma/index.ts +++ b/libs/components/editor-blocks/src/blocks/figma/index.ts @@ -13,35 +13,6 @@ export class FigmaBlock extends BaseView { type = Protocol.Block.Type.figma; View = FigmaView; - override html2block( - el: Element, - parseEl: (el: Element) => any[] - ): any[] | null { - const tag_name = el.tagName; - if (tag_name === 'A' && el.parentElement?.childElementCount === 1) { - const href = el.getAttribute('href'); - const allowedHosts = ['www.figma.com']; - const host = new URL(href).host; - - if (allowedHosts.includes(host)) { - return [ - { - type: this.type, - properties: { - // TODO: Not sure what value to fill for name - embedLink: { - name: this.type, - value: el.getAttribute('href'), - }, - }, - children: [], - }, - ]; - } - } - - return null; - } override async block2html({ block }: Block2HtmlProps) { const figmaUrl = block.getProperty('embedLink')?.value; return `

${figmaUrl}

`; diff --git a/libs/components/editor-blocks/src/blocks/groupDvider/index.ts b/libs/components/editor-blocks/src/blocks/groupDvider/index.ts index 52940173e6..458ef2f708 100644 --- a/libs/components/editor-blocks/src/blocks/groupDvider/index.ts +++ b/libs/components/editor-blocks/src/blocks/groupDvider/index.ts @@ -10,25 +10,7 @@ import { Block2HtmlProps } from '../../utils/commonBlockClip'; export class GroupDividerBlock extends BaseView { type = Protocol.Block.Type.groupDivider; View = GroupDividerView; - override html2block( - el: Element, - parseEl: (el: Element) => any[] - ): any[] | null { - const tag_name = el.tagName; - if (tag_name === 'HR') { - return [ - { - type: this.type, - properties: { - text: {}, - }, - children: [], - }, - ]; - } - return null; - } override async block2html(props: Block2HtmlProps) { return `
`; } diff --git a/libs/components/editor-blocks/src/blocks/image/index.ts b/libs/components/editor-blocks/src/blocks/image/index.ts index 190f83d72a..844ae43cb2 100644 --- a/libs/components/editor-blocks/src/blocks/image/index.ts +++ b/libs/components/editor-blocks/src/blocks/image/index.ts @@ -1,7 +1,12 @@ -import { BaseView } from '@toeverything/framework/virgo'; +import { + BaseView, + BlockEditor, + HTML2BlockResult, +} from '@toeverything/framework/virgo'; import { Protocol } from '@toeverything/datasource/db-service'; import { ImageView } from './ImageView'; import { Block2HtmlProps } from '../../utils/commonBlockClip'; +import { getRandomString } from '@toeverything/components/common'; export class ImageBlock extends BaseView { public override selectable = true; @@ -10,27 +15,30 @@ export class ImageBlock extends BaseView { View = ImageView; // TODO: needs to download the image and then upload it to get a new link and then assign it - override html2block( - el: Element, - parseEl: (el: Element) => any[] - ): any[] | null { - const tag_name = el.tagName; - if (tag_name === 'IMG') { + override async html2block2({ + element, + editor, + }: { + element: Element; + editor: BlockEditor; + }): Promise { + if (element.tagName === 'IMG') { return [ { type: this.type, properties: { - value: '', - url: el.getAttribute('src'), - name: el.getAttribute('src'), - size: 0, - type: 'link', + image: { + value: getRandomString('image'), + url: element.getAttribute('src'), + name: element.getAttribute('src'), + size: 0, + type: 'link', + }, }, children: [], }, ]; } - return null; } diff --git a/libs/components/editor-blocks/src/blocks/numbered/index.ts b/libs/components/editor-blocks/src/blocks/numbered/index.ts index d6eb9c1839..5c3f8a4e4e 100644 --- a/libs/components/editor-blocks/src/blocks/numbered/index.ts +++ b/libs/components/editor-blocks/src/blocks/numbered/index.ts @@ -1,9 +1,15 @@ -import { AsyncBlock, BaseView } from '@toeverything/framework/virgo'; +import { + AsyncBlock, + BaseView, + BlockEditor, + HTML2BlockResult, +} from '@toeverything/framework/virgo'; import { Protocol } from '@toeverything/datasource/db-service'; import { defaultTodoProps, NumberedView } from './NumberedView'; import { Block2HtmlProps, commonBlock2HtmlContent, + commonHTML2block, } from '../../utils/commonBlockClip'; export class NumberedBlock extends BaseView { @@ -22,55 +28,38 @@ export class NumberedBlock extends BaseView { return block; } - override html2block( - el: Element, - parseEl: (el: Element) => any[] - ): any[] | null { - const tag_name = el.tagName; - if (tag_name === 'OL') { - const result = []; - for (let i = 0; i < el.children.length; i++) { - const blocks_info = parseEl(el.children[i]); - result.push(...blocks_info); - } - return result.length > 0 ? result : null; + override async html2block2({ + element, + editor, + }: { + element: Element; + editor: BlockEditor; + }): Promise { + if (element.tagName === 'OL') { + const children = Array.from(element.children); + const childrenBlockInfos = ( + await Promise.all( + children.map(childElement => + this.html2block2({ + editor, + element: childElement, + }) + ) + ) + ) + .flat() + .filter(v => v); + return childrenBlockInfos.length ? childrenBlockInfos : null; } - if (tag_name == 'LI' && el.textContent.startsWith('[ ] ')) { - const childNodes = el.childNodes; - let texts = []; - const children = []; - for (let i = 0; i < childNodes.length; i++) { - const blocks_info = parseEl(childNodes[i] as Element); - for (let j = 0; j < blocks_info.length; j++) { - if (blocks_info[j].type === 'text') { - const block_texts = - blocks_info[j].properties.text.value; - texts.push(...block_texts); - } else { - children.push(blocks_info[j]); - } - } - } - if (texts.length > 0 && (texts[0].text || '').startsWith('[ ] ')) { - texts[0].text = texts[0].text.substring('[ ] '.length); - if (!texts[0].text) { - texts = texts.slice(1); - } - } - return [ - { - type: this.type, - properties: { - text: { value: texts }, - }, - children: children, - }, - ]; - } - - return null; + return commonHTML2block({ + element, + editor, + type: this.type, + tagName: 'LI', + }); } + override async block2html(props: Block2HtmlProps) { return `
  1. ${await commonBlock2HtmlContent(props)}
`; } diff --git a/libs/components/editor-blocks/src/blocks/text/QuoteBlock.tsx b/libs/components/editor-blocks/src/blocks/text/QuoteBlock.tsx index c3613f585d..51f63e3dec 100644 --- a/libs/components/editor-blocks/src/blocks/text/QuoteBlock.tsx +++ b/libs/components/editor-blocks/src/blocks/text/QuoteBlock.tsx @@ -2,11 +2,14 @@ import { Protocol } from '@toeverything/datasource/db-service'; import { AsyncBlock, BaseView, + BlockEditor, CreateView, + HTML2BlockResult, } from '@toeverything/framework/virgo'; import { Block2HtmlProps, commonBlock2HtmlContent, + commonHTML2block, } from '../../utils/commonBlockClip'; import { TextView } from './TextView'; @@ -27,36 +30,19 @@ export class QuoteBlock extends BaseView { return block; } - override html2block( - el: Element, - parseEl: (el: Element) => any[] - ): any[] | null { - const tag_name = el.tagName; - if (tag_name === 'BLOCKQUOTE') { - const childNodes = el.childNodes; - const texts = []; - for (let i = 0; i < childNodes.length; i++) { - const blocks_info = parseEl(childNodes[i] as Element); - for (let j = 0; j < blocks_info.length; j++) { - if (blocks_info[j].type === 'text') { - const block_texts = - blocks_info[j].properties.text.value; - texts.push(...block_texts); - } - } - } - return [ - { - type: this.type, - properties: { - text: { value: texts }, - }, - children: [], - }, - ]; - } - - return null; + override async html2block2({ + element, + editor, + }: { + element: Element; + editor: BlockEditor; + }): Promise { + return commonHTML2block({ + element, + editor, + type: this.type, + tagName: 'BLOCKQUOTE', + }); } override async block2html(props: Block2HtmlProps) { @@ -82,52 +68,19 @@ export class CalloutBlock extends BaseView { return block; } - override html2block( - el: Element, - parseEl: (el: Element) => any[] - ): any[] | null { - const tag_name = el.tagName; - if ( - tag_name === 'ASIDE' || - el.firstChild?.nodeValue?.startsWith('

${url}

- Copy + + Copy
diff --git a/libs/components/editor-blocks/src/blocks/embed-link/EmbedLinkView.tsx b/libs/components/editor-blocks/src/blocks/embed-link/EmbedLinkView.tsx index 86b43908d1..c3e7199c29 100644 --- a/libs/components/editor-blocks/src/blocks/embed-link/EmbedLinkView.tsx +++ b/libs/components/editor-blocks/src/blocks/embed-link/EmbedLinkView.tsx @@ -33,7 +33,7 @@ export const EmbedLinkView = (props: EmbedLinkView) => { }; return ( - + {embedLinkUrl ? ( { setIsSelect(isSelect); }); return ( - + {figmaUrl ? ( { }; return ( - +
- {!isSelect ? ( - - ) : null} + {!isSelect ? : null} {imgUrl ? (
{ diff --git a/libs/components/editor-blocks/src/blocks/numbered/NumberedView.tsx b/libs/components/editor-blocks/src/blocks/numbered/NumberedView.tsx index 74bcfab504..c45321a138 100644 --- a/libs/components/editor-blocks/src/blocks/numbered/NumberedView.tsx +++ b/libs/components/editor-blocks/src/blocks/numbered/NumberedView.tsx @@ -183,7 +183,7 @@ export const NumberedView = ({ block, editor }: CreateView) => { return ( - +
{getNumber(properties.numberType, number)}. diff --git a/libs/components/editor-blocks/src/blocks/page/PageView.tsx b/libs/components/editor-blocks/src/blocks/page/PageView.tsx index 64fba3ca83..123021e361 100644 --- a/libs/components/editor-blocks/src/blocks/page/PageView.tsx +++ b/libs/components/editor-blocks/src/blocks/page/PageView.tsx @@ -1,14 +1,14 @@ -import { useRef, useEffect, useMemo, useState } from 'react'; +import { useEffect, useMemo, useRef, useState } from 'react'; import { useParams } from 'react-router'; import { BackLink, TextProps } from '@toeverything/components/common'; import { - RenderBlockChildren, BlockPendantProvider, + RenderBlockChildren, } from '@toeverything/components/editor-core'; +import { styled } from '@toeverything/components/ui'; import { ContentColumnValue } from '@toeverything/datasource/db-service'; import { CreateView } from '@toeverything/framework/virgo'; -import { Theme, styled } from '@toeverything/components/ui'; import { TextManage, @@ -81,7 +81,7 @@ export const PageView = ({ block, editor }: CreateView) => { return ( - + - + { return ( - +
) => { @@ -23,8 +30,23 @@ export const BlockPendantProvider = ({ const showTriggerLine = properties.filter(property => getValue(property.id)).length === 0; + const onClick = useCallback( + (e: MouseEvent) => { + if (containerFlavor.includes(block.type)) { + return; + } + if (e.target === e.currentTarget) { + const rect = e.currentTarget.getBoundingClientRect(); + const middle = (rect.left + rect.right) / 2; + const position = e.clientX < middle ? 'start' : 'end'; + editor.selectionManager.activeNodeByNodeId(block.id, position); + } + }, + [editor, block] + ); + return ( - + {children} {showTriggerLine ? ( diff --git a/libs/components/editor-core/src/editor/scroll/scroll.ts b/libs/components/editor-core/src/editor/scroll/scroll.ts index 08f2b8ec16..2e3c8453e6 100644 --- a/libs/components/editor-core/src/editor/scroll/scroll.ts +++ b/libs/components/editor-core/src/editor/scroll/scroll.ts @@ -196,11 +196,11 @@ export class ScrollManager { private _getKeepInViewParams(blockRect: Rect) { if (this.scrollContainer == null) return 0; const { top, bottom } = domToRect(this._scrollContainer); - if (blockRect.top <= top + blockRect.height * 3) { + if (blockRect.top <= top + blockRect.height) { return -1; } - if (blockRect.bottom >= bottom - blockRect.height * 3) { + if (blockRect.bottom >= bottom - blockRect.height) { return 1; } return 0; diff --git a/libs/components/editor-plugins/src/menu/left-menu/LeftMenuPlugin.tsx b/libs/components/editor-plugins/src/menu/left-menu/LeftMenuPlugin.tsx index 9c339e8630..f3b8fa35a1 100644 --- a/libs/components/editor-plugins/src/menu/left-menu/LeftMenuPlugin.tsx +++ b/libs/components/editor-plugins/src/menu/left-menu/LeftMenuPlugin.tsx @@ -1,3 +1,4 @@ +import { containerFlavor } from '@toeverything/datasource/db-service'; import { BlockDropPlacement, HookType } from '@toeverything/framework/virgo'; import { domToRect, last, Point } from '@toeverything/utils'; import { StrictMode } from 'react'; @@ -9,7 +10,6 @@ import { LeftMenuDraggable, LineInfoSubject, } from './LeftMenuDraggable'; -import { ignoreBlockTypes } from './menu-config'; const DRAG_THROTTLE_DELAY = 60; export class LeftMenuPlugin extends BasePlugin { private _mousedown?: boolean; @@ -104,7 +104,7 @@ export class LeftMenuPlugin extends BasePlugin { const block = await this.editor.getBlockByPoint( new Point(event.clientX, event.clientY) ); - if (block == null || ignoreBlockTypes.includes(block.type)) return; + if (block == null || containerFlavor.includes(block.type)) return; const { direction, block: targetBlock } = await this.editor.dragDropManager.checkBlockDragTypes( event, @@ -143,7 +143,7 @@ export class LeftMenuPlugin extends BasePlugin { const node = await this.editor.getBlockByPoint( new Point(event.clientX, event.clientY) ); - if (node == null || ignoreBlockTypes.includes(node.type)) { + if (node == null || containerFlavor.includes(node.type)) { return; } if (node.dom) { diff --git a/libs/components/editor-plugins/src/menu/left-menu/menu-config.ts b/libs/components/editor-plugins/src/menu/left-menu/menu-config.ts index 0d107c15a8..d210c71a23 100644 --- a/libs/components/editor-plugins/src/menu/left-menu/menu-config.ts +++ b/libs/components/editor-plugins/src/menu/left-menu/menu-config.ts @@ -1,14 +1,14 @@ -import { BlockFlavorKeys, Protocol } from '@toeverything/datasource/db-service'; -import ShortTextIcon from '@mui/icons-material/ShortText'; -import TitleIcon from '@mui/icons-material/Title'; import FormatListBulletedIcon from '@mui/icons-material/FormatListBulleted'; import HorizontalRuleIcon from '@mui/icons-material/HorizontalRule'; +import ListIcon from '@mui/icons-material/List'; import NotificationsNoneIcon from '@mui/icons-material/NotificationsNone'; +import ShortTextIcon from '@mui/icons-material/ShortText'; +import TitleIcon from '@mui/icons-material/Title'; import { CodeBlockInlineIcon, PagesIcon, } from '@toeverything/components/common'; -import ListIcon from '@mui/icons-material/List'; +import { Protocol } from '@toeverything/datasource/db-service'; export const MENU_WIDTH = 14; export const pageConvertIconSize = 24; type MenuItem = { @@ -93,12 +93,3 @@ const textTypeBlocks: MenuItem[] = [ export const addMenuList = [...textTypeBlocks].filter(v => v); export const textConvertMenuList = textTypeBlocks; - -export const ignoreBlockTypes: BlockFlavorKeys[] = [ - Protocol.Block.Type.workspace, - Protocol.Block.Type.page, - Protocol.Block.Type.group, - Protocol.Block.Type.title, - Protocol.Block.Type.grid, - Protocol.Block.Type.gridItem, -]; diff --git a/libs/datasource/db-service/src/index.ts b/libs/datasource/db-service/src/index.ts index 3d4ffb01a9..c9e7cc2e86 100644 --- a/libs/datasource/db-service/src/index.ts +++ b/libs/datasource/db-service/src/index.ts @@ -42,6 +42,7 @@ export { type TemplateMeta, } from './services/editor-block/templates'; export type { Template } from './services/editor-block/templates/types'; +export { containerFlavor } from './services/editor-block/types'; export { DEFAULT_COLUMN_KEYS } from './services/editor-block/utils/column/default-config'; const api = new Proxy({} as DbServicesMap, { diff --git a/libs/datasource/db-service/src/services/editor-block/types.ts b/libs/datasource/db-service/src/services/editor-block/types.ts index e2bb7922b2..5c7ab2a2dd 100644 --- a/libs/datasource/db-service/src/services/editor-block/types.ts +++ b/libs/datasource/db-service/src/services/editor-block/types.ts @@ -4,6 +4,15 @@ import { Column, DefaultColumnsValue } from './utils/column'; export type BlockFlavors = typeof Protocol.Block.Type; export type BlockFlavorKeys = keyof typeof Protocol.Block.Type; +export const containerFlavor: BlockFlavorKeys[] = [ + Protocol.Block.Type.workspace, + Protocol.Block.Type.page, + Protocol.Block.Type.group, + Protocol.Block.Type.title, + Protocol.Block.Type.grid, + Protocol.Block.Type.gridItem, +]; + export interface CreateEditorBlock { workspace: string; type: keyof BlockFlavors; From 7eff19509fe057b6ef8217839ec397b5eae605e3 Mon Sep 17 00:00:00 2001 From: DarkSky Date: Fri, 26 Aug 2022 18:53:58 +0800 Subject: [PATCH 50/81] chore: fix deps warn --- apps/ligo-virgo/package.json | 2 +- libs/components/editor-blocks/package.json | 2 +- libs/components/editor-core/package.json | 4 +- .../editor-core/src/editor/clipboard/index.ts | 2 +- libs/components/editor-plugins/package.json | 4 +- libs/components/layout/package.json | 4 +- libs/components/ui/package.json | 2 +- libs/datasource/state/package.json | 4 +- package.json | 65 +- pnpm-lock.yaml | 2092 +++++++++-------- 10 files changed, 1127 insertions(+), 1054 deletions(-) diff --git a/apps/ligo-virgo/package.json b/apps/ligo-virgo/package.json index 5bb0d78eaa..e8a18e071c 100644 --- a/apps/ligo-virgo/package.json +++ b/apps/ligo-virgo/package.json @@ -13,7 +13,7 @@ "@mui/icons-material": "^5.8.4" }, "devDependencies": { - "firebase": "^9.9.2", + "firebase": "^9.9.3", "mini-css-extract-plugin": "^2.6.1", "webpack": "^5.74.0" } diff --git a/libs/components/editor-blocks/package.json b/libs/components/editor-blocks/package.json index d9b9c66f72..04d8e0e544 100644 --- a/libs/components/editor-blocks/package.json +++ b/libs/components/editor-blocks/package.json @@ -38,7 +38,7 @@ "react-window": "^1.8.7", "slate": "^0.81.1", "slate-react": "^0.81.0", - "style9": "^0.13.3" + "style9": "^0.14.0" }, "devDependencies": { "@types/codemirror": "^5.60.5", diff --git a/libs/components/editor-core/package.json b/libs/components/editor-core/package.json index a9c5cd636f..b680b35b96 100644 --- a/libs/components/editor-core/package.json +++ b/libs/components/editor-core/package.json @@ -4,7 +4,7 @@ "license": "MIT", "dependencies": { "@mui/icons-material": "^5.8.4", - "date-fns": "^2.28.0", + "date-fns": "^2.29.2", "eventemitter3": "^4.0.7", "hotkeys-js": "^3.9.4", "html-escaper": "^3.0.3", @@ -12,6 +12,6 @@ "marked": "^4.0.19", "nanoid": "^4.0.0", "slate": "^0.81.0", - "style9": "^0.13.3" + "style9": "^0.14.0" } } diff --git a/libs/components/editor-core/src/editor/clipboard/index.ts b/libs/components/editor-core/src/editor/clipboard/index.ts index 41cf2aba32..cca57e3a47 100644 --- a/libs/components/editor-core/src/editor/clipboard/index.ts +++ b/libs/components/editor-core/src/editor/clipboard/index.ts @@ -1,2 +1,2 @@ -export { HTML2BlockResult, ClipBlockInfo } from './types'; export { Clipboard } from './clipboard'; +export type { ClipBlockInfo, HTML2BlockResult } from './types'; diff --git a/libs/components/editor-plugins/package.json b/libs/components/editor-plugins/package.json index 94f7b8e0c5..7d3696c949 100644 --- a/libs/components/editor-plugins/package.json +++ b/libs/components/editor-plugins/package.json @@ -4,7 +4,7 @@ "license": "MIT", "dependencies": { "@mui/icons-material": "^5.8.4", - "date-fns": "^2.28.0", - "style9": "^0.13.3" + "date-fns": "^2.29.2", + "style9": "^0.14.0" } } diff --git a/libs/components/layout/package.json b/libs/components/layout/package.json index 739ad7c56e..a36a746d84 100644 --- a/libs/components/layout/package.json +++ b/libs/components/layout/package.json @@ -10,8 +10,8 @@ "@dnd-kit/utilities": "^3.2.0", "@mui/icons-material": "^5.8.4", "clsx": "^1.2.1", - "date-fns": "^2.28.0", - "jotai": "^1.7.4", + "date-fns": "^2.29.2", + "jotai": "^1.8.1", "tinycolor2": "^1.4.2", "turndown": "7.1.1" }, diff --git a/libs/components/ui/package.json b/libs/components/ui/package.json index 6df3065fa9..a4b562991e 100644 --- a/libs/components/ui/package.json +++ b/libs/components/ui/package.json @@ -13,7 +13,7 @@ "@mui/x-date-pickers": "^5.0.0-alpha.7", "@mui/x-date-pickers-pro": "^5.0.0-alpha.7", "@types/react-date-range": "^1.4.4", - "clsx": "^1.2.0", + "clsx": "^1.2.1", "notistack": "^2.0.5", "react-date-range": "^1.4.0" } diff --git a/libs/datasource/state/package.json b/libs/datasource/state/package.json index a1a92d478b..20bdf4c8ce 100644 --- a/libs/datasource/state/package.json +++ b/libs/datasource/state/package.json @@ -3,9 +3,9 @@ "version": "0.0.1", "license": "MIT", "dependencies": { - "jotai": "^1.7.4" + "jotai": "^1.8.1" }, "devDependencies": { - "firebase": "^9.9.2" + "firebase": "^9.9.3" } } diff --git a/package.json b/package.json index a0e060199e..88f5c1264e 100644 --- a/package.json +++ b/package.json @@ -51,13 +51,20 @@ "@mui/material", "babel-loader", "jest-environment-node", + "mobx", "rollup", "webpack", "react", "react-dom", "reflect-metadata", "rxjs" - ] + ], + "allowedVersions": { + "@types/react": "18", + "react": "18", + "react-dom": "18", + "react-test-renderer": "18" + } } }, "dependencies": { @@ -66,9 +73,9 @@ "@mui/icons-material": "^5.8.4", "@mui/material": "^5.8.6", "assert": "^2.0.0", - "clsx": "^1.2.0", - "core-js": "^3.23.3", - "got": "^12.1.0", + "clsx": "^1.2.1", + "core-js": "^3.25.0", + "got": "^12.3.1", "level": "^8.0.0", "level-read-stream": "1.1.0", "react": "^18.2.0", @@ -76,38 +83,36 @@ "react-router": "^6.3.0", "react-router-dom": "^6.3.0", "regenerator-runtime": "^0.13.9", - "rxjs": "^7.5.5", - "style9": "^0.13.3", + "rxjs": "^7.5.6", + "style9": "^0.14.0", "tslib": "^2.4.0" }, "devDependencies": { "@firebase/auth": "^0.20.5", - "@headlessui/react": "^1.6.5", - "@heroicons/react": "^1.0.6", - "@nrwl/cli": "^14.4.0", - "@nrwl/cypress": "^14.4.0", - "@nrwl/eslint-plugin-nx": "^14.4.0", - "@nrwl/jest": "^14.4.0", - "@nrwl/js": "^14.4.0", - "@nrwl/linter": "^14.4.0", - "@nrwl/node": "^14.4.0", - "@nrwl/nx-cloud": "^14.2.0", - "@nrwl/react": "^14.4.0", - "@nrwl/tao": "^14.4.0", - "@nrwl/web": "^14.4.0", - "@nrwl/workspace": "^14.4.0", + "@nrwl/cli": "^14.5.10", + "@nrwl/cypress": "^14.5.10", + "@nrwl/eslint-plugin-nx": "^14.5.10", + "@nrwl/jest": "^14.5.10", + "@nrwl/js": "^14.5.10", + "@nrwl/linter": "^14.5.10", + "@nrwl/node": "^14.5.10", + "@nrwl/nx-cloud": "^14.5.4", + "@nrwl/react": "^14.5.10", + "@nrwl/tao": "^14.5.10", + "@nrwl/web": "^14.5.10", + "@nrwl/workspace": "^14.5.10", "@portabletext/react": "^1.0.6", - "@svgr/core": "^6.2.1", + "@svgr/core": "^6.3.1", "@swc/cli": "^0.1.57", - "@swc/core": "^1.2.208", - "@swc/helpers": "^0.4.3", - "@swc/jest": "^0.2.21", + "@swc/core": "^1.2.244", + "@swc/helpers": "^0.4.11", + "@swc/jest": "^0.2.22", "@testing-library/react": "^13.3.0", "@testing-library/react-hooks": "^8.0.1", - "@types/jest": "^28.1.4", - "@types/node": "^18.0.1", - "@types/react": "^18.0.14", - "@types/react-dom": "^18.0.5", + "@types/jest": "^28.1.8", + "@types/node": "^18.7.13", + "@types/react": "^18.0.17", + "@types/react-dom": "^18.0.6", "@types/react-router-dom": "^5.3.3", "@typescript-eslint/eslint-plugin": "^5.30.4", "@typescript-eslint/parser": "^5.30.4", @@ -128,13 +133,13 @@ "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-react": "^7.30.1", "eslint-plugin-react-hooks": "^4.6.0", - "firebase": "^9.9.2", + "firebase": "^9.9.3", "fs-extra": "^10.1.0", "html-webpack-plugin": "^5.5.0", "husky": "^8.0.1", "jest": "^28.1.2", "lint-staged": "^13.0.3", - "nx": "^14.4.0", + "nx": "^14.5.10", "prettier": "^2.7.1", "react-test-renderer": "^18.2.0", "svgo": "^2.8.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 27efb6db8e..89bc777cd6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,34 +7,32 @@ importers: '@emotion/react': ^11.9.3 '@emotion/styled': ^11.9.3 '@firebase/auth': ^0.20.5 - '@headlessui/react': ^1.6.5 - '@heroicons/react': ^1.0.6 '@mui/icons-material': ^5.8.4 '@mui/material': ^5.8.6 - '@nrwl/cli': ^14.4.0 - '@nrwl/cypress': ^14.4.0 - '@nrwl/eslint-plugin-nx': ^14.4.0 - '@nrwl/jest': ^14.4.0 - '@nrwl/js': ^14.4.0 - '@nrwl/linter': ^14.4.0 - '@nrwl/node': ^14.4.0 - '@nrwl/nx-cloud': ^14.2.0 - '@nrwl/react': ^14.4.0 - '@nrwl/tao': ^14.4.0 - '@nrwl/web': ^14.4.0 - '@nrwl/workspace': ^14.4.0 + '@nrwl/cli': ^14.5.10 + '@nrwl/cypress': ^14.5.10 + '@nrwl/eslint-plugin-nx': ^14.5.10 + '@nrwl/jest': ^14.5.10 + '@nrwl/js': ^14.5.10 + '@nrwl/linter': ^14.5.10 + '@nrwl/node': ^14.5.10 + '@nrwl/nx-cloud': ^14.5.4 + '@nrwl/react': ^14.5.10 + '@nrwl/tao': ^14.5.10 + '@nrwl/web': ^14.5.10 + '@nrwl/workspace': ^14.5.10 '@portabletext/react': ^1.0.6 - '@svgr/core': ^6.2.1 + '@svgr/core': ^6.3.1 '@swc/cli': ^0.1.57 - '@swc/core': ^1.2.208 - '@swc/helpers': ^0.4.3 - '@swc/jest': ^0.2.21 + '@swc/core': ^1.2.244 + '@swc/helpers': ^0.4.11 + '@swc/jest': ^0.2.22 '@testing-library/react': ^13.3.0 '@testing-library/react-hooks': ^8.0.1 - '@types/jest': ^28.1.4 - '@types/node': ^18.0.1 - '@types/react': ^18.0.14 - '@types/react-dom': ^18.0.5 + '@types/jest': ^28.1.8 + '@types/node': ^18.7.13 + '@types/react': ^18.0.17 + '@types/react-dom': ^18.0.6 '@types/react-router-dom': ^5.3.3 '@typescript-eslint/eslint-plugin': ^5.30.4 '@typescript-eslint/parser': ^5.30.4 @@ -42,9 +40,9 @@ importers: babel-jest: ^28.1.2 babel-plugin-open-source: ^1.3.4 change-case: ^4.1.2 - clsx: ^1.2.0 + clsx: ^1.2.1 compression-webpack-plugin: ^10.0.0 - core-js: ^3.23.3 + core-js: ^3.25.0 cross-env: ^7.0.3 css-minimizer-webpack-plugin: ^4.0.0 cz-customizable: ^5.3.0 @@ -58,16 +56,16 @@ importers: eslint-plugin-prettier: ^4.2.1 eslint-plugin-react: ^7.30.1 eslint-plugin-react-hooks: ^4.6.0 - firebase: ^9.9.2 + firebase: ^9.9.3 fs-extra: ^10.1.0 - got: ^12.1.0 + got: ^12.3.1 html-webpack-plugin: ^5.5.0 husky: ^8.0.1 jest: ^28.1.2 level: ^8.0.0 level-read-stream: 1.1.0 lint-staged: ^13.0.3 - nx: ^14.4.0 + nx: ^14.5.10 prettier: ^2.7.1 react: ^18.2.0 react-dom: ^18.2.0 @@ -75,8 +73,8 @@ importers: react-router-dom: ^6.3.0 react-test-renderer: ^18.2.0 regenerator-runtime: ^0.13.9 - rxjs: ^7.5.5 - style9: ^0.13.3 + rxjs: ^7.5.6 + style9: ^0.14.0 svgo: ^2.8.0 terser-webpack-plugin: ^5.3.3 ts-jest: ^28.0.5 @@ -86,14 +84,14 @@ importers: webpack: ^5.74.0 webpack-bundle-analyzer: ^4.5.0 dependencies: - '@emotion/react': 11.9.3_4jaruczdv2uxjj3lb2xbkiuci4 - '@emotion/styled': 11.9.3_toiz7tndcw4z2b7gxmmeo5fkcu - '@mui/icons-material': 5.8.4_vdnh4jyrnjwcar5vg6k35n5t6e - '@mui/material': 5.8.7_h2u6a3oivtyocvjxeke7xcvlfa + '@emotion/react': 11.9.3_aev5mndowrsc2o4rquiaswzsei + '@emotion/styled': 11.9.3_lzq4tq5osthlqcqhyhuicy5gfy + '@mui/icons-material': 5.8.4_wip2cf6yrkxu2zuyrl3lmpbdaa + '@mui/material': 5.8.7_mugunlselc52kyz7qt5aa5ixva assert: 2.0.0 - clsx: 1.2.0 - core-js: 3.23.3 - got: 12.1.0 + clsx: 1.2.1 + core-js: 3.25.0 + got: 12.3.1 level: 8.0.0 level-read-stream: 1.1.0 react: 18.2.0 @@ -101,36 +99,34 @@ importers: react-router: 6.3.0_react@18.2.0 react-router-dom: 6.3.0_biqbaboplfbrettd7655fr4n2y regenerator-runtime: 0.13.9 - rxjs: 7.5.5 - style9: 0.13.3_3dhnqjc63a233tfpt3a625zcdq + rxjs: 7.5.6 + style9: 0.14.0_3dhnqjc63a233tfpt3a625zcdq tslib: 2.4.0 devDependencies: - '@firebase/auth': 0.20.5_@firebase+app@0.7.30 - '@headlessui/react': 1.6.5_biqbaboplfbrettd7655fr4n2y - '@heroicons/react': 1.0.6_react@18.2.0 - '@nrwl/cli': 14.4.2_@swc+core@1.2.210 - '@nrwl/cypress': 14.4.2_gtbxvtmh5ipj3piki3xg57n5fe - '@nrwl/eslint-plugin-nx': 14.4.2_afsbewstkdex5d4fc6xnpjlnau - '@nrwl/jest': 14.4.2_dltevkctzdxkrvyldbyepwbdle - '@nrwl/js': 14.4.2_gtbxvtmh5ipj3piki3xg57n5fe - '@nrwl/linter': 14.4.2_jqnzvbaca4rx3byobgjku3onji - '@nrwl/node': 14.4.2_ehspof47b5bphcyk4536mwaw4u - '@nrwl/nx-cloud': 14.2.0 - '@nrwl/react': 14.4.2_46t6z7wulh2zjyi5wmxujdm57y - '@nrwl/tao': 14.4.2_@swc+core@1.2.210 - '@nrwl/web': 14.4.2_7ggz7ibmlwrqtwusxeq53zzcym - '@nrwl/workspace': 14.4.2_a22ftc74wzukohhtmp6cnnvzoq + '@firebase/auth': 0.20.5_@firebase+app@0.7.31 + '@nrwl/cli': 14.5.10_@swc+core@1.2.244 + '@nrwl/cypress': 14.5.10_fh4vayvykx4so2ggxmjmy42o7q + '@nrwl/eslint-plugin-nx': 14.5.10_givxt7oldssnfrhy2ogb3txvmu + '@nrwl/jest': 14.5.10_mxnt7yjwrufofllb6rm3srb2gy + '@nrwl/js': 14.5.10_fh4vayvykx4so2ggxmjmy42o7q + '@nrwl/linter': 14.5.10_nccbbaajqjy3rznvgrrzaevqwe + '@nrwl/node': 14.5.10_b7xqi4yfwax4wnal77xdlkadre + '@nrwl/nx-cloud': 14.5.4 + '@nrwl/react': 14.5.10_o5732ev3g42bu2r3ngh6yfrgia + '@nrwl/tao': 14.5.10_@swc+core@1.2.244 + '@nrwl/web': 14.5.10_tpw7pltx5fafq53de536pruocy + '@nrwl/workspace': 14.5.10_eva5qnqrnaa26adtrypogyveky '@portabletext/react': 1.0.6_react@18.2.0 - '@svgr/core': 6.2.1 - '@swc/cli': 0.1.57_@swc+core@1.2.210 - '@swc/core': 1.2.210 - '@swc/helpers': 0.4.3 - '@swc/jest': 0.2.21_@swc+core@1.2.210 + '@svgr/core': 6.3.1 + '@swc/cli': 0.1.57_@swc+core@1.2.244 + '@swc/core': 1.2.244 + '@swc/helpers': 0.4.11 + '@swc/jest': 0.2.22_@swc+core@1.2.244 '@testing-library/react': 13.3.0_biqbaboplfbrettd7655fr4n2y - '@testing-library/react-hooks': 8.0.1_5qggqhesezyescxqnsg4rpj6qa - '@types/jest': 28.1.4 - '@types/node': 18.0.1 - '@types/react': 18.0.14 + '@testing-library/react-hooks': 8.0.1_y6lpz2mvcoua7qihahug4ke22i + '@types/jest': 28.1.8 + '@types/node': 18.7.13 + '@types/react': 18.0.17 '@types/react-dom': 18.0.6 '@types/react-router-dom': 5.3.3 '@typescript-eslint/eslint-plugin': 5.30.5_6zdoc3rn4mpiddqwhppni2mnnm @@ -152,21 +148,21 @@ importers: eslint-plugin-prettier: 4.2.1_7uxdfn2xinezdgvmbammh6ev5i eslint-plugin-react: 7.30.1_eslint@8.19.0 eslint-plugin-react-hooks: 4.6.0_eslint@8.19.0 - firebase: 9.9.2 + firebase: 9.9.3 fs-extra: 10.1.0 html-webpack-plugin: 5.5.0_webpack@5.74.0 husky: 8.0.1 - jest: 28.1.2_hxaxlvfys2pc3hefxwkmyo5cpq + jest: 28.1.2_3glepa5322b7j342guju4hszoy lint-staged: 13.0.3 - nx: 14.4.2_@swc+core@1.2.210 + nx: 14.5.10_@swc+core@1.2.244 prettier: 2.7.1 react-test-renderer: 18.2.0_react@18.2.0 svgo: 2.8.0 - terser-webpack-plugin: 5.3.3_vwzmvoh3samqo2nn3x7mqt365m + terser-webpack-plugin: 5.3.3_5yvlrjpud4kvfyyr2mesgpo47e ts-jest: 28.0.5_dvf3gqad2lwurck7yyca7j3d3i - ts-node: 10.8.2_y42jqzo3jkzuv3kp7opavo2xbi + ts-node: 10.8.2_hixnfb2jfw56u6pahjg3ndp4oy typescript: 4.7.4 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 webpack-bundle-analyzer: 4.5.0 apps/keck: @@ -184,7 +180,7 @@ importers: yjs: ^13.5.41 dependencies: authing-js-sdk: 4.23.35 - firebase-admin: 11.0.1 + firebase-admin: 11.0.1_@firebase+app-types@0.7.0 lib0: 0.2.52 lru-cache: 7.13.2 nanoid: 4.0.0 @@ -199,13 +195,13 @@ importers: apps/ligo-virgo: specifiers: '@mui/icons-material': ^5.8.4 - firebase: ^9.9.2 + firebase: ^9.9.3 mini-css-extract-plugin: ^2.6.1 webpack: ^5.74.0 dependencies: '@mui/icons-material': 5.8.4 devDependencies: - firebase: 9.9.2 + firebase: 9.9.3 mini-css-extract-plugin: 2.6.1_webpack@5.74.0 webpack: 5.74.0 @@ -260,7 +256,7 @@ importers: '@tldraw/intersect': ^1.7.1 '@tldraw/vec': ^1.7.0 dependencies: - '@tldraw/core': 1.14.1_mobx@6.6.1 + '@tldraw/core': 1.14.1 '@tldraw/intersect': 1.7.1 '@tldraw/vec': 1.7.1 @@ -409,22 +405,22 @@ importers: react-window: ^1.8.7 slate: ^0.81.1 slate-react: ^0.81.0 - style9: ^0.13.3 + style9: ^0.14.0 dependencies: '@codemirror/commands': 6.0.1 '@codemirror/lang-cpp': 6.0.1 - '@codemirror/lang-css': 6.0.0_bmjizg7gr5ieupmvn5u62mbipm - '@codemirror/lang-html': 6.1.0_@codemirror+view@6.2.0 + '@codemirror/lang-css': 6.0.0 + '@codemirror/lang-html': 6.1.0 '@codemirror/lang-java': 6.0.0 '@codemirror/lang-javascript': 6.0.2 '@codemirror/lang-json': 6.0.0 '@codemirror/lang-lezer': 6.0.0 '@codemirror/lang-markdown': 6.0.1 - '@codemirror/lang-php': 6.0.0_@codemirror+view@6.2.0 + '@codemirror/lang-php': 6.0.0 '@codemirror/lang-python': 6.0.1 '@codemirror/lang-rust': 6.0.0 - '@codemirror/lang-sql': 6.1.0_bmjizg7gr5ieupmvn5u62mbipm - '@codemirror/lang-xml': 6.0.0_@codemirror+view@6.2.0 + '@codemirror/lang-sql': 6.1.0 + '@codemirror/lang-xml': 6.0.0 '@codemirror/language': 6.2.1 '@codemirror/legacy-modes': 6.1.0 '@codemirror/next': 0.16.0 @@ -438,7 +434,7 @@ importers: '@emotion/styled': 11.9.3_dc5dh2wp562rsjxvguwi2i3yzq '@mui/system': 5.8.7_d6menda4vqwq6peqnkbe7mkj4i code-example: 3.3.6 - codemirror: 6.0.1_@lezer+common@1.0.0 + codemirror: 6.0.1 codemirror-lang-elixir: 3.0.0_@codemirror+language@6.2.1 keymap: link:@codemirror/next/keymap nanoid: 4.0.0 @@ -446,7 +442,7 @@ importers: react-window: 1.8.7 slate: 0.81.1 slate-react: 0.81.0_slate@0.81.1 - style9: 0.13.3 + style9: 0.14.0 devDependencies: '@types/codemirror': 5.60.5 '@types/react-resizable': 3.0.1 @@ -455,7 +451,7 @@ importers: libs/components/editor-core: specifiers: '@mui/icons-material': ^5.8.4 - date-fns: ^2.28.0 + date-fns: ^2.29.2 eventemitter3: ^4.0.7 hotkeys-js: ^3.9.4 html-escaper: ^3.0.3 @@ -463,10 +459,10 @@ importers: marked: ^4.0.19 nanoid: ^4.0.0 slate: ^0.81.0 - style9: ^0.13.3 + style9: ^0.14.0 dependencies: '@mui/icons-material': 5.8.4 - date-fns: 2.28.0 + date-fns: 2.29.2 eventemitter3: 4.0.7 hotkeys-js: 3.9.4 html-escaper: 3.0.3 @@ -474,17 +470,17 @@ importers: marked: 4.0.19 nanoid: 4.0.0 slate: 0.81.1 - style9: 0.13.3 + style9: 0.14.0 libs/components/editor-plugins: specifiers: '@mui/icons-material': ^5.8.4 - date-fns: ^2.28.0 - style9: ^0.13.3 + date-fns: ^2.29.2 + style9: ^0.14.0 dependencies: '@mui/icons-material': 5.8.4 - date-fns: 2.28.0 - style9: 0.13.3 + date-fns: 2.29.2 + style9: 0.14.0 libs/components/icons: specifiers: {} @@ -500,20 +496,20 @@ importers: '@types/tinycolor2': ^1.4.3 '@types/turndown': ^5.0.1 clsx: ^1.2.1 - date-fns: ^2.28.0 - jotai: ^1.7.4 + date-fns: ^2.29.2 + jotai: ^1.8.1 tinycolor2: ^1.4.2 turndown: 7.1.1 dependencies: - '@date-io/date-fns': 2.14.0_date-fns@2.28.0 + '@date-io/date-fns': 2.14.0_date-fns@2.29.2 '@dnd-kit/core': 6.0.5 '@dnd-kit/modifiers': 6.0.0_@dnd-kit+core@6.0.5 '@dnd-kit/sortable': 7.0.1_@dnd-kit+core@6.0.5 '@dnd-kit/utilities': 3.2.0 '@mui/icons-material': 5.8.4 clsx: 1.2.1 - date-fns: 2.28.0 - jotai: 1.7.4 + date-fns: 2.29.2 + jotai: 1.8.1 tinycolor2: 1.4.2 turndown: 7.1.1 devDependencies: @@ -532,7 +528,7 @@ importers: '@mui/x-date-pickers': ^5.0.0-alpha.7 '@mui/x-date-pickers-pro': ^5.0.0-alpha.7 '@types/react-date-range': ^1.4.4 - clsx: ^1.2.0 + clsx: ^1.2.1 notistack: ^2.0.5 react-date-range: ^1.4.0 dependencies: @@ -543,12 +539,12 @@ importers: '@mui/base': 5.0.0-alpha.88 '@mui/material': 5.8.7_d6menda4vqwq6peqnkbe7mkj4i '@mui/system': 5.8.7_d6menda4vqwq6peqnkbe7mkj4i - '@mui/x-date-pickers': 5.0.0-alpha.7_3ze6eywwrphmf4xmeajh7ll6xm - '@mui/x-date-pickers-pro': 5.0.0-alpha.7_3ze6eywwrphmf4xmeajh7ll6xm + '@mui/x-date-pickers': 5.0.0-alpha.7_k34ytkg6gx4xxob5q3piijp2ce + '@mui/x-date-pickers-pro': 5.0.0-alpha.7_k34ytkg6gx4xxob5q3piijp2ce '@types/react-date-range': 1.4.4 - clsx: 1.2.0 + clsx: 1.2.1 notistack: 2.0.5_5ejcbl776hpy2drdn6qveocmsu - react-date-range: 1.4.0_date-fns@2.28.0 + react-date-range: 1.4.0_date-fns@2.29.2 libs/datasource/commands: specifiers: {} @@ -570,6 +566,9 @@ importers: dependencies: ffc-js-client-side-sdk: 1.1.5 + libs/datasource/jwst/pkg: + specifiers: {} + libs/datasource/jwt: specifiers: '@types/debug': ^4.1.7 @@ -651,12 +650,12 @@ importers: libs/datasource/state: specifiers: - firebase: ^9.9.2 - jotai: ^1.7.4 + firebase: ^9.9.3 + jotai: ^1.8.1 dependencies: - jotai: 1.7.4 + jotai: 1.8.1 devDependencies: - firebase: 9.9.2 + firebase: 9.9.3 libs/framework/virgo: specifiers: {} @@ -2258,13 +2257,8 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@codemirror/autocomplete/6.0.3_nq4pwfkqi5icglf26kczcr4s2i: + /@codemirror/autocomplete/6.0.3: resolution: {integrity: sha512-JTSBDC4tUyR8iRmCwQJaYpTXtOZmRn4gKjw1Fu4xIatFPqTJ7m0QRCdkdbzlvMovzjTiuHp4a8WUEB1c/LtiHg==} - peerDependencies: - '@codemirror/language': ^6.0.0 - '@codemirror/state': ^6.0.0 - '@codemirror/view': ^6.0.0 - '@lezer/common': ^1.0.0 dependencies: '@codemirror/language': 6.2.1 '@codemirror/state': 6.1.1 @@ -2288,30 +2282,25 @@ packages: '@lezer/cpp': 1.0.0 dev: false - /@codemirror/lang-css/6.0.0_bmjizg7gr5ieupmvn5u62mbipm: + /@codemirror/lang-css/6.0.0: resolution: {integrity: sha512-jBqc+BTuwhNOTlrimFghLlSrN6iFuE44HULKWoR4qKYObhOIl9Lci1iYj6zMIte1XTQmZguNvjXMyr43LUKwSw==} dependencies: - '@codemirror/autocomplete': 6.0.3_nq4pwfkqi5icglf26kczcr4s2i + '@codemirror/autocomplete': 6.0.3 '@codemirror/language': 6.2.1 '@codemirror/state': 6.1.1 '@lezer/css': 1.0.0 - transitivePeerDependencies: - - '@codemirror/view' - - '@lezer/common' dev: false - /@codemirror/lang-html/6.1.0_@codemirror+view@6.2.0: + /@codemirror/lang-html/6.1.0: resolution: {integrity: sha512-gA7NmJxqvnhwza05CvR7W/39Ap9r/4Vs9uiC0IeFYo1hSlJzc/8N6Evviz6vTW1x8SpHcRYyqKOf6rpl6LfWtg==} dependencies: - '@codemirror/autocomplete': 6.0.3_nq4pwfkqi5icglf26kczcr4s2i - '@codemirror/lang-css': 6.0.0_bmjizg7gr5ieupmvn5u62mbipm + '@codemirror/autocomplete': 6.0.3 + '@codemirror/lang-css': 6.0.0 '@codemirror/lang-javascript': 6.0.2 '@codemirror/language': 6.2.1 '@codemirror/state': 6.1.1 '@lezer/common': 1.0.0 '@lezer/html': 1.0.0 - transitivePeerDependencies: - - '@codemirror/view' dev: false /@codemirror/lang-java/6.0.0: @@ -2324,7 +2313,7 @@ packages: /@codemirror/lang-javascript/6.0.2: resolution: {integrity: sha512-BZRJ9u/zl16hLkSpDAWm73mrfIR7HJrr0lvnhoSOCQVea5BglguWI/slxexhvUb0CB5cXgKWuo2bM+N9EhIaZw==} dependencies: - '@codemirror/autocomplete': 6.0.3_nq4pwfkqi5icglf26kczcr4s2i + '@codemirror/autocomplete': 6.0.3 '@codemirror/language': 6.2.1 '@codemirror/lint': 6.0.0 '@codemirror/state': 6.1.1 @@ -2352,7 +2341,7 @@ packages: /@codemirror/lang-markdown/6.0.1: resolution: {integrity: sha512-pHPQuRwf9cUrmkmsTHRjtS9ZnGu3fA9YzAdh2++d+L9wbfnC2XbKh0Xvm/0YiUjdCnoCx9wDFEoCuAnkqKWLIw==} dependencies: - '@codemirror/lang-html': 6.1.0_@codemirror+view@6.2.0 + '@codemirror/lang-html': 6.1.0 '@codemirror/language': 6.2.1 '@codemirror/state': 6.1.1 '@codemirror/view': 6.2.0 @@ -2360,16 +2349,14 @@ packages: '@lezer/markdown': 1.0.1 dev: false - /@codemirror/lang-php/6.0.0_@codemirror+view@6.2.0: + /@codemirror/lang-php/6.0.0: resolution: {integrity: sha512-96CEjq0xEgbzc6bdFPwILPfZ6m8917JRbh2oPszZJABlYxG4Y+eYjtYkUTDb4yuyjQKyigHoeGC6zoIOYA1NWA==} dependencies: - '@codemirror/lang-html': 6.1.0_@codemirror+view@6.2.0 + '@codemirror/lang-html': 6.1.0 '@codemirror/language': 6.2.1 '@codemirror/state': 6.1.1 '@lezer/common': 1.0.0 '@lezer/php': 1.0.0 - transitivePeerDependencies: - - '@codemirror/view' dev: false /@codemirror/lang-python/6.0.1: @@ -2386,29 +2373,24 @@ packages: '@lezer/rust': 1.0.0 dev: false - /@codemirror/lang-sql/6.1.0_bmjizg7gr5ieupmvn5u62mbipm: + /@codemirror/lang-sql/6.1.0: resolution: {integrity: sha512-eTNTP0+uNHqYClCvJ3QGE7mn1S96QJFNsK76dB4c1pYAQjbgVVjy5DqtD3//A44rp2kuRkgBccRaPKrWDzBdNQ==} dependencies: - '@codemirror/autocomplete': 6.0.3_nq4pwfkqi5icglf26kczcr4s2i + '@codemirror/autocomplete': 6.0.3 '@codemirror/language': 6.2.1 '@codemirror/state': 6.1.1 '@lezer/highlight': 1.0.0 '@lezer/lr': 1.2.0 - transitivePeerDependencies: - - '@codemirror/view' - - '@lezer/common' dev: false - /@codemirror/lang-xml/6.0.0_@codemirror+view@6.2.0: + /@codemirror/lang-xml/6.0.0: resolution: {integrity: sha512-M/HLWxIiP956xGjtrxkeHkCmDGVQGKu782x8pOH5CLJIMkWtiB1DWfDoDHqpFjdEE9dkfcqPWvYfVi6GbhuXEg==} dependencies: - '@codemirror/autocomplete': 6.0.3_nq4pwfkqi5icglf26kczcr4s2i + '@codemirror/autocomplete': 6.0.3 '@codemirror/language': 6.2.1 '@codemirror/state': 6.1.1 '@lezer/common': 1.0.0 '@lezer/xml': 1.0.0 - transitivePeerDependencies: - - '@codemirror/view' dev: false /@codemirror/language/6.2.1: @@ -2547,7 +2529,7 @@ packages: bluebird: 3.7.1 debug: 4.3.4 lodash: 4.17.21 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 transitivePeerDependencies: - supports-color dev: true @@ -2565,7 +2547,7 @@ packages: resolution: {integrity: sha512-qFN64hiFjmlDHJhu+9xMkdfDG2jLsggNxKXglnekUpXSq8faiqZgtHm2lsHCUuaPDTV6wuXHcCl8J1GQ5wLmPw==} dev: false - /@date-io/date-fns/2.14.0_date-fns@2.28.0: + /@date-io/date-fns/2.14.0_date-fns@2.29.2: resolution: {integrity: sha512-4fJctdVyOd5cKIKGaWUM+s3MUXMuzkZaHuTY15PH70kU1YTMrCoauA7hgQVx9qj0ZEbGrH9VSPYJYnYro7nKiA==} peerDependencies: date-fns: ^2.0.0 @@ -2574,7 +2556,7 @@ packages: optional: true dependencies: '@date-io/core': 2.14.0 - date-fns: 2.28.0 + date-fns: 2.29.2 dev: false /@date-io/dayjs/2.14.0: @@ -2613,7 +2595,7 @@ packages: /@dnd-kit/accessibility/3.0.1: resolution: {integrity: sha512-HXRrwS9YUYQO9lFRc/49uO/VICbM+O+ZRpFDe9Pd1rwVv2PCNkRiTZRdxrDgng/UkvdC3Re9r2vwPpXXrWeFzg==} peerDependencies: - react: '>=16.8.0' + react: '>=16.8.0 || 18' peerDependenciesMeta: react: optional: true @@ -2624,8 +2606,8 @@ packages: /@dnd-kit/core/6.0.5: resolution: {integrity: sha512-3nL+Zy5cT+1XwsWdlXIvGIFvbuocMyB4NBxTN74DeBaBqeWdH9JsnKwQv7buZQgAHmAH+eIENfS1ginkvW6bCw==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: '>=16.8.0 || 18' + react-dom: '>=16.8.0 || 18' peerDependenciesMeta: react: optional: true @@ -2653,7 +2635,7 @@ packages: resolution: {integrity: sha512-n77qAzJQtMMywu25sJzhz3gsHnDOUlEjTtnRl8A87rWIhnu32zuP+7zmFjwGgvqfXmRufqiHOSlH7JPC/tnJ8Q==} peerDependencies: '@dnd-kit/core': ^6.0.4 - react: '>=16.8.0' + react: '>=16.8.0 || 18' peerDependenciesMeta: react: optional: true @@ -2666,7 +2648,7 @@ packages: /@dnd-kit/utilities/3.2.0: resolution: {integrity: sha512-h65/pn2IPCCIWwdlR2BMLqRkDxpTEONA+HQW3n765HBijLYGyrnTCLa2YQt8VVjjSQD6EfFlTE6aS2Q/b6nb2g==} peerDependencies: - react: '>=16.8.0' + react: '>=16.8.0 || 18' peerDependenciesMeta: react: optional: true @@ -2794,7 +2776,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0 '@types/react': '*' - react: '>=16.8.0' + react: '>=16.8.0 || 18' peerDependenciesMeta: '@babel/core': optional: true @@ -2817,7 +2799,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0 '@types/react': '*' - react: '>=16.8.0' + react: '>=16.8.0 || 18' peerDependenciesMeta: '@babel/core': optional: true @@ -2835,38 +2817,12 @@ packages: hoist-non-react-statics: 3.3.2 dev: false - /@emotion/react/11.9.3_4jaruczdv2uxjj3lb2xbkiuci4: - resolution: {integrity: sha512-g9Q1GcTOlzOEjqwuLF/Zd9LC+4FljjPjDfxSM7KmEakm+hsHXk+bYZ2q+/hTJzr0OUNkujo72pXLQvXj6H+GJQ==} - peerDependencies: - '@babel/core': ^7.0.0 - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@babel/core': - optional: true - '@types/react': - optional: true - react: - optional: true - dependencies: - '@babel/core': 7.18.6 - '@babel/runtime': 7.18.6 - '@emotion/babel-plugin': 11.9.2_@babel+core@7.18.6 - '@emotion/cache': 11.9.3 - '@emotion/serialize': 1.0.4 - '@emotion/utils': 1.1.0 - '@emotion/weak-memoize': 0.2.5 - '@types/react': 18.0.14 - hoist-non-react-statics: 3.3.2 - react: 18.2.0 - dev: false - /@emotion/react/11.9.3_@babel+core@7.18.6: resolution: {integrity: sha512-g9Q1GcTOlzOEjqwuLF/Zd9LC+4FljjPjDfxSM7KmEakm+hsHXk+bYZ2q+/hTJzr0OUNkujo72pXLQvXj6H+GJQ==} peerDependencies: '@babel/core': ^7.0.0 '@types/react': '*' - react: '>=16.8.0' + react: '>=16.8.0 || 18' peerDependenciesMeta: '@babel/core': optional: true @@ -2885,6 +2841,32 @@ packages: hoist-non-react-statics: 3.3.2 dev: false + /@emotion/react/11.9.3_aev5mndowrsc2o4rquiaswzsei: + resolution: {integrity: sha512-g9Q1GcTOlzOEjqwuLF/Zd9LC+4FljjPjDfxSM7KmEakm+hsHXk+bYZ2q+/hTJzr0OUNkujo72pXLQvXj6H+GJQ==} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/react': '*' + react: '>=16.8.0 || 18' + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/react': + optional: true + react: + optional: true + dependencies: + '@babel/core': 7.18.6 + '@babel/runtime': 7.18.6 + '@emotion/babel-plugin': 11.9.2_@babel+core@7.18.6 + '@emotion/cache': 11.9.3 + '@emotion/serialize': 1.0.4 + '@emotion/utils': 1.1.0 + '@emotion/weak-memoize': 0.2.5 + '@types/react': 18.0.17 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + dev: false + /@emotion/serialize/1.0.4: resolution: {integrity: sha512-1JHamSpH8PIfFwAMryO2bNka+y8+KA5yga5Ocf2d7ZEiJjb7xlLW7aknBGZqJLajuLOvJ+72vN+IBSwPlXD1Pg==} dependencies: @@ -2919,7 +2901,7 @@ packages: '@babel/core': ^7.0.0 '@emotion/react': ^11.0.0-rc.0 '@types/react': '*' - react: '>=16.8.0' + react: '>=16.8.0 || 18' peerDependenciesMeta: '@babel/core': optional: true @@ -2944,7 +2926,7 @@ packages: '@babel/core': ^7.0.0 '@emotion/react': ^11.0.0-rc.0 '@types/react': '*' - react: '>=16.8.0' + react: '>=16.8.0 || 18' peerDependenciesMeta: '@babel/core': optional: true @@ -2968,7 +2950,7 @@ packages: '@babel/core': ^7.0.0 '@emotion/react': ^11.0.0-rc.0 '@types/react': '*' - react: '>=16.8.0' + react: '>=16.8.0 || 18' peerDependenciesMeta: '@babel/core': optional: true @@ -2993,7 +2975,7 @@ packages: '@babel/core': ^7.0.0 '@emotion/react': ^11.0.0-rc.0 '@types/react': '*' - react: '>=16.8.0' + react: '>=16.8.0 || 18' peerDependenciesMeta: '@babel/core': optional: true @@ -3013,13 +2995,13 @@ packages: '@emotion/utils': 1.1.0 dev: false - /@emotion/styled/11.9.3_toiz7tndcw4z2b7gxmmeo5fkcu: + /@emotion/styled/11.9.3_lzq4tq5osthlqcqhyhuicy5gfy: resolution: {integrity: sha512-o3sBNwbtoVz9v7WB1/Y/AmXl69YHmei2mrVnK7JgyBJ//Rst5yqPZCecEJlMlJrFeWHp+ki/54uN265V2pEcXA==} peerDependencies: '@babel/core': ^7.0.0 '@emotion/react': ^11.0.0-rc.0 '@types/react': '*' - react: '>=16.8.0' + react: '>=16.8.0 || 18' peerDependenciesMeta: '@babel/core': optional: true @@ -3034,10 +3016,10 @@ packages: '@babel/runtime': 7.18.6 '@emotion/babel-plugin': 11.9.2_@babel+core@7.18.6 '@emotion/is-prop-valid': 1.1.3 - '@emotion/react': 11.9.3_4jaruczdv2uxjj3lb2xbkiuci4 + '@emotion/react': 11.9.3_aev5mndowrsc2o4rquiaswzsei '@emotion/serialize': 1.0.4 '@emotion/utils': 1.1.0 - '@types/react': 18.0.14 + '@types/react': 18.0.17 react: 18.2.0 dev: false @@ -3089,14 +3071,14 @@ packages: text-decoding: 1.0.0 dev: false - /@firebase/analytics-compat/0.1.13_ntdu3hfexp42gsr3dmzonffheq: + /@firebase/analytics-compat/0.1.13_kowmy6vzi2xcdysg3n6ul4qaae: resolution: {integrity: sha512-QC1DH/Dwc8fBihn0H+jocBWyE17GF1fOCpCrpAiQ2u16F/NqsVDVG4LjIqdhq963DXaXneNY7oDwa25Up682AA==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/analytics': 0.8.0_@firebase+app@0.7.30 + '@firebase/analytics': 0.8.0_@firebase+app@0.7.31 '@firebase/analytics-types': 0.7.0 - '@firebase/app-compat': 0.1.31 + '@firebase/app-compat': 0.1.32 '@firebase/component': 0.5.17 '@firebase/util': 1.6.3 tslib: 2.4.0 @@ -3108,27 +3090,27 @@ packages: resolution: {integrity: sha512-DNE2Waiwy5+zZnCfintkDtBfaW6MjIG883474v6Z0K1XZIvl76cLND4iv0YUb48leyF+PJK1KO2XrgHb/KpmhQ==} dev: true - /@firebase/analytics/0.8.0_@firebase+app@0.7.30: + /@firebase/analytics/0.8.0_@firebase+app@0.7.31: resolution: {integrity: sha512-wkcwainNm8Cu2xkJpDSHfhBSdDJn86Q1TZNmLWc67VrhZUHXIKXxIqb65/tNUVE+I8+sFiDDNwA+9R3MqTQTaA==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.7.30 + '@firebase/app': 0.7.31 '@firebase/component': 0.5.17 - '@firebase/installations': 0.5.12_@firebase+app@0.7.30 + '@firebase/installations': 0.5.12_@firebase+app@0.7.31 '@firebase/logger': 0.3.3 '@firebase/util': 1.6.3 tslib: 2.4.0 dev: true - /@firebase/app-check-compat/0.2.12_ntdu3hfexp42gsr3dmzonffheq: + /@firebase/app-check-compat/0.2.12_kowmy6vzi2xcdysg3n6ul4qaae: resolution: {integrity: sha512-GFppNLlUyMN9Iq31ME/+GkjRVKlc+MeanzUKQ9UaR73ZsYH3oX3Ja+xjoYgixaVJDDG+ofBYR7ZXTkkQdSR/pw==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-check': 0.5.12_@firebase+app@0.7.30 + '@firebase/app-check': 0.5.12_@firebase+app@0.7.31 '@firebase/app-check-types': 0.4.0 - '@firebase/app-compat': 0.1.31 + '@firebase/app-compat': 0.1.32 '@firebase/component': 0.5.17 '@firebase/logger': 0.3.3 '@firebase/util': 1.6.3 @@ -3145,22 +3127,22 @@ packages: resolution: {integrity: sha512-SsWafqMABIOu7zLgWbmwvHGOeQQVQlwm42kwwubsmfLmL4Sf5uGpBfDhQ0CAkpi7bkJ/NwNFKafNDL9prRNP0Q==} dev: true - /@firebase/app-check/0.5.12_@firebase+app@0.7.30: + /@firebase/app-check/0.5.12_@firebase+app@0.7.31: resolution: {integrity: sha512-l+MmvupSGT/F+I5ei7XjhEfpoL4hLVJr0vUwcG5NEf2hAkQnySli9fnbl9fZu1BJaQ2kthrMmtg1gcbcM9BUCQ==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.7.30 + '@firebase/app': 0.7.31 '@firebase/component': 0.5.17 '@firebase/logger': 0.3.3 '@firebase/util': 1.6.3 tslib: 2.4.0 dev: true - /@firebase/app-compat/0.1.31: - resolution: {integrity: sha512-oH3F4Pf0/Q0WTyNynMlaoM1qjUTTu7ofDdAWUOgr9BH9gftIClqeCulltXSQH3DO3XUE61pIIpIakAWQ7zzumA==} + /@firebase/app-compat/0.1.32: + resolution: {integrity: sha512-dChnJsnHxih0MYQxCWBPAruqK2M4ba/t+DvKu8IcRpd4FkcUQ8FO19Z963nCdXyu2T6cxPcwCopKWaWlymBVVA==} dependencies: - '@firebase/app': 0.7.30 + '@firebase/app': 0.7.31 '@firebase/component': 0.5.17 '@firebase/logger': 0.3.3 '@firebase/util': 1.6.3 @@ -3170,8 +3152,8 @@ packages: /@firebase/app-types/0.7.0: resolution: {integrity: sha512-6fbHQwDv2jp/v6bXhBw2eSRbNBpxHcd1NBF864UksSMVIqIyri9qpJB1Mn6sGZE+bnDsSQBC5j2TbMxYsJQkQg==} - /@firebase/app/0.7.30: - resolution: {integrity: sha512-uJRMShpCWCrW6eO+/UuN0ExgztPMpK/w/AUryHJh7Ll4lFkc71pqE9P/XlfE+XXi0zkWoXVgPeLAQDkUJwgmMA==} + /@firebase/app/0.7.31: + resolution: {integrity: sha512-pqCkY2wC5pRBVH1oYliD9E0aSW6qisuMy7meaCtGzwaVcE8AFMhW9xhxHuBMpX1291+2iimUZWnCxSL9DaUUGA==} dependencies: '@firebase/component': 0.5.17 '@firebase/logger': 0.3.3 @@ -3180,13 +3162,13 @@ packages: tslib: 2.4.0 dev: true - /@firebase/auth-compat/0.2.18_53yvy43rwpg2c45kgeszsxtrca: + /@firebase/auth-compat/0.2.18_kg6iqletipudcxzgqetrtqyldy: resolution: {integrity: sha512-Fw2PJS0G/tGrfyEBcYJQ42sfy5+sANrK5xd7tuzgV7zLFW5rYkHUIZngXjuOBwLOcfO2ixa/FavfeJle3oJ38Q==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.1.31 - '@firebase/auth': 0.20.5_@firebase+app@0.7.30 + '@firebase/app-compat': 0.1.32 + '@firebase/auth': 0.20.5_@firebase+app@0.7.31 '@firebase/auth-types': 0.11.0_pbfwexsq7uf6mrzcwnikj3g37m '@firebase/component': 0.5.17 '@firebase/util': 1.6.3 @@ -3201,15 +3183,6 @@ packages: - utf-8-validate dev: true - /@firebase/auth-interop-types/0.1.6_@firebase+util@1.6.3: - resolution: {integrity: sha512-etIi92fW3CctsmR9e3sYM3Uqnoq861M0Id9mdOPF6PWIg38BXL5k4upCNBggGUpLIS0H1grMOvy/wn1xymwe2g==} - peerDependencies: - '@firebase/app-types': 0.x - '@firebase/util': 1.x - dependencies: - '@firebase/util': 1.6.3 - dev: false - /@firebase/auth-interop-types/0.1.6_pbfwexsq7uf6mrzcwnikj3g37m: resolution: {integrity: sha512-etIi92fW3CctsmR9e3sYM3Uqnoq861M0Id9mdOPF6PWIg38BXL5k4upCNBggGUpLIS0H1grMOvy/wn1xymwe2g==} peerDependencies: @@ -3218,7 +3191,6 @@ packages: dependencies: '@firebase/app-types': 0.7.0 '@firebase/util': 1.6.3 - dev: true /@firebase/auth-types/0.11.0_pbfwexsq7uf6mrzcwnikj3g37m: resolution: {integrity: sha512-q7Bt6cx+ySj9elQHTsKulwk3+qDezhzRBFC9zlQ1BjgMueUOnGMcvqmU0zuKlQ4RhLSH7MNAdBV2znVaoN3Vxw==} @@ -3230,12 +3202,12 @@ packages: '@firebase/util': 1.6.3 dev: true - /@firebase/auth/0.20.5_@firebase+app@0.7.30: + /@firebase/auth/0.20.5_@firebase+app@0.7.31: resolution: {integrity: sha512-SbKj7PCAuL0lXEToUOoprc1im2Lr/bzOePXyPC7WWqVgdVBt0qovbfejlzKYwJLHUAPg9UW1y3XYe3IlbXr77w==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.7.30 + '@firebase/app': 0.7.31 '@firebase/component': 0.5.17 '@firebase/logger': 0.3.3 '@firebase/util': 1.6.3 @@ -3254,11 +3226,11 @@ packages: '@firebase/util': 1.6.3 tslib: 2.4.0 - /@firebase/database-compat/0.2.4: + /@firebase/database-compat/0.2.4_@firebase+app-types@0.7.0: resolution: {integrity: sha512-VtsGixO5mTjNMJn6PwxAJEAR70fj+3blCXIdQKel3q+eYGZAfdqxox1+tzZDnf9NWBJpaOgAHPk3JVDxEo9NFQ==} dependencies: '@firebase/component': 0.5.17 - '@firebase/database': 0.13.4 + '@firebase/database': 0.13.4_@firebase+app-types@0.7.0 '@firebase/database-types': 0.9.12 '@firebase/logger': 0.3.3 '@firebase/util': 1.6.3 @@ -3267,12 +3239,12 @@ packages: - '@firebase/app-types' dev: false - /@firebase/database-compat/0.2.4_@firebase+app-types@0.7.0: - resolution: {integrity: sha512-VtsGixO5mTjNMJn6PwxAJEAR70fj+3blCXIdQKel3q+eYGZAfdqxox1+tzZDnf9NWBJpaOgAHPk3JVDxEo9NFQ==} + /@firebase/database-compat/0.2.5_@firebase+app-types@0.7.0: + resolution: {integrity: sha512-fj88gwtNJMcJBDjcTMbCuYEiVzuGb76rTOaaiAOqxR+unzvvbs2KU5KbFyl83jcpIjY6NIt+xXNrCXpzo7Zp3g==} dependencies: '@firebase/component': 0.5.17 - '@firebase/database': 0.13.4_@firebase+app-types@0.7.0 - '@firebase/database-types': 0.9.12 + '@firebase/database': 0.13.5_@firebase+app-types@0.7.0 + '@firebase/database-types': 0.9.13 '@firebase/logger': 0.3.3 '@firebase/util': 1.6.3 tslib: 2.4.0 @@ -3292,22 +3264,30 @@ packages: dependencies: '@firebase/app-types': 0.7.0 '@firebase/util': 1.6.3 - - /@firebase/database/0.13.4: - resolution: {integrity: sha512-NW7bOoiaC4sJCj6DY/m9xHoFNa0CK32YPMCh6FiMweLCDQbOZM8Ql/Kn6yyuxCb7K7ypz9eSbRlCWQJsJRQjhg==} - dependencies: - '@firebase/auth-interop-types': 0.1.6_@firebase+util@1.6.3 - '@firebase/component': 0.5.17 - '@firebase/logger': 0.3.3 - '@firebase/util': 1.6.3 - faye-websocket: 0.11.4 - tslib: 2.4.0 - transitivePeerDependencies: - - '@firebase/app-types' dev: false + /@firebase/database-types/0.9.13: + resolution: {integrity: sha512-dIJ1zGe3EHMhwcvukTOPzYlFYFIG1Et5Znl7s7y/ZTN2/toARRNnsv1qCKvqevIMYKvIrRsYOYfOXDS8l1YIJA==} + dependencies: + '@firebase/app-types': 0.7.0 + '@firebase/util': 1.6.3 + dev: true + /@firebase/database/0.13.4_@firebase+app-types@0.7.0: resolution: {integrity: sha512-NW7bOoiaC4sJCj6DY/m9xHoFNa0CK32YPMCh6FiMweLCDQbOZM8Ql/Kn6yyuxCb7K7ypz9eSbRlCWQJsJRQjhg==} + dependencies: + '@firebase/auth-interop-types': 0.1.6_pbfwexsq7uf6mrzcwnikj3g37m + '@firebase/component': 0.5.17 + '@firebase/logger': 0.3.3 + '@firebase/util': 1.6.3 + faye-websocket: 0.11.4 + tslib: 2.4.0 + transitivePeerDependencies: + - '@firebase/app-types' + dev: false + + /@firebase/database/0.13.5_@firebase+app-types@0.7.0: + resolution: {integrity: sha512-QmX73yi8URk36NAbykXeuAcJCjDtx3BzuxKJO3sL9B4CtjNFAfpWawVxoaaThocDWNAyMJxFhiL1kkaVraH7Lg==} dependencies: '@firebase/auth-interop-types': 0.1.6_pbfwexsq7uf6mrzcwnikj3g37m '@firebase/component': 0.5.17 @@ -3319,14 +3299,14 @@ packages: - '@firebase/app-types' dev: true - /@firebase/firestore-compat/0.1.23_53yvy43rwpg2c45kgeszsxtrca: + /@firebase/firestore-compat/0.1.23_kg6iqletipudcxzgqetrtqyldy: resolution: {integrity: sha512-QfcuyMAavp//fQnjSfCEpnbWi7spIdKaXys1kOLu7395fLr+U6ykmto1HUMCSz8Yus9cEr/03Ujdi2SUl2GUAA==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.1.31 + '@firebase/app-compat': 0.1.32 '@firebase/component': 0.5.17 - '@firebase/firestore': 3.4.14_@firebase+app@0.7.30 + '@firebase/firestore': 3.4.14_@firebase+app@0.7.31 '@firebase/firestore-types': 2.5.0_pbfwexsq7uf6mrzcwnikj3g37m '@firebase/util': 1.6.3 tslib: 2.4.0 @@ -3346,13 +3326,13 @@ packages: '@firebase/util': 1.6.3 dev: true - /@firebase/firestore/3.4.14_@firebase+app@0.7.30: + /@firebase/firestore/3.4.14_@firebase+app@0.7.31: resolution: {integrity: sha512-F4Pqd5OUBtJaAWWC39C0vrMLIdZtx7jsO7sARFHSiOZY/8bikfH9YovIRkpxk7OSs3HT/SgVdK0B1vISGNSnJA==} engines: {node: '>=10.10.0'} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.7.30 + '@firebase/app': 0.7.31 '@firebase/component': 0.5.17 '@firebase/logger': 0.3.3 '@firebase/util': 1.6.3 @@ -3365,14 +3345,14 @@ packages: - encoding dev: true - /@firebase/functions-compat/0.2.4_53yvy43rwpg2c45kgeszsxtrca: + /@firebase/functions-compat/0.2.4_kg6iqletipudcxzgqetrtqyldy: resolution: {integrity: sha512-Crfn6il1yXGuXkjSd8nKrqR4XxPvuP19g64bXpM6Ix67qOkQg676kyOuww0FF17xN0NSXHfG8Pyf+CUrx8wJ5g==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.1.31 + '@firebase/app-compat': 0.1.32 '@firebase/component': 0.5.17 - '@firebase/functions': 0.8.4_54flq6t3lt2vkv56b3wekvuqsq + '@firebase/functions': 0.8.4_lwgt3sk4yfjgasfpmvix4ixi2u '@firebase/functions-types': 0.5.0 '@firebase/util': 1.6.3 tslib: 2.4.0 @@ -3386,12 +3366,12 @@ packages: resolution: {integrity: sha512-qza0M5EwX+Ocrl1cYI14zoipUX4gI/Shwqv0C1nB864INAD42Dgv4v94BCyxGHBg2kzlWy8PNafdP7zPO8aJQA==} dev: true - /@firebase/functions/0.8.4_54flq6t3lt2vkv56b3wekvuqsq: + /@firebase/functions/0.8.4_lwgt3sk4yfjgasfpmvix4ixi2u: resolution: {integrity: sha512-o1bB0xMyQKe+b246zGnjwHj4R6BH4mU2ZrSaa/3QvTpahUQ3hqYfkZPLOXCU7+vEFxHb3Hd4UUjkFhxoAcPqLA==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.7.30 + '@firebase/app': 0.7.31 '@firebase/app-check-interop-types': 0.1.0 '@firebase/auth-interop-types': 0.1.6_pbfwexsq7uf6mrzcwnikj3g37m '@firebase/component': 0.5.17 @@ -3404,14 +3384,14 @@ packages: - encoding dev: true - /@firebase/installations-compat/0.1.12_53yvy43rwpg2c45kgeszsxtrca: + /@firebase/installations-compat/0.1.12_kg6iqletipudcxzgqetrtqyldy: resolution: {integrity: sha512-BIhFpWIn/GkuOa+jnXkp3SDJT2RLYJF6MWpinHIBKFJs7MfrgYZ3zQ1AlhobDEql+bkD1dK4dB5sNcET2T+EyA==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.1.31 + '@firebase/app-compat': 0.1.32 '@firebase/component': 0.5.17 - '@firebase/installations': 0.5.12_@firebase+app@0.7.30 + '@firebase/installations': 0.5.12_@firebase+app@0.7.31 '@firebase/installations-types': 0.4.0_@firebase+app-types@0.7.0 '@firebase/util': 1.6.3 tslib: 2.4.0 @@ -3428,12 +3408,12 @@ packages: '@firebase/app-types': 0.7.0 dev: true - /@firebase/installations/0.5.12_@firebase+app@0.7.30: + /@firebase/installations/0.5.12_@firebase+app@0.7.31: resolution: {integrity: sha512-Zq43fCE0PB5tGJ3ojzx5RNQzKdej1188qgAk22rwjuhP7npaG/PlJqDG1/V0ZjTLRePZ1xGrfXSPlA17c/vtNw==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.7.30 + '@firebase/app': 0.7.31 '@firebase/component': 0.5.17 '@firebase/util': 1.6.3 idb: 7.0.1 @@ -3445,14 +3425,14 @@ packages: dependencies: tslib: 2.4.0 - /@firebase/messaging-compat/0.1.16_ntdu3hfexp42gsr3dmzonffheq: + /@firebase/messaging-compat/0.1.16_kowmy6vzi2xcdysg3n6ul4qaae: resolution: {integrity: sha512-uG7rWcXJzU8vvlEBFpwG1ndw/GURrrmKcwsHopEWbsPGjMRaVWa7XrdKbvIR7IZohqPzcC/V9L8EeqF4Q4lz8w==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.1.31 + '@firebase/app-compat': 0.1.32 '@firebase/component': 0.5.17 - '@firebase/messaging': 0.9.16_@firebase+app@0.7.30 + '@firebase/messaging': 0.9.16_@firebase+app@0.7.31 '@firebase/util': 1.6.3 tslib: 2.4.0 transitivePeerDependencies: @@ -3463,29 +3443,29 @@ packages: resolution: {integrity: sha512-DbvUl/rXAZpQeKBnwz0NYY5OCqr2nFA0Bj28Fmr3NXGqR4PAkfTOHuQlVtLO1Nudo3q0HxAYLa68ZDAcuv2uKQ==} dev: true - /@firebase/messaging/0.9.16_@firebase+app@0.7.30: + /@firebase/messaging/0.9.16_@firebase+app@0.7.31: resolution: {integrity: sha512-Yl9gGrAvJF6C1gg3+Cr2HxlL6APsDEkrorkFafmSP1l+rg1epZKoOAcKJbSF02Vtb50wfb9FqGGy8tzodgETxg==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.7.30 + '@firebase/app': 0.7.31 '@firebase/component': 0.5.17 - '@firebase/installations': 0.5.12_@firebase+app@0.7.30 + '@firebase/installations': 0.5.12_@firebase+app@0.7.31 '@firebase/messaging-interop-types': 0.1.0 '@firebase/util': 1.6.3 idb: 7.0.1 tslib: 2.4.0 dev: true - /@firebase/performance-compat/0.1.12_ntdu3hfexp42gsr3dmzonffheq: + /@firebase/performance-compat/0.1.12_kowmy6vzi2xcdysg3n6ul4qaae: resolution: {integrity: sha512-IBORzUeGY1MGdZnsix9Mu5z4+C3WHIwalu0usxvygL0EZKHztGG8bppYPGH/b5vvg8QyHs9U+Pn1Ot2jZhffQQ==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.1.31 + '@firebase/app-compat': 0.1.32 '@firebase/component': 0.5.17 '@firebase/logger': 0.3.3 - '@firebase/performance': 0.5.12_@firebase+app@0.7.30 + '@firebase/performance': 0.5.12_@firebase+app@0.7.31 '@firebase/performance-types': 0.1.0 '@firebase/util': 1.6.3 tslib: 2.4.0 @@ -3497,36 +3477,28 @@ packages: resolution: {integrity: sha512-6p1HxrH0mpx+622Ql6fcxFxfkYSBpE3LSuwM7iTtYU2nw91Hj6THC8Bc8z4nboIq7WvgsT/kOTYVVZzCSlXl8w==} dev: true - /@firebase/performance/0.5.12_@firebase+app@0.7.30: + /@firebase/performance/0.5.12_@firebase+app@0.7.31: resolution: {integrity: sha512-MPVTkOkGrm2SMQgI1FPNBm85y2pPqlPb6VDjIMCWkVpAr6G1IZzUT24yEMySRcIlK/Hh7/Qu1Nu5ASRzRuX6+Q==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.7.30 + '@firebase/app': 0.7.31 '@firebase/component': 0.5.17 - '@firebase/installations': 0.5.12_@firebase+app@0.7.30 + '@firebase/installations': 0.5.12_@firebase+app@0.7.31 '@firebase/logger': 0.3.3 '@firebase/util': 1.6.3 tslib: 2.4.0 dev: true - /@firebase/polyfill/0.3.36: - resolution: {integrity: sha512-zMM9oSJgY6cT2jx3Ce9LYqb0eIpDE52meIzd/oe/y70F+v9u1LDqk5kUF5mf16zovGBWMNFmgzlsh6Wj0OsFtg==} - dependencies: - core-js: 3.6.5 - promise-polyfill: 8.1.3 - whatwg-fetch: 2.0.4 - dev: true - - /@firebase/remote-config-compat/0.1.12_ntdu3hfexp42gsr3dmzonffheq: + /@firebase/remote-config-compat/0.1.12_kowmy6vzi2xcdysg3n6ul4qaae: resolution: {integrity: sha512-Yz7Gtb2rLa7ykXZX9DnSTId8CXd++jFFLW3foUImrYwJEtWgLJc7gwkRfd1M73IlKGNuQAY+DpUNF0n1dLbecA==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.1.31 + '@firebase/app-compat': 0.1.32 '@firebase/component': 0.5.17 '@firebase/logger': 0.3.3 - '@firebase/remote-config': 0.3.11_@firebase+app@0.7.30 + '@firebase/remote-config': 0.3.11_@firebase+app@0.7.31 '@firebase/remote-config-types': 0.2.0 '@firebase/util': 1.6.3 tslib: 2.4.0 @@ -3538,27 +3510,27 @@ packages: resolution: {integrity: sha512-hqK5sCPeZvcHQ1D6VjJZdW6EexLTXNMJfPdTwbD8NrXUw6UjWC4KWhLK/TSlL0QPsQtcKRkaaoP+9QCgKfMFPw==} dev: true - /@firebase/remote-config/0.3.11_@firebase+app@0.7.30: + /@firebase/remote-config/0.3.11_@firebase+app@0.7.31: resolution: {integrity: sha512-qA84dstrvVpO7rWT/sb2CLv1kjHVmz59SRFPKohJJYFBcPOGK4Pe4FWWhKAE9yg1Gnl0qYAGkahOwNawq3vE0g==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.7.30 + '@firebase/app': 0.7.31 '@firebase/component': 0.5.17 - '@firebase/installations': 0.5.12_@firebase+app@0.7.30 + '@firebase/installations': 0.5.12_@firebase+app@0.7.31 '@firebase/logger': 0.3.3 '@firebase/util': 1.6.3 tslib: 2.4.0 dev: true - /@firebase/storage-compat/0.1.17_53yvy43rwpg2c45kgeszsxtrca: + /@firebase/storage-compat/0.1.17_kg6iqletipudcxzgqetrtqyldy: resolution: {integrity: sha512-nOYmnpI0gwoz5nROseMi9WbmHGf+xumfsOvdPyMZAjy0VqbDnpKIwmTUZQBdR+bLuB5oIkHQsvw9nbb1SH+PzQ==} peerDependencies: '@firebase/app-compat': 0.x dependencies: - '@firebase/app-compat': 0.1.31 + '@firebase/app-compat': 0.1.32 '@firebase/component': 0.5.17 - '@firebase/storage': 0.9.9_@firebase+app@0.7.30 + '@firebase/storage': 0.9.9_@firebase+app@0.7.31 '@firebase/storage-types': 0.6.0_pbfwexsq7uf6mrzcwnikj3g37m '@firebase/util': 1.6.3 tslib: 2.4.0 @@ -3578,12 +3550,12 @@ packages: '@firebase/util': 1.6.3 dev: true - /@firebase/storage/0.9.9_@firebase+app@0.7.30: + /@firebase/storage/0.9.9_@firebase+app@0.7.31: resolution: {integrity: sha512-Zch7srLT2SIh9y2nCVv/4Kne0HULn7OPkmreY70BJTUJ+g5WLRjggBq6x9fV5ls9V38iqMWfn4prxzX8yIc08A==} peerDependencies: '@firebase/app': 0.x dependencies: - '@firebase/app': 0.7.30 + '@firebase/app': 0.7.31 '@firebase/component': 0.5.17 '@firebase/util': 1.6.3 node-fetch: 2.6.7 @@ -3702,33 +3674,6 @@ packages: protobufjs: 6.11.3 yargs: 16.2.0 - /@headlessui/react/1.6.5_biqbaboplfbrettd7655fr4n2y: - resolution: {integrity: sha512-3VkKteDxlxf3fE0KbfO9t60KC1lM7YNpZggLpwzVNg1J/zwL+h+4N7MBlFDVpInZI3rKlZGpNx0PWsG/9c2vQg==} - engines: {node: '>=10'} - peerDependencies: - react: ^16 || ^17 || ^18 - react-dom: ^16 || ^17 || ^18 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - dependencies: - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - dev: true - - /@heroicons/react/1.0.6_react@18.2.0: - resolution: {integrity: sha512-JJCXydOFWMDpCP4q13iEplA503MQO3xLoZiKum+955ZCtHINWnx26CUxVxxFQu/uLb4LW3ge15ZpzIkXKkJ8oQ==} - peerDependencies: - react: '>= 16' - peerDependenciesMeta: - react: - optional: true - dependencies: - react: 18.2.0 - dev: true - /@humanwhocodes/config-array/0.9.5: resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} engines: {node: '>=10.10.0'} @@ -3765,7 +3710,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 18.0.1 + '@types/node': 18.7.13 chalk: 4.1.2 jest-message-util: 27.5.1 jest-util: 27.5.1 @@ -3777,7 +3722,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.1 - '@types/node': 18.0.1 + '@types/node': 18.7.13 chalk: 4.1.2 jest-message-util: 28.1.1 jest-util: 28.1.1 @@ -3798,14 +3743,14 @@ packages: '@jest/test-result': 28.1.1 '@jest/transform': 28.1.2 '@jest/types': 28.1.1 - '@types/node': 18.0.1 + '@types/node': 18.7.13 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.3.2 exit: 0.1.2 graceful-fs: 4.2.10 jest-changed-files: 28.0.2 - jest-config: 28.1.2_hxaxlvfys2pc3hefxwkmyo5cpq + jest-config: 28.1.2_3glepa5322b7j342guju4hszoy jest-haste-map: 28.1.1 jest-message-util: 28.1.1 jest-regex-util: 28.0.2 @@ -3840,7 +3785,7 @@ packages: dependencies: '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.0.1 + '@types/node': 18.7.13 jest-mock: 27.5.1 dev: true @@ -3850,7 +3795,7 @@ packages: dependencies: '@jest/fake-timers': 28.1.2 '@jest/types': 28.1.1 - '@types/node': 18.0.1 + '@types/node': 18.7.13 jest-mock: 28.1.1 dev: true @@ -3877,7 +3822,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@sinonjs/fake-timers': 8.1.0 - '@types/node': 18.0.1 + '@types/node': 18.7.13 jest-message-util: 27.5.1 jest-mock: 27.5.1 jest-util: 27.5.1 @@ -3889,7 +3834,7 @@ packages: dependencies: '@jest/types': 28.1.1 '@sinonjs/fake-timers': 9.1.2 - '@types/node': 18.0.1 + '@types/node': 18.7.13 jest-message-util: 28.1.1 jest-mock: 28.1.1 jest-util: 28.1.1 @@ -3929,8 +3874,8 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.0.1 - chalk: 4.1.0 + '@types/node': 18.7.13 + chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 glob: 7.2.3 @@ -3968,7 +3913,7 @@ packages: '@jest/transform': 28.1.2 '@jest/types': 28.1.1 '@jridgewell/trace-mapping': 0.3.14 - '@types/node': 18.0.1 + '@types/node': 18.7.13 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -4110,7 +4055,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.0.1 + '@types/node': 18.7.13 '@types/yargs': 16.0.4 chalk: 4.1.2 dev: true @@ -4122,7 +4067,7 @@ packages: '@jest/schemas': 28.0.2 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.0.1 + '@types/node': 18.7.13 '@types/yargs': 17.0.10 chalk: 4.1.2 dev: true @@ -4280,9 +4225,9 @@ packages: resolution: {integrity: sha512-uL7ej2F/3GUnZewsDQSHUVHoSBT3AQcTIdfdy6QeCHy7X26mtbcIvTRcjl2PzbbNQplppavSTibPiQG/giJ+ng==} engines: {node: '>=12.0.0'} peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || 18 + react: ^17.0.0 || ^18.0.0 || 18 + react-dom: ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: '@types/react': optional: true @@ -4296,18 +4241,18 @@ packages: '@mui/types': 7.1.4 '@mui/utils': 5.8.6 '@popperjs/core': 2.11.5 - clsx: 1.2.0 + clsx: 1.2.1 prop-types: 15.8.1 react-is: 17.0.2 dev: false - /@mui/base/5.0.0-alpha.88_twyhzqqpkwvvgrmyeapdo6i4my: + /@mui/base/5.0.0-alpha.88_zxljzmqdrxwnuenbkrz77w74uy: resolution: {integrity: sha512-uL7ej2F/3GUnZewsDQSHUVHoSBT3AQcTIdfdy6QeCHy7X26mtbcIvTRcjl2PzbbNQplppavSTibPiQG/giJ+ng==} engines: {node: '>=12.0.0'} peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || 18 + react: ^17.0.0 || ^18.0.0 || 18 + react-dom: ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: '@types/react': optional: true @@ -4318,11 +4263,11 @@ packages: dependencies: '@babel/runtime': 7.18.6 '@emotion/is-prop-valid': 1.1.3 - '@mui/types': 7.1.4_@types+react@18.0.14 + '@mui/types': 7.1.4_@types+react@18.0.17 '@mui/utils': 5.8.6_react@18.2.0 '@popperjs/core': 2.11.5 - '@types/react': 18.0.14 - clsx: 1.2.0 + '@types/react': 18.0.17 + clsx: 1.2.1 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 @@ -4333,9 +4278,9 @@ packages: resolution: {integrity: sha512-ZgnSLrTXL4iUdLQhjp01dAOTQPQlnwrqjZRwDT3E6LZXEYn6cMv1MY6LZkWcF/zxrUnyasnsyMAgZ5d8AXS7bA==} engines: {node: '>=12.0.0'} peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || 18 + react: ^17.0.0 || ^18.0.0 || 18 + react-dom: ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: '@types/react': optional: true @@ -4359,8 +4304,8 @@ packages: engines: {node: '>=12.0.0'} peerDependencies: '@mui/material': ^5.0.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || 18 + react: ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: '@mui/material': optional: true @@ -4377,8 +4322,8 @@ packages: engines: {node: '>=12.0.0'} peerDependencies: '@mui/material': ^5.0.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || 18 + react: ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: '@mui/material': optional: true @@ -4391,13 +4336,13 @@ packages: '@mui/material': 5.8.7_d6menda4vqwq6peqnkbe7mkj4i dev: false - /@mui/icons-material/5.8.4_vdnh4jyrnjwcar5vg6k35n5t6e: + /@mui/icons-material/5.8.4_wip2cf6yrkxu2zuyrl3lmpbdaa: resolution: {integrity: sha512-9Z/vyj2szvEhGWDvb+gG875bOGm8b8rlHBKOD1+nA3PcgC3fV6W1AU6pfOorPeBfH2X4mb9Boe97vHvaSndQvA==} engines: {node: '>=12.0.0'} peerDependencies: '@mui/material': ^5.0.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || 18 + react: ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: '@mui/material': optional: true @@ -4407,8 +4352,8 @@ packages: optional: true dependencies: '@babel/runtime': 7.18.6 - '@mui/material': 5.8.7_h2u6a3oivtyocvjxeke7xcvlfa - '@types/react': 18.0.14 + '@mui/material': 5.8.7_mugunlselc52kyz7qt5aa5ixva + '@types/react': 18.0.17 react: 18.2.0 dev: false @@ -4418,9 +4363,9 @@ packages: peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || 18 + react: ^17.0.0 || ^18.0.0 || 18 + react-dom: ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: '@emotion/react': optional: true @@ -4452,9 +4397,9 @@ packages: peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || 18 + react: ^17.0.0 || ^18.0.0 || 18 + react-dom: ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: '@emotion/react': optional: true @@ -4475,22 +4420,22 @@ packages: '@mui/types': 7.1.4 '@mui/utils': 5.8.6 '@types/react-transition-group': 4.4.5 - clsx: 1.2.0 + clsx: 1.2.1 csstype: 3.1.0 prop-types: 15.8.1 react-is: 17.0.2 react-transition-group: 4.4.2 dev: false - /@mui/material/5.8.7_h2u6a3oivtyocvjxeke7xcvlfa: + /@mui/material/5.8.7_mugunlselc52kyz7qt5aa5ixva: resolution: {integrity: sha512-Oo62UhrgEi+BMLr3nUEASJgScE2/hhq14CbBUmrVV3GQlEGtqMZsy26Vb0AqEmphFeN3TXlsbM9aeW5yq8ZFlw==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || 18 + react: ^17.0.0 || ^18.0.0 || 18 + react-dom: ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: '@emotion/react': optional: true @@ -4504,15 +4449,15 @@ packages: optional: true dependencies: '@babel/runtime': 7.18.6 - '@emotion/react': 11.9.3_4jaruczdv2uxjj3lb2xbkiuci4 - '@emotion/styled': 11.9.3_toiz7tndcw4z2b7gxmmeo5fkcu - '@mui/base': 5.0.0-alpha.88_twyhzqqpkwvvgrmyeapdo6i4my - '@mui/system': 5.8.7_2n63gx4a5hafw7crejwh35wbou - '@mui/types': 7.1.4_@types+react@18.0.14 + '@emotion/react': 11.9.3_aev5mndowrsc2o4rquiaswzsei + '@emotion/styled': 11.9.3_lzq4tq5osthlqcqhyhuicy5gfy + '@mui/base': 5.0.0-alpha.88_zxljzmqdrxwnuenbkrz77w74uy + '@mui/system': 5.8.7_q75tbj2u2psqs4y633sohfsc6i + '@mui/types': 7.1.4_@types+react@18.0.17 '@mui/utils': 5.8.6_react@18.2.0 - '@types/react': 18.0.14 + '@types/react': 18.0.17 '@types/react-transition-group': 4.4.5 - clsx: 1.2.0 + clsx: 1.2.1 csstype: 3.1.0 prop-types: 15.8.1 react: 18.2.0 @@ -4525,8 +4470,8 @@ packages: resolution: {integrity: sha512-yHsJk1qU9r/q0DlnxGRJPHyM0Y/nUv8FTNgDTiI9I58GWuVuZqeTUr7JRvPh6ybeP/FLtW5eXEavRK9wxVk4uQ==} engines: {node: '>=12.0.0'} peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || 18 + react: ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: '@types/react': optional: true @@ -4538,12 +4483,12 @@ packages: prop-types: 15.8.1 dev: false - /@mui/private-theming/5.8.6_luyos4mouogwq6z3wafb3re4ce: + /@mui/private-theming/5.8.6_ug65io7jkbhmo4fihdmbrh3ina: resolution: {integrity: sha512-yHsJk1qU9r/q0DlnxGRJPHyM0Y/nUv8FTNgDTiI9I58GWuVuZqeTUr7JRvPh6ybeP/FLtW5eXEavRK9wxVk4uQ==} engines: {node: '>=12.0.0'} peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || 18 + react: ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: '@types/react': optional: true @@ -4552,7 +4497,7 @@ packages: dependencies: '@babel/runtime': 7.18.6 '@mui/utils': 5.8.6_react@18.2.0 - '@types/react': 18.0.14 + '@types/react': 18.0.17 prop-types: 15.8.1 react: 18.2.0 dev: false @@ -4561,8 +4506,8 @@ packages: resolution: {integrity: sha512-Ys3WO39WqoGciGX9k5AIi/k2zJhlydv4FzlEEwtw9OqdMaV0ydK/TdZekKzjP9sTI/JcdAP3H5DWtUaPLQJjWg==} engines: {node: '>=12.0.0'} peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || 18 + react: ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: '@types/react': optional: true @@ -4580,7 +4525,7 @@ packages: peerDependencies: '@emotion/react': ^11.4.1 '@emotion/styled': ^11.3.0 - react: ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: '@emotion/react': optional: true @@ -4603,7 +4548,7 @@ packages: peerDependencies: '@emotion/react': ^11.4.1 '@emotion/styled': ^11.3.0 - react: ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: '@emotion/react': optional: true @@ -4614,8 +4559,8 @@ packages: dependencies: '@babel/runtime': 7.18.6 '@emotion/cache': 11.9.3 - '@emotion/react': 11.9.3 - '@emotion/styled': 11.9.3_@emotion+react@11.9.3 + '@emotion/react': 11.9.3_@babel+core@7.18.6 + '@emotion/styled': 11.9.3_dc5dh2wp562rsjxvguwi2i3yzq csstype: 3.1.0 prop-types: 15.8.1 dev: false @@ -4626,7 +4571,7 @@ packages: peerDependencies: '@emotion/react': ^11.4.1 '@emotion/styled': ^11.3.0 - react: ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: '@emotion/react': optional: true @@ -4637,40 +4582,8 @@ packages: dependencies: '@babel/runtime': 7.18.6 '@emotion/cache': 11.9.3 - '@emotion/react': 11.9.3_4jaruczdv2uxjj3lb2xbkiuci4 - '@emotion/styled': 11.9.3_toiz7tndcw4z2b7gxmmeo5fkcu - csstype: 3.1.0 - prop-types: 15.8.1 - react: 18.2.0 - dev: false - - /@mui/system/5.8.7_2n63gx4a5hafw7crejwh35wbou: - resolution: {integrity: sha512-yFoFbfO42FWeSUDrFPixYjpqySQMqVMOSbSlAxiKnwFpvXGGn/bkfQTboCRNO31fvES29FJLQd4mwwMHd5mXng==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true - react: - optional: true - dependencies: - '@babel/runtime': 7.18.6 - '@emotion/react': 11.9.3_4jaruczdv2uxjj3lb2xbkiuci4 - '@emotion/styled': 11.9.3_toiz7tndcw4z2b7gxmmeo5fkcu - '@mui/private-theming': 5.8.6_luyos4mouogwq6z3wafb3re4ce - '@mui/styled-engine': 5.8.7_fdnqutfacy7v3gmlcm66flps3q - '@mui/types': 7.1.4_@types+react@18.0.14 - '@mui/utils': 5.8.6_react@18.2.0 - '@types/react': 18.0.14 - clsx: 1.2.0 + '@emotion/react': 11.9.3_aev5mndowrsc2o4rquiaswzsei + '@emotion/styled': 11.9.3_lzq4tq5osthlqcqhyhuicy5gfy csstype: 3.1.0 prop-types: 15.8.1 react: 18.2.0 @@ -4682,8 +4595,8 @@ packages: peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || 18 + react: ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: '@emotion/react': optional: true @@ -4706,14 +4619,46 @@ packages: prop-types: 15.8.1 dev: false + /@mui/system/5.8.7_q75tbj2u2psqs4y633sohfsc6i: + resolution: {integrity: sha512-yFoFbfO42FWeSUDrFPixYjpqySQMqVMOSbSlAxiKnwFpvXGGn/bkfQTboCRNO31fvES29FJLQd4mwwMHd5mXng==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 || 18 + react: ^17.0.0 || ^18.0.0 || 18 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + react: + optional: true + dependencies: + '@babel/runtime': 7.18.6 + '@emotion/react': 11.9.3_aev5mndowrsc2o4rquiaswzsei + '@emotion/styled': 11.9.3_lzq4tq5osthlqcqhyhuicy5gfy + '@mui/private-theming': 5.8.6_ug65io7jkbhmo4fihdmbrh3ina + '@mui/styled-engine': 5.8.7_fdnqutfacy7v3gmlcm66flps3q + '@mui/types': 7.1.4_@types+react@18.0.17 + '@mui/utils': 5.8.6_react@18.2.0 + '@types/react': 18.0.17 + clsx: 1.2.0 + csstype: 3.1.0 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + /@mui/system/5.9.3_72v32ofbtgpmxm7mhvtx474vfu: resolution: {integrity: sha512-EXQV2POwncstHLYII+G4VSYdEFun1TjBbQSBDK76DbIkug8nPjtjAZ+3Kgk3/NoFIigW+vQ9cDVUZtlbRH6YMQ==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || 18 + react: ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: '@emotion/react': optional: true @@ -4742,8 +4687,8 @@ packages: peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || 18 + react: ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: '@emotion/react': optional: true @@ -4775,7 +4720,7 @@ packages: optional: true dev: false - /@mui/types/7.1.4_@types+react@18.0.14: + /@mui/types/7.1.4_@types+react@18.0.17: resolution: {integrity: sha512-uveM3byMbthO+6tXZ1n2zm0W3uJCQYtwt/v5zV5I77v2v18u0ITkb8xwhsDD2i3V2Kye7SaNR6FFJ6lMuY/WqQ==} peerDependencies: '@types/react': '*' @@ -4783,7 +4728,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.0.14 + '@types/react': 18.0.17 dev: false /@mui/types/7.1.5: @@ -4799,7 +4744,7 @@ packages: resolution: {integrity: sha512-QM2Sd1xZo2jOt2Vz5Rmro+pi2FLJyiv4+OjxkUwXR3oUM65KSMAMLl/KNYU55s3W3DLRFP5MVwE4FhAbHseHAg==} engines: {node: '>=12.0.0'} peerDependencies: - react: ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: react: optional: true @@ -4815,7 +4760,7 @@ packages: resolution: {integrity: sha512-QM2Sd1xZo2jOt2Vz5Rmro+pi2FLJyiv4+OjxkUwXR3oUM65KSMAMLl/KNYU55s3W3DLRFP5MVwE4FhAbHseHAg==} engines: {node: '>=12.0.0'} peerDependencies: - react: ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: react: optional: true @@ -4832,7 +4777,7 @@ packages: resolution: {integrity: sha512-l0N5bcrenE9hnwZ/jPecpIRqsDFHkPXoFUcmkgysaJwVZzJ3yQkGXB47eqmXX5yyGrSc6HksbbqXEaUya+siew==} engines: {node: '>=12.0.0'} peerDependencies: - react: ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: react: optional: true @@ -4850,8 +4795,8 @@ packages: peerDependencies: '@mui/material': ^5.4.1 '@mui/system': ^5.4.1 - react: ^17.0.2 || ^18.0.0 - react-dom: ^17.0.2 || ^18.0.0 + react: ^17.0.2 || ^18.0.0 || 18 + react-dom: ^17.0.2 || ^18.0.0 || 18 peerDependenciesMeta: '@mui/material': optional: true @@ -4869,7 +4814,7 @@ packages: reselect: 4.1.6 dev: false - /@mui/x-date-pickers-pro/5.0.0-alpha.7_3ze6eywwrphmf4xmeajh7ll6xm: + /@mui/x-date-pickers-pro/5.0.0-alpha.7_k34ytkg6gx4xxob5q3piijp2ce: resolution: {integrity: sha512-Ni244FQNYmiPCGUS47E9FE5YYSTJZ4BxjUmQ8h2Mz0Ob+n+q2zXN+q2KzRjtuhBcH3w+VGjFD1zxvKxyAZkgbg==} engines: {node: '>=12.0.0'} peerDependencies: @@ -4879,7 +4824,7 @@ packages: dayjs: ^1.10.7 luxon: ^1.28.0 || ^2.0.0 moment: ^2.29.1 - react: ^17.0.2 || ^18.0.0 + react: ^17.0.2 || ^18.0.0 || 18 peerDependenciesMeta: '@mui/material': optional: true @@ -4895,17 +4840,17 @@ packages: optional: true dependencies: '@babel/runtime': 7.18.6 - '@date-io/date-fns': 2.14.0_date-fns@2.28.0 + '@date-io/date-fns': 2.14.0_date-fns@2.29.2 '@date-io/dayjs': 2.14.0 '@date-io/luxon': 2.14.0 '@date-io/moment': 2.14.0 '@mui/material': 5.8.7_d6menda4vqwq6peqnkbe7mkj4i '@mui/system': 5.8.7_d6menda4vqwq6peqnkbe7mkj4i '@mui/utils': 5.8.6 - '@mui/x-date-pickers': 5.0.0-alpha.7_3ze6eywwrphmf4xmeajh7ll6xm + '@mui/x-date-pickers': 5.0.0-alpha.7_k34ytkg6gx4xxob5q3piijp2ce '@mui/x-license-pro': 5.12.1 - clsx: 1.2.0 - date-fns: 2.28.0 + clsx: 1.2.1 + date-fns: 2.29.2 prop-types: 15.8.1 react-transition-group: 4.4.2 rifm: 0.12.1 @@ -4915,7 +4860,7 @@ packages: - react-dom dev: false - /@mui/x-date-pickers/5.0.0-alpha.7_3ze6eywwrphmf4xmeajh7ll6xm: + /@mui/x-date-pickers/5.0.0-alpha.7_k34ytkg6gx4xxob5q3piijp2ce: resolution: {integrity: sha512-y+RAkuC9riyoPD8mt2/Y9nV3+MxwCYfUOh2o09nFVnIKUSud37hhOMiX8BzAbQRO/2JoRByN5jEj2zuWPW2zuw==} engines: {node: '>=12.0.0'} peerDependencies: @@ -4927,7 +4872,7 @@ packages: dayjs: ^1.10.7 luxon: ^1.28.0 || ^2.0.0 moment: ^2.29.1 - react: ^17.0.2 || ^18.0.0 + react: ^17.0.2 || ^18.0.0 || 18 peerDependenciesMeta: '@emotion/react': optional: true @@ -4947,7 +4892,7 @@ packages: optional: true dependencies: '@babel/runtime': 7.18.6 - '@date-io/date-fns': 2.14.0_date-fns@2.28.0 + '@date-io/date-fns': 2.14.0_date-fns@2.29.2 '@date-io/dayjs': 2.14.0 '@date-io/luxon': 2.14.0 '@date-io/moment': 2.14.0 @@ -4956,8 +4901,8 @@ packages: '@mui/material': 5.8.7_d6menda4vqwq6peqnkbe7mkj4i '@mui/system': 5.8.7_d6menda4vqwq6peqnkbe7mkj4i '@mui/utils': 5.8.6 - clsx: 1.2.0 - date-fns: 2.28.0 + clsx: 1.2.1 + date-fns: 2.29.2 prop-types: 15.8.1 react-transition-group: 4.4.2 rifm: 0.12.1 @@ -4970,7 +4915,7 @@ packages: engines: {node: '>=12.0.0'} hasBin: true peerDependencies: - react: ^17.0.2 || ^18.0.0 + react: ^17.0.2 || ^18.0.0 || 18 peerDependenciesMeta: react: optional: true @@ -5002,25 +4947,25 @@ packages: fastq: 1.13.0 dev: true - /@nrwl/cli/14.4.2: - resolution: {integrity: sha512-JNV4kP9goZD4BlTQGKdKhCRc1bhiWYp1TaDJHdk4ZfhiLt1NzXNxxgc/eX2obFZ3Hw+KdM/gM5F7KfWBbtSGSw==} + /@nrwl/cli/14.5.10: + resolution: {integrity: sha512-GpnnKGO3+HwlMmZSStbq1MOyoDJg2I0HN4nBqM3ltaQkfxGZv3erwRMOAT+8mba2MWbJJ2QQgASAYvTscNYjOQ==} dependencies: - nx: 14.4.2_@swc+core@1.2.210 + nx: 14.5.10_@swc+core@1.2.244 dev: true - /@nrwl/cli/14.4.2_@swc+core@1.2.210: - resolution: {integrity: sha512-JNV4kP9goZD4BlTQGKdKhCRc1bhiWYp1TaDJHdk4ZfhiLt1NzXNxxgc/eX2obFZ3Hw+KdM/gM5F7KfWBbtSGSw==} + /@nrwl/cli/14.5.10_@swc+core@1.2.244: + resolution: {integrity: sha512-GpnnKGO3+HwlMmZSStbq1MOyoDJg2I0HN4nBqM3ltaQkfxGZv3erwRMOAT+8mba2MWbJJ2QQgASAYvTscNYjOQ==} dependencies: - nx: 14.4.2_@swc+core@1.2.210 + nx: 14.5.10_@swc+core@1.2.244 transitivePeerDependencies: - '@swc-node/register' - '@swc/core' dev: true - /@nrwl/cypress/14.4.2_gtbxvtmh5ipj3piki3xg57n5fe: - resolution: {integrity: sha512-vek4tJYzaJwnLgeJLAJKWuCmtE+XWCq6IgmCl/4G/lWxTWGzlJ19ZK8MoCEiJqbnNYeoHZPxoaAGwyBAbVuO3w==} + /@nrwl/cypress/14.5.10_7nv76pmmfazpmc5mincnwvnlka: + resolution: {integrity: sha512-NymwWehtpgCNZBLV/jwvKFCHWz4mw8+YG70uAheyO4ybkCmA2ghvaOG3shni9MG9mOMfRGz5Cc23/ScIekxA2w==} peerDependencies: - cypress: '>= 3 < 10' + cypress: '>= 3 < 11' peerDependenciesMeta: cypress: optional: true @@ -5028,19 +4973,21 @@ packages: '@babel/core': 7.18.6 '@babel/preset-env': 7.18.6_@babel+core@7.18.6 '@cypress/webpack-preprocessor': 5.12.0_kbhwel7in52p4dlvjkqlq5ojfi - '@nrwl/devkit': 14.4.2_nx@14.4.2 - '@nrwl/linter': 14.4.2_jqnzvbaca4rx3byobgjku3onji - '@nrwl/workspace': 14.4.2_a22ftc74wzukohhtmp6cnnvzoq + '@nrwl/devkit': 14.5.10_friigstnlhuirqu4wr7dfbyroa + '@nrwl/linter': 14.5.10_z5rj2yvzo55d4uujwqo5vfieea + '@nrwl/workspace': 14.5.10_cx6aw7aax7s3eyq3oi6a2zoeoi + '@phenomnomnominal/tsquery': 4.1.1_typescript@4.7.4 babel-loader: 8.2.5_m3opitmgss2x7fiy6klia7uvaa chalk: 4.1.0 + dotenv: 10.0.0 enhanced-resolve: 5.10.0 - fork-ts-checker-webpack-plugin: 6.2.10_wln64xm7gyszy6wbwhdijmigya + fork-ts-checker-webpack-plugin: 7.2.13_xnp4kzegbjokq62cajex2ovgkm rxjs: 6.6.7 ts-loader: 9.3.1_xnp4kzegbjokq62cajex2ovgkm tsconfig-paths: 3.14.1 tsconfig-paths-webpack-plugin: 3.5.2 tslib: 2.4.0 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 webpack-node-externals: 3.0.0 transitivePeerDependencies: - '@swc-node/register' @@ -5061,21 +5008,69 @@ packages: - webpack-cli dev: true - /@nrwl/devkit/14.4.2_nx@14.4.2: - resolution: {integrity: sha512-CJCczAbnZ7w6XZeOMHhb4aTQeDzU0pJOAAJvNU1EAzbj/nkP+QILn/sX+WQR6z94UT2Y9SMamnE4TjQC2F48vQ==} + /@nrwl/cypress/14.5.10_fh4vayvykx4so2ggxmjmy42o7q: + resolution: {integrity: sha512-NymwWehtpgCNZBLV/jwvKFCHWz4mw8+YG70uAheyO4ybkCmA2ghvaOG3shni9MG9mOMfRGz5Cc23/ScIekxA2w==} + peerDependencies: + cypress: '>= 3 < 11' + peerDependenciesMeta: + cypress: + optional: true + dependencies: + '@babel/core': 7.18.6 + '@babel/preset-env': 7.18.6_@babel+core@7.18.6 + '@cypress/webpack-preprocessor': 5.12.0_kbhwel7in52p4dlvjkqlq5ojfi + '@nrwl/devkit': 14.5.10_friigstnlhuirqu4wr7dfbyroa + '@nrwl/linter': 14.5.10_nccbbaajqjy3rznvgrrzaevqwe + '@nrwl/workspace': 14.5.10_eva5qnqrnaa26adtrypogyveky + '@phenomnomnominal/tsquery': 4.1.1_typescript@4.7.4 + babel-loader: 8.2.5_m3opitmgss2x7fiy6klia7uvaa + chalk: 4.1.0 + dotenv: 10.0.0 + enhanced-resolve: 5.10.0 + fork-ts-checker-webpack-plugin: 7.2.13_xnp4kzegbjokq62cajex2ovgkm + rxjs: 6.6.7 + ts-loader: 9.3.1_xnp4kzegbjokq62cajex2ovgkm + tsconfig-paths: 3.14.1 + tsconfig-paths-webpack-plugin: 3.5.2 + tslib: 2.4.0 + webpack: 5.74.0_@swc+core@1.2.244 + webpack-node-externals: 3.0.0 + transitivePeerDependencies: + - '@swc-node/register' + - '@swc/core' + - bufferutil + - canvas + - esbuild + - eslint + - node-notifier + - nx + - prettier + - supports-color + - ts-node + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: true + + /@nrwl/devkit/14.5.10_friigstnlhuirqu4wr7dfbyroa: + resolution: {integrity: sha512-YVT0MRvyXwe0uczUZK4XUi1f2iLAqklFMfAoqwfgcgWToH8xN06NSlyUphD4eLHFgem3Sd0kimAJVsnse/PTlA==} peerDependencies: nx: '>= 13.10 <= 15' dependencies: + '@phenomnomnominal/tsquery': 4.1.1_typescript@4.7.4 ejs: 3.1.8 ignore: 5.2.0 - nx: 14.4.2_@swc+core@1.2.210 - rxjs: 6.6.7 + nx: 14.5.10_@swc+core@1.2.244 semver: 7.3.4 tslib: 2.4.0 + transitivePeerDependencies: + - typescript dev: true - /@nrwl/eslint-plugin-nx/14.4.2_afsbewstkdex5d4fc6xnpjlnau: - resolution: {integrity: sha512-lYePXOoBWDbnzv/ltkT/ueE0rm30wJTaHaSJAZwI+csHR5Oj61l0zaCdXz4GlDOl6ZJLbS98/oOgufCnOSdMhw==} + /@nrwl/eslint-plugin-nx/14.5.10_givxt7oldssnfrhy2ogb3txvmu: + resolution: {integrity: sha512-YKXgnY8UzHfsw7Hzut7aO02t/8midI/vagUpwGCs08k8oWLZJ50CsTfnEgh61V6VAQWEpm8iPTaubAVLPLwtlg==} peerDependencies: '@typescript-eslint/parser': ^5.29.0 eslint-config-prettier: ^8.1.0 @@ -5083,10 +5078,10 @@ packages: eslint-config-prettier: optional: true dependencies: - '@nrwl/devkit': 14.4.2_nx@14.4.2 - '@nrwl/workspace': 14.4.2_a22ftc74wzukohhtmp6cnnvzoq - '@typescript-eslint/experimental-utils': 5.30.5_4x5o4skxv6sl53vpwefgt23khm + '@nrwl/devkit': 14.5.10_friigstnlhuirqu4wr7dfbyroa + '@nrwl/workspace': 14.5.10_eva5qnqrnaa26adtrypogyveky '@typescript-eslint/parser': 5.30.5_4x5o4skxv6sl53vpwefgt23khm + '@typescript-eslint/utils': 5.30.5_4x5o4skxv6sl53vpwefgt23khm chalk: 4.1.0 confusing-browser-globals: 1.0.11 eslint-config-prettier: 8.5.0_eslint@8.19.0 @@ -5106,14 +5101,15 @@ packages: - utf-8-validate dev: true - /@nrwl/jest/14.4.2_dltevkctzdxkrvyldbyepwbdle: - resolution: {integrity: sha512-5BIbkChVRmJQ0ngNBdL1Fy3oSLm20zR1ec9XgBAktPDQ4ZMPz3ZWk9c5kKX2H2tOvyu98hbOqZ0HLbPXAbt/Ew==} + /@nrwl/jest/14.5.10_mxnt7yjwrufofllb6rm3srb2gy: + resolution: {integrity: sha512-gGqghwDcpBhk8TNK2Gfp/5PWqnnAPUjNfSCOz39kk9ZBtsyloozGwjg/VEF3k2p9uCifRfAyZOpDrSdALxBpdA==} dependencies: '@jest/reporters': 27.5.1 '@jest/test-result': 27.5.1 - '@nrwl/devkit': 14.4.2_nx@14.4.2 + '@nrwl/devkit': 14.5.10_friigstnlhuirqu4wr7dfbyroa '@phenomnomnominal/tsquery': 4.1.1_typescript@4.7.4 chalk: 4.1.0 + dotenv: 10.0.0 identity-obj-proxy: 3.0.0 jest-config: 27.5.1_ts-node@10.8.2 jest-resolve: 27.5.1 @@ -5132,13 +5128,40 @@ packages: - utf-8-validate dev: true - /@nrwl/js/14.4.2_gtbxvtmh5ipj3piki3xg57n5fe: - resolution: {integrity: sha512-kVi+DAm1iaEZ8XQ8+dViDlK9/2ZM4Eq0fhWXtWisvuVmgoTdWQ88DDzXyINbzv4cWtpMnKHeIWJeM/WMWAX36w==} + /@nrwl/jest/14.5.10_oqd6w67pqggug57az6damxqvgm: + resolution: {integrity: sha512-gGqghwDcpBhk8TNK2Gfp/5PWqnnAPUjNfSCOz39kk9ZBtsyloozGwjg/VEF3k2p9uCifRfAyZOpDrSdALxBpdA==} dependencies: - '@nrwl/devkit': 14.4.2_nx@14.4.2 - '@nrwl/jest': 14.4.2_dltevkctzdxkrvyldbyepwbdle - '@nrwl/linter': 14.4.2_jqnzvbaca4rx3byobgjku3onji - '@nrwl/workspace': 14.4.2_a22ftc74wzukohhtmp6cnnvzoq + '@jest/reporters': 27.5.1 + '@jest/test-result': 27.5.1 + '@nrwl/devkit': 14.5.10_friigstnlhuirqu4wr7dfbyroa + '@phenomnomnominal/tsquery': 4.1.1_typescript@4.7.4 + chalk: 4.1.0 + dotenv: 10.0.0 + identity-obj-proxy: 3.0.0 + jest-config: 27.5.1_ts-node@10.9.1 + jest-resolve: 27.5.1 + jest-util: 27.5.1 + resolve.exports: 1.1.0 + rxjs: 6.6.7 + tslib: 2.4.0 + transitivePeerDependencies: + - bufferutil + - canvas + - node-notifier + - nx + - supports-color + - ts-node + - typescript + - utf-8-validate + dev: true + + /@nrwl/js/14.5.10_7nv76pmmfazpmc5mincnwvnlka: + resolution: {integrity: sha512-UNLGI1kP2YoWCraDaSDQOqQSgj3S5+qpvnqWBkDMl+augJmNEDBSWi/bNXMQgQqKDvLHF65iJeAuFSFhtdksAA==} + dependencies: + '@nrwl/devkit': 14.5.10_friigstnlhuirqu4wr7dfbyroa + '@nrwl/jest': 14.5.10_oqd6w67pqggug57az6damxqvgm + '@nrwl/linter': 14.5.10_z5rj2yvzo55d4uujwqo5vfieea + '@nrwl/workspace': 14.5.10_cx6aw7aax7s3eyq3oi6a2zoeoi '@parcel/watcher': 2.0.4 chalk: 4.1.0 fast-glob: 3.2.7 @@ -5163,19 +5186,50 @@ packages: - utf-8-validate dev: true - /@nrwl/linter/14.4.2_jqnzvbaca4rx3byobgjku3onji: - resolution: {integrity: sha512-K44C+mwwbq0Q3IECNqxO9WGB9J7vSKoyaOzx0BH0HgKtfTSTyALHuM6ylzZ9y9pNK0CDbkVraKoFwDZ42GtzCQ==} + /@nrwl/js/14.5.10_fh4vayvykx4so2ggxmjmy42o7q: + resolution: {integrity: sha512-UNLGI1kP2YoWCraDaSDQOqQSgj3S5+qpvnqWBkDMl+augJmNEDBSWi/bNXMQgQqKDvLHF65iJeAuFSFhtdksAA==} + dependencies: + '@nrwl/devkit': 14.5.10_friigstnlhuirqu4wr7dfbyroa + '@nrwl/jest': 14.5.10_mxnt7yjwrufofllb6rm3srb2gy + '@nrwl/linter': 14.5.10_nccbbaajqjy3rznvgrrzaevqwe + '@nrwl/workspace': 14.5.10_eva5qnqrnaa26adtrypogyveky + '@parcel/watcher': 2.0.4 + chalk: 4.1.0 + fast-glob: 3.2.7 + fs-extra: 10.1.0 + ignore: 5.2.0 + js-tokens: 4.0.0 + minimatch: 3.0.5 + source-map-support: 0.5.19 + tree-kill: 1.2.2 + transitivePeerDependencies: + - '@swc-node/register' + - '@swc/core' + - bufferutil + - canvas + - eslint + - node-notifier + - nx + - prettier + - supports-color + - ts-node + - typescript + - utf-8-validate + dev: true + + /@nrwl/linter/14.5.10_nccbbaajqjy3rznvgrrzaevqwe: + resolution: {integrity: sha512-3c6KhSLJmt8wMkYZw+f/KayPHkM+KV/z+QaYQL59XY5o9DdYyq6jHjnvu/CuW2JzU97yHkacYbwkSFQlDKCyIg==} peerDependencies: eslint: ^8.0.0 peerDependenciesMeta: eslint: optional: true dependencies: - '@nrwl/devkit': 14.4.2_nx@14.4.2 - '@nrwl/jest': 14.4.2_dltevkctzdxkrvyldbyepwbdle + '@nrwl/devkit': 14.5.10_friigstnlhuirqu4wr7dfbyroa + '@nrwl/jest': 14.5.10_mxnt7yjwrufofllb6rm3srb2gy '@phenomnomnominal/tsquery': 4.1.1_typescript@4.7.4 eslint: 8.19.0 - nx: 14.4.2_@swc+core@1.2.210 + nx: 14.5.10_@swc+core@1.2.244 tmp: 0.2.1 tslib: 2.4.0 transitivePeerDependencies: @@ -5190,32 +5244,59 @@ packages: - utf-8-validate dev: true - /@nrwl/node/14.4.2_ehspof47b5bphcyk4536mwaw4u: - resolution: {integrity: sha512-YMolQH3R/DTyPap3fQFWXvBaKJQG6l+msAUqzHp5OML3lPDg+zBYGW2kD1IsXpYq/ccpaot1ePS5K0JDpbZ8zQ==} + /@nrwl/linter/14.5.10_z5rj2yvzo55d4uujwqo5vfieea: + resolution: {integrity: sha512-3c6KhSLJmt8wMkYZw+f/KayPHkM+KV/z+QaYQL59XY5o9DdYyq6jHjnvu/CuW2JzU97yHkacYbwkSFQlDKCyIg==} + peerDependencies: + eslint: ^8.0.0 + peerDependenciesMeta: + eslint: + optional: true dependencies: - '@nrwl/devkit': 14.4.2_nx@14.4.2 - '@nrwl/jest': 14.4.2_dltevkctzdxkrvyldbyepwbdle - '@nrwl/js': 14.4.2_gtbxvtmh5ipj3piki3xg57n5fe - '@nrwl/linter': 14.4.2_jqnzvbaca4rx3byobgjku3onji - '@nrwl/workspace': 14.4.2_a22ftc74wzukohhtmp6cnnvzoq + '@nrwl/devkit': 14.5.10_friigstnlhuirqu4wr7dfbyroa + '@nrwl/jest': 14.5.10_oqd6w67pqggug57az6damxqvgm + '@phenomnomnominal/tsquery': 4.1.1_typescript@4.7.4 + eslint: 8.19.0 + nx: 14.5.10_@swc+core@1.2.244 + tmp: 0.2.1 + tslib: 2.4.0 + transitivePeerDependencies: + - '@swc-node/register' + - '@swc/core' + - bufferutil + - canvas + - node-notifier + - supports-color + - ts-node + - typescript + - utf-8-validate + dev: true + + /@nrwl/node/14.5.10_b7xqi4yfwax4wnal77xdlkadre: + resolution: {integrity: sha512-d/2QSLyOe19/GddWExA2YeRu97r1jyjFpqpQGjJQ/PzdAMuAXWw8fOvhM5iq8XDlWi0IoQMmU5r/OoPDzRtbLg==} + dependencies: + '@nrwl/devkit': 14.5.10_friigstnlhuirqu4wr7dfbyroa + '@nrwl/jest': 14.5.10_oqd6w67pqggug57az6damxqvgm + '@nrwl/js': 14.5.10_7nv76pmmfazpmc5mincnwvnlka + '@nrwl/linter': 14.5.10_z5rj2yvzo55d4uujwqo5vfieea + '@nrwl/workspace': 14.5.10_cx6aw7aax7s3eyq3oi6a2zoeoi chalk: 4.1.0 - copy-webpack-plugin: 9.1.0_webpack@5.74.0 + copy-webpack-plugin: 10.2.4_webpack@5.74.0 + dotenv: 10.0.0 enhanced-resolve: 5.10.0 - fork-ts-checker-webpack-plugin: 6.2.10_wln64xm7gyszy6wbwhdijmigya + fork-ts-checker-webpack-plugin: 7.2.13_xnp4kzegbjokq62cajex2ovgkm fs-extra: 10.1.0 glob: 7.1.4 license-webpack-plugin: 4.0.2_webpack@5.74.0 rxjs: 6.6.7 - rxjs-for-await: 0.0.2_rxjs@6.6.7 source-map-support: 0.5.19 - terser-webpack-plugin: 5.3.3_vwzmvoh3samqo2nn3x7mqt365m + terser-webpack-plugin: 5.3.3_5yvlrjpud4kvfyyr2mesgpo47e tree-kill: 1.2.2 ts-loader: 9.3.1_xnp4kzegbjokq62cajex2ovgkm - ts-node: 10.8.2_y42jqzo3jkzuv3kp7opavo2xbi + ts-node: 10.9.1_hixnfb2jfw56u6pahjg3ndp4oy tsconfig-paths: 3.14.1 tsconfig-paths-webpack-plugin: 3.5.2 tslib: 2.4.0 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 webpack-merge: 5.8.0 webpack-node-externals: 3.0.0 transitivePeerDependencies: @@ -5238,44 +5319,46 @@ packages: - webpack-cli dev: true - /@nrwl/nx-cloud/14.2.0: - resolution: {integrity: sha512-KnrNFDCII9mbLwFp0HgyKVlhMTXoN90CQzGgdtCNPPBP/Wg84pttcpynGdWyupkrBJxdqMNTJEC7HGib0ipxew==} + /@nrwl/nx-cloud/14.5.4: + resolution: {integrity: sha512-fuKsx+2jvpL5OAuwSUsODEydzt01qiPJwZslbCtMWXRGva5KNbT4udNwl0C1M/W9RFVYmFbD7n4Ewz3oho531A==} hasBin: true dependencies: axios: 0.21.4 chalk: 4.1.0 + dotenv: 10.0.0 node-machine-id: 1.1.12 strip-json-comments: 3.1.1 tar: 6.1.11 + yargs-parser: 21.0.1 transitivePeerDependencies: - debug dev: true - /@nrwl/react/14.4.2_46t6z7wulh2zjyi5wmxujdm57y: - resolution: {integrity: sha512-5OlTpa5wRgADkNuP55Ii0myZLqzcefwR+lMRSBFquwOzxQ5VEU9JCyZVeO4pBdVr1ibbIJoj1EfO+NnVpCtELg==} + /@nrwl/react/14.5.10_o5732ev3g42bu2r3ngh6yfrgia: + resolution: {integrity: sha512-cdMWs9BKu1mkKg+/UisOSxAIxD13kbKY565+mqIRKzsdN8LvP7Xe6iDCfGtIpg1esrZxVZbcMm38L3rn6x+4hQ==} dependencies: '@babel/core': 7.18.6 '@babel/preset-react': 7.18.6_@babel+core@7.18.6 - '@nrwl/cypress': 14.4.2_gtbxvtmh5ipj3piki3xg57n5fe - '@nrwl/devkit': 14.4.2_nx@14.4.2 - '@nrwl/jest': 14.4.2_dltevkctzdxkrvyldbyepwbdle - '@nrwl/js': 14.4.2_gtbxvtmh5ipj3piki3xg57n5fe - '@nrwl/linter': 14.4.2_jqnzvbaca4rx3byobgjku3onji - '@nrwl/storybook': 14.4.2_brofqo76x5gdh2qufyuyzjmfne - '@nrwl/web': 14.4.2_7ggz7ibmlwrqtwusxeq53zzcym - '@nrwl/workspace': 14.4.2_a22ftc74wzukohhtmp6cnnvzoq + '@nrwl/cypress': 14.5.10_fh4vayvykx4so2ggxmjmy42o7q + '@nrwl/devkit': 14.5.10_friigstnlhuirqu4wr7dfbyroa + '@nrwl/jest': 14.5.10_mxnt7yjwrufofllb6rm3srb2gy + '@nrwl/js': 14.5.10_fh4vayvykx4so2ggxmjmy42o7q + '@nrwl/linter': 14.5.10_nccbbaajqjy3rznvgrrzaevqwe + '@nrwl/storybook': 14.5.10_cu63rkszloo7pn4oqbb7oabdnu + '@nrwl/web': 14.5.10_tpw7pltx5fafq53de536pruocy + '@nrwl/workspace': 14.5.10_eva5qnqrnaa26adtrypogyveky '@pmmmwh/react-refresh-webpack-plugin': 0.5.7_bgbvhssx5jbdjtmrq4m55itcsu - '@storybook/node-logger': 6.1.20 '@svgr/webpack': 6.2.1 chalk: 4.1.0 eslint-plugin-import: 2.26.0_iom7pm3yknyiblqpw2vvqvxs5i eslint-plugin-jsx-a11y: 6.6.0_eslint@8.19.0 eslint-plugin-react: 7.30.0_eslint@8.19.0 eslint-plugin-react-hooks: 4.6.0_eslint@8.19.0 + minimatch: 3.0.5 react-refresh: 0.10.0 semver: 7.3.4 url-loader: 4.1.1_webpack@5.74.0 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 webpack-merge: 5.8.0 transitivePeerDependencies: - '@parcel/css' @@ -5318,14 +5401,15 @@ packages: - webpack-plugin-serve dev: true - /@nrwl/storybook/14.4.2_brofqo76x5gdh2qufyuyzjmfne: - resolution: {integrity: sha512-G6h3jQT+pIY0RAEbeclguEFSAIXsToRVKEeRyq1bk6fWJHy7y//bCeJrINL9xPf9zk12cWyKkjJvwsOcy0Z1Mw==} + /@nrwl/storybook/14.5.10_cu63rkszloo7pn4oqbb7oabdnu: + resolution: {integrity: sha512-CIeVgxYvkEvVDo3RaHS49bbqm97Mpv+g3iM8lFU11yz5ImJdnJkjZOF8AHl1jLJpyFj1nAXdmWtbTzULAObgTw==} dependencies: - '@nrwl/cypress': 14.4.2_gtbxvtmh5ipj3piki3xg57n5fe - '@nrwl/devkit': 14.4.2_nx@14.4.2 - '@nrwl/linter': 14.4.2_jqnzvbaca4rx3byobgjku3onji - '@nrwl/workspace': 14.4.2_a22ftc74wzukohhtmp6cnnvzoq - core-js: 3.23.3 + '@nrwl/cypress': 14.5.10_fh4vayvykx4so2ggxmjmy42o7q + '@nrwl/devkit': 14.5.10_friigstnlhuirqu4wr7dfbyroa + '@nrwl/linter': 14.5.10_nccbbaajqjy3rznvgrrzaevqwe + '@nrwl/workspace': 14.5.10_eva5qnqrnaa26adtrypogyveky + core-js: 3.25.0 + dotenv: 10.0.0 semver: 7.3.4 ts-loader: 9.3.1_xnp4kzegbjokq62cajex2ovgkm tsconfig-paths-webpack-plugin: 3.5.2 @@ -5350,18 +5434,18 @@ packages: - webpack-cli dev: true - /@nrwl/tao/14.4.2_@swc+core@1.2.210: - resolution: {integrity: sha512-Ygw3skKZfFhi4MBHZKQ8A67pDQxeyDdY78tFWViMN0SEn9ExL41Q8V9aSMfir8VZYGca6ZOXX5MRhbeHdcgMLQ==} + /@nrwl/tao/14.5.10_@swc+core@1.2.244: + resolution: {integrity: sha512-eWORRba0HlTNmOQFUxHqki0Z5yiRIq1Hl0taprmZpz2lgDXuzPIjGfAi5/ETy5+G5gkEyxFnCq7+SiMilPokwA==} hasBin: true dependencies: - nx: 14.4.2_@swc+core@1.2.210 + nx: 14.5.10_@swc+core@1.2.244 transitivePeerDependencies: - '@swc-node/register' - '@swc/core' dev: true - /@nrwl/web/14.4.2_7ggz7ibmlwrqtwusxeq53zzcym: - resolution: {integrity: sha512-x00dE67yDRC3zmVEdO1HdtIbPezZ5gSKmNmEL2++PrA6AUz3a+f7/Ahhs4ALxnEPx1oDRLzM5OxRb5w6kLmGfw==} + /@nrwl/web/14.5.10_tpw7pltx5fafq53de536pruocy: + resolution: {integrity: sha512-mMlHRgywmSJIRfKyfDfVbOt0NnAPf+tV2gEAYnXt8GF0SfcQhG1xpn3A6oQgl36fpZ78FzO2Z+txw4OiKk+lrw==} dependencies: '@babel/core': 7.18.6 '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.18.6 @@ -5371,12 +5455,12 @@ packages: '@babel/preset-env': 7.18.6_@babel+core@7.18.6 '@babel/preset-typescript': 7.18.6_@babel+core@7.18.6 '@babel/runtime': 7.18.6 - '@nrwl/cypress': 14.4.2_gtbxvtmh5ipj3piki3xg57n5fe - '@nrwl/devkit': 14.4.2_nx@14.4.2 - '@nrwl/jest': 14.4.2_dltevkctzdxkrvyldbyepwbdle - '@nrwl/js': 14.4.2_gtbxvtmh5ipj3piki3xg57n5fe - '@nrwl/linter': 14.4.2_jqnzvbaca4rx3byobgjku3onji - '@nrwl/workspace': 14.4.2_a22ftc74wzukohhtmp6cnnvzoq + '@nrwl/cypress': 14.5.10_7nv76pmmfazpmc5mincnwvnlka + '@nrwl/devkit': 14.5.10_friigstnlhuirqu4wr7dfbyroa + '@nrwl/jest': 14.5.10_oqd6w67pqggug57az6damxqvgm + '@nrwl/js': 14.5.10_7nv76pmmfazpmc5mincnwvnlka + '@nrwl/linter': 14.5.10_z5rj2yvzo55d4uujwqo5vfieea + '@nrwl/workspace': 14.5.10_cx6aw7aax7s3eyq3oi6a2zoeoi '@pmmmwh/react-refresh-webpack-plugin': 0.5.7_obbju5ecoedcc2mvvgblbzwdca '@rollup/plugin-babel': 5.3.1_fb3qe53zzddvqjqqltveoanfhe '@rollup/plugin-commonjs': 20.0.0_rollup@2.75.7 @@ -5394,13 +5478,13 @@ packages: caniuse-lite: 1.0.30001363 chalk: 4.1.0 chokidar: 3.5.3 - copy-webpack-plugin: 9.1.0_webpack@5.74.0 - core-js: 3.23.3 + copy-webpack-plugin: 10.2.4_webpack@5.74.0 + core-js: 3.25.0 css-loader: 6.7.1_webpack@5.74.0 css-minimizer-webpack-plugin: 3.4.1_webpack@5.74.0 enhanced-resolve: 5.10.0 file-loader: 6.2.0_webpack@5.74.0 - fork-ts-checker-webpack-plugin: 6.2.10_wln64xm7gyszy6wbwhdijmigya + fork-ts-checker-webpack-plugin: 7.2.13_xnp4kzegbjokq62cajex2ovgkm fs-extra: 10.1.0 http-server: 14.1.0 identity-obj-proxy: 3.0.0 @@ -5420,10 +5504,9 @@ packages: rollup: 2.75.7 rollup-plugin-copy: 3.4.0 rollup-plugin-peer-deps-external: 2.2.4_rollup@2.75.7 - rollup-plugin-postcss: 4.0.2_i7duc3lt6p42geuj2nwruihc6u + rollup-plugin-postcss: 4.0.2_pe6iykxod2v7i2uk6okjazxzki rollup-plugin-typescript2: 0.31.2_okefoyb4o5sittgqayreuhurei rxjs: 6.6.7 - rxjs-for-await: 0.0.2_rxjs@6.6.7 sass: 1.53.0 sass-loader: 12.6.0_sass@1.53.0+webpack@5.74.0 semver: 7.3.4 @@ -5432,13 +5515,13 @@ packages: style-loader: 3.3.1_webpack@5.74.0 stylus: 0.55.0 stylus-loader: 6.2.0_772wava6yveehcyvgfd527qm3q - terser-webpack-plugin: 5.3.3_vwzmvoh3samqo2nn3x7mqt365m + terser-webpack-plugin: 5.3.3_5yvlrjpud4kvfyyr2mesgpo47e ts-loader: 9.3.1_xnp4kzegbjokq62cajex2ovgkm - ts-node: 10.8.2_y42jqzo3jkzuv3kp7opavo2xbi + ts-node: 10.9.1_hixnfb2jfw56u6pahjg3ndp4oy tsconfig-paths: 3.14.1 tsconfig-paths-webpack-plugin: 3.5.2 tslib: 2.4.0 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 webpack-dev-server: 4.9.3_webpack@5.74.0 webpack-merge: 5.8.0 webpack-sources: 3.2.3 @@ -5478,17 +5561,17 @@ packages: - webpack-plugin-serve dev: true - /@nrwl/workspace/14.4.2_a22ftc74wzukohhtmp6cnnvzoq: - resolution: {integrity: sha512-D3EXkeg/39V3OeKINvymeOsr5QVRLZFwYOWHfvVcJh8iKpVrev/zMFOm6rSrHmdlpoLkJVAOW2QI+1MYl92Gig==} + /@nrwl/workspace/14.5.10_cx6aw7aax7s3eyq3oi6a2zoeoi: + resolution: {integrity: sha512-bJK2O5NcIYhU7z1mmWoONo2+tOt1VUYyOQUUrAcI00hiBhMJPOTwPPN+W5BbJsue95ndH6mRLo2UhTz20U2tNA==} peerDependencies: prettier: ^2.6.2 peerDependenciesMeta: prettier: optional: true dependencies: - '@nrwl/devkit': 14.4.2_nx@14.4.2 - '@nrwl/jest': 14.4.2_dltevkctzdxkrvyldbyepwbdle - '@nrwl/linter': 14.4.2_jqnzvbaca4rx3byobgjku3onji + '@nrwl/devkit': 14.5.10_friigstnlhuirqu4wr7dfbyroa + '@nrwl/jest': 14.5.10_oqd6w67pqggug57az6damxqvgm + '@nrwl/linter': 14.5.10_z5rj2yvzo55d4uujwqo5vfieea '@parcel/watcher': 2.0.4 chalk: 4.1.0 chokidar: 3.5.3 @@ -5503,7 +5586,54 @@ packages: ignore: 5.2.0 minimatch: 3.0.5 npm-run-path: 4.0.1 - nx: 14.4.2_@swc+core@1.2.210 + nx: 14.5.10_@swc+core@1.2.244 + open: 8.4.0 + prettier: 2.7.1 + rxjs: 6.6.7 + semver: 7.3.4 + tmp: 0.2.1 + tslib: 2.4.0 + yargs: 17.5.1 + yargs-parser: 21.0.1 + transitivePeerDependencies: + - '@swc-node/register' + - '@swc/core' + - bufferutil + - canvas + - eslint + - node-notifier + - supports-color + - ts-node + - typescript + - utf-8-validate + dev: true + + /@nrwl/workspace/14.5.10_eva5qnqrnaa26adtrypogyveky: + resolution: {integrity: sha512-bJK2O5NcIYhU7z1mmWoONo2+tOt1VUYyOQUUrAcI00hiBhMJPOTwPPN+W5BbJsue95ndH6mRLo2UhTz20U2tNA==} + peerDependencies: + prettier: ^2.6.2 + peerDependenciesMeta: + prettier: + optional: true + dependencies: + '@nrwl/devkit': 14.5.10_friigstnlhuirqu4wr7dfbyroa + '@nrwl/jest': 14.5.10_mxnt7yjwrufofllb6rm3srb2gy + '@nrwl/linter': 14.5.10_nccbbaajqjy3rznvgrrzaevqwe + '@parcel/watcher': 2.0.4 + chalk: 4.1.0 + chokidar: 3.5.3 + cli-cursor: 3.1.0 + cli-spinners: 2.6.1 + dotenv: 10.0.0 + enquirer: 2.3.6 + figures: 3.2.0 + flat: 5.0.2 + fs-extra: 10.1.0 + glob: 7.1.4 + ignore: 5.2.0 + minimatch: 3.0.5 + npm-run-path: 4.0.1 + nx: 14.5.10_@swc+core@1.2.244 open: 8.4.0 prettier: 2.7.1 rxjs: 6.6.7 @@ -5586,7 +5716,7 @@ packages: react-refresh: 0.10.0 schema-utils: 3.1.1 source-map: 0.7.4 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 dev: true /@pmmmwh/react-refresh-webpack-plugin/0.5.7_obbju5ecoedcc2mvvgblbzwdca: @@ -5627,7 +5757,7 @@ packages: react-refresh: 0.10.0 schema-utils: 3.1.1 source-map: 0.7.4 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 webpack-dev-server: 4.9.3_webpack@5.74.0 dev: true @@ -5642,7 +5772,7 @@ packages: /@portabletext/react/1.0.6_react@18.2.0: resolution: {integrity: sha512-j6BprLiwFz3zr1Lo6BxM2sQ1b3g1JIjGwePeuxqSfbBiEYbGXn2izEckMJ02hSa1f7+RCEUJ+Bojvtzz6BBUaw==} peerDependencies: - react: ^17 || ^18 + react: ^17 || ^18 || 18 peerDependenciesMeta: react: optional: true @@ -5825,9 +5955,9 @@ packages: engines: {node: '>=4'} dev: true - /@sindresorhus/is/4.6.0: - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} + /@sindresorhus/is/5.3.0: + resolution: {integrity: sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==} + engines: {node: '>=14.16'} dev: false /@sinonjs/commons/1.8.3: @@ -5848,18 +5978,8 @@ packages: '@sinonjs/commons': 1.8.3 dev: true - /@storybook/node-logger/6.1.20: - resolution: {integrity: sha512-Z6337htb1mxIccvCx2Ai0v9LPDlBlmXzeWhap3q2Y6hg8g1p4+0W5Y6bG9RmXqJoXLaT1trO8uAXgGO7AN92yg==} - dependencies: - '@types/npmlog': 4.1.4 - chalk: 4.1.0 - core-js: 3.23.3 - npmlog: 4.1.2 - pretty-hrtime: 1.0.3 - dev: true - - /@svgr/babel-plugin-add-jsx-attribute/6.0.0_@babel+core@7.18.6: - resolution: {integrity: sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==} + /@svgr/babel-plugin-add-jsx-attribute/6.3.1_@babel+core@7.18.6: + resolution: {integrity: sha512-jDBKArXYO1u0B1dmd2Nf8Oy6aTF5vLDfLoO9Oon/GLkqZ/NiggYWZA+a2HpUMH4ITwNqS3z43k8LWApB8S583w==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5870,8 +5990,8 @@ packages: '@babel/core': 7.18.6 dev: true - /@svgr/babel-plugin-remove-jsx-attribute/6.0.0_@babel+core@7.18.6: - resolution: {integrity: sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==} + /@svgr/babel-plugin-remove-jsx-attribute/6.3.1_@babel+core@7.18.6: + resolution: {integrity: sha512-dQzyJ4prwjcFd929T43Z8vSYiTlTu8eafV40Z2gO7zy/SV5GT+ogxRJRBIKWomPBOiaVXFg3jY4S5hyEN3IBjQ==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5882,8 +6002,8 @@ packages: '@babel/core': 7.18.6 dev: true - /@svgr/babel-plugin-remove-jsx-empty-expression/6.0.0_@babel+core@7.18.6: - resolution: {integrity: sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==} + /@svgr/babel-plugin-remove-jsx-empty-expression/6.3.1_@babel+core@7.18.6: + resolution: {integrity: sha512-HBOUc1XwSU67fU26V5Sfb8MQsT0HvUyxru7d0oBJ4rA2s4HW3PhyAPC7fV/mdsSGpAvOdd8Wpvkjsr0fWPUO7A==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5894,8 +6014,8 @@ packages: '@babel/core': 7.18.6 dev: true - /@svgr/babel-plugin-replace-jsx-attribute-value/6.0.0_@babel+core@7.18.6: - resolution: {integrity: sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==} + /@svgr/babel-plugin-replace-jsx-attribute-value/6.3.1_@babel+core@7.18.6: + resolution: {integrity: sha512-C12e6aN4BXAolRrI601gPn5MDFCRHO7C4TM8Kks+rDtl8eEq+NN1sak0eAzJu363x3TmHXdZn7+Efd2nr9I5dA==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5906,8 +6026,8 @@ packages: '@babel/core': 7.18.6 dev: true - /@svgr/babel-plugin-svg-dynamic-title/6.0.0_@babel+core@7.18.6: - resolution: {integrity: sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==} + /@svgr/babel-plugin-svg-dynamic-title/6.3.1_@babel+core@7.18.6: + resolution: {integrity: sha512-6NU55Mmh3M5u2CfCCt6TX29/pPneutrkJnnDCHbKZnjukZmmgUAZLtZ2g6ZoSPdarowaQmAiBRgAHqHmG0vuqA==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5918,8 +6038,8 @@ packages: '@babel/core': 7.18.6 dev: true - /@svgr/babel-plugin-svg-em-dimensions/6.0.0_@babel+core@7.18.6: - resolution: {integrity: sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==} + /@svgr/babel-plugin-svg-em-dimensions/6.3.1_@babel+core@7.18.6: + resolution: {integrity: sha512-HV1NGHYTTe1vCNKlBgq/gKuCSfaRlKcHIADn7P8w8U3Zvujdw1rmusutghJ1pZJV7pDt3Gt8ws+SVrqHnBO/Qw==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5930,8 +6050,8 @@ packages: '@babel/core': 7.18.6 dev: true - /@svgr/babel-plugin-transform-react-native-svg/6.0.0_@babel+core@7.18.6: - resolution: {integrity: sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==} + /@svgr/babel-plugin-transform-react-native-svg/6.3.1_@babel+core@7.18.6: + resolution: {integrity: sha512-2wZhSHvTolFNeKDAN/ZmIeSz2O9JSw72XD+o2bNp2QAaWqa8KGpn5Yk5WHso6xqfSAiRzAE+GXlsrBO4UP9LLw==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5942,8 +6062,8 @@ packages: '@babel/core': 7.18.6 dev: true - /@svgr/babel-plugin-transform-svg-component/6.2.0_@babel+core@7.18.6: - resolution: {integrity: sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg==} + /@svgr/babel-plugin-transform-svg-component/6.3.1_@babel+core@7.18.6: + resolution: {integrity: sha512-cZ8Tr6ZAWNUFfDeCKn/pGi976iWSkS8ijmEYKosP+6ktdZ7lW9HVLHojyusPw3w0j8PI4VBeWAXAmi/2G7owxw==} engines: {node: '>=12'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5954,8 +6074,8 @@ packages: '@babel/core': 7.18.6 dev: true - /@svgr/babel-preset/6.2.0_@babel+core@7.18.6: - resolution: {integrity: sha512-4WQNY0J71JIaL03DRn0vLiz87JXx0b9dYm2aA8XHlQJQoixMl4r/soYHm8dsaJZ3jWtkCiOYy48dp9izvXhDkQ==} + /@svgr/babel-preset/6.3.1_@babel+core@7.18.6: + resolution: {integrity: sha512-tQtWtzuMMQ3opH7je+MpwfuRA1Hf3cKdSgTtAYwOBDfmhabP7rcTfBi3E7V3MuwJNy/Y02/7/RutvwS1W4Qv9g==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5964,57 +6084,57 @@ packages: optional: true dependencies: '@babel/core': 7.18.6 - '@svgr/babel-plugin-add-jsx-attribute': 6.0.0_@babel+core@7.18.6 - '@svgr/babel-plugin-remove-jsx-attribute': 6.0.0_@babel+core@7.18.6 - '@svgr/babel-plugin-remove-jsx-empty-expression': 6.0.0_@babel+core@7.18.6 - '@svgr/babel-plugin-replace-jsx-attribute-value': 6.0.0_@babel+core@7.18.6 - '@svgr/babel-plugin-svg-dynamic-title': 6.0.0_@babel+core@7.18.6 - '@svgr/babel-plugin-svg-em-dimensions': 6.0.0_@babel+core@7.18.6 - '@svgr/babel-plugin-transform-react-native-svg': 6.0.0_@babel+core@7.18.6 - '@svgr/babel-plugin-transform-svg-component': 6.2.0_@babel+core@7.18.6 + '@svgr/babel-plugin-add-jsx-attribute': 6.3.1_@babel+core@7.18.6 + '@svgr/babel-plugin-remove-jsx-attribute': 6.3.1_@babel+core@7.18.6 + '@svgr/babel-plugin-remove-jsx-empty-expression': 6.3.1_@babel+core@7.18.6 + '@svgr/babel-plugin-replace-jsx-attribute-value': 6.3.1_@babel+core@7.18.6 + '@svgr/babel-plugin-svg-dynamic-title': 6.3.1_@babel+core@7.18.6 + '@svgr/babel-plugin-svg-em-dimensions': 6.3.1_@babel+core@7.18.6 + '@svgr/babel-plugin-transform-react-native-svg': 6.3.1_@babel+core@7.18.6 + '@svgr/babel-plugin-transform-svg-component': 6.3.1_@babel+core@7.18.6 dev: true - /@svgr/core/6.2.1: - resolution: {integrity: sha512-NWufjGI2WUyrg46mKuySfviEJ6IxHUOm/8a3Ph38VCWSp+83HBraCQrpEM3F3dB6LBs5x8OElS8h3C0oOJaJAA==} + /@svgr/core/6.3.1: + resolution: {integrity: sha512-Sm3/7OdXbQreemf9aO25keerZSbnKMpGEfmH90EyYpj1e8wMD4TuwJIb3THDSgRMWk1kYJfSRulELBy4gVgZUA==} engines: {node: '>=10'} dependencies: - '@svgr/plugin-jsx': 6.2.1_@svgr+core@6.2.1 + '@svgr/plugin-jsx': 6.3.1_@svgr+core@6.3.1 camelcase: 6.3.0 cosmiconfig: 7.0.1 transitivePeerDependencies: - supports-color dev: true - /@svgr/hast-util-to-babel-ast/6.2.1: - resolution: {integrity: sha512-pt7MMkQFDlWJVy9ULJ1h+hZBDGFfSCwlBNW1HkLnVi7jUhyEXUaGYWi1x6bM2IXuAR9l265khBT4Av4lPmaNLQ==} + /@svgr/hast-util-to-babel-ast/6.3.1: + resolution: {integrity: sha512-NgyCbiTQIwe3wHe/VWOUjyxmpUmsrBjdoIxKpXt3Nqc3TN30BpJG22OxBvVzsAh9jqep0w0/h8Ywvdk3D9niNQ==} engines: {node: '>=10'} dependencies: '@babel/types': 7.18.7 - entities: 3.0.1 + entities: 4.3.1 dev: true - /@svgr/plugin-jsx/6.2.1_@svgr+core@6.2.1: - resolution: {integrity: sha512-u+MpjTsLaKo6r3pHeeSVsh9hmGRag2L7VzApWIaS8imNguqoUwDq/u6U/NDmYs/KAsrmtBjOEaAAPbwNGXXp1g==} + /@svgr/plugin-jsx/6.3.1_@svgr+core@6.3.1: + resolution: {integrity: sha512-r9+0mYG3hD4nNtUgsTXWGYJomv/bNd7kC16zvsM70I/bGeoCi/3lhTmYqeN6ChWX317OtQCSZZbH4wq9WwoXbw==} engines: {node: '>=10'} peerDependencies: '@svgr/core': ^6.0.0 dependencies: '@babel/core': 7.18.6 - '@svgr/babel-preset': 6.2.0_@babel+core@7.18.6 - '@svgr/core': 6.2.1 - '@svgr/hast-util-to-babel-ast': 6.2.1 + '@svgr/babel-preset': 6.3.1_@babel+core@7.18.6 + '@svgr/core': 6.3.1 + '@svgr/hast-util-to-babel-ast': 6.3.1 svg-parser: 2.0.4 transitivePeerDependencies: - supports-color dev: true - /@svgr/plugin-svgo/6.2.0_@svgr+core@6.2.1: + /@svgr/plugin-svgo/6.2.0_@svgr+core@6.3.1: resolution: {integrity: sha512-oDdMQONKOJEbuKwuy4Np6VdV6qoaLLvoY86hjvQEgU82Vx1MSWRyYms6Sl0f+NtqxLI/rDVufATbP/ev996k3Q==} engines: {node: '>=10'} peerDependencies: '@svgr/core': ^6.0.0 dependencies: - '@svgr/core': 6.2.1 + '@svgr/core': 6.3.1 cosmiconfig: 7.0.1 deepmerge: 4.2.2 svgo: 2.8.0 @@ -6029,14 +6149,14 @@ packages: '@babel/preset-env': 7.18.6_@babel+core@7.18.6 '@babel/preset-react': 7.18.6_@babel+core@7.18.6 '@babel/preset-typescript': 7.18.6_@babel+core@7.18.6 - '@svgr/core': 6.2.1 - '@svgr/plugin-jsx': 6.2.1_@svgr+core@6.2.1 - '@svgr/plugin-svgo': 6.2.0_@svgr+core@6.2.1 + '@svgr/core': 6.3.1 + '@svgr/plugin-jsx': 6.3.1_@svgr+core@6.3.1 + '@svgr/plugin-svgo': 6.2.0_@svgr+core@6.3.1 transitivePeerDependencies: - supports-color dev: true - /@swc/cli/0.1.57_@swc+core@1.2.210: + /@swc/cli/0.1.57_@swc+core@1.2.244: resolution: {integrity: sha512-HxM8TqYHhAg+zp7+RdTU69bnkl4MWdt1ygyp6BDIPjTiaJVH6Dizn2ezbgDS8mnFZI1FyhKvxU/bbaUs8XhzQg==} engines: {node: '>= 12.13'} hasBin: true @@ -6047,152 +6167,175 @@ packages: chokidar: optional: true dependencies: - '@swc/core': 1.2.210 + '@swc/core': 1.2.244 commander: 7.2.0 fast-glob: 3.2.11 slash: 3.0.0 source-map: 0.7.4 dev: true - /@swc/core-android-arm-eabi/1.2.210: - resolution: {integrity: sha512-JGPcCM9XixJIbCHP/fbI79pXTuU9C3V6AxolTy0zEhgNe7r59CiSVcGWN5t5dgkEuwApAxN2iNjJRmz4z+ALAg==} + /@swc/core-android-arm-eabi/1.2.244: + resolution: {integrity: sha512-bQN6SY78bFIm6lz46ss4+ZDU9owevVjF95Cm+3KB/13ZOPF+m5Pdm8WQLoBYTLgJ0r4/XukEe9XXjba/6Kf8kw==} engines: {node: '>=10'} cpu: [arm] os: [android] requiresBuild: true + dependencies: + '@swc/wasm': 1.2.122 optional: true - /@swc/core-android-arm64/1.2.210: - resolution: {integrity: sha512-oP2b8LjZiMNrzOnoC/mVomksSiqQDrIsm4LxPAGTK1fWnbtITLF/Wj/St1wnUu98jZf5kvQP9AH3p2d3J6UaDA==} + /@swc/core-android-arm64/1.2.244: + resolution: {integrity: sha512-CJeL/EeOIzrH+77otNT6wfGF8uadOHo4rEaBN/xvmtnpdADjYJ8Wt85X4nRK0G929bMke/QdJm5ilPNJdmgCTg==} engines: {node: '>=10'} cpu: [arm64] os: [android] requiresBuild: true + dependencies: + '@swc/wasm': 1.2.130 optional: true - /@swc/core-darwin-arm64/1.2.210: - resolution: {integrity: sha512-7PEHF1AHRpVcMtttfOVtyjZq73VUVaLsBnTWUqdFv1toRu42n+CmnXm3brmnSwyi7TTtCU/nahunWNmBbJeG8A==} + /@swc/core-darwin-arm64/1.2.244: + resolution: {integrity: sha512-ZhRK8L/lpPCerUxtrW48cRJtpsUG5xVTUXu3N0TrYuxRzzapHgK+61g1JdtcwdNvEV7l00X4vfCBRYO0S2nsmw==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@swc/core-darwin-x64/1.2.210: - resolution: {integrity: sha512-FEPSgnzRy7X9SaDWtAQKfoodttG90GOyTKqBC/915SPhvuprSf3/PpX2NP63E44/GVgEoNzmNGGiUzbL5k70Dg==} + /@swc/core-darwin-x64/1.2.244: + resolution: {integrity: sha512-4mY8Gkq2ZMUpXYCLceGp7w0Jnxp75N1gQswNFhMBU4k90ElDuBtPoUSnB1v8MwlQtK7WA25MdvwFnBaEJnfxOg==} engines: {node: '>=10'} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /@swc/core-freebsd-x64/1.2.210: - resolution: {integrity: sha512-nehrNTikTfY4H08VUjp20/U5/bt4PC/hi8Zthjz1A0evcIdA0WHajByFj0um/0lYmdF1K6T7A9UuaoOwPEAZ0A==} + /@swc/core-freebsd-x64/1.2.244: + resolution: {integrity: sha512-k/NEZfkgtZ4S96woYArZ89jwJ/L1zyxihTgFFu7SxDt+WRE1EPmY42Gt4y874zi1JiSEFSRHiiueDUfRPu7C0Q==} engines: {node: '>=10'} cpu: [x64] os: [freebsd] requiresBuild: true + dependencies: + '@swc/wasm': 1.2.130 optional: true - /@swc/core-linux-arm-gnueabihf/1.2.210: - resolution: {integrity: sha512-vbSQxZcPBJC2WqVWHZhZIPpv+8xoNug/Qv6FLFPcl735MeNRzgciKC1LlXuy6DNA0RqoCPPyzaK2jnwJyq4bSw==} + /@swc/core-linux-arm-gnueabihf/1.2.244: + resolution: {integrity: sha512-tE9b/oZWhMXwoXHkgHFckMrLrlczvG7HgQAdtDuA6g30Xd/3XmdVzC4NbXR+1HoaGVDh7cf0EFE3aKdfPvPQwA==} engines: {node: '>=10'} cpu: [arm] os: [linux] requiresBuild: true + dependencies: + '@swc/wasm': 1.2.130 optional: true - /@swc/core-linux-arm64-gnu/1.2.210: - resolution: {integrity: sha512-gfItagFmC06q5Uu7WHf/O3n1yKhA7uAo9VPUcNDKKrOh/WSkMI2dxtoeo4u5xOuJWKWedGCcdyJw46uhpYST0w==} + /@swc/core-linux-arm64-gnu/1.2.244: + resolution: {integrity: sha512-zrpVKUeQxZnzorOp3aXhjK1X2/6xuVZcdyxAUDzItP6G4nLbgPBEQLUi6aUjOjquFiihokXoKWaMPQjF/LqH+g==} engines: {node: '>=10'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-arm64-musl/1.2.210: - resolution: {integrity: sha512-3nlNHIYiuppJBB+bbaxLfGN/mnofaVvKVEwUQ9HPtghY87zFIsKl1RfNQtxcOlcarcWya1XAMSk9NXv2dFHWDg==} + /@swc/core-linux-arm64-musl/1.2.244: + resolution: {integrity: sha512-gI6bntk+HDe2witOsQgBDyDDpRmF5dfxbygvVsEdCI+Ko9yj5S9aCsc8WhhbtdcEG1Fo3v/sM/F/9pGatCAwzQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-x64-gnu/1.2.210: - resolution: {integrity: sha512-BmhfneSvUzIufUhPaql3YvoWlSrNZiAhpL3c5fPrfQxADywkZLljgh0kckxpeCi5R8iWIUlNSPFmo589QS2Jsg==} + /@swc/core-linux-x64-gnu/1.2.244: + resolution: {integrity: sha512-hwJ5HrDj7asmVGjzaT6SFdhPVxVUIYm9LCuE3yu89+6C5aR9YrCXvpgIjGcHJvEO2PLAtff72FsX7sbXbzzYGQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-x64-musl/1.2.210: - resolution: {integrity: sha512-0VT7FeF4Vc/u0oxVLplF/0hcApE+fwC4Njf49SFyvszgAMc9a+fyUNBX2NSqIrTQFwmifRcpQOeXDT8Edy0g6w==} + /@swc/core-linux-x64-musl/1.2.244: + resolution: {integrity: sha512-P8d4AIVN63xaS3t5WhOo0Ejy/X7XaDxXe9sJpEbGQP7CGofhURvgXwe8Q6uhPeWC9AwEPu35ArFQ0ZUmOCY0rg==} engines: {node: '>=10'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@swc/core-win32-arm64-msvc/1.2.210: - resolution: {integrity: sha512-MwM35TtzMX7GS424y/Bk0CrwWsYRfZ/WX15QAi/Yz+fnPCDLtFNknRC7gAaTpDeqywu6dsXUFyErzK1FC8l8YA==} + /@swc/core-win32-arm64-msvc/1.2.244: + resolution: {integrity: sha512-PZUhgooqPDo+NUo+tIxWI1jKnYVV2ACs8eUkSE++Qf7E4/9Igy79XHbG4/G5ERlCudhdcw4XkYiRN8GJQg6P5w==} engines: {node: '>=10'} cpu: [arm64] os: [win32] requiresBuild: true + dependencies: + '@swc/wasm': 1.2.130 optional: true - /@swc/core-win32-ia32-msvc/1.2.210: - resolution: {integrity: sha512-KpofYa0wqd8urFLrdsz0yQU2YkF7NEDU3+IzqUNnxwamlaEFg/C3l6rTgmiihHXIZuYQS9di4YwykyMVVXutOA==} + /@swc/core-win32-ia32-msvc/1.2.244: + resolution: {integrity: sha512-w7v8fND4E8wOHoVVNJIDjOh8EQiedI9HCsCTEDM/z/dVPsk/rxi6iHYnZG6gv+X/d0aCLeZQOkW9khfyy128cg==} engines: {node: '>=10'} cpu: [ia32] os: [win32] requiresBuild: true + dependencies: + '@swc/wasm': 1.2.130 optional: true - /@swc/core-win32-x64-msvc/1.2.210: - resolution: {integrity: sha512-bUhY0bK8s+B6LSdbNu9L0RKrO/rWrXICtIZyHZolUZKo326hfQ0Iwx+N/xuh6jYpON0RaY9pR0HAyaCDHugoRA==} + /@swc/core-win32-x64-msvc/1.2.244: + resolution: {integrity: sha512-/A9ssLtqXEQrdHnJ9SvZSBF7zQM/0ydz8B3p5BT9kUbAhmNqbfE4/Wy3d2zd7nrF16n6tRm4giCzcIdzd/7mvw==} engines: {node: '>=10'} cpu: [x64] os: [win32] requiresBuild: true optional: true - /@swc/core/1.2.210: - resolution: {integrity: sha512-euiCxnx+dCnE6iDGM04hIvcLS2LADVgIDo0OGnxqRce4SwUNHZi/KcRxIT04YtJd3BdO5v+l4K8RHIx4jvn+TA==} + /@swc/core/1.2.244: + resolution: {integrity: sha512-/UguNMvKgVeR8wGFb53h+Y9hFSiEpeUhC4Cr1neN15wvWZD3lfvN4qAdqNifZiiPKXrCwYy8NTKlHVtHMYzpXw==} engines: {node: '>=10'} hasBin: true + requiresBuild: true optionalDependencies: - '@swc/core-android-arm-eabi': 1.2.210 - '@swc/core-android-arm64': 1.2.210 - '@swc/core-darwin-arm64': 1.2.210 - '@swc/core-darwin-x64': 1.2.210 - '@swc/core-freebsd-x64': 1.2.210 - '@swc/core-linux-arm-gnueabihf': 1.2.210 - '@swc/core-linux-arm64-gnu': 1.2.210 - '@swc/core-linux-arm64-musl': 1.2.210 - '@swc/core-linux-x64-gnu': 1.2.210 - '@swc/core-linux-x64-musl': 1.2.210 - '@swc/core-win32-arm64-msvc': 1.2.210 - '@swc/core-win32-ia32-msvc': 1.2.210 - '@swc/core-win32-x64-msvc': 1.2.210 + '@swc/core-android-arm-eabi': 1.2.244 + '@swc/core-android-arm64': 1.2.244 + '@swc/core-darwin-arm64': 1.2.244 + '@swc/core-darwin-x64': 1.2.244 + '@swc/core-freebsd-x64': 1.2.244 + '@swc/core-linux-arm-gnueabihf': 1.2.244 + '@swc/core-linux-arm64-gnu': 1.2.244 + '@swc/core-linux-arm64-musl': 1.2.244 + '@swc/core-linux-x64-gnu': 1.2.244 + '@swc/core-linux-x64-musl': 1.2.244 + '@swc/core-win32-arm64-msvc': 1.2.244 + '@swc/core-win32-ia32-msvc': 1.2.244 + '@swc/core-win32-x64-msvc': 1.2.244 - /@swc/helpers/0.4.3: - resolution: {integrity: sha512-6JrF+fdUK2zbGpJIlN7G3v966PQjyx/dPt1T9km2wj+EUBqgrxCk3uX4Kct16MIm9gGxfKRcfax2hVf5jvlTzA==} + /@swc/helpers/0.4.11: + resolution: {integrity: sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==} dependencies: tslib: 2.4.0 dev: true - /@swc/jest/0.2.21_@swc+core@1.2.210: - resolution: {integrity: sha512-/+NcExiZbxXANNhNPnIdFuGq62CeumulLS1bngwqIXd8H7d96LFUfrYzdt8tlTwLMel8tFtQ5aRjzVkyOTyPDw==} + /@swc/jest/0.2.22_@swc+core@1.2.244: + resolution: {integrity: sha512-PIUIk9IdB1oAVfF9zNIfYoMBoEhahrrSvyryFANas7swC1cF0L5HR0f9X4qfet46oyCHCBtNcSpN0XJEOFIKlw==} engines: {npm: '>= 7.0.0'} peerDependencies: '@swc/core': '*' dependencies: '@jest/create-cache-key-function': 27.5.1 - '@swc/core': 1.2.210 + '@swc/core': 1.2.244 dev: true + /@swc/wasm/1.2.122: + resolution: {integrity: sha512-sM1VCWQxmNhFtdxME+8UXNyPNhxNu7zdb6ikWpz0YKAQQFRGT5ThZgJrubEpah335SUToNg8pkdDF7ibVCjxbQ==} + requiresBuild: true + optional: true + + /@swc/wasm/1.2.130: + resolution: {integrity: sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==} + requiresBuild: true + optional: true + /@szmarczak/http-timer/5.0.1: resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} @@ -6214,14 +6357,14 @@ packages: pretty-format: 27.5.1 dev: true - /@testing-library/react-hooks/8.0.1_5qggqhesezyescxqnsg4rpj6qa: + /@testing-library/react-hooks/8.0.1_y6lpz2mvcoua7qihahug4ke22i: resolution: {integrity: sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g==} engines: {node: '>=12'} peerDependencies: - '@types/react': ^16.9.0 || ^17.0.0 - react: ^16.9.0 || ^17.0.0 - react-dom: ^16.9.0 || ^17.0.0 - react-test-renderer: ^16.9.0 || ^17.0.0 + '@types/react': ^16.9.0 || ^17.0.0 || 18 + react: ^16.9.0 || ^17.0.0 || 18 + react-dom: ^16.9.0 || ^17.0.0 || 18 + react-test-renderer: ^16.9.0 || ^17.0.0 || 18 peerDependenciesMeta: '@types/react': optional: true @@ -6233,7 +6376,7 @@ packages: optional: true dependencies: '@babel/runtime': 7.18.6 - '@types/react': 18.0.14 + '@types/react': 18.0.17 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 react-error-boundary: 3.1.4_react@18.2.0 @@ -6244,8 +6387,8 @@ packages: resolution: {integrity: sha512-DB79aA426+deFgGSjnf5grczDPiL4taK3hFaa+M5q7q20Kcve9eQottOG5kZ74KEr55v0tU2CQormSSDK87zYQ==} engines: {node: '>=12'} peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.0 || 18 + react-dom: ^18.0.0 || 18 peerDependenciesMeta: react: optional: true @@ -6262,8 +6405,8 @@ packages: /@tldraw/core/1.14.1: resolution: {integrity: sha512-FAiX/TD/tl5eMvTk0IHhFUSmldCe/UTTOnLL5aWQHqhicF/iTP5m3H12L6kyjN60yfssN8U9g4E/7y70TY7JxA==} peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' + react: '>=16.8 || 18' + react-dom: '>=16.8 || 18' peerDependenciesMeta: react: optional: true @@ -6284,8 +6427,8 @@ packages: /@tldraw/core/1.14.1_mobx@6.6.1: resolution: {integrity: sha512-FAiX/TD/tl5eMvTk0IHhFUSmldCe/UTTOnLL5aWQHqhicF/iTP5m3H12L6kyjN60yfssN8U9g4E/7y70TY7JxA==} peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' + react: '>=16.8 || 18' + react-dom: '>=16.8 || 18' peerDependenciesMeta: react: optional: true @@ -6391,7 +6534,7 @@ packages: /@types/bonjour/3.5.10: resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} dependencies: - '@types/node': 18.0.1 + '@types/node': 18.7.13 dev: true /@types/cacheable-request/6.0.2: @@ -6399,7 +6542,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 18.0.1 + '@types/node': 18.7.13 '@types/responselike': 1.0.0 dev: false @@ -6413,7 +6556,7 @@ packages: resolution: {integrity: sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==} dependencies: '@types/express-serve-static-core': 4.17.29 - '@types/node': 18.0.1 + '@types/node': 18.7.13 dev: true /@types/connect/3.4.35: @@ -6482,20 +6625,20 @@ packages: /@types/fs-extra/8.1.2: resolution: {integrity: sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==} dependencies: - '@types/node': 18.0.1 + '@types/node': 18.7.13 dev: true /@types/glob/7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 3.0.5 - '@types/node': 18.0.1 + '@types/node': 18.7.13 dev: true /@types/graceful-fs/4.1.5: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: - '@types/node': 18.0.1 + '@types/node': 18.7.13 dev: true /@types/history/4.7.11: @@ -6513,7 +6656,7 @@ packages: /@types/http-proxy/1.17.9: resolution: {integrity: sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==} dependencies: - '@types/node': 18.0.1 + '@types/node': 18.7.13 dev: true /@types/is-hotkey/0.1.7: @@ -6539,10 +6682,10 @@ packages: '@types/istanbul-lib-report': 3.0.0 dev: true - /@types/jest/28.1.4: - resolution: {integrity: sha512-telv6G5N7zRJiLcI3Rs3o+ipZ28EnE+7EvF0pSrt2pZOMnAVI/f+6/LucDxOvcBcTeTL3JMF744BbVQAVBUQRA==} + /@types/jest/28.1.8: + resolution: {integrity: sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw==} dependencies: - jest-matcher-utils: 28.1.1 + expect: 28.1.1 pretty-format: 28.1.1 dev: true @@ -6598,9 +6741,8 @@ packages: /@types/node/18.0.1: resolution: {integrity: sha512-CmR8+Tsy95hhwtZBKJBs0/FFq4XX7sDZHlGGf+0q+BRZfMbOTkzkj0AFAuTyXbObDIoanaBBW0+KEW+m3N16Wg==} - /@types/npmlog/4.1.4: - resolution: {integrity: sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ==} - dev: true + /@types/node/18.7.13: + resolution: {integrity: sha512-46yIhxSe5xEaJZXWdIBP7GU4HDTG8/eo0qd9atdiL+lFpA03y8KS+lkTN834TWJj5767GbWv4n/P6efyTFt1Dw==} /@types/parse-json/4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} @@ -6628,7 +6770,7 @@ packages: /@types/react-dom/18.0.6: resolution: {integrity: sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==} dependencies: - '@types/react': 18.0.14 + '@types/react': 18.0.17 dev: true /@types/react-is/17.0.3: @@ -6647,7 +6789,7 @@ packages: resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} dependencies: '@types/history': 4.7.11 - '@types/react': 18.0.14 + '@types/react': 18.0.17 '@types/react-router': 5.1.18 dev: true @@ -6655,13 +6797,13 @@ packages: resolution: {integrity: sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g==} dependencies: '@types/history': 4.7.11 - '@types/react': 18.0.14 + '@types/react': 18.0.17 dev: true /@types/react-transition-group/4.4.5: resolution: {integrity: sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==} dependencies: - '@types/react': 18.0.14 + '@types/react': 18.0.17 dev: false /@types/react-window/1.8.5: @@ -6677,6 +6819,13 @@ packages: '@types/scheduler': 0.16.2 csstype: 3.1.0 + /@types/react/18.0.17: + resolution: {integrity: sha512-38ETy4tL+rn4uQQi7mB81G7V1g0u2ryquNmsVIOKUAEIDK+3CUjZ6rSRpdvS99dNBnkLFL83qfmtLacGOTIhwQ==} + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.2 + csstype: 3.1.0 + /@types/readable-stream/2.3.14: resolution: {integrity: sha512-8jQ5Mp7bsDJEnW/69i6nAaQMoLwAVJVc7ZRAVTrdh/o6XueQsX38TEvKuYyoQj76/mg7WdlRfMrtl9pDLCJWsg==} dependencies: @@ -6687,7 +6836,7 @@ packages: /@types/resolve/1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 18.0.1 + '@types/node': 18.7.13 dev: true /@types/responselike/1.0.0: @@ -6725,7 +6874,7 @@ packages: /@types/sockjs/0.3.33: resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} dependencies: - '@types/node': 18.0.1 + '@types/node': 18.7.13 dev: true /@types/sql.js/1.4.3: @@ -6818,19 +6967,6 @@ packages: - supports-color dev: true - /@typescript-eslint/experimental-utils/5.30.5_4x5o4skxv6sl53vpwefgt23khm: - resolution: {integrity: sha512-lsOedOkwAHWiJyvQsv9DtvWnANWecf28eO/L1EPNxLIBRoB7UCDa0uZF61IikZHYubGnDLLHDQ/6KFWl4Nrnjg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@typescript-eslint/utils': 5.30.5_4x5o4skxv6sl53vpwefgt23khm - eslint: 8.19.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - /@typescript-eslint/parser/5.30.5_4x5o4skxv6sl53vpwefgt23khm: resolution: {integrity: sha512-zj251pcPXI8GO9NDKWWmygP6+UjwWmrdf9qMW/L/uQJBM/0XbU2inxe5io/234y/RCvwpKEYjZ6c1YrXERkK4Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -6937,7 +7073,7 @@ packages: /@use-gesture/react/10.2.16: resolution: {integrity: sha512-kkWi97SHzj/F6XqRXSyrk5pLoSiuRgqvnQl2Bawmf05dWo2q6DL7v5LhnnyPNZRVkCm+WEb3e1nsR+iVza1vmg==} peerDependencies: - react: '>= 16.8.0' + react: '>= 16.8.0 || 18' peerDependenciesMeta: react: optional: true @@ -7141,10 +7277,8 @@ packages: indent-string: 4.0.0 dev: true - /ajv-formats/2.1.1_ajv@8.11.0: + /ajv-formats/2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 peerDependenciesMeta: ajv: optional: true @@ -7208,11 +7342,6 @@ packages: hasBin: true dev: true - /ansi-regex/2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - dev: true - /ansi-regex/3.0.1: resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} engines: {node: '>=4'} @@ -7262,10 +7391,6 @@ packages: picomatch: 2.3.1 dev: true - /aproba/1.2.0: - resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} - dev: true - /arch/2.2.0: resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} dev: true @@ -7277,13 +7402,6 @@ packages: file-type: 4.4.0 dev: true - /are-we-there-yet/1.1.7: - resolution: {integrity: sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==} - dependencies: - delegates: 1.0.0 - readable-stream: 2.3.7 - dev: true - /arg/4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true @@ -7571,7 +7689,7 @@ packages: loader-utils: 2.0.2 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 dev: true /babel-plugin-const-enum/1.2.0_@babel+core@7.18.6: @@ -8331,11 +8449,6 @@ packages: resolution: {integrity: sha512-JN7Fa6iwAUPyJC/h8myT4Dm+/Weu2TvaPzKcyl1qJ9yX7pmQsEszbF2D+23oFlR7jngCeU2KRkUiakbFTOobRA==} dev: false - /code-point-at/1.1.0: - resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} - engines: {node: '>=0.10.0'} - dev: true - /codemirror-lang-elixir/3.0.0_@codemirror+language@6.2.1: resolution: {integrity: sha512-Liy5MDxf+xw7aFqNfhLfntSK6vsRkI0lSlyytw23P1hWSrb0Bw5WunEB3iKJ49iUu8Kj2dx+vvMqD8I5ms7rSQ==} peerDependencies: @@ -8344,18 +8457,16 @@ packages: '@codemirror/language': 6.2.1 dev: false - /codemirror/6.0.1_@lezer+common@1.0.0: + /codemirror/6.0.1: resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==} dependencies: - '@codemirror/autocomplete': 6.0.3_nq4pwfkqi5icglf26kczcr4s2i + '@codemirror/autocomplete': 6.0.3 '@codemirror/commands': 6.0.1 '@codemirror/language': 6.2.1 '@codemirror/lint': 6.0.0 '@codemirror/search': 6.0.0 '@codemirror/state': 6.1.1 '@codemirror/view': 6.2.0 - transitivePeerDependencies: - - '@lezer/common' dev: false /collect-v8-coverage/1.0.1: @@ -8464,7 +8575,7 @@ packages: dependencies: schema-utils: 4.0.0 serialize-javascript: 6.0.0 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 dev: true /compression/1.7.4: @@ -8512,10 +8623,6 @@ packages: engines: {node: '>=0.8'} dev: true - /console-control-strings/1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - dev: true - /constant-case/3.0.4: resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} dependencies: @@ -8556,9 +8663,9 @@ packages: toggle-selection: 1.0.6 dev: false - /copy-webpack-plugin/9.1.0_webpack@5.74.0: - resolution: {integrity: sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==} - engines: {node: '>= 12.13.0'} + /copy-webpack-plugin/10.2.4_webpack@5.74.0: + resolution: {integrity: sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg==} + engines: {node: '>= 12.20.0'} peerDependencies: webpack: ^5.1.0 peerDependenciesMeta: @@ -8567,11 +8674,11 @@ packages: dependencies: fast-glob: 3.2.11 glob-parent: 6.0.2 - globby: 11.1.0 + globby: 12.2.0 normalize-path: 3.0.0 - schema-utils: 3.1.1 + schema-utils: 4.0.0 serialize-javascript: 6.0.0 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 dev: true /core-js-compat/3.23.3: @@ -8586,16 +8693,10 @@ packages: requiresBuild: true dev: true - /core-js/3.23.3: - resolution: {integrity: sha512-oAKwkj9xcWNBAvGbT//WiCdOMpb9XQG92/Fe3ABFM/R16BsHgePG00mFOgKf7IsCtfj8tA1kHtf/VwErhriz5Q==} + /core-js/3.25.0: + resolution: {integrity: sha512-CVU1xvJEfJGhyCpBrzzzU1kjCfgsGUxhEvwUV2e/cOedYWHdmluamx+knDnmhqALddMG16fZvIqvs9aijsHHaA==} requiresBuild: true - /core-js/3.6.5: - resolution: {integrity: sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==} - deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. - requiresBuild: true - dev: true - /core-util-is/1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} dev: true @@ -8703,7 +8804,7 @@ packages: postcss-modules-values: 4.0.0_postcss@8.4.14 postcss-value-parser: 4.2.0 semver: 7.3.7 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 dev: true /css-minimizer-webpack-plugin/3.4.1_webpack@5.74.0: @@ -8733,7 +8834,7 @@ packages: schema-utils: 4.0.0 serialize-javascript: 6.0.0 source-map: 0.6.1 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 dev: true /css-minimizer-webpack-plugin/4.0.0_webpack@5.74.0: @@ -8763,7 +8864,7 @@ packages: schema-utils: 4.0.0 serialize-javascript: 6.0.0 source-map: 0.6.1 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 dev: true /css-select/4.3.0: @@ -8972,6 +9073,11 @@ packages: engines: {node: '>=0.11'} dev: false + /date-fns/2.29.2: + resolution: {integrity: sha512-0VNbwmWJDS/G3ySwFSJA3ayhbURMTJLtwM2DTxf9CWondCnh6DTNlO9JgRSq6ibf4eD0lfMJNBxUdEAHHix+bA==} + engines: {node: '>=0.11'} + dev: false + /dayjs/1.11.3: resolution: {integrity: sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A==} dev: true @@ -9162,10 +9268,6 @@ packages: engines: {node: '>=0.4.0'} dev: true - /delegates/1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dev: true - /depd/1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} engines: {node: '>= 0.6'} @@ -9467,8 +9569,8 @@ packages: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} dev: true - /entities/3.0.1: - resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + /entities/4.3.1: + resolution: {integrity: sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==} engines: {node: '>=0.12'} dev: true @@ -10252,7 +10354,7 @@ packages: dependencies: loader-utils: 2.0.2 schema-utils: 3.1.1 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 dev: true /file-saver/2.0.5: @@ -10395,12 +10497,12 @@ packages: semver-regex: 2.0.0 dev: true - /firebase-admin/11.0.1: + /firebase-admin/11.0.1_@firebase+app-types@0.7.0: resolution: {integrity: sha512-rL3wlZbi2Kb/KJgcmj1YHlD4ZhfmhfgRO2YJialxAllm0tj1IQea878hHuBLGmv4DpbW9t9nLvX9kddNR2Y65Q==} engines: {node: '>=14'} dependencies: '@fastify/busboy': 1.1.0 - '@firebase/database-compat': 0.2.4 + '@firebase/database-compat': 0.2.4_@firebase+app-types@0.7.0 '@firebase/database-types': 0.9.10 '@types/node': 18.0.1 jsonwebtoken: 8.5.1 @@ -10416,35 +10518,34 @@ packages: - supports-color dev: false - /firebase/9.9.2: - resolution: {integrity: sha512-zhWUEyBQbwWhLEYhULwZ0A6eRuHP/EP2bpwASpHkI1QQgO1GVqkyCZEpp/feGSDve0COhv9oWC1wOuAzrQrV6g==} + /firebase/9.9.3: + resolution: {integrity: sha512-lU1FstWqfVZQfz4+TWCZvqJYbwZMyoyP0X/xD/YIfrtXgquOMEDTpoasH4P79N9y3I8iV+6gQHuVmpK+AX2elg==} dependencies: - '@firebase/analytics': 0.8.0_@firebase+app@0.7.30 - '@firebase/analytics-compat': 0.1.13_ntdu3hfexp42gsr3dmzonffheq - '@firebase/app': 0.7.30 - '@firebase/app-check': 0.5.12_@firebase+app@0.7.30 - '@firebase/app-check-compat': 0.2.12_ntdu3hfexp42gsr3dmzonffheq - '@firebase/app-compat': 0.1.31 + '@firebase/analytics': 0.8.0_@firebase+app@0.7.31 + '@firebase/analytics-compat': 0.1.13_kowmy6vzi2xcdysg3n6ul4qaae + '@firebase/app': 0.7.31 + '@firebase/app-check': 0.5.12_@firebase+app@0.7.31 + '@firebase/app-check-compat': 0.2.12_kowmy6vzi2xcdysg3n6ul4qaae + '@firebase/app-compat': 0.1.32 '@firebase/app-types': 0.7.0 - '@firebase/auth': 0.20.5_@firebase+app@0.7.30 - '@firebase/auth-compat': 0.2.18_53yvy43rwpg2c45kgeszsxtrca - '@firebase/database': 0.13.4_@firebase+app-types@0.7.0 - '@firebase/database-compat': 0.2.4_@firebase+app-types@0.7.0 - '@firebase/firestore': 3.4.14_@firebase+app@0.7.30 - '@firebase/firestore-compat': 0.1.23_53yvy43rwpg2c45kgeszsxtrca - '@firebase/functions': 0.8.4_54flq6t3lt2vkv56b3wekvuqsq - '@firebase/functions-compat': 0.2.4_53yvy43rwpg2c45kgeszsxtrca - '@firebase/installations': 0.5.12_@firebase+app@0.7.30 - '@firebase/installations-compat': 0.1.12_53yvy43rwpg2c45kgeszsxtrca - '@firebase/messaging': 0.9.16_@firebase+app@0.7.30 - '@firebase/messaging-compat': 0.1.16_ntdu3hfexp42gsr3dmzonffheq - '@firebase/performance': 0.5.12_@firebase+app@0.7.30 - '@firebase/performance-compat': 0.1.12_ntdu3hfexp42gsr3dmzonffheq - '@firebase/polyfill': 0.3.36 - '@firebase/remote-config': 0.3.11_@firebase+app@0.7.30 - '@firebase/remote-config-compat': 0.1.12_ntdu3hfexp42gsr3dmzonffheq - '@firebase/storage': 0.9.9_@firebase+app@0.7.30 - '@firebase/storage-compat': 0.1.17_53yvy43rwpg2c45kgeszsxtrca + '@firebase/auth': 0.20.5_@firebase+app@0.7.31 + '@firebase/auth-compat': 0.2.18_kg6iqletipudcxzgqetrtqyldy + '@firebase/database': 0.13.5_@firebase+app-types@0.7.0 + '@firebase/database-compat': 0.2.5_@firebase+app-types@0.7.0 + '@firebase/firestore': 3.4.14_@firebase+app@0.7.31 + '@firebase/firestore-compat': 0.1.23_kg6iqletipudcxzgqetrtqyldy + '@firebase/functions': 0.8.4_lwgt3sk4yfjgasfpmvix4ixi2u + '@firebase/functions-compat': 0.2.4_kg6iqletipudcxzgqetrtqyldy + '@firebase/installations': 0.5.12_@firebase+app@0.7.31 + '@firebase/installations-compat': 0.1.12_kg6iqletipudcxzgqetrtqyldy + '@firebase/messaging': 0.9.16_@firebase+app@0.7.31 + '@firebase/messaging-compat': 0.1.16_kowmy6vzi2xcdysg3n6ul4qaae + '@firebase/performance': 0.5.12_@firebase+app@0.7.31 + '@firebase/performance-compat': 0.1.12_kowmy6vzi2xcdysg3n6ul4qaae + '@firebase/remote-config': 0.3.11_@firebase+app@0.7.31 + '@firebase/remote-config-compat': 0.1.12_kowmy6vzi2xcdysg3n6ul4qaae + '@firebase/storage': 0.9.9_@firebase+app@0.7.31 + '@firebase/storage-compat': 0.1.17_kg6iqletipudcxzgqetrtqyldy '@firebase/util': 1.6.3 transitivePeerDependencies: - bufferutil @@ -10502,42 +10603,38 @@ packages: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} dev: true - /fork-ts-checker-webpack-plugin/6.2.10_wln64xm7gyszy6wbwhdijmigya: - resolution: {integrity: sha512-HveFCHWSH2WlYU1tU3PkrupvW8lNFMTfH3Jk0TfC2mtktE9ibHGcifhCsCFvj+kqlDfNIlwmNLiNqR9jnSA7OQ==} - engines: {node: '>=10', yarn: '>=1.0.0'} + /fork-ts-checker-webpack-plugin/7.2.13_xnp4kzegbjokq62cajex2ovgkm: + resolution: {integrity: sha512-fR3WRkOb4bQdWB/y7ssDUlVdrclvwtyCUIHCfivAoYxq9dF7XfrDKbMdZIfwJ7hxIAqkYSGeU7lLJE6xrxIBdg==} + engines: {node: '>=12.13.0', yarn: '>=1.0.0'} peerDependencies: - eslint: '>= 6' - typescript: '>= 2.7' + typescript: '>3.6.0' vue-template-compiler: '*' - webpack: '>= 4' + webpack: ^5.11.0 peerDependenciesMeta: - eslint: - optional: true vue-template-compiler: optional: true webpack: optional: true dependencies: '@babel/code-frame': 7.18.6 - '@types/json-schema': 7.0.11 chalk: 4.1.2 chokidar: 3.5.3 - cosmiconfig: 6.0.0 + cosmiconfig: 7.0.1 deepmerge: 4.2.2 - eslint: 8.19.0 - fs-extra: 9.1.0 - glob: 7.2.3 + fs-extra: 10.1.0 memfs: 3.4.7 minimatch: 3.1.2 - schema-utils: 2.7.0 + node-abort-controller: 3.0.1 + schema-utils: 3.1.1 semver: 7.3.7 - tapable: 1.1.3 + tapable: 2.2.1 typescript: 4.7.4 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 dev: true - /form-data-encoder/1.7.1: - resolution: {integrity: sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==} + /form-data-encoder/2.1.0: + resolution: {integrity: sha512-njK60LnfhfDWy+AEUIf9ZQNRAcmXCdDfiNOm2emuPtzwh7U9k/mo9F3S54aPiaZ3vhqUjikVLfcPg2KuBddskQ==} + engines: {node: '>= 14.17'} dev: false /form-data/2.3.3: @@ -10651,19 +10748,6 @@ packages: /functions-have-names/1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - /gauge/2.7.4: - resolution: {integrity: sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==} - dependencies: - aproba: 1.2.0 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - object-assign: 4.1.1 - signal-exit: 3.0.7 - string-width: 1.0.2 - strip-ansi: 3.0.1 - wide-align: 1.1.5 - dev: true - /gaxios/4.3.3: resolution: {integrity: sha512-gSaYYIO1Y3wUtdfHmjDUZ8LWaxJQpiavzbF5Kq53akSzvmVg0RfyOcFDbO1KJ/KCGRFz2qG+lS81F0nkr7cRJA==} engines: {node: '>=10'} @@ -10987,18 +11071,18 @@ packages: dev: false optional: true - /got/12.1.0: - resolution: {integrity: sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==} + /got/12.3.1: + resolution: {integrity: sha512-tS6+JMhBh4iXMSXF6KkIsRxmloPln31QHDlcb6Ec3bzxjjFJFr/8aXdpyuLmVc9I4i2HyBHYw1QU5K1ruUdpkw==} engines: {node: '>=14.16'} dependencies: - '@sindresorhus/is': 4.6.0 + '@sindresorhus/is': 5.3.0 '@szmarczak/http-timer': 5.0.1 '@types/cacheable-request': 6.0.2 '@types/responselike': 1.0.0 cacheable-lookup: 6.0.4 cacheable-request: 7.0.2 decompress-response: 6.0.0 - form-data-encoder: 1.7.1 + form-data-encoder: 2.1.0 get-stream: 6.0.1 http2-wrapper: 2.1.11 lowercase-keys: 3.0.0 @@ -11133,10 +11217,6 @@ packages: dependencies: has-symbols: 1.0.3 - /has-unicode/2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - dev: true - /has/1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} @@ -11244,7 +11324,7 @@ packages: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 dev: true /htmlparser2/6.1.0: @@ -11732,13 +11812,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /is-fullwidth-code-point/1.0.0: - resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} - engines: {node: '>=0.10.0'} - dependencies: - number-is-nan: 1.0.1 - dev: true - /is-fullwidth-code-point/2.0.0: resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} engines: {node: '>=4'} @@ -12053,7 +12126,7 @@ packages: '@jest/environment': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.0.1 + '@types/node': 18.7.13 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -12081,7 +12154,7 @@ packages: '@jest/expect': 28.1.2 '@jest/test-result': 28.1.1 '@jest/types': 28.1.1 - '@types/node': 18.0.1 + '@types/node': 18.7.13 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -12100,7 +12173,7 @@ packages: - supports-color dev: true - /jest-cli/28.1.2_hxaxlvfys2pc3hefxwkmyo5cpq: + /jest-cli/28.1.2_3glepa5322b7j342guju4hszoy: resolution: {integrity: sha512-l6eoi5Do/IJUXAFL9qRmDiFpBeEJAnjJb1dcd9i/VWfVWbp3mJhuH50dNtX67Ali4Ecvt4eBkWb4hXhPHkAZTw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} hasBin: true @@ -12117,7 +12190,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.10 import-local: 3.1.0 - jest-config: 28.1.2_hxaxlvfys2pc3hefxwkmyo5cpq + jest-config: 28.1.2_3glepa5322b7j342guju4hszoy jest-util: 28.1.1 jest-validate: 28.1.1 prompts: 2.4.2 @@ -12141,7 +12214,7 @@ packages: '@jest/test-sequencer': 27.5.1 '@jest/types': 27.5.1 babel-jest: 27.5.1_@babel+core@7.18.6 - chalk: 4.1.0 + chalk: 4.1.2 ci-info: 3.3.2 deepmerge: 4.2.2 glob: 7.2.3 @@ -12161,7 +12234,7 @@ packages: pretty-format: 27.5.1 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.8.2_y42jqzo3jkzuv3kp7opavo2xbi + ts-node: 10.8.2_hixnfb2jfw56u6pahjg3ndp4oy transitivePeerDependencies: - bufferutil - canvas @@ -12169,7 +12242,48 @@ packages: - utf-8-validate dev: true - /jest-config/28.1.2_hxaxlvfys2pc3hefxwkmyo5cpq: + /jest-config/27.5.1_ts-node@10.9.1: + resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + ts-node: '>=9.0.0' + peerDependenciesMeta: + ts-node: + optional: true + dependencies: + '@babel/core': 7.18.6 + '@jest/test-sequencer': 27.5.1 + '@jest/types': 27.5.1 + babel-jest: 27.5.1_@babel+core@7.18.6 + chalk: 4.1.2 + ci-info: 3.3.2 + deepmerge: 4.2.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-circus: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-get-type: 27.5.1 + jest-jasmine2: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runner: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 27.5.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.1_hixnfb2jfw56u6pahjg3ndp4oy + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-config/28.1.2_3glepa5322b7j342guju4hszoy: resolution: {integrity: sha512-g6EfeRqddVbjPVBVY4JWpUY4IvQoFRIZcv4V36QkqzE0IGhEC/VkugFeBMAeUE7PRgC8KJF0yvJNDeQRbamEVA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} peerDependencies: @@ -12184,7 +12298,7 @@ packages: '@babel/core': 7.18.6 '@jest/test-sequencer': 28.1.1 '@jest/types': 28.1.1 - '@types/node': 18.0.1 + '@types/node': 18.7.13 babel-jest: 28.1.2_@babel+core@7.18.6 chalk: 4.1.2 ci-info: 3.3.2 @@ -12204,7 +12318,7 @@ packages: pretty-format: 28.1.1 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.8.2_y42jqzo3jkzuv3kp7opavo2xbi + ts-node: 10.8.2_hixnfb2jfw56u6pahjg3ndp4oy transitivePeerDependencies: - supports-color dev: true @@ -12272,7 +12386,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.0.1 + '@types/node': 18.7.13 jest-mock: 27.5.1 jest-util: 27.5.1 jsdom: 16.7.0 @@ -12290,7 +12404,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.0.1 + '@types/node': 18.7.13 jest-mock: 27.5.1 jest-util: 27.5.1 dev: true @@ -12302,7 +12416,7 @@ packages: '@jest/environment': 28.1.2 '@jest/fake-timers': 28.1.2 '@jest/types': 28.1.1 - '@types/node': 18.0.1 + '@types/node': 18.7.13 jest-mock: 28.1.1 jest-util: 28.1.1 dev: true @@ -12323,7 +12437,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@types/graceful-fs': 4.1.5 - '@types/node': 18.0.1 + '@types/node': 18.7.13 anymatch: 3.1.2 fb-watchman: 2.0.1 graceful-fs: 4.2.10 @@ -12343,7 +12457,7 @@ packages: dependencies: '@jest/types': 28.1.1 '@types/graceful-fs': 4.1.5 - '@types/node': 18.0.1 + '@types/node': 18.7.13 anymatch: 3.1.2 fb-watchman: 2.0.1 graceful-fs: 4.2.10 @@ -12364,7 +12478,7 @@ packages: '@jest/source-map': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.0.1 + '@types/node': 18.7.13 chalk: 4.1.2 co: 4.6.0 expect: 27.5.1 @@ -12452,7 +12566,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 18.0.1 + '@types/node': 18.7.13 dev: true /jest-mock/28.1.1: @@ -12460,7 +12574,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.1 - '@types/node': 18.0.1 + '@types/node': 18.7.13 dev: true /jest-pnp-resolver/1.2.2_jest-resolve@27.5.1: @@ -12512,7 +12626,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - chalk: 4.1.0 + chalk: 4.1.2 graceful-fs: 4.2.10 jest-haste-map: 27.5.1 jest-pnp-resolver: 1.2.2_jest-resolve@27.5.1 @@ -12547,7 +12661,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.0.1 + '@types/node': 18.7.13 chalk: 4.1.2 emittery: 0.8.1 graceful-fs: 4.2.10 @@ -12579,7 +12693,7 @@ packages: '@jest/test-result': 28.1.1 '@jest/transform': 28.1.2 '@jest/types': 28.1.1 - '@types/node': 18.0.1 + '@types/node': 18.7.13 chalk: 4.1.2 emittery: 0.10.2 graceful-fs: 4.2.10 @@ -12663,7 +12777,7 @@ packages: resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@types/node': 18.0.1 + '@types/node': 18.7.13 graceful-fs: 4.2.10 dev: true @@ -12733,8 +12847,8 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 18.0.1 - chalk: 4.1.0 + '@types/node': 18.7.13 + chalk: 4.1.2 ci-info: 3.3.2 graceful-fs: 4.2.10 picomatch: 2.3.1 @@ -12745,7 +12859,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.1 - '@types/node': 18.0.1 + '@types/node': 18.7.13 chalk: 4.1.2 ci-info: 3.3.2 graceful-fs: 4.2.10 @@ -12782,7 +12896,7 @@ packages: dependencies: '@jest/test-result': 28.1.1 '@jest/types': 28.1.1 - '@types/node': 18.0.1 + '@types/node': 18.7.13 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.10.2 @@ -12794,7 +12908,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.0.1 + '@types/node': 18.7.13 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -12802,12 +12916,12 @@ packages: resolution: {integrity: sha512-Au7slXB08C6h+xbJPp7VIb6U0XX5Kc9uel/WFc6/rcTzGiaVCBRngBExSYuXSLFPULPSYU3cJ3ybS988lNFQhQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@types/node': 18.0.1 + '@types/node': 18.7.13 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest/28.1.2_hxaxlvfys2pc3hefxwkmyo5cpq: + /jest/28.1.2_3glepa5322b7j342guju4hszoy: resolution: {integrity: sha512-Tuf05DwLeCh2cfWCQbcz9UxldoDyiR1E9Igaei5khjonKncYdc6LDfynKCEWozK0oLE3GD+xKAo2u8x/0s6GOg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} hasBin: true @@ -12820,7 +12934,7 @@ packages: '@jest/core': 28.1.2_ts-node@10.8.2 '@jest/types': 28.1.1 import-local: 3.1.0 - jest-cli: 28.1.2_hxaxlvfys2pc3hefxwkmyo5cpq + jest-cli: 28.1.2_3glepa5322b7j342guju4hszoy transitivePeerDependencies: - '@types/node' - supports-color @@ -12839,17 +12953,17 @@ packages: '@panva/asn1.js': 1.0.0 dev: false - /jotai/1.7.4: - resolution: {integrity: sha512-PvkjL6DA4I0GFNFWt/1MKouTpN6Ohj0qyfuV4LoYGBHQRlf38qF6cPILozYsYZi2Nfeap9MdzWVGSYu1qBElKQ==} + /jotai/1.8.1: + resolution: {integrity: sha512-ZhZ15z+94E95aMYpH9MfwFFYP5m8TuFKkEN/6+3P4SC3dXnQc5s+DbMl+kA4RC63OcUlfi9C0nJU3YDnJfqLIg==} engines: {node: '>=12.7.0'} peerDependencies: '@babel/core': '*' '@babel/template': '*' + '@tanstack/query-core': '*' '@urql/core': '*' immer: '*' optics-ts: '*' - react: '>=16.8' - react-query: '*' + react: '>=16.8 || 18' valtio: '*' wonka: '*' xstate: '*' @@ -12858,6 +12972,8 @@ packages: optional: true '@babel/template': optional: true + '@tanstack/query-core': + optional: true '@urql/core': optional: true immer: @@ -12866,8 +12982,6 @@ packages: optional: true react: optional: true - react-query: - optional: true valtio: optional: true wonka: @@ -13193,7 +13307,7 @@ packages: dependencies: klona: 2.0.5 less: 3.12.2 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 dev: true /less/3.12.2: @@ -13365,7 +13479,7 @@ packages: webpack-sources: optional: true dependencies: - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 webpack-sources: 3.2.3 dev: true @@ -13444,7 +13558,7 @@ packages: log-update: 4.0.0 p-map: 4.0.0 rfdc: 1.3.0 - rxjs: 7.5.5 + rxjs: 7.5.6 through: 2.3.8 wrap-ansi: 7.0.0 dev: true @@ -13822,7 +13936,7 @@ packages: dependencies: loader-utils: 2.0.2 schema-utils: 3.1.1 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 webpack-sources: 1.4.3 dev: false @@ -13836,7 +13950,7 @@ packages: optional: true dependencies: schema-utils: 4.0.0 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 dev: true /mini-css-extract-plugin/2.6.1_webpack@5.74.0: @@ -13915,10 +14029,12 @@ packages: resolution: {integrity: sha512-bRuZp3C0itgLKHu/VNxi66DN/XVkQG7xtoBVWxpvC5FhAqbOCP21+nPhULjnzEqd7xBMybp6KwytdUpZKEgpIQ==} peerDependencies: mobx: ^6.1.0 - react: ^16.8.0 || ^17 || ^18 + react: ^16.8.0 || ^17 || ^18 || 18 react-dom: '*' react-native: '*' peerDependenciesMeta: + mobx: + optional: true react: optional: true react-dom: @@ -13931,10 +14047,12 @@ packages: resolution: {integrity: sha512-bRuZp3C0itgLKHu/VNxi66DN/XVkQG7xtoBVWxpvC5FhAqbOCP21+nPhULjnzEqd7xBMybp6KwytdUpZKEgpIQ==} peerDependencies: mobx: ^6.1.0 - react: ^16.8.0 || ^17 || ^18 + react: ^16.8.0 || ^17 || ^18 || 18 react-dom: '*' react-native: '*' peerDependenciesMeta: + mobx: + optional: true react: optional: true react-dom: @@ -14028,6 +14146,10 @@ packages: tslib: 2.4.0 dev: true + /node-abort-controller/3.0.1: + resolution: {integrity: sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==} + dev: true + /node-addon-api/3.2.1: resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} dev: true @@ -14091,8 +14213,8 @@ packages: '@emotion/react': ^11.4.1 '@emotion/styled': ^11.3.0 '@mui/material': ^5.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || 18 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: '@emotion/react': optional: true @@ -14141,32 +14263,18 @@ packages: path-key: 4.0.0 dev: true - /npmlog/4.1.2: - resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==} - dependencies: - are-we-there-yet: 1.1.7 - console-control-strings: 1.1.0 - gauge: 2.7.4 - set-blocking: 2.0.0 - dev: true - /nth-check/2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} dependencies: boolbase: 1.0.0 dev: true - /number-is-nan/1.0.1: - resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} - engines: {node: '>=0.10.0'} - dev: true - /nwsapi/2.2.1: resolution: {integrity: sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==} dev: true - /nx/14.4.2_@swc+core@1.2.210: - resolution: {integrity: sha512-bYO//HuwQL4X8y+2BjUPtkPLDiYI1zMejQo6+uJl3+VdYPcsjwW/ca581tBPHiPH95XnHiBartnMrMJtn11grw==} + /nx/14.5.10_@swc+core@1.2.244: + resolution: {integrity: sha512-dqiV+zY32k98mfKFTgiQyYd9HYZmB1zoJj6gYniEuqzs6CKp8ZSpeRDaVQRxR6wEMvW9MSTA9kBg8sJ78W/NZg==} hasBin: true requiresBuild: true peerDependencies: @@ -14178,10 +14286,10 @@ packages: '@swc/core': optional: true dependencies: - '@nrwl/cli': 14.4.2 - '@nrwl/tao': 14.4.2_@swc+core@1.2.210 + '@nrwl/cli': 14.5.10 + '@nrwl/tao': 14.5.10_@swc+core@1.2.244 '@parcel/watcher': 2.0.4 - '@swc/core': 1.2.210 + '@swc/core': 1.2.244 chalk: 4.1.0 chokidar: 3.5.3 cli-cursor: 3.1.0 @@ -14833,7 +14941,7 @@ packages: resolve: 1.22.1 dev: true - /postcss-load-config/3.1.4_i7duc3lt6p42geuj2nwruihc6u: + /postcss-load-config/3.1.4_pe6iykxod2v7i2uk6okjazxzki: resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} peerDependencies: @@ -14847,7 +14955,7 @@ packages: dependencies: lilconfig: 2.0.5 postcss: 8.4.14 - ts-node: 10.8.2_y42jqzo3jkzuv3kp7opavo2xbi + ts-node: 10.9.1_hixnfb2jfw56u6pahjg3ndp4oy yaml: 1.10.2 dev: true @@ -14865,7 +14973,7 @@ packages: klona: 2.0.5 postcss: 8.4.14 semver: 7.3.7 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 dev: true /postcss-merge-longhand/5.1.6_postcss@8.4.14: @@ -15220,19 +15328,10 @@ packages: react-is: 18.2.0 dev: true - /pretty-hrtime/1.0.3: - resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} - engines: {node: '>= 0.8'} - dev: true - /process-nextick-args/2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: true - /promise-polyfill/8.1.3: - resolution: {integrity: sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g==} - dev: true - /promise.series/0.2.0: resolution: {integrity: sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==} engines: {node: '>=0.12'} @@ -15403,20 +15502,20 @@ packages: dependencies: loader-utils: 2.0.2 schema-utils: 3.1.1 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 dev: true - /react-date-range/1.4.0_date-fns@2.28.0: + /react-date-range/1.4.0_date-fns@2.29.2: resolution: {integrity: sha512-+9t0HyClbCqw1IhYbpWecjsiaftCeRN5cdhsi9v06YdimwyMR2yYHWcgVn3URwtN/txhqKpEZB6UX1fHpvK76w==} peerDependencies: date-fns: 2.0.0-alpha.7 || >=2.0.0 - react: ^0.14 || ^15.0.0-rc || >=15.0 + react: ^0.14 || ^15.0.0-rc || >=15.0 || 18 peerDependenciesMeta: react: optional: true dependencies: classnames: 2.3.1 - date-fns: 2.28.0 + date-fns: 2.29.2 prop-types: 15.8.1 react-list: 0.8.17 shallow-equal: 1.2.1 @@ -15425,7 +15524,7 @@ packages: /react-dom/18.2.0_react@18.2.0: resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: - react: ^18.2.0 + react: ^18.2.0 || 18 peerDependenciesMeta: react: optional: true @@ -15437,8 +15536,8 @@ packages: /react-draggable/4.4.5: resolution: {integrity: sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g==} peerDependencies: - react: '>= 16.3.0' - react-dom: '>= 16.3.0' + react: '>= 16.3.0 || 18' + react-dom: '>= 16.3.0 || 18' peerDependenciesMeta: react: optional: true @@ -15453,7 +15552,7 @@ packages: resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} engines: {node: '>=10', npm: '>=6'} peerDependencies: - react: '>=16.13.1' + react: '>=16.13.1 || 18' peerDependenciesMeta: react: optional: true @@ -15465,7 +15564,7 @@ packages: resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} engines: {node: '>=10', npm: '>=6'} peerDependencies: - react: '>=16.13.1' + react: '>=16.13.1 || 18' peerDependenciesMeta: react: optional: true @@ -15477,8 +15576,8 @@ packages: /react-hotkeys-hook/3.4.6: resolution: {integrity: sha512-SiGKHnauaAQglRA7qeiW5LTa0KoT2ssv8YGYKZQoM3P9v5JFEHJdXOSFml1N6K86oKQ8dLCLlxqBqGlSJWGmxQ==} peerDependencies: - react: '>=16.8.1' - react-dom: '>=16.8.1' + react: '>=16.8.1 || 18' + react-dom: '>=16.8.1 || 18' peerDependenciesMeta: react: optional: true @@ -15492,7 +15591,7 @@ packages: resolution: {integrity: sha512-gK/AylAQC5DvCD5YLNCHW4PNzpCfrWIyVAXbSMl+/5QXzlDP8VdBoqE2s2niGHB+zIXwBV9hRXbDrVuupbgHcg==} peerDependencies: i18next: '>= 19.0.0' - react: '>= 16.8.0' + react: '>= 16.8.0 || 18' react-dom: '*' react-native: '*' peerDependenciesMeta: @@ -15520,7 +15619,7 @@ packages: /react-list/0.8.17: resolution: {integrity: sha512-pgmzGi0G5uGrdHzMhgO7KR1wx5ZXVvI3SsJUmkblSAKtewIhMwbQiMuQiTE83ozo04BQJbe0r3WIWzSO0dR1xg==} peerDependencies: - react: 0.14 || 15 - 18 + react: 0.14 || 15 - 18 || 18 peerDependenciesMeta: react: optional: true @@ -15536,7 +15635,7 @@ packages: /react-resizable/3.0.4: resolution: {integrity: sha512-StnwmiESiamNzdRHbSSvA65b0ZQJ7eVQpPusrSmcpyGKzC0gojhtO62xxH6YOBmepk9dQTBi9yxidL3W4s3EBA==} peerDependencies: - react: '>= 16.3' + react: '>= 16.3 || 18' peerDependenciesMeta: react: optional: true @@ -15550,8 +15649,8 @@ packages: /react-router-dom/6.3.0_biqbaboplfbrettd7655fr4n2y: resolution: {integrity: sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==} peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' + react: '>=16.8 || 18' + react-dom: '>=16.8 || 18' peerDependenciesMeta: react: optional: true @@ -15567,7 +15666,7 @@ packages: /react-router/6.3.0_react@18.2.0: resolution: {integrity: sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==} peerDependencies: - react: '>=16.8' + react: '>=16.8 || 18' peerDependenciesMeta: react: optional: true @@ -15579,7 +15678,7 @@ packages: /react-shallow-renderer/16.15.0_react@18.2.0: resolution: {integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==} peerDependencies: - react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react: ^16.0.0 || ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: react: optional: true @@ -15592,7 +15691,7 @@ packages: /react-test-renderer/18.2.0_react@18.2.0: resolution: {integrity: sha512-JWD+aQ0lh2gvh4NM3bBM42Kx+XybOxCpgYK7F8ugAlpaTSnWsX+39Z4XkOykGZAHrjwwTZT3x3KxswVWxHPUqA==} peerDependencies: - react: ^18.2.0 + react: ^18.2.0 || 18 peerDependenciesMeta: react: optional: true @@ -15606,8 +15705,8 @@ packages: /react-transition-group/4.4.2: resolution: {integrity: sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==} peerDependencies: - react: '>=16.6.0' - react-dom: '>=16.6.0' + react: '>=16.6.0 || 18' + react-dom: '>=16.6.0 || 18' peerDependenciesMeta: react: optional: true @@ -15623,8 +15722,8 @@ packages: /react-transition-group/4.4.2_biqbaboplfbrettd7655fr4n2y: resolution: {integrity: sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==} peerDependencies: - react: '>=16.6.0' - react-dom: '>=16.6.0' + react: '>=16.6.0 || 18' + react-dom: '>=16.6.0 || 18' peerDependenciesMeta: react: optional: true @@ -15643,8 +15742,8 @@ packages: resolution: {integrity: sha512-JHEZbPXBpKMmoNO1bNhoXOOLg/ujhL/BU4IqVU9r8eQPcy5KQnGHIHDRkJ0ns9IM5+Aq5LNwt3j8t3tIrePQzA==} engines: {node: '>8.0.0'} peerDependencies: - react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || 18 + react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: react: optional: true @@ -15919,7 +16018,7 @@ packages: /rifm/0.12.1: resolution: {integrity: sha512-OGA1Bitg/dSJtI/c4dh90svzaUPt228kzFsUkJbtA2c964IqEAwWXeL9ZJi86xWv3j5SMqRvGULl7bA6cK0Bvg==} peerDependencies: - react: '>=16.8' + react: '>=16.8 || 18' peerDependenciesMeta: react: optional: true @@ -15961,7 +16060,7 @@ packages: rollup: 2.75.7 dev: true - /rollup-plugin-postcss/4.0.2_i7duc3lt6p42geuj2nwruihc6u: + /rollup-plugin-postcss/4.0.2_pe6iykxod2v7i2uk6okjazxzki: resolution: {integrity: sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==} engines: {node: '>=10'} peerDependencies: @@ -15974,7 +16073,7 @@ packages: p-queue: 6.6.2 pify: 5.0.0 postcss: 8.4.14 - postcss-load-config: 3.1.4_i7duc3lt6p42geuj2nwruihc6u + postcss-load-config: 3.1.4_pe6iykxod2v7i2uk6okjazxzki postcss-modules: 4.3.1_postcss@8.4.14 promise.series: 0.2.0 resolve: 1.22.1 @@ -16034,17 +16133,6 @@ packages: queue-microtask: 1.2.3 dev: true - /rxjs-for-await/0.0.2_rxjs@6.6.7: - resolution: {integrity: sha512-IJ8R/ZCFMHOcDIqoABs82jal00VrZx8Xkgfe7TOKoaRPAW5nH/VFlG23bXpeGdrmtqI9UobFPgUKgCuFc7Lncw==} - peerDependencies: - rxjs: ^6.0.0 - peerDependenciesMeta: - rxjs: - optional: true - dependencies: - rxjs: 6.6.7 - dev: true - /rxjs/6.6.7: resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} engines: {npm: '>=2.0.0'} @@ -16056,6 +16144,12 @@ packages: resolution: {integrity: sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==} dependencies: tslib: 2.4.0 + dev: true + + /rxjs/7.5.6: + resolution: {integrity: sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==} + dependencies: + tslib: 2.4.0 /safari-14-idb-fix/3.0.0: resolution: {integrity: sha512-eBNFLob4PMq8JA1dGyFn6G97q3/WzNtFK4RnzT1fnLq+9RyrGknzYiM/9B12MnKAxuj1IXr7UKYtTNtjyKMBog==} @@ -16099,7 +16193,7 @@ packages: klona: 2.0.5 neo-async: 2.6.2 sass: 1.53.0 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 dev: true /sass/1.53.0: @@ -16131,15 +16225,6 @@ packages: dependencies: loose-envify: 1.4.0 - /schema-utils/2.7.0: - resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} - engines: {node: '>= 8.9.0'} - dependencies: - '@types/json-schema': 7.0.11 - ajv: 6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 - dev: true - /schema-utils/2.7.1: resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} engines: {node: '>= 8.9.0'} @@ -16163,7 +16248,7 @@ packages: dependencies: '@types/json-schema': 7.0.11 ajv: 8.11.0 - ajv-formats: 2.1.1_ajv@8.11.0 + ajv-formats: 2.1.1 ajv-keywords: 5.1.0_ajv@8.11.0 dev: true @@ -16174,7 +16259,7 @@ packages: dev: false /secure-compare/3.0.1: - resolution: {integrity: sha1-8aAymzCLIh+uN7mXTz1XjQypmeM=} + resolution: {integrity: sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==} dev: true /seek-bzip/1.0.6: @@ -16194,7 +16279,7 @@ packages: dependencies: jszip: 3.10.0 tmp: 0.2.1 - ws: 8.8.0 + ws: 8.8.1 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -16309,10 +16394,6 @@ packages: - supports-color dev: true - /set-blocking/2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: true - /setimmediate/1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} dev: true @@ -16407,8 +16488,8 @@ packages: /slate-react/0.81.0_slate@0.81.1: resolution: {integrity: sha512-bwryad4EvOmc7EFKb8aGg9DWNDh3KvToaggGieIgGTTbHJYHc9ADFC3A87Ittlpd5XUVopR0MpChQ3g3ODyvqw==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: '>=16.8.0 || 18' + react-dom: '>=16.8.0 || 18' slate: '>=0.65.3' peerDependenciesMeta: react: @@ -16528,7 +16609,7 @@ packages: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.0.2 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 dev: true /source-map-resolve/0.6.0: @@ -16704,15 +16785,6 @@ packages: schema-utils: 3.1.1 dev: false - /string-width/1.0.2: - resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} - engines: {node: '>=0.10.0'} - dependencies: - code-point-at: 1.1.0 - is-fullwidth-code-point: 1.0.0 - strip-ansi: 3.0.1 - dev: true - /string-width/2.1.1: resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} engines: {node: '>=4'} @@ -16776,13 +16848,6 @@ packages: dependencies: safe-buffer: 5.2.1 - /strip-ansi/3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: true - /strip-ansi/4.0.0: resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} engines: {node: '>=4'} @@ -16879,7 +16944,7 @@ packages: webpack: optional: true dependencies: - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 dev: true /style-mod/3.2.2: @@ -16890,8 +16955,8 @@ packages: resolution: {integrity: sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==} dev: false - /style9/0.13.3: - resolution: {integrity: sha512-mQ39P2a4o5vHzy80vdpG4JfolQkBNxjvIvQen2JkM4/EdF4KEl0vOBCobD4Dd43aW2HoOzFuEVYHmsdmJoMs2g==} + /style9/0.14.0: + resolution: {integrity: sha512-zcKdz1GGM7kq8clEfAQ/2TV52d1hj+BgWPPGjqkjtUhP/i3qJq+nA4UJSgO67T7UQPax56tmOQs4y1AZrv9FTw==} engines: {node: '>=12'} dependencies: '@babel/core': 7.18.6 @@ -16917,8 +16982,8 @@ packages: - webpack dev: false - /style9/0.13.3_3dhnqjc63a233tfpt3a625zcdq: - resolution: {integrity: sha512-mQ39P2a4o5vHzy80vdpG4JfolQkBNxjvIvQen2JkM4/EdF4KEl0vOBCobD4Dd43aW2HoOzFuEVYHmsdmJoMs2g==} + /style9/0.14.0_3dhnqjc63a233tfpt3a625zcdq: + resolution: {integrity: sha512-zcKdz1GGM7kq8clEfAQ/2TV52d1hj+BgWPPGjqkjtUhP/i3qJq+nA4UJSgO67T7UQPax56tmOQs4y1AZrv9FTw==} engines: {node: '>=12'} dependencies: '@babel/core': 7.18.6 @@ -16973,7 +17038,7 @@ packages: klona: 2.0.5 normalize-path: 3.0.0 stylus: 0.55.0 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 dev: true /stylus/0.55.0: @@ -16987,7 +17052,7 @@ packages: safer-buffer: 2.1.2 sax: 1.2.4 semver: 6.3.0 - source-map: 0.7.3 + source-map: 0.7.4 transitivePeerDependencies: - supports-color dev: true @@ -17045,11 +17110,6 @@ packages: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true - /tapable/1.1.3: - resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} - engines: {node: '>=6'} - dev: true - /tapable/2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -17134,7 +17194,7 @@ packages: supports-hyperlinks: 2.2.0 dev: true - /terser-webpack-plugin/5.3.3_vwzmvoh3samqo2nn3x7mqt365m: + /terser-webpack-plugin/5.3.3_5yvlrjpud4kvfyyr2mesgpo47e: resolution: {integrity: sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -17153,12 +17213,12 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.14 - '@swc/core': 1.2.210 + '@swc/core': 1.2.244 jest-worker: 27.5.1 schema-utils: 3.1.1 serialize-javascript: 6.0.0 terser: 5.14.1 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 /terser-webpack-plugin/5.3.3_webpack@5.74.0: resolution: {integrity: sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==} @@ -17366,7 +17426,7 @@ packages: babel-jest: 28.1.2_@babel+core@7.18.6 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 28.1.2_hxaxlvfys2pc3hefxwkmyo5cpq + jest: 28.1.2_3glepa5322b7j342guju4hszoy jest-util: 28.1.1 json5: 2.2.1 lodash.memoize: 4.1.2 @@ -17386,15 +17446,15 @@ packages: webpack: optional: true dependencies: - chalk: 4.1.0 + chalk: 4.1.2 enhanced-resolve: 5.10.0 micromatch: 4.0.5 semver: 7.3.7 typescript: 4.7.4 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 dev: true - /ts-node/10.8.2_y42jqzo3jkzuv3kp7opavo2xbi: + /ts-node/10.8.2_hixnfb2jfw56u6pahjg3ndp4oy: resolution: {integrity: sha512-LYdGnoGddf1D6v8REPtIH+5iq/gTDuZqv2/UJUU7tKjuEU8xVZorBM+buCGNjj+pGEud+sOoM4CX3/YzINpENA==} hasBin: true peerDependencies: @@ -17409,12 +17469,44 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@swc/core': 1.2.210 + '@swc/core': 1.2.244 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 18.0.1 + '@types/node': 18.7.13 + acorn: 8.7.1 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.7.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /ts-node/10.9.1_hixnfb2jfw56u6pahjg3ndp4oy: + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@swc/core': 1.2.244 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 18.7.13 acorn: 8.7.1 acorn-walk: 8.2.0 arg: 4.1.3 @@ -17597,7 +17689,7 @@ packages: /upath2/3.1.13: resolution: {integrity: sha512-M88uBoqgzrkXvXrF/+oSIPsTmL21uRwGhPVJKODrl+3lXkQ5NPKrTYuSBZVa+lgPGFoI6qYyHlSKACFHO0AoNw==} dependencies: - '@types/node': 18.0.1 + '@types/node': 18.7.13 path-is-network-drive: 1.0.15 path-strip-sep: 1.0.12 tslib: 2.4.0 @@ -17649,7 +17741,7 @@ packages: loader-utils: 2.0.2 mime-types: 2.1.35 schema-utils: 3.1.1 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 dev: true /url-parse-lax/1.0.0: @@ -17704,7 +17796,7 @@ packages: dev: true /utils-merge/1.0.1: - resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=} + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} dev: true @@ -17850,7 +17942,7 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.0.0 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 dev: true /webpack-dev-server/4.9.3_webpack@5.74.0: @@ -17893,9 +17985,9 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 webpack-dev-middleware: 5.3.3_webpack@5.74.0 - ws: 8.8.0 + ws: 8.8.1 transitivePeerDependencies: - bufferutil - debug @@ -17949,7 +18041,7 @@ packages: dependencies: html-webpack-plugin: 5.5.0_webpack@5.74.0 typed-assert: 1.0.9 - webpack: 5.74.0_@swc+core@1.2.210 + webpack: 5.74.0_@swc+core@1.2.244 dev: true /webpack-virtual-modules/0.4.4: @@ -17996,7 +18088,7 @@ packages: - uglify-js dev: true - /webpack/5.74.0_@swc+core@1.2.210: + /webpack/5.74.0_@swc+core@1.2.244: resolution: {integrity: sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==} engines: {node: '>=10.13.0'} hasBin: true @@ -18027,7 +18119,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.1.1 tapable: 2.2.1 - terser-webpack-plugin: 5.3.3_vwzmvoh3samqo2nn3x7mqt365m + terser-webpack-plugin: 5.3.3_5yvlrjpud4kvfyyr2mesgpo47e watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -18060,10 +18152,6 @@ packages: iconv-lite: 0.6.3 dev: true - /whatwg-fetch/2.0.4: - resolution: {integrity: sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==} - dev: true - /whatwg-mimetype/2.3.0: resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} dev: true @@ -18119,12 +18207,6 @@ packages: isexe: 2.0.0 dev: true - /wide-align/1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - dependencies: - string-width: 1.0.2 - dev: true - /wildcard/2.0.0: resolution: {integrity: sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==} dev: true @@ -18184,19 +18266,6 @@ packages: optional: true dev: true - /ws/8.8.0: - resolution: {integrity: sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==} - 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 - dev: true - /ws/8.8.1: resolution: {integrity: sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==} engines: {node: '>=10.0.0'} @@ -18208,7 +18277,6 @@ packages: optional: true utf-8-validate: optional: true - dev: false /xml-name-validator/3.0.0: resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} @@ -18318,7 +18386,7 @@ packages: resolution: {integrity: sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==} engines: {node: '>=12.7.0'} peerDependencies: - react: '>=16.8' + react: '>=16.8 || 18' peerDependenciesMeta: react: optional: true From 12afd6be681c05112174548996e84f93327d9150 Mon Sep 17 00:00:00 2001 From: lawvs <18554747+lawvs@users.noreply.github.com> Date: Fri, 26 Aug 2022 19:50:17 +0800 Subject: [PATCH 51/81] refactor: remove useBlockRender --- .../src/blocks/grid-item/GridItemRender.tsx | 11 ++--------- .../components/editor-blocks/src/blocks/grid/Grid.tsx | 3 +-- .../editor-core/src/render-block/Context.tsx | 9 +++++++-- .../editor-core/src/render-block/RenderBlock.tsx | 5 +++-- .../src/render-block/RenderBlockChildren.tsx | 3 +-- .../src/render-block/WithTreeViewChildren.tsx | 3 +-- libs/components/editor-core/src/render-block/index.ts | 2 +- 7 files changed, 16 insertions(+), 20 deletions(-) diff --git a/libs/components/editor-blocks/src/blocks/grid-item/GridItemRender.tsx b/libs/components/editor-blocks/src/blocks/grid-item/GridItemRender.tsx index 1dece91699..620a25dba6 100644 --- a/libs/components/editor-blocks/src/blocks/grid-item/GridItemRender.tsx +++ b/libs/components/editor-blocks/src/blocks/grid-item/GridItemRender.tsx @@ -1,4 +1,4 @@ -import { useBlockRender } from '@toeverything/components/editor-core'; +import { RenderBlockChildren } from '@toeverything/components/editor-core'; import { ChildrenView, CreateView } from '@toeverything/framework/virgo'; export const GridItemRender = function ( @@ -6,14 +6,7 @@ export const GridItemRender = function ( ) { const GridItem = function (props: CreateView) { const { block } = props; - const { BlockRender } = useBlockRender(); - const children = ( - <> - {block.childrenIds.map(id => { - return ; - })} - - ); + const children = ; return <>{creator({ ...props, children })}; }; return GridItem; diff --git a/libs/components/editor-blocks/src/blocks/grid/Grid.tsx b/libs/components/editor-blocks/src/blocks/grid/Grid.tsx index 4b5bfd49b3..a8e69125d0 100644 --- a/libs/components/editor-blocks/src/blocks/grid/Grid.tsx +++ b/libs/components/editor-blocks/src/blocks/grid/Grid.tsx @@ -1,4 +1,4 @@ -import { useBlockRender } from '@toeverything/components/editor-core'; +import { BlockRender } from '@toeverything/components/editor-core'; import { styled } from '@toeverything/components/ui'; import { Protocol } from '@toeverything/datasource/db-service'; import { CreateView } from '@toeverything/framework/virgo'; @@ -31,7 +31,6 @@ export const Grid = function (props: CreateView) { const originalLeftWidth = useRef(gridItemMinWidth); const originalRightWidth = useRef(gridItemMinWidth); const [alertHandleId, setAlertHandleId] = useState(null); - const { BlockRender } = useBlockRender(); const getLeftRightGridItemDomByIndex = (index: number) => { const gridItems = Array.from(gridContainerRef.current?.children).filter( diff --git a/libs/components/editor-core/src/render-block/Context.tsx b/libs/components/editor-core/src/render-block/Context.tsx index 90c89eec0e..d34f5d6801 100644 --- a/libs/components/editor-core/src/render-block/Context.tsx +++ b/libs/components/editor-core/src/render-block/Context.tsx @@ -3,7 +3,7 @@ import { createContext, PropsWithChildren, useContext } from 'react'; import { RenderBlockProps } from './RenderBlock'; type BlockRenderProps = { - blockRender: (args: RenderBlockProps) => JSX.Element | null; + blockRender: (args: RenderBlockProps) => JSX.Element; }; export const BlockRenderContext = createContext( @@ -27,9 +27,14 @@ export const BlockRenderProvider = ({ ); }; -export const useBlockRender = () => { +const useBlockRender = () => { const { blockRender } = useContext(BlockRenderContext); return { BlockRender: blockRender, }; }; + +export const BlockRender = (props: RenderBlockProps) => { + const { BlockRender } = useBlockRender(); + return ; +}; diff --git a/libs/components/editor-core/src/render-block/RenderBlock.tsx b/libs/components/editor-core/src/render-block/RenderBlock.tsx index c843274166..a7ebc53789 100644 --- a/libs/components/editor-core/src/render-block/RenderBlock.tsx +++ b/libs/components/editor-core/src/render-block/RenderBlock.tsx @@ -7,7 +7,8 @@ import { useBlock } from '../hooks'; /** * Render nothing */ -export const NullBlockRender = (): null => null; +// eslint-disable-next-line react/jsx-no-useless-fragment +export const NullBlockRender = () => <>; export interface RenderBlockProps { blockId: string; @@ -22,7 +23,7 @@ export function RenderBlock({ const { block } = useBlock(blockId); const setRef = useCallback( - (dom: HTMLElement) => { + (dom: HTMLElement | null) => { if (block != null && dom != null) { block.dom = dom; } diff --git a/libs/components/editor-core/src/render-block/RenderBlockChildren.tsx b/libs/components/editor-core/src/render-block/RenderBlockChildren.tsx index d79d0cd002..3ff9892949 100644 --- a/libs/components/editor-core/src/render-block/RenderBlockChildren.tsx +++ b/libs/components/editor-core/src/render-block/RenderBlockChildren.tsx @@ -1,6 +1,6 @@ import { styled } from '@toeverything/components/ui'; import type { AsyncBlock } from '../editor'; -import { useBlockRender } from './Context'; +import { BlockRender } from './Context'; import { NullBlockRender } from './RenderBlock'; export interface RenderChildrenProps { @@ -12,7 +12,6 @@ export const RenderBlockChildren = ({ block, indent = true, }: RenderChildrenProps) => { - const { BlockRender } = useBlockRender(); if (BlockRender === NullBlockRender) { return null; } diff --git a/libs/components/editor-core/src/render-block/WithTreeViewChildren.tsx b/libs/components/editor-core/src/render-block/WithTreeViewChildren.tsx index 8c3642ef6d..6dccd49ace 100644 --- a/libs/components/editor-core/src/render-block/WithTreeViewChildren.tsx +++ b/libs/components/editor-core/src/render-block/WithTreeViewChildren.tsx @@ -7,7 +7,7 @@ import type { } from 'react'; import { forwardRef } from 'react'; import { CreateView } from '../editor'; -import { useBlockRender } from './Context'; +import { BlockRender } from './Context'; import { NullBlockRender } from './RenderBlock'; type WithChildrenConfig = { @@ -60,7 +60,6 @@ export const withTreeViewChildren = ( return (props: CreateView) => { const { block } = props; - const { BlockRender } = useBlockRender(); const collapsed = block.getProperty('collapsed')?.value; const childrenIds = block.childrenIds; const showChildren = diff --git a/libs/components/editor-core/src/render-block/index.ts b/libs/components/editor-core/src/render-block/index.ts index 5d3c6d122e..bc071cf5a2 100644 --- a/libs/components/editor-core/src/render-block/index.ts +++ b/libs/components/editor-core/src/render-block/index.ts @@ -1,4 +1,4 @@ -export { BlockRenderProvider, useBlockRender } from './Context'; +export { BlockRender, BlockRenderProvider } from './Context'; export { NullBlockRender, RenderBlock } from './RenderBlock'; export { RenderBlockChildren } from './RenderBlockChildren'; export { KanbanBlockRender } from './RenderKanbanBlock'; From 374d9d94efb4d39374d1221679c28d7655f9f389 Mon Sep 17 00:00:00 2001 From: lawvs <18554747+lawvs@users.noreply.github.com> Date: Fri, 26 Aug 2022 19:51:33 +0800 Subject: [PATCH 52/81] chore: clean styles --- .../src/blocks/group/GroupView.tsx | 21 +++++++------------ .../blocks/group/group-menu/AddViewMenu.tsx | 2 +- .../src/blocks/group/group-menu/ViewsMenu.tsx | 4 ++-- 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/libs/components/editor-blocks/src/blocks/group/GroupView.tsx b/libs/components/editor-blocks/src/blocks/group/GroupView.tsx index 791059e36c..f0d6e56cc5 100644 --- a/libs/components/editor-blocks/src/blocks/group/GroupView.tsx +++ b/libs/components/editor-blocks/src/blocks/group/GroupView.tsx @@ -21,19 +21,6 @@ const SceneMap: Record> = { kanban: SceneKanban, } as const; -const GroupBox = styled('div')(({ theme }) => { - return { - '&:hover': { - // Workaround referring to other components - // See https://emotion.sh/docs/styled#targeting-another-emotion-component - // [GroupActionWrapper.toString()]: {}, - '& > *': { - visibility: 'visible', - }, - }, - }; -}); - const GroupActionWrapper = styled('div')(({ theme }) => ({ height: '30px', display: 'flex', @@ -59,6 +46,14 @@ const GroupActionWrapper = styled('div')(({ theme }) => ({ }, })); +const GroupBox = styled('div')({ + '&:hover': { + [GroupActionWrapper.toString()]: { + visibility: 'visible', + }, + }, +}); + const GroupContainer = styled('div')<{ isSelect?: boolean }>( ({ isSelect, theme }) => ({ background: theme.affine.palette.white, diff --git a/libs/components/editor-blocks/src/blocks/group/group-menu/AddViewMenu.tsx b/libs/components/editor-blocks/src/blocks/group/group-menu/AddViewMenu.tsx index a376785b52..cffa0a0dd0 100644 --- a/libs/components/editor-blocks/src/blocks/group/group-menu/AddViewMenu.tsx +++ b/libs/components/editor-blocks/src/blocks/group/group-menu/AddViewMenu.tsx @@ -41,7 +41,7 @@ export const AddViewMenu = () => { onClick={() => setActivePanel(!activePanel)} > - Add View + Add View {activePanel && ( diff --git a/libs/components/editor-blocks/src/blocks/group/group-menu/ViewsMenu.tsx b/libs/components/editor-blocks/src/blocks/group/group-menu/ViewsMenu.tsx index 1fee99465e..9e6a70df24 100644 --- a/libs/components/editor-blocks/src/blocks/group/group-menu/ViewsMenu.tsx +++ b/libs/components/editor-blocks/src/blocks/group/group-menu/ViewsMenu.tsx @@ -20,7 +20,7 @@ export const ViewsMenu = () => { useRecastView(); const handleChange = (e: ChangeEvent) => { - setViewName(e.target.value.trim()); + setViewName(e.target.value); }; const handleKeyDown = (event: KeyboardEvent) => { @@ -36,7 +36,7 @@ export const ViewsMenu = () => { } await updateView({ ...activeView, - name: viewName, + name: viewName.trim(), type: viewType, }); setActiveView(null); From 8df4ac7f14ad3a353bf309f284a4470cc6a5c345 Mon Sep 17 00:00:00 2001 From: tzhangchi Date: Fri, 26 Aug 2022 21:20:55 +0800 Subject: [PATCH 53/81] feat(scss): remove last scss file --- .../src/components/table/basic-table.scss | 6 ------ .../editor-blocks/src/components/table/basic-table.tsx | 10 +++++----- 2 files changed, 5 insertions(+), 11 deletions(-) delete mode 100644 libs/components/editor-blocks/src/components/table/basic-table.scss diff --git a/libs/components/editor-blocks/src/components/table/basic-table.scss b/libs/components/editor-blocks/src/components/table/basic-table.scss deleted file mode 100644 index d5546784fc..0000000000 --- a/libs/components/editor-blocks/src/components/table/basic-table.scss +++ /dev/null @@ -1,6 +0,0 @@ -.v-basic-table-body { - overflow: hidden !important; - &:hover { - overflow: auto !important; - } -} diff --git a/libs/components/editor-blocks/src/components/table/basic-table.tsx b/libs/components/editor-blocks/src/components/table/basic-table.tsx index 04507ddebd..01f6a154ef 100644 --- a/libs/components/editor-blocks/src/components/table/basic-table.tsx +++ b/libs/components/editor-blocks/src/components/table/basic-table.tsx @@ -1,19 +1,19 @@ import { - useMemo, memo, + useCallback, + useLayoutEffect, + useMemo, useRef, useState, - useLayoutEffect, - useCallback, } from 'react'; -import { VariableSizeGrid, areEqual } from 'react-window'; import type { GridChildComponentProps, GridItemKeySelector, } from 'react-window'; +import { VariableSizeGrid } from 'react-window'; import style9 from 'style9'; -import './basic-table.scss'; + export interface TableColumn { dataKey: string; label: string; From aac9eee6e29c4c6e19a5d496eb438e332419c9a4 Mon Sep 17 00:00:00 2001 From: tzhangchi Date: Fri, 26 Aug 2022 21:53:45 +0800 Subject: [PATCH 54/81] feat(toc): add scroll active item --- .../src/pages/workspace/docs/components/toc/TOC.tsx | 7 ++++++- .../src/pages/workspace/docs/components/toc/toc.css | 13 +++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 apps/ligo-virgo/src/pages/workspace/docs/components/toc/toc.css diff --git a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx index 6e416a8b6b..877a17d480 100644 --- a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx +++ b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx @@ -16,8 +16,8 @@ import { getContentByAsyncBlocks, getPageTOC, } from './toc-util'; +import './toc.css'; import type { ListenerMap, TOCType } from './types'; - const StyledTOCItem = styled('a')<{ type?: string; isActive?: boolean }>( ({ type, isActive }) => { const common = { @@ -168,6 +168,11 @@ export const TOC = () => { const onClick = async (blockId?: string) => { setActiveBlockId(blockId); + const block = await editor.getBlockById(blockId); + block.dom.classList.add('toc-scroll-item'); + setTimeout(() => { + block.dom.classList.remove('toc-scroll-item'); + }, 1000); await editor.scrollManager.scrollIntoViewByBlockId(blockId); }; diff --git a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/toc.css b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/toc.css new file mode 100644 index 0000000000..44364012dc --- /dev/null +++ b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/toc.css @@ -0,0 +1,13 @@ +.toc-scroll-item { + animation: blinker 1s linear; + animation-delay: 1s; +} + +@keyframes blinker { + 0% { + background: rgba(152, 172, 189, 0.1); + } + 100% { + background: rgba(152, 172, 189, 0.1); + } +} From 6b6e70f02c0447bc625ae626f2bc2f48688b04c2 Mon Sep 17 00:00:00 2001 From: QiShaoXuan Date: Mon, 29 Aug 2022 11:26:01 +0800 Subject: [PATCH 55/81] fix: can not copy text other than block --- .../src/editor/clipboard/clipboardEventDispatcher.ts | 12 ++++++------ .../src/editor/clipboard/clipboardUtils.ts | 8 ++++++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/libs/components/editor-core/src/editor/clipboard/clipboardEventDispatcher.ts b/libs/components/editor-core/src/editor/clipboard/clipboardEventDispatcher.ts index a4f0c76044..675b1d603f 100644 --- a/libs/components/editor-core/src/editor/clipboard/clipboardEventDispatcher.ts +++ b/libs/components/editor-core/src/editor/clipboard/clipboardEventDispatcher.ts @@ -72,21 +72,21 @@ export class ClipboardEventDispatcher { ); } - private _copyHandler(e: ClipboardEvent) { - if (!this._utils.shouldHandlerContinue(e)) { + private async _copyHandler(e: ClipboardEvent) { + if (!(await this._utils.shouldHandlerContinue(e))) { return; } this._editor.getHooks().onCopy(e); } - private _cutHandler(e: ClipboardEvent) { - if (!this._utils.shouldHandlerContinue(e)) { + private async _cutHandler(e: ClipboardEvent) { + if (!(await this._utils.shouldHandlerContinue(e))) { return; } this._editor.getHooks().onCut(e); } - private _pasteHandler(e: ClipboardEvent) { - if (!this._utils.shouldHandlerContinue(e)) { + private async _pasteHandler(e: ClipboardEvent) { + if (!(await this._utils.shouldHandlerContinue(e))) { return; } diff --git a/libs/components/editor-core/src/editor/clipboard/clipboardUtils.ts b/libs/components/editor-core/src/editor/clipboard/clipboardUtils.ts index 09c532273c..2b93912d67 100644 --- a/libs/components/editor-core/src/editor/clipboard/clipboardUtils.ts +++ b/libs/components/editor-core/src/editor/clipboard/clipboardUtils.ts @@ -11,7 +11,7 @@ export class ClipboardUtils { this._editor = editor; } - shouldHandlerContinue(event: ClipboardEvent) { + async shouldHandlerContinue(event: ClipboardEvent) { const filterNodes = ['INPUT', 'SELECT', 'TEXTAREA']; if (event.defaultPrevented) { @@ -20,8 +20,12 @@ export class ClipboardUtils { if (filterNodes.includes((event.target as HTMLElement)?.tagName)) { return false; } + const selectInfo = await this._editor.selectionManager.getSelectInfo(); - return this._editor.selectionManager.currentSelectInfo.type !== 'None'; + return ( + selectInfo.blocks.length && + this._editor.selectionManager.currentSelectInfo.type !== 'None' + ); } async getClipInfoOfBlockById(blockId: string) { From c0a41074497e2282113054e50e27e42ba05c0ea6 Mon Sep 17 00:00:00 2001 From: tzhangchi Date: Mon, 29 Aug 2022 12:02:32 +0800 Subject: [PATCH 56/81] feat(toc): add animation to toc item --- .../workspace/docs/components/toc/TOC.tsx | 20 ++++++++++++++++--- .../workspace/docs/components/toc/toc.css | 13 ------------ 2 files changed, 17 insertions(+), 16 deletions(-) delete mode 100644 apps/ligo-virgo/src/pages/workspace/docs/components/toc/toc.css diff --git a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx index 877a17d480..3e9eb11d4a 100644 --- a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx +++ b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx @@ -1,3 +1,4 @@ +import { keyframes } from '@emotion/react'; import type { Virgo } from '@toeverything/components/editor-core'; import { styled } from '@toeverything/components/ui'; import { useCurrentEditors } from '@toeverything/datasource/state'; @@ -16,8 +17,21 @@ import { getContentByAsyncBlocks, getPageTOC, } from './toc-util'; -import './toc.css'; import type { ListenerMap, TOCType } from './types'; +// import './toc.css'; +const blinker = keyframes` +0% { + background: rgba(152, 172, 189, 0.1); +} +100% { + background: rgba(152, 172, 189, 0.1); +} +`; +const toScrollItem = styled('div')` + animation: ${blinker} 1s linear; + animation-delay: 1s; +`; +const toScrollItemClassName = toScrollItem.toString().substring(1); const StyledTOCItem = styled('a')<{ type?: string; isActive?: boolean }>( ({ type, isActive }) => { const common = { @@ -169,9 +183,9 @@ export const TOC = () => { const onClick = async (blockId?: string) => { setActiveBlockId(blockId); const block = await editor.getBlockById(blockId); - block.dom.classList.add('toc-scroll-item'); + block.dom.classList.add(toScrollItemClassName); setTimeout(() => { - block.dom.classList.remove('toc-scroll-item'); + block.dom.classList.remove(toScrollItemClassName); }, 1000); await editor.scrollManager.scrollIntoViewByBlockId(blockId); }; diff --git a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/toc.css b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/toc.css deleted file mode 100644 index 44364012dc..0000000000 --- a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/toc.css +++ /dev/null @@ -1,13 +0,0 @@ -.toc-scroll-item { - animation: blinker 1s linear; - animation-delay: 1s; -} - -@keyframes blinker { - 0% { - background: rgba(152, 172, 189, 0.1); - } - 100% { - background: rgba(152, 172, 189, 0.1); - } -} From fd4f99bd83a1c70846a88f67fd147419eeeb609b Mon Sep 17 00:00:00 2001 From: lawvs <18554747+lawvs@users.noreply.github.com> Date: Mon, 29 Aug 2022 13:30:56 +0800 Subject: [PATCH 57/81] refactor: use web animate api --- .../workspace/docs/components/toc/TOC.tsx | 42 ++++++++++--------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx index 3e9eb11d4a..0a5c442590 100644 --- a/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx +++ b/apps/ligo-virgo/src/pages/workspace/docs/components/toc/TOC.tsx @@ -1,6 +1,6 @@ -import { keyframes } from '@emotion/react'; import type { Virgo } from '@toeverything/components/editor-core'; import { styled } from '@toeverything/components/ui'; +import { Protocol } from '@toeverything/datasource/db-service'; import { useCurrentEditors } from '@toeverything/datasource/state'; import { createContext, @@ -18,20 +18,7 @@ import { getPageTOC, } from './toc-util'; import type { ListenerMap, TOCType } from './types'; -// import './toc.css'; -const blinker = keyframes` -0% { - background: rgba(152, 172, 189, 0.1); -} -100% { - background: rgba(152, 172, 189, 0.1); -} -`; -const toScrollItem = styled('div')` - animation: ${blinker} 1s linear; - animation-delay: 1s; -`; -const toScrollItemClassName = toScrollItem.toString().substring(1); + const StyledTOCItem = styled('a')<{ type?: string; isActive?: boolean }>( ({ type, isActive }) => { const common = { @@ -183,11 +170,28 @@ export const TOC = () => { const onClick = async (blockId?: string) => { setActiveBlockId(blockId); const block = await editor.getBlockById(blockId); - block.dom.classList.add(toScrollItemClassName); - setTimeout(() => { - block.dom.classList.remove(toScrollItemClassName); - }, 1000); await editor.scrollManager.scrollIntoViewByBlockId(blockId); + + if (!block || block.type === Protocol.Block.Type.group) { + // the group block has its own background + return; + } + // See https://developer.mozilla.org/en-US/docs/Web/API/Element/animate + block.dom?.animate( + [ + { + backgroundColor: 'rgba(152, 172, 189, 0.1)', + }, + { + backgroundColor: 'rgba(152, 172, 189, 0)', + }, + ], + { + delay: 500, + duration: 700, + easing: 'linear', + } + ); }; return ( From bd9796bd256046c66b762913b91be7afd29c6937 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Mon, 29 Aug 2022 15:52:07 +0800 Subject: [PATCH 58/81] update i18n for venus --- apps/venus/src/app/App.tsx | 4 ++-- apps/venus/src/app/i18n/resources/en.json | 2 ++ apps/venus/src/app/i18n/resources/zh.json | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/venus/src/app/App.tsx b/apps/venus/src/app/App.tsx index 8f791b7ec3..af2ac5cc6f 100644 --- a/apps/venus/src/app/App.tsx +++ b/apps/venus/src/app/App.tsx @@ -259,7 +259,7 @@ export function App() { }} size="lg" > - Blog + {t('Blog')} + +// const { t, i18n } = useTranslation(); +// const changeLanguage = (event: any) => { +// i18n.changeLanguage(event); +// }; diff --git a/libs/components/layout/src/i18n/resources/en.json b/libs/components/layout/src/i18n/resources/en.json new file mode 100644 index 0000000000..d12f3bc040 --- /dev/null +++ b/libs/components/layout/src/i18n/resources/en.json @@ -0,0 +1,30 @@ +{ + "translation": { + "Paper": "Paper", + "Edgeless": "Edgeless", + "Sync to Disk": "Sync to Disk", + "Share": "Share", + "warningTips": { + "isNotfsApiSupported": "Welcome to the AFFiNE demo. To begin saving changes you can SYNC DATA TO DISK with the latest version of Chromium based browser like Chrome/Edge", + "isNotLocalWorkspace": "Welcome to the AFFiNE demo. To begin saving changes you can SYNC TO DISK.", + "DoNotStore": "AFFiNE is under active development and the current version is UNSTABLE. Please DO NOT store information or data" + }, + "stetting": { + "Layout": { + "title": "Layout" + }, + "Comment": { + "title": "Comment" + }, + "Settings": { + "title": "Settings", + "Duplicate Page": "Duplicate Page", + "Copy Page Link": "Copy Page Link", + "Language": "Language", + "Clear Workspace": "Clear Workspace", + "Last edited by": "Last edited by ", + "Logout": "Logout" + } + } + } +} diff --git a/libs/components/layout/src/i18n/resources/zh.json b/libs/components/layout/src/i18n/resources/zh.json new file mode 100644 index 0000000000..90847e4610 --- /dev/null +++ b/libs/components/layout/src/i18n/resources/zh.json @@ -0,0 +1,30 @@ +{ + "translation": { + "Paper": "页面", + "Edgeless": "无边缘", + "Sync to Disk": "同步到磁盘", + "Share": "分享", + "warningTips": { + "isNotfsApiSupported": "欢迎来到AFFiNE 的演示界面。您可以使用最新版本的基于Chrome的浏览器(如Chrome/Edge)将数据同步到磁盘来进行保存", + "isNotLocalWorkspace": "欢迎来到AFFiNE 的演示界面,您可以同步到磁盘来进行保存操作。", + "DoNotStore": "AFFINE 正在积极开发中,当前版本不稳定。请不要存储信息或数据。" + }, + "stetting": { + "Layout": { + "title": "布局" + }, + "Comment": { + "title": "评论" + }, + "Settings": { + "title": "设置", + "Duplicate Page": "复制页面", + "Copy Page Link": "拷贝页面链接", + "Language": "当前语言", + "Clear Workspace": "清空工作区域", + "Last edited by": "最后编辑者为 ", + "Logout": "登出" + } + } + } +} diff --git a/libs/components/layout/src/index.ts b/libs/components/layout/src/index.ts index 69a6d3ff72..1aee5a687f 100644 --- a/libs/components/layout/src/index.ts +++ b/libs/components/layout/src/index.ts @@ -1,3 +1,4 @@ export * from './header'; +export * from './i18n'; export * from './settings-sidebar'; export * from './workspace-sidebar'; diff --git a/libs/components/layout/src/settings-sidebar/ContainerTabs/ContainerTabs.tsx b/libs/components/layout/src/settings-sidebar/ContainerTabs/ContainerTabs.tsx index dc5320c19d..9019063f30 100644 --- a/libs/components/layout/src/settings-sidebar/ContainerTabs/ContainerTabs.tsx +++ b/libs/components/layout/src/settings-sidebar/ContainerTabs/ContainerTabs.tsx @@ -5,6 +5,7 @@ import { } from '@toeverything/components/icons'; import { styled } from '@toeverything/components/ui'; import { cloneElement, useCallback, useMemo, type ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; import { Comments } from '../Comments'; import { useActiveComment } from '../Comments/use-comments'; import { LayoutSettings } from '../Layout'; @@ -67,7 +68,7 @@ export const ContainerTabs = () => { _defaultTabsKeys as unknown as string[], 'settings' ); - + const { t } = useTranslation(); return ( <> @@ -75,7 +76,7 @@ export const ContainerTabs = () => { const { type, text, icon } = tab; return ( { diff --git a/libs/components/layout/src/settings-sidebar/Settings/SettingsList.tsx b/libs/components/layout/src/settings-sidebar/Settings/SettingsList.tsx index 57e4a2fbf0..a0d93aae23 100644 --- a/libs/components/layout/src/settings-sidebar/Settings/SettingsList.tsx +++ b/libs/components/layout/src/settings-sidebar/Settings/SettingsList.tsx @@ -1,8 +1,21 @@ -import { Divider, ListItem, styled, Switch } from '@toeverything/components/ui'; +import { + Divider, + ListItem, + Option, + Select, + styled, + Switch, +} from '@toeverything/components/ui'; +import { useTranslation } from 'react-i18next'; +import { options } from '../../i18n'; import { useSettings } from './use-settings'; export const SettingsList = () => { const settings = useSettings(); + const { t, i18n } = useTranslation(); + const changeLanguage = (event: any) => { + i18n.changeLanguage(event); + }; return ( @@ -32,7 +45,24 @@ export const SettingsList = () => { return ( item.onClick()}> - {item.name} + {t(`stetting.Settings.${item.name}`)} + {item.name === 'Language' ? ( +
+ +
+ ) : null}
); })} diff --git a/libs/components/layout/src/settings-sidebar/Settings/footer/LastModified.tsx b/libs/components/layout/src/settings-sidebar/Settings/footer/LastModified.tsx index 1bcf8a83be..2d37a73717 100644 --- a/libs/components/layout/src/settings-sidebar/Settings/footer/LastModified.tsx +++ b/libs/components/layout/src/settings-sidebar/Settings/footer/LastModified.tsx @@ -1,6 +1,7 @@ import { styled, Typography } from '@toeverything/components/ui'; import { useUserAndSpaces } from '@toeverything/datasource/state'; import format from 'date-fns/format'; +import { useTranslation } from 'react-i18next'; import { usePageLastUpdated, useWorkspaceAndPageId } from '../util'; export const LastModified = () => { @@ -9,11 +10,12 @@ export const LastModified = () => { const { workspaceId, pageId } = useWorkspaceAndPageId(); const lastModified = usePageLastUpdated({ workspaceId, pageId }); const formatLastModified = format(lastModified, 'MM/dd/yyyy hh:mm'); + const { t } = useTranslation(); return (
- Last edited by + {t('stetting.Settings.Last edited by')} {username}
diff --git a/libs/components/layout/src/settings-sidebar/Settings/footer/Logout.tsx b/libs/components/layout/src/settings-sidebar/Settings/footer/Logout.tsx index a168f25b6d..1960a74626 100644 --- a/libs/components/layout/src/settings-sidebar/Settings/footer/Logout.tsx +++ b/libs/components/layout/src/settings-sidebar/Settings/footer/Logout.tsx @@ -2,6 +2,7 @@ import { MoveToIcon } from '@toeverything/components/icons'; import { ListItem, styled, Typography } from '@toeverything/components/ui'; import { LOGOUT_COOKIES, LOGOUT_LOCAL_STORAGE } from '@toeverything/utils'; import { getAuth, signOut } from 'firebase/auth'; +import { useTranslation } from 'react-i18next'; const logout = () => { LOGOUT_LOCAL_STORAGE.forEach(name => localStorage.removeItem(name)); @@ -16,10 +17,13 @@ const logout = () => { }; export const Logout = () => { + const { t } = useTranslation(); return ( - Logout + + {t('stetting.Settings.Logout')} + ); }; diff --git a/libs/components/layout/src/settings-sidebar/Settings/use-settings.ts b/libs/components/layout/src/settings-sidebar/Settings/use-settings.ts index 0dd9413c89..fdd1a1fb53 100644 --- a/libs/components/layout/src/settings-sidebar/Settings/use-settings.ts +++ b/libs/components/layout/src/settings-sidebar/Settings/use-settings.ts @@ -97,6 +97,13 @@ export const useSettings = (): SettingItem[] => { message.success('Page link copied successfully'); }, }, + { + type: 'button', + name: 'Language', + onClick: () => { + console.log('Language is change'); + }, + }, { type: 'separator', }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5d023ebe9e..5ed408b554 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -196,10 +196,14 @@ importers: specifiers: '@mui/icons-material': ^5.8.4 firebase: ^9.9.3 + i18next: ^21.9.1 mini-css-extract-plugin: ^2.6.1 + react-i18next: ^11.18.4 webpack: ^5.74.0 dependencies: '@mui/icons-material': 5.8.4 + i18next: 21.9.1 + react-i18next: 11.18.4_i18next@21.9.1 devDependencies: firebase: 9.9.3 mini-css-extract-plugin: 2.6.1_webpack@5.74.0 @@ -501,7 +505,9 @@ importers: '@types/turndown': ^5.0.1 clsx: ^1.2.1 date-fns: ^2.29.2 + i18next: ^21.9.1 jotai: ^1.8.1 + react-i18next: ^11.18.4 tinycolor2: ^1.4.2 turndown: 7.1.1 dependencies: @@ -513,7 +519,9 @@ importers: '@mui/icons-material': 5.8.4 clsx: 1.2.1 date-fns: 2.29.2 + i18next: 21.9.1 jotai: 1.8.1 + react-i18next: 11.18.4_i18next@21.9.1 tinycolor2: 1.4.2 turndown: 7.1.1 devDependencies: @@ -7383,10 +7391,8 @@ packages: indent-string: 4.0.0 dev: true - /ajv-formats/2.1.1_ajv@8.11.0: + /ajv-formats/2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 peerDependenciesMeta: ajv: optional: true @@ -16953,7 +16959,7 @@ packages: dependencies: '@types/json-schema': 7.0.11 ajv: 8.11.0 - ajv-formats: 2.1.1_ajv@8.11.0 + ajv-formats: 2.1.1 ajv-keywords: 5.1.0_ajv@8.11.0 dev: true From 0baf02e80f0a88c616f03d423d9d57a5481b96a0 Mon Sep 17 00:00:00 2001 From: DarkSky <25152247+darkskygit@users.noreply.github.com> Date: Tue, 30 Aug 2022 00:28:57 +0800 Subject: [PATCH 62/81] Update libs/components/layout/src/i18n/resources/en.json Co-authored-by: Whitewater --- libs/components/layout/src/i18n/resources/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/components/layout/src/i18n/resources/en.json b/libs/components/layout/src/i18n/resources/en.json index d12f3bc040..8706296bba 100644 --- a/libs/components/layout/src/i18n/resources/en.json +++ b/libs/components/layout/src/i18n/resources/en.json @@ -9,7 +9,7 @@ "isNotLocalWorkspace": "Welcome to the AFFiNE demo. To begin saving changes you can SYNC TO DISK.", "DoNotStore": "AFFiNE is under active development and the current version is UNSTABLE. Please DO NOT store information or data" }, - "stetting": { + "setting": { "Layout": { "title": "Layout" }, From 0bda0feb8322aaf9e863cf541acb295a1861844d Mon Sep 17 00:00:00 2001 From: DarkSky <25152247+darkskygit@users.noreply.github.com> Date: Tue, 30 Aug 2022 00:29:28 +0800 Subject: [PATCH 63/81] Update libs/components/layout/src/i18n/index.ts Co-authored-by: Whitewater --- libs/components/layout/src/i18n/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/components/layout/src/i18n/index.ts b/libs/components/layout/src/i18n/index.ts index 6e7cf7521b..dae0c24f3c 100644 --- a/libs/components/layout/src/i18n/index.ts +++ b/libs/components/layout/src/i18n/index.ts @@ -20,7 +20,7 @@ i18next.use(initReactI18next).init({ export const options = [ { value: 'en', text: 'English' }, { value: 'zh', text: '简体中文' }, -]; +] as const; export { i18next }; From e6569410844e970a77919546ab448325a861df74 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Tue, 30 Aug 2022 10:32:52 +0800 Subject: [PATCH 64/81] update i18n --- .../header/EditorBoardSwitcher/Switcher.tsx | 4 +- libs/components/layout/src/i18n/index.ts | 6 ++- .../layout/src/i18n/resources/en.json | 46 +++++++++---------- .../layout/src/i18n/resources/zh.json | 46 +++++++++---------- .../ContainerTabs/ContainerTabs.tsx | 10 ++-- .../Settings/SettingsList.tsx | 6 +-- .../settings-sidebar/Settings/use-settings.ts | 14 +++--- 7 files changed, 64 insertions(+), 68 deletions(-) diff --git a/libs/components/layout/src/header/EditorBoardSwitcher/Switcher.tsx b/libs/components/layout/src/header/EditorBoardSwitcher/Switcher.tsx index d1b5cc2acc..636dfdc905 100644 --- a/libs/components/layout/src/header/EditorBoardSwitcher/Switcher.tsx +++ b/libs/components/layout/src/header/EditorBoardSwitcher/Switcher.tsx @@ -38,7 +38,7 @@ export const Switcher = () => { active={pageViewMode === DocMode.doc} onClick={() => switchToPageView(DocMode.doc)} > - {t('Paper')} + Paper { active={pageViewMode === DocMode.board} onClick={() => switchToPageView(DocMode.board)} > - {t('Edgeless')} + Edgeless ); diff --git a/libs/components/layout/src/i18n/index.ts b/libs/components/layout/src/i18n/index.ts index dae0c24f3c..efb3848125 100644 --- a/libs/components/layout/src/i18n/index.ts +++ b/libs/components/layout/src/i18n/index.ts @@ -4,8 +4,10 @@ import en_US from './resources/en.json'; import zh_CN from './resources/zh.json'; const resources = { - en: en_US, - zh: zh_CN, + translation: { + en: en_US, + zh: zh_CN, + }, } as const; i18next.use(initReactI18next).init({ diff --git a/libs/components/layout/src/i18n/resources/en.json b/libs/components/layout/src/i18n/resources/en.json index 8706296bba..ef13d02e86 100644 --- a/libs/components/layout/src/i18n/resources/en.json +++ b/libs/components/layout/src/i18n/resources/en.json @@ -1,30 +1,26 @@ { - "translation": { - "Paper": "Paper", - "Edgeless": "Edgeless", - "Sync to Disk": "Sync to Disk", - "Share": "Share", - "warningTips": { - "isNotfsApiSupported": "Welcome to the AFFiNE demo. To begin saving changes you can SYNC DATA TO DISK with the latest version of Chromium based browser like Chrome/Edge", - "isNotLocalWorkspace": "Welcome to the AFFiNE demo. To begin saving changes you can SYNC TO DISK.", - "DoNotStore": "AFFiNE is under active development and the current version is UNSTABLE. Please DO NOT store information or data" + "Sync to Disk": "Sync to Disk", + "Share": "Share", + "WarningTips": { + "IsNotfsApiSupported": "Welcome to the AFFiNE demo. To begin saving changes you can SYNC DATA TO DISK with the latest version of Chromium based browser like Chrome/Edge", + "IsNotLocalWorkspace": "Welcome to the AFFiNE demo. To begin saving changes you can SYNC TO DISK.", + "DoNotStore": "AFFiNE is under active development and the current version is UNSTABLE. Please DO NOT store information or data" + }, + "Setting": { + "Layout": { + "Title": "Layout" }, - "setting": { - "Layout": { - "title": "Layout" - }, - "Comment": { - "title": "Comment" - }, - "Settings": { - "title": "Settings", - "Duplicate Page": "Duplicate Page", - "Copy Page Link": "Copy Page Link", - "Language": "Language", - "Clear Workspace": "Clear Workspace", - "Last edited by": "Last edited by ", - "Logout": "Logout" - } + "Comment": { + "Title": "Comment" + }, + "Settings": { + "Title": "Settings", + "Duplicate Page": "Duplicate Page", + "Copy Page Link": "Copy Page Link", + "Language": "Language", + "Clear Workspace": "Clear Workspace", + "Last edited by": "Last edited by ", + "Logout": "Logout" } } } diff --git a/libs/components/layout/src/i18n/resources/zh.json b/libs/components/layout/src/i18n/resources/zh.json index 90847e4610..51a0cfcd00 100644 --- a/libs/components/layout/src/i18n/resources/zh.json +++ b/libs/components/layout/src/i18n/resources/zh.json @@ -1,30 +1,26 @@ { - "translation": { - "Paper": "页面", - "Edgeless": "无边缘", - "Sync to Disk": "同步到磁盘", - "Share": "分享", - "warningTips": { - "isNotfsApiSupported": "欢迎来到AFFiNE 的演示界面。您可以使用最新版本的基于Chrome的浏览器(如Chrome/Edge)将数据同步到磁盘来进行保存", - "isNotLocalWorkspace": "欢迎来到AFFiNE 的演示界面,您可以同步到磁盘来进行保存操作。", - "DoNotStore": "AFFINE 正在积极开发中,当前版本不稳定。请不要存储信息或数据。" + "Sync to Disk": "同步到磁盘", + "Share": "分享", + "WarningTips": { + "IsNotfsApiSupported": "欢迎来到AFFiNE 的演示界面。您可以使用最新版本的基于Chrome的浏览器(如Chrome/Edge)将数据同步到磁盘来进行保存", + "IsNotLocalWorkspace": "欢迎来到AFFiNE 的演示界面,您可以同步到磁盘来进行保存操作。", + "DoNotStore": "AFFINE 正在积极开发中,当前版本不稳定。请不要存储信息或数据。" + }, + "Setting": { + "Layout": { + "Title": "布局" }, - "stetting": { - "Layout": { - "title": "布局" - }, - "Comment": { - "title": "评论" - }, - "Settings": { - "title": "设置", - "Duplicate Page": "复制页面", - "Copy Page Link": "拷贝页面链接", - "Language": "当前语言", - "Clear Workspace": "清空工作区域", - "Last edited by": "最后编辑者为 ", - "Logout": "登出" - } + "Comment": { + "Title": "评论" + }, + "Settings": { + "Title": "设置", + "Duplicate Page": "复制页面", + "Copy Page Link": "拷贝页面链接", + "Language": "当前语言", + "Clear Workspace": "清空工作区域", + "Last edited by": "最后编辑者为 ", + "Logout": "退出登录" } } } diff --git a/libs/components/layout/src/settings-sidebar/ContainerTabs/ContainerTabs.tsx b/libs/components/layout/src/settings-sidebar/ContainerTabs/ContainerTabs.tsx index 9019063f30..9e29edaa2d 100644 --- a/libs/components/layout/src/settings-sidebar/ContainerTabs/ContainerTabs.tsx +++ b/libs/components/layout/src/settings-sidebar/ContainerTabs/ContainerTabs.tsx @@ -17,12 +17,13 @@ const _defaultTabsKeys = ['layout', 'comment', 'settings'] as const; export const ContainerTabs = () => { const { activeCommentId, resolveComment } = useActiveComment(); + const { t } = useTranslation(); const getSettingsTabsData = useCallback((): SettingsTabItemType[] => { return [ { type: 'layout', - text: 'Layout', + text: t('Setting.Layout'), icon: ( @@ -32,7 +33,7 @@ export const ContainerTabs = () => { }, { type: 'comment', - text: 'Comment', + text: t('Setting.Comment'), icon: ( @@ -49,7 +50,7 @@ export const ContainerTabs = () => { }, { type: 'settings', - text: 'Settings', + text: t('Setting.Settings'), icon: ( @@ -68,7 +69,6 @@ export const ContainerTabs = () => { _defaultTabsKeys as unknown as string[], 'settings' ); - const { t } = useTranslation(); return ( <> @@ -76,7 +76,7 @@ export const ContainerTabs = () => { const { type, text, icon } = tab; return ( { diff --git a/libs/components/layout/src/settings-sidebar/Settings/SettingsList.tsx b/libs/components/layout/src/settings-sidebar/Settings/SettingsList.tsx index a0d93aae23..47384cf99f 100644 --- a/libs/components/layout/src/settings-sidebar/Settings/SettingsList.tsx +++ b/libs/components/layout/src/settings-sidebar/Settings/SettingsList.tsx @@ -12,8 +12,8 @@ import { useSettings } from './use-settings'; export const SettingsList = () => { const settings = useSettings(); - const { t, i18n } = useTranslation(); - const changeLanguage = (event: any) => { + const { i18n } = useTranslation(); + const changeLanguage = event => { i18n.changeLanguage(event); }; @@ -45,7 +45,7 @@ export const SettingsList = () => { return ( item.onClick()}> - {t(`stetting.Settings.${item.name}`)} + {item.name} {item.name === 'Language' ? (
+ ) : item.name === '当前语言' ? ( +
+ +
) : null}
); diff --git a/libs/components/layout/src/settings-sidebar/Settings/footer/LastModified.tsx b/libs/components/layout/src/settings-sidebar/Settings/footer/LastModified.tsx index 2d37a73717..853912780b 100644 --- a/libs/components/layout/src/settings-sidebar/Settings/footer/LastModified.tsx +++ b/libs/components/layout/src/settings-sidebar/Settings/footer/LastModified.tsx @@ -15,7 +15,7 @@ export const LastModified = () => {
- {t('stetting.Settings.Last edited by')} + {t('Last edited by')} {username}
diff --git a/libs/components/layout/src/settings-sidebar/Settings/footer/Logout.tsx b/libs/components/layout/src/settings-sidebar/Settings/footer/Logout.tsx index 1960a74626..3dfc7dffb9 100644 --- a/libs/components/layout/src/settings-sidebar/Settings/footer/Logout.tsx +++ b/libs/components/layout/src/settings-sidebar/Settings/footer/Logout.tsx @@ -21,9 +21,7 @@ export const Logout = () => { return ( - - {t('stetting.Settings.Logout')} - + {t('Logout')} ); }; diff --git a/libs/components/layout/src/settings-sidebar/Settings/use-settings.ts b/libs/components/layout/src/settings-sidebar/Settings/use-settings.ts index eb7d2d1454..8b08312e94 100644 --- a/libs/components/layout/src/settings-sidebar/Settings/use-settings.ts +++ b/libs/components/layout/src/settings-sidebar/Settings/use-settings.ts @@ -82,7 +82,7 @@ export const useSettings = (): SettingItem[] => { // }, { type: 'button', - name: t('Setting.Settings.Duplicate Page'), + name: t('Duplicate Page'), onClick: async () => { const newPageInfo = await duplicatePage({ workspaceId, @@ -93,7 +93,7 @@ export const useSettings = (): SettingItem[] => { }, { type: 'button', - name: t('Setting.Settings.Copy Page Link'), + name: t('Copy Page Link'), onClick: () => { copyToClipboard(window.location.href); message.success('Page link copied successfully'); @@ -101,7 +101,7 @@ export const useSettings = (): SettingItem[] => { }, { type: 'button', - name: t('Setting.Settings.Language'), + name: t('Language'), onClick: () => { //Do noting }, @@ -150,7 +150,7 @@ export const useSettings = (): SettingItem[] => { }, { type: 'button', - name: t('Setting.Settings.Clear Workspace'), + name: t('Clear Workspace'), onClick: () => clearWorkspace(workspaceId), flag: 'booleanClearWorkspace', }, From 6b373642e786f0dd861e43d2ea8c7caef6c36fbc Mon Sep 17 00:00:00 2001 From: JimmFly Date: Tue, 30 Aug 2022 11:16:59 +0800 Subject: [PATCH 66/81] update --- libs/components/layout/src/i18n/index.ts | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/libs/components/layout/src/i18n/index.ts b/libs/components/layout/src/i18n/index.ts index 174786cb26..866edee933 100644 --- a/libs/components/layout/src/i18n/index.ts +++ b/libs/components/layout/src/i18n/index.ts @@ -24,18 +24,3 @@ export const options = [ ] as const; export { i18next }; - -// import { useTranslation } from 'react-i18next'; -// import { options } from './i18n'; -// - -// const { t, i18n } = useTranslation(); -// const changeLanguage = (event: any) => { -// i18n.changeLanguage(event); -// }; From 838113941e2ec8785296baa0c480d62c3b5b5965 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Tue, 30 Aug 2022 12:42:04 +0800 Subject: [PATCH 67/81] update i18n --- libs/components/layout/src/i18n/index.ts | 14 +++++++++++ .../layout/src/i18n/resources/en.json | 9 +++++-- .../layout/src/i18n/resources/zh.json | 9 +++++-- .../ContainerTabs/ContainerTabs.tsx | 10 ++++---- .../Settings/SettingsList.tsx | 22 +++-------------- .../Settings/footer/LastModified.tsx | 3 +-- .../settings-sidebar/Settings/use-settings.ts | 24 ++++++++++++++----- 7 files changed, 55 insertions(+), 36 deletions(-) diff --git a/libs/components/layout/src/i18n/index.ts b/libs/components/layout/src/i18n/index.ts index 866edee933..20f4e2a3ce 100644 --- a/libs/components/layout/src/i18n/index.ts +++ b/libs/components/layout/src/i18n/index.ts @@ -3,6 +3,20 @@ import { initReactI18next } from 'react-i18next'; import en_US from './resources/en.json'; import zh_CN from './resources/zh.json'; +// See https://react.i18next.com/latest/typescript +declare module 'react-i18next' { + // and extend them! + interface CustomTypeOptions { + // custom namespace type if you changed it + defaultNS: 'ns1'; + // custom resources type + resources: { + en: typeof en_US.translation; + zh: typeof zh_CN.translation; + }; + } +} + const resources = { en: en_US, zh: zh_CN, diff --git a/libs/components/layout/src/i18n/resources/en.json b/libs/components/layout/src/i18n/resources/en.json index 0a3efcdc9a..4c6a714e9b 100644 --- a/libs/components/layout/src/i18n/resources/en.json +++ b/libs/components/layout/src/i18n/resources/en.json @@ -10,12 +10,17 @@ "Layout": "Layout", "Comment": "Comment", "Settings": "Settings", - + "ComingSoon": "Layout Settings Coming Soon...", "Duplicate Page": "Duplicate Page", "Copy Page Link": "Copy Page Link", "Language": "Language", "Clear Workspace": "Clear Workspace", - "Last edited by": "Last edited by ", + "Export As Markdown": "Export As Markdown", + "Export As HTML": "Export As HTML", + "Export As PDF (Unsupported)": "Export As PDF (Unsupported)", + "Import Workspace": "Import Workspace", + "Export Workspace": "Export Workspace", + "Last edited by": "Last edited by {{name}}", "Logout": "Logout" } } diff --git a/libs/components/layout/src/i18n/resources/zh.json b/libs/components/layout/src/i18n/resources/zh.json index d8fcedc53f..da86cef6b2 100644 --- a/libs/components/layout/src/i18n/resources/zh.json +++ b/libs/components/layout/src/i18n/resources/zh.json @@ -7,7 +7,7 @@ "IsNotLocalWorkspace": "欢迎来到AFFiNE 的演示界面,您可以同步到磁盘来进行保存操作。", "DoNotStore": "AFFINE 正在积极开发中,当前版本不稳定。请不要存储信息或数据。" }, - + "ComingSoon": "布局设置即将到来", "Layout": "布局", "Comment": "评论", "Settings": "设置", @@ -15,7 +15,12 @@ "Copy Page Link": "复制页面链接", "Language": "当前语言", "Clear Workspace": "清空工作区域", - "Last edited by": "最后编辑者为 ", + "Export As Markdown": "导出 markdown", + "Export As HTML": "导出 HTML", + "Export As PDF (Unsupported)": "导出 PDF (暂不支持)", + "Import Workspace": "导入 Workspace", + "Export Workspace": "导出 Workspace", + "Last edited by": "最后编辑者为 {{name}}", "Logout": "退出登录" } } diff --git a/libs/components/layout/src/settings-sidebar/ContainerTabs/ContainerTabs.tsx b/libs/components/layout/src/settings-sidebar/ContainerTabs/ContainerTabs.tsx index a479e7f372..4503482d05 100644 --- a/libs/components/layout/src/settings-sidebar/ContainerTabs/ContainerTabs.tsx +++ b/libs/components/layout/src/settings-sidebar/ContainerTabs/ContainerTabs.tsx @@ -23,7 +23,7 @@ export const ContainerTabs = () => { return [ { type: 'layout', - text: 'Layout', + text: t('Layout'), icon: ( @@ -33,7 +33,7 @@ export const ContainerTabs = () => { }, { type: 'comment', - text: 'Comment', + text: t('Comment'), icon: ( @@ -50,7 +50,7 @@ export const ContainerTabs = () => { }, { type: 'settings', - text: 'Settings', + text: t('Settings'), icon: ( @@ -59,7 +59,7 @@ export const ContainerTabs = () => { panel: , }, ]; - }, [activeCommentId, resolveComment]); + }, [activeCommentId, resolveComment, t]); const settingsTabsData = useMemo(() => { return getSettingsTabsData(); @@ -76,7 +76,7 @@ export const ContainerTabs = () => { const { type, text, icon } = tab; return ( { diff --git a/libs/components/layout/src/settings-sidebar/Settings/SettingsList.tsx b/libs/components/layout/src/settings-sidebar/Settings/SettingsList.tsx index 90ecf60cc6..d1b633b754 100644 --- a/libs/components/layout/src/settings-sidebar/Settings/SettingsList.tsx +++ b/libs/components/layout/src/settings-sidebar/Settings/SettingsList.tsx @@ -28,7 +28,7 @@ export const SettingsList = () => { if (type === 'switch') { return ( { item.onChange(!item.value); }} @@ -44,9 +44,9 @@ export const SettingsList = () => { } return ( - item.onClick()}> + item.onClick()}> {item.name} - {item.name === 'Language' ? ( + {item.key === 'Language' ? (
- ) : item.name === '当前语言' ? ( -
- -
) : null}
); diff --git a/libs/components/layout/src/settings-sidebar/Settings/footer/LastModified.tsx b/libs/components/layout/src/settings-sidebar/Settings/footer/LastModified.tsx index 853912780b..0c0b5c2efd 100644 --- a/libs/components/layout/src/settings-sidebar/Settings/footer/LastModified.tsx +++ b/libs/components/layout/src/settings-sidebar/Settings/footer/LastModified.tsx @@ -15,8 +15,7 @@ export const LastModified = () => {
- {t('Last edited by')} - {username} + {t('Last edited by', { name: username })}
diff --git a/libs/components/layout/src/settings-sidebar/Settings/use-settings.ts b/libs/components/layout/src/settings-sidebar/Settings/use-settings.ts index 8b08312e94..dfd8918c49 100644 --- a/libs/components/layout/src/settings-sidebar/Settings/use-settings.ts +++ b/libs/components/layout/src/settings-sidebar/Settings/use-settings.ts @@ -17,6 +17,7 @@ import { interface BaseSettingItem { flag?: keyof SettingFlags; + key: string; } interface SwitchItem extends BaseSettingItem { @@ -83,6 +84,7 @@ export const useSettings = (): SettingItem[] => { { type: 'button', name: t('Duplicate Page'), + key: 'Duplicate Page', onClick: async () => { const newPageInfo = await duplicatePage({ workspaceId, @@ -94,6 +96,7 @@ export const useSettings = (): SettingItem[] => { { type: 'button', name: t('Copy Page Link'), + key: 'Copy Page Link', onClick: () => { copyToClipboard(window.location.href); message.success('Page link copied successfully'); @@ -102,16 +105,19 @@ export const useSettings = (): SettingItem[] => { { type: 'button', name: t('Language'), + key: 'Language', onClick: () => { - //Do noting + // Do noting }, }, { type: 'separator', + key: 'separator1', }, { type: 'button', - name: 'Export As Markdown', + name: t('Export As Markdown'), + key: 'Export As Markdown', onClick: async () => { const title = await getPageTitle({ workspaceId, pageId }); exportMarkdown({ workspaceId, rootBlockId: pageId, title }); @@ -120,7 +126,8 @@ export const useSettings = (): SettingItem[] => { }, { type: 'button', - name: 'Export As HTML', + name: t('Export As HTML'), + key: 'Export As HTML', onClick: async () => { const title = await getPageTitle({ workspaceId, pageId }); exportHtml({ workspaceId, rootBlockId: pageId, title }); @@ -129,28 +136,33 @@ export const useSettings = (): SettingItem[] => { }, { type: 'button', - name: 'Export As PDF (Unsupported)', + name: t('Export As PDF (Unsupported)'), + key: 'Export As PDF (Unsupported)', onClick: () => console.log('Export As PDF'), flag: 'booleanExportPdf', }, { type: 'separator', + key: 'separator2', }, { type: 'button', - name: 'Import Workspace', + name: t('Import Workspace'), + key: 'Import Workspace', onClick: () => importWorkspace(workspaceId), flag: 'booleanImportWorkspace', }, { type: 'button', - name: 'Export Workspace', + name: t('Export Workspace'), + key: 'Export Workspace', onClick: () => exportWorkspace(), flag: 'booleanExportWorkspace', }, { type: 'button', name: t('Clear Workspace'), + key: 'Clear Workspace', onClick: () => clearWorkspace(workspaceId), flag: 'booleanClearWorkspace', }, From 5e767e187f220e16a316e8d535ead6ac2eecc899 Mon Sep 17 00:00:00 2001 From: JimmFly <102217452+JimmFly@users.noreply.github.com> Date: Tue, 30 Aug 2022 14:58:04 +0800 Subject: [PATCH 68/81] Update libs/components/layout/src/settings-sidebar/Settings/SettingsList.tsx Co-authored-by: Whitewater --- .../layout/src/settings-sidebar/Settings/SettingsList.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/components/layout/src/settings-sidebar/Settings/SettingsList.tsx b/libs/components/layout/src/settings-sidebar/Settings/SettingsList.tsx index d1b633b754..18e7d20d3f 100644 --- a/libs/components/layout/src/settings-sidebar/Settings/SettingsList.tsx +++ b/libs/components/layout/src/settings-sidebar/Settings/SettingsList.tsx @@ -49,7 +49,7 @@ export const SettingsList = () => { {item.key === 'Language' ? (
- {options.map(option => ( - - ))} - - - + - - - - - - - - - - - + ); }; + +export const AFFiNEHeader = () => { + const matches = useMediaQuery('(max-width: 1024px)'); + const navigate = useNavigate(); + const { i18n } = useTranslation(); + + const changeLanguage = (event: any) => { + i18n.changeLanguage(event); + }; + return ( + + + + + + + + + + + + ); +}; From 93e5eacd566c9f54b22869169c450e7e6f69d878 Mon Sep 17 00:00:00 2001 From: tzhangchi Date: Thu, 1 Sep 2022 15:55:15 +0800 Subject: [PATCH 72/81] feat(venus): add responsive --- apps/venus/src/app/Common.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/venus/src/app/Common.tsx b/apps/venus/src/app/Common.tsx index 7adb206a56..87347f4fa1 100644 --- a/apps/venus/src/app/Common.tsx +++ b/apps/venus/src/app/Common.tsx @@ -350,6 +350,7 @@ export const AFFiNEHeader = () => { const changeLanguage = (event: any) => { i18n.changeLanguage(event); }; + const matchesIPAD = useMediaQuery('(max-width: 768px)'); return ( { > About Us - {options.map(option => (