From ee705b2c341d4c31f891670dca3fd32700edce6a Mon Sep 17 00:00:00 2001 From: Jade Ellis Date: Wed, 6 Mar 2024 20:46:15 +0000 Subject: [PATCH] Demo editor! --- packages/loro-demo/.gitignore | 12 + packages/loro-demo/.npmrc | 1 + packages/loro-demo/Dockerfile | 29 + packages/loro-demo/package.json | 44 ++ packages/loro-demo/src/app.d.ts | 13 + packages/loro-demo/src/app.html | 12 + packages/loro-demo/src/lib/Hero.svelte | 60 ++ packages/loro-demo/src/lib/LiveEditor.svelte | 108 +++ packages/loro-demo/src/lib/logo.svg | 387 ++++++++++ packages/loro-demo/src/lib/menu/Menu.svelte | 46 ++ .../loro-demo/src/lib/menu/MenuIcon.svelte | 8 + packages/loro-demo/src/lib/menu/index.ts | 67 ++ .../src/lib/prosemirror/Editor.svelte | 216 ++++++ .../loro-demo/src/lib/prosemirror/editor.ts | 100 +++ .../loro-demo/src/lib/prosemirror/keymap.ts | 111 +++ .../loro-demo/src/lib/prosemirror/metadata.ts | 14 + .../loro-demo/src/lib/prosemirror/schema.ts | 24 + packages/loro-demo/src/lib/styles.css | 80 ++ packages/loro-demo/src/routes/+layout.svelte | 8 + packages/loro-demo/src/routes/+page.svelte | 9 + packages/loro-demo/static/robots.txt | 3 + packages/loro-demo/svelte.config.js | 16 + packages/loro-demo/tsconfig.json | 18 + packages/loro-demo/vite.config.ts | 9 + pnpm-lock.yaml | 720 +++++++++++++++--- 25 files changed, 1988 insertions(+), 127 deletions(-) create mode 100644 packages/loro-demo/.gitignore create mode 100644 packages/loro-demo/.npmrc create mode 100644 packages/loro-demo/Dockerfile create mode 100644 packages/loro-demo/package.json create mode 100644 packages/loro-demo/src/app.d.ts create mode 100644 packages/loro-demo/src/app.html create mode 100644 packages/loro-demo/src/lib/Hero.svelte create mode 100644 packages/loro-demo/src/lib/LiveEditor.svelte create mode 100644 packages/loro-demo/src/lib/logo.svg create mode 100644 packages/loro-demo/src/lib/menu/Menu.svelte create mode 100644 packages/loro-demo/src/lib/menu/MenuIcon.svelte create mode 100644 packages/loro-demo/src/lib/menu/index.ts create mode 100644 packages/loro-demo/src/lib/prosemirror/Editor.svelte create mode 100644 packages/loro-demo/src/lib/prosemirror/editor.ts create mode 100644 packages/loro-demo/src/lib/prosemirror/keymap.ts create mode 100644 packages/loro-demo/src/lib/prosemirror/metadata.ts create mode 100644 packages/loro-demo/src/lib/prosemirror/schema.ts create mode 100644 packages/loro-demo/src/lib/styles.css create mode 100644 packages/loro-demo/src/routes/+layout.svelte create mode 100644 packages/loro-demo/src/routes/+page.svelte create mode 100644 packages/loro-demo/static/robots.txt create mode 100644 packages/loro-demo/svelte.config.js create mode 100644 packages/loro-demo/tsconfig.json create mode 100644 packages/loro-demo/vite.config.ts diff --git a/packages/loro-demo/.gitignore b/packages/loro-demo/.gitignore new file mode 100644 index 00000000..8f6c617e --- /dev/null +++ b/packages/loro-demo/.gitignore @@ -0,0 +1,12 @@ +.DS_Store +node_modules +/build +/.svelte-kit +/package +.env +.env.* +!.env.example +.vercel +.output +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/packages/loro-demo/.npmrc b/packages/loro-demo/.npmrc new file mode 100644 index 00000000..b6f27f13 --- /dev/null +++ b/packages/loro-demo/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/packages/loro-demo/Dockerfile b/packages/loro-demo/Dockerfile new file mode 100644 index 00000000..1c163d05 --- /dev/null +++ b/packages/loro-demo/Dockerfile @@ -0,0 +1,29 @@ +# build the sapper app +FROM node AS base +ENV PNPM_HOME="/pnpm" +ENV PATH="$PNPM_HOME:$PATH" +RUN corepack enable +COPY ./../.. /app/ +WORKDIR /app + +# FROM base AS prod-deps +# RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-lockfile + +FROM base AS build +ENV CI=1 +RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile +# RUN cd packages/website; --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile + +RUN cd packages/website; pnpm run build + + +# copy node_modules/ and other build files over +FROM node:alpine + +WORKDIR /app + +COPY --from=build /app/packages/website/build . +COPY --from=build /app/packages/website/package.json ./package.json + +EXPOSE 3000 +CMD ["node", "."] \ No newline at end of file diff --git a/packages/loro-demo/package.json b/packages/loro-demo/package.json new file mode 100644 index 00000000..10857e7e --- /dev/null +++ b/packages/loro-demo/package.json @@ -0,0 +1,44 @@ +{ + "name": "website", + "version": "0.0.1", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch" + }, + "devDependencies": { + "@fontsource/fira-mono": "^4.5.10", + "@neoconfetti/svelte": "^1.0.0", + "@sveltejs/adapter-auto": "^3.0.0", + "@sveltejs/adapter-node": "^4.0.1", + "@sveltejs/kit": "^2.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.0", + "@types/quill": "^2.0.14", + "svelte": "^4.2.7", + "svelte-check": "^3.6.0", + "tslib": "^2.4.1", + "typescript": "^5.0.0", + "vite": "^5.0.3", + "vite-plugin-top-level-await": "^1.4.1", + "vite-plugin-wasm": "^3.3.0" + }, + "type": "module", + "dependencies": { + "@steeze-ui/svelte-icon": "^1.5.0", + "loro-crdt": "^0.11.1", + "prosemirror-commands": "^1.5.2", + "prosemirror-dropcursor": "^1.8.1", + "prosemirror-gapcursor": "^1.3.2", + "prosemirror-history": "^1.3.2", + "prosemirror-inputrules": "^1.4.0", + "prosemirror-keymap": "^1.2.2", + "prosemirror-model": "^1.19.4", + "prosemirror-schema-basic": "^1.2.2", + "prosemirror-schema-list": "^1.3.0", + "prosemirror-state": "^1.4.3", + "prosemirror-view": "^1.33.1", + "quill": "^1.3.7" + } +} diff --git a/packages/loro-demo/src/app.d.ts b/packages/loro-demo/src/app.d.ts new file mode 100644 index 00000000..743f07b2 --- /dev/null +++ b/packages/loro-demo/src/app.d.ts @@ -0,0 +1,13 @@ +// See https://kit.svelte.dev/docs/types#app +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface PageState {} + // interface Platform {} + } +} + +export {}; diff --git a/packages/loro-demo/src/app.html b/packages/loro-demo/src/app.html new file mode 100644 index 00000000..5889edbd --- /dev/null +++ b/packages/loro-demo/src/app.html @@ -0,0 +1,12 @@ + + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/packages/loro-demo/src/lib/Hero.svelte b/packages/loro-demo/src/lib/Hero.svelte new file mode 100644 index 00000000..b068cca4 --- /dev/null +++ b/packages/loro-demo/src/lib/Hero.svelte @@ -0,0 +1,60 @@ + + +
+ +
+

JadedBlueEyes

+
Finally, a website!
+
+
+ + diff --git a/packages/loro-demo/src/lib/LiveEditor.svelte b/packages/loro-demo/src/lib/LiveEditor.svelte new file mode 100644 index 00000000..2189b517 --- /dev/null +++ b/packages/loro-demo/src/lib/LiveEditor.svelte @@ -0,0 +1,108 @@ + + + +
+ + +
+
+ + + diff --git a/packages/loro-demo/src/lib/logo.svg b/packages/loro-demo/src/lib/logo.svg new file mode 100644 index 00000000..771b016a --- /dev/null +++ b/packages/loro-demo/src/lib/logo.svg @@ -0,0 +1,387 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/loro-demo/src/lib/menu/Menu.svelte b/packages/loro-demo/src/lib/menu/Menu.svelte new file mode 100644 index 00000000..da9f9529 --- /dev/null +++ b/packages/loro-demo/src/lib/menu/Menu.svelte @@ -0,0 +1,46 @@ + + + + + diff --git a/packages/loro-demo/src/lib/menu/MenuIcon.svelte b/packages/loro-demo/src/lib/menu/MenuIcon.svelte new file mode 100644 index 00000000..c6b27b7d --- /dev/null +++ b/packages/loro-demo/src/lib/menu/MenuIcon.svelte @@ -0,0 +1,8 @@ + + + + {text} + diff --git a/packages/loro-demo/src/lib/menu/index.ts b/packages/loro-demo/src/lib/menu/index.ts new file mode 100644 index 00000000..1b69c041 --- /dev/null +++ b/packages/loro-demo/src/lib/menu/index.ts @@ -0,0 +1,67 @@ +import { Plugin, type Command } from "prosemirror-state"; +import { setBlockType, toggleMark } from "prosemirror-commands"; +import { richTextSchema as schema } from "../prosemirror/schema"; + +import Menu from "./Menu.svelte"; +import type { EditorView } from "prosemirror-view"; + +class MenuView { + items: { command: Command; text: string; name: string; }[]; + editorView: EditorView; + dom: HTMLDivElement; + menu: Menu; + constructor(items: { command: Command; text: string; name: string; }[], editorView: EditorView) { + this.items = items; + this.editorView = editorView; + this.update(); + + const onCommand = (command: (arg0: any, arg1: any, arg2: any) => void) => { + editorView.focus(); + command(editorView.state, editorView.dispatch, editorView); + }; + + this.dom = document.createElement("div"); + this.menu = new Menu({ + target: this.dom, + props: { + items, + onCommand + } + }); + } + + update() { + // this.items.forEach(({ command, dom }) => { + // let active = command(this.editorView.state, null, this.editorView); + // dom.style.display = active ? "" : "none"; + // }); + } + + destroy() { + this.dom.remove(); + } +} + +function menuPlugin(items: { command: Command; text: string; name: string; }[]) { + return new Plugin({ + view(editorView) { + let menuView = new MenuView(items, editorView); + editorView.dom?.parentNode?.insertBefore(menuView.dom, editorView.dom); + return menuView; + } + }); +} + +let menu = menuPlugin([ + { command: toggleMark(schema.marks.strong), text: "B", name: "strong" }, + { command: toggleMark(schema.marks.em), text: "i", name: "em" }, + { command: toggleMark(schema.marks.code), text: " + import { onMount, onDestroy, createEventDispatcher } from 'svelte' + // import { createSingleLineEditor } from './state' + import { EditorView } from "prosemirror-view" + import { EditorState } from "prosemirror-state" + import { createRichTextEditor } from './editor'; + import type { LoroText } from 'loro-crdt'; + + + const dispatch = createEventDispatcher() + + /** @type string */ + export let className = "ui-editor" + + /** @type Loro */ + export let state; + /** @type string */ + export let document; + + /** @type EditorState */ + export let editorState = createRichTextEditor(document, state) + + /** @type string */ + export let placeholder = '' + + /** Reference to the editor view + * @type EditorView|null */ + export let view: EditorView | null = null + + /** Debounce change events (set to zero for immediate updates) */ + export let debounceChangeEventsInterval = 50 + + /** Reference to the editor component + * @type HTMLDivElement | null */ + export let editor: HTMLDivElement | null = null + + /** Initial EditorView props */ + export let editorViewProps = {} + + /** Focus the content-editable div */ + export function focus() { + view && view.focus() + } + + /** Blur the content-editable div */ + export function blur() { + editor && editor.blur() + } + + /** + * Tracks the timeout id of the last time the change event was dispatched + * @type {number | undefined} + */ + let dispatchLastEditTimeout: number | undefined + + /** Tracks whether changes to editor state were not yet dispatched */ + let isDirty = false + + // @ts-ignore + $: if (view && editorState && !isDirty) { + view.updateState(editorState) // necessary to keep the DOM in sync with the editor state on external updates + } + + /** + * Tracks whether the editor is empty (i.e. has a content size of 0) + * @type {boolean} + */ + let editorIsEmpty: boolean + // @ts-ignore + $: editorIsEmpty = editorState ? editorState.doc.content.size === 0 + || (editorState.doc.textContent === "" && editorState.doc.content.size < 3) : true + + /** Dispatches a change event and resets whether the editor state is dirty */ + const dispatchChangeEvent = () => { + if (isDirty) { + dispatch('change', {editorState}) + isDirty = false + } + } + + /** + * Captures custom events from plugins and dispatches them with a new event type (based on event.detail.type) + * @param event {CustomEvent} + */ + const onCustomEvent = (event: CustomEvent) => { + if (event.detail) { + const {type, ...detail} = event.detail + dispatch(type || 'custom', detail) + } + } + + onMount(() => { + // @ts-ignore + view = new EditorView({mount: editor}, { + ...editorViewProps, + state: editorState, + dispatchTransaction: (transaction) => { + // @ts-ignore + editorState = view.state.apply(transaction) + + // @ts-ignore + const contentHasChanged = !editorState.doc.eq(view.state.doc) + + if (contentHasChanged) { + isDirty = true + if (debounceChangeEventsInterval > 0) { + if (dispatchLastEditTimeout) clearTimeout(dispatchLastEditTimeout) + dispatchLastEditTimeout = setTimeout(dispatchChangeEvent, 50) + } else { + setTimeout(dispatchChangeEvent, 0) + } + } + + // @ts-ignore + view.updateState(editorState) + + dispatch('transaction', {view, editorState, isDirty, contentHasChanged}) + }, + }) + }) + + onDestroy(() => { + // @ts-ignore + if (view) + view.destroy() + }) + + --> + + + + + \ No newline at end of file diff --git a/packages/loro-demo/src/lib/prosemirror/editor.ts b/packages/loro-demo/src/lib/prosemirror/editor.ts new file mode 100644 index 00000000..16afac8f --- /dev/null +++ b/packages/loro-demo/src/lib/prosemirror/editor.ts @@ -0,0 +1,100 @@ +// import type { Delta, Loro, LoroText } from "loro-crdt"; + +// import { EditorState, TextSelection, Plugin } from "prosemirror-state"; +// import { DOMParser, DOMSerializer, Node, Schema } from "prosemirror-model"; +// import { richTextSchema, EXPAND_CONFIG } from "./schema"; + +// import { keymap } from "prosemirror-keymap"; +// import { baseKeymap } from "prosemirror-commands"; +// import { history, redo, undo } from "prosemirror-history"; +// import { dropCursor } from "prosemirror-dropcursor" +// import { gapCursor } from "prosemirror-gapcursor" + +// import { richTextKeyMapPlugin } from "./keymap"; + + +// import { PluginKey } from 'prosemirror-state' +// const syncPluginKey = new PluginKey('loro-sync') + +// /** +// * Create an empty editor state with rich text editing capabilities +// * @param html {string} +// * @param plugins {array} +// * @return {EditorState} +// */ +// export const createRichTextEditor = (document: string, state: Loro, plugins = []) => { +// state.configTextStyle(EXPAND_CONFIG) + + +// const syncPlugin = new Plugin({ +// key: syncPluginKey, +// state: { +// init(config, instance) { +// let richtext = state.getText(document); +// richtext. +// instance.doc = new Node() +// richtext.subscribe(state, (event) => { +// for (const change of event.events) { +// console.log(change) +// } +// // if (!event.local && event.diff.type == "text") { +// // console.log(state.peerId, "CRDT_EVENT", event); +// // const eventDelta = event.diff.diff; +// // const delta: Delta[] = []; +// // let index = 0; +// // for (let i = 0; i < eventDelta.length; i++) { +// // const d = eventDelta[i]; +// // const length = d.delete || d.retain || d.insert!.length; +// // // skip the last newline that quill automatically appends +// // if ( +// // d.insert && +// // d.insert === "\n" && +// // // index === quill.getLength() - 1 && +// // i === eventDelta.length - 1 && +// // d.attributes != null && +// // Object.keys(d.attributes).length > 0 +// // ) { +// // delta.push({ +// // retain: 1, +// // attributes: d.attributes, +// // }); +// // index += length; +// // continue; +// // } + +// // delta.push(d); +// // index += length; +// // } + +// // // quill.updateContents(new Delta(delta), "this" as any); +// // // const a = this.richtext.toDelta(); +// // // const b = this.quill.getContents().ops; +// // // console.log(this.doc.peerId, "COMPARE AFTER CRDT_EVENT"); +// // // if (!assertEqual(a, b as any)) { +// // // quill.setContents(new Delta(a), "this" as any); +// // // } +// // } +// }); +// }, +// apply(tr, value, oldState, newState) { +// console.log(tr, value, oldState, newState) +// }, +// } +// }); + +// return EditorState.create({ +// schema: richTextSchema, +// // doc, +// // selection, +// plugins: [ +// // history(), +// keymap({}), // {"Mod-z": undo, "Mod-y": redo, "Mod-Shift-z": redo} +// keymap(baseKeymap), +// dropCursor(), +// gapCursor(), +// syncPlugin, +// richTextKeyMapPlugin, +// ...plugins +// ] +// }); +// } \ No newline at end of file diff --git a/packages/loro-demo/src/lib/prosemirror/keymap.ts b/packages/loro-demo/src/lib/prosemirror/keymap.ts new file mode 100644 index 00000000..85641b76 --- /dev/null +++ b/packages/loro-demo/src/lib/prosemirror/keymap.ts @@ -0,0 +1,111 @@ +import { + wrapIn, setBlockType, chainCommands, toggleMark, exitCode, + joinUp, joinDown, lift, selectParentNode +} from "prosemirror-commands"; +import { wrapInList, splitListItem, liftListItem, sinkListItem } from "prosemirror-schema-list"; +import { undo, redo } from "prosemirror-history"; +import { undoInputRule } from "prosemirror-inputrules"; +import { richTextSchema } from "./schema"; +import { keymap } from "prosemirror-keymap" + +import type { Command, EditorState, Transaction } from "prosemirror-state"; +import type { EditorView } from "prosemirror-view"; +import type { Schema } from "prosemirror-model"; +const mac = typeof navigator != "undefined" ? /Mac/.test(navigator.platform) : false; +type keyMap = { [x: string]: { combo: string, command: Command }[] }; + +const addKey = (keyMap: keyMap, name: string, combo: string, command: Command) => { + if (!keyMap[name]) keyMap[name] = []; + keyMap[name].push({ combo, command }); +} + +const createKeyMapConfiguration = (schema: Schema) => { + let config: keyMap = {} + + addKey(config, 'undo', "Mod-z", undo) + + addKey(config, "redo", "Shift-Mod-z", redo); + addKey(config, "undoInputRule", "Backspace", undoInputRule); + + if (!mac) addKey(config, "redo", "Mod-y", redo); + + addKey(config, "joinUp", "Alt-ArrowUp", joinUp); + addKey(config, "joinDown", "Alt-ArrowDown", joinDown); + addKey(config, "lift", "Mod-BracketLeft", lift); + addKey(config, "selectParentNode", "Escape", selectParentNode); + + if (!!schema.marks.strong) { + addKey(config, "toggleMarkStrong", "Mod-b", toggleMark(schema.marks.strong)); + addKey(config, "toggleMarkStrong", "Mod-B", toggleMark(schema.marks.strong)); + } + + if (!!schema.marks.em) { + addKey(config, "toggleMarkEm", "Mod-i", toggleMark(schema.marks.em)); + addKey(config, "toggleMarkEm", "Mod-I", toggleMark(schema.marks.em)); + } + if (!!schema.marks.code) + addKey(config, "toggleMarkCode", "Mod-`", toggleMark(schema.marks.code)); + + if (!!schema.nodes.bullet_list) + addKey(config, "wrapInListUnordered", "Shift-Ctrl-8", wrapInList(schema.nodes.bullet_list)); + + if (!!schema.nodes.ordered_list) + addKey(config, "wrapInListOrdered", "Shift-Ctrl-9", wrapInList(schema.nodes.ordered_list)); + + if (!!schema.nodes.blockquote) + addKey(config, "wrapInBlockquote", "Ctrl->", wrapIn(schema.nodes.blockquote)); + + if (!!schema.nodes.hard_break) { + let br = schema.nodes.hard_break + const cmd = chainCommands(exitCode, (state, dispatch) => { + if (dispatch) + dispatch(state.tr.replaceSelectionWith(br.create()).scrollIntoView()) + return true + }) + + addKey(config, "hardBreak", "Mod-Enter", cmd); + addKey(config, "hardBreak", "Shift-Enter", cmd); + if (mac) addKey(config, "hardBreak", "Ctrl-Enter", cmd); + } + + if (!!schema.nodes.list_item) { + addKey(config, "splitListItem", "Enter", splitListItem(schema.nodes.list_item)); + addKey(config, "liftListItem", "Mod-[", liftListItem(schema.nodes.list_item)); + addKey(config, "sinkListItem", "Mod-]", sinkListItem(schema.nodes.list_item)); + } + if (!!schema.nodes.paragraph) + addKey(config, "setBlockTypeParagraph", "Shift-Ctrl-0", setBlockType(schema.nodes.paragraph)); + + if (!!schema.nodes.code_block) + addKey(config, "setBlockTypeCode", "Shift-Ctrl-\\", setBlockType(schema.nodes.code_block)); + + if (!!schema.nodes.heading) + for (let i = 1; i <= 6; i++) { + addKey(config, `setHeading${i}`, `Shift-Ctrl-${i}`, setBlockType(schema.nodes.heading, { level: i })); + } + + if (!!schema.nodes.horizontal_rule) { + addKey(config, "insertHorizontalRuler", "Mod-_", (state, dispatch) => { + let hr = schema.nodes.horizontal_rule; + if (dispatch) + dispatch(state.tr.replaceSelectionWith(hr.create()).scrollIntoView()); + return true; + }) + } + + return config +} + +const getKeyMapFromConfig = (config: keyMap) => { + const keys = Object.keys(config); + let bindings: { [ combo: string]: Command} = {}; + keys.forEach(key => { + config[key].forEach(entry => { + bindings[entry.combo] = entry.command; + }) + }) + return keymap(bindings); +} + +const richTextKeyMapConfiguration = createKeyMapConfiguration(richTextSchema); +export const richTextKeyMapPlugin = getKeyMapFromConfig(richTextKeyMapConfiguration); \ No newline at end of file diff --git a/packages/loro-demo/src/lib/prosemirror/metadata.ts b/packages/loro-demo/src/lib/prosemirror/metadata.ts new file mode 100644 index 00000000..d72e0197 --- /dev/null +++ b/packages/loro-demo/src/lib/prosemirror/metadata.ts @@ -0,0 +1,14 @@ + +import { dev } from '$app/environment'; + + + +export const SITE_TITLE = 'JadedBlueEyes'; + +export const SITE_URL = dev ? "http://localhost:5173" : "https://jade.ellis.link" + +export const SITE_DOMAIN = 'jade.ellis.link'; +export const SITE_DEFAULT_DESCRIPTION = + "Jade's website."; + +export const RSS_DEFAULT_POSTS_PER_PAGE = 15; \ No newline at end of file diff --git a/packages/loro-demo/src/lib/prosemirror/schema.ts b/packages/loro-demo/src/lib/prosemirror/schema.ts new file mode 100644 index 00000000..942b7cfd --- /dev/null +++ b/packages/loro-demo/src/lib/prosemirror/schema.ts @@ -0,0 +1,24 @@ + +import { Schema } from 'prosemirror-model'; +import { nodes, marks } from 'prosemirror-schema-basic'; + + +export const EXPAND_CONFIG: { [key in string]: { expand: "before" | "after" | "both" | "none"; } } = { + bold: { expand: "after" }, + italic: { expand: "after" }, + underline: { expand: "after" }, + link: { expand: "none" }, + heading: { expand: "none" }, +} + + + +/** + * Schema to represent rich text + * @type {Schema} + */ +export const richTextSchema = new Schema({ + nodes, + marks + }); +// richTextSchema.nodes.heading \ No newline at end of file diff --git a/packages/loro-demo/src/lib/styles.css b/packages/loro-demo/src/lib/styles.css new file mode 100644 index 00000000..0120f2f3 --- /dev/null +++ b/packages/loro-demo/src/lib/styles.css @@ -0,0 +1,80 @@ +:root { + color-scheme: light; + --spacing: 24px; + --theme: #242424; + --background-color: #f8f8f8; + --surface-color: #fff; + --backdrop-color: rgba(247, 247, 247, .54); + --shadow-color: rgba(0, 0, 0, .12); + --font-color: rgba(0, 0, 0, .87); + --font-color-contrast: rgba(255, 255, 255, 1); + --font-color-secondary: rgba(0, 0, 0, .6); + --font-family-base: Roboto, sans-serif; + --font-family-heading: "Sen", Roboto, sans-serif; + --border-radius: 8px; + --shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); +} + +@media (prefers-color-scheme: dark) { + :root { + color-scheme: dark; + --theme: #eee; + --background-color: #141414; + --backdrop-color: rgba(20, 20, 20, .54); + --shadow-color: rgba(255, 255, 255, .12); + --surface-color: #242424; + --font-color: rgba(255, 255, 255, .87); + --font-color-contrast: rgba(0, 0, 0, .87); + --font-color-secondary: rgba(255, 255, 255, .6) + } +} + + + + +html { + font-family: var(--font-family-base); + background-color: var(--background-color); + color: var(--font-color); + font-size: 16px; + line-height: 1.5 +} + +body { + padding: 0; + margin: 0 +} + +iframe, +img, +svg { + width: 100%; + height: 100%; + display: block; +} + +.main { + max-width: 1056px; + margin: 0 auto; + padding: 0 var(--spacing); + --edge-border-radius: var(--border-radius); +} + +@media screen and (max-width: 320px) { + .main { + padding: 0 0; + --edge-border-radius: 0; + } +} + + +.card { + border-radius: var(--border-radius); + box-shadow: var(--shadow); + background-color: var(--surface-color); +} + + +.edge { + border-radius: var(--edge-border-radius); +} \ No newline at end of file diff --git a/packages/loro-demo/src/routes/+layout.svelte b/packages/loro-demo/src/routes/+layout.svelte new file mode 100644 index 00000000..ea10c5fc --- /dev/null +++ b/packages/loro-demo/src/routes/+layout.svelte @@ -0,0 +1,8 @@ + + +
+ + +
\ No newline at end of file diff --git a/packages/loro-demo/src/routes/+page.svelte b/packages/loro-demo/src/routes/+page.svelte new file mode 100644 index 00000000..614876f6 --- /dev/null +++ b/packages/loro-demo/src/routes/+page.svelte @@ -0,0 +1,9 @@ + + + + diff --git a/packages/loro-demo/static/robots.txt b/packages/loro-demo/static/robots.txt new file mode 100644 index 00000000..e9e57dc4 --- /dev/null +++ b/packages/loro-demo/static/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/packages/loro-demo/svelte.config.js b/packages/loro-demo/svelte.config.js new file mode 100644 index 00000000..e4150ef3 --- /dev/null +++ b/packages/loro-demo/svelte.config.js @@ -0,0 +1,16 @@ +import adapter from '@sveltejs/adapter-node'; +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + // Consult https://kit.svelte.dev/docs/integrations#preprocessors + // for more information about preprocessors + preprocess: vitePreprocess(), + + kit: { + adapter: adapter(), + + } +}; + +export default config; diff --git a/packages/loro-demo/tsconfig.json b/packages/loro-demo/tsconfig.json new file mode 100644 index 00000000..82081abc --- /dev/null +++ b/packages/loro-demo/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias + // + // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes + // from the referenced tsconfig.json - TypeScript does not merge them in +} diff --git a/packages/loro-demo/vite.config.ts b/packages/loro-demo/vite.config.ts new file mode 100644 index 00000000..cebdca84 --- /dev/null +++ b/packages/loro-demo/vite.config.ts @@ -0,0 +1,9 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +import wasm from "vite-plugin-wasm"; +import topLevelAwait from "vite-plugin-top-level-await"; + +export default defineConfig({ + plugins: [wasm(), topLevelAwait(), sveltekit()] +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index da8a12a4..86c7b758 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,94 @@ importers: .: {} + packages/loro-demo: + dependencies: + '@steeze-ui/svelte-icon': + specifier: ^1.5.0 + version: 1.5.0(svelte@4.2.8) + loro-crdt: + specifier: ^0.11.1 + version: 0.11.1 + prosemirror-commands: + specifier: ^1.5.2 + version: 1.5.2 + prosemirror-dropcursor: + specifier: ^1.8.1 + version: 1.8.1 + prosemirror-gapcursor: + specifier: ^1.3.2 + version: 1.3.2 + prosemirror-history: + specifier: ^1.3.2 + version: 1.3.2 + prosemirror-inputrules: + specifier: ^1.4.0 + version: 1.4.0 + prosemirror-keymap: + specifier: ^1.2.2 + version: 1.2.2 + prosemirror-model: + specifier: ^1.19.4 + version: 1.19.4 + prosemirror-schema-basic: + specifier: ^1.2.2 + version: 1.2.2 + prosemirror-schema-list: + specifier: ^1.3.0 + version: 1.3.0 + prosemirror-state: + specifier: ^1.4.3 + version: 1.4.3 + prosemirror-view: + specifier: ^1.33.1 + version: 1.33.1 + quill: + specifier: ^1.3.7 + version: 1.3.7 + devDependencies: + '@fontsource/fira-mono': + specifier: ^4.5.10 + version: 4.5.10 + '@neoconfetti/svelte': + specifier: ^1.0.0 + version: 1.0.0 + '@sveltejs/adapter-auto': + specifier: ^3.0.0 + version: 3.1.1(@sveltejs/kit@2.5.0) + '@sveltejs/adapter-node': + specifier: ^4.0.1 + version: 4.0.1(@sveltejs/kit@2.5.0) + '@sveltejs/kit': + specifier: ^2.0.0 + version: 2.5.0(@sveltejs/vite-plugin-svelte@3.0.1)(svelte@4.2.8)(vite@5.0.10) + '@sveltejs/vite-plugin-svelte': + specifier: ^3.0.0 + version: 3.0.1(svelte@4.2.8)(vite@5.0.10) + '@types/quill': + specifier: ^2.0.14 + version: 2.0.14 + svelte: + specifier: ^4.2.7 + version: 4.2.8 + svelte-check: + specifier: ^3.6.0 + version: 3.6.2(svelte@4.2.8) + tslib: + specifier: ^2.4.1 + version: 2.6.2 + typescript: + specifier: ^5.0.0 + version: 5.3.3 + vite: + specifier: ^5.0.3 + version: 5.0.10 + vite-plugin-top-level-await: + specifier: ^1.4.1 + version: 1.4.1(vite@5.0.10) + vite-plugin-wasm: + specifier: ^3.3.0 + version: 3.3.0(vite@5.0.10) + packages/website: dependencies: '@steeze-ui/svelte-icon': @@ -403,6 +491,16 @@ packages: rollup: 4.10.0 dev: true + /@rollup/plugin-virtual@3.0.2: + resolution: {integrity: sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dev: true + /@rollup/pluginutils@5.1.0(rollup@4.10.0): resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} @@ -426,14 +524,6 @@ packages: dev: true optional: true - /@rollup/rollup-android-arm-eabi@4.9.1: - resolution: {integrity: sha512-6vMdBZqtq1dVQ4CWdhFwhKZL6E4L1dV6jUjuBvsavvNJSppzi6dLBbuV+3+IyUREaj9ZFvQefnQm28v4OCXlig==} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-android-arm64@4.10.0: resolution: {integrity: sha512-lvu0jK97mZDJdpZKDnZI93I0Om8lSDaiPx3OiCk0RXn3E8CMPJNS/wxjAvSJJzhhZpfjXsjLWL8LnS6qET4VNQ==} cpu: [arm64] @@ -442,14 +532,6 @@ packages: dev: true optional: true - /@rollup/rollup-android-arm64@4.9.1: - resolution: {integrity: sha512-Jto9Fl3YQ9OLsTDWtLFPtaIMSL2kwGyGoVCmPC8Gxvym9TCZm4Sie+cVeblPO66YZsYH8MhBKDMGZ2NDxuk/XQ==} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-darwin-arm64@4.10.0: resolution: {integrity: sha512-uFpayx8I8tyOvDkD7X6n0PriDRWxcqEjqgtlxnUA/G9oS93ur9aZ8c8BEpzFmsed1TH5WZNG5IONB8IiW90TQg==} cpu: [arm64] @@ -458,14 +540,6 @@ packages: dev: true optional: true - /@rollup/rollup-darwin-arm64@4.9.1: - resolution: {integrity: sha512-LtYcLNM+bhsaKAIGwVkh5IOWhaZhjTfNOkGzGqdHvhiCUVuJDalvDxEdSnhFzAn+g23wgsycmZk1vbnaibZwwA==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-darwin-x64@4.10.0: resolution: {integrity: sha512-nIdCX03qFKoR/MwQegQBK+qZoSpO3LESurVAC6s6jazLA1Mpmgzo3Nj3H1vydXp/JM29bkCiuF7tDuToj4+U9Q==} cpu: [x64] @@ -474,14 +548,6 @@ packages: dev: true optional: true - /@rollup/rollup-darwin-x64@4.9.1: - resolution: {integrity: sha512-KyP/byeXu9V+etKO6Lw3E4tW4QdcnzDG/ake031mg42lob5tN+5qfr+lkcT/SGZaH2PdW4Z1NX9GHEkZ8xV7og==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.10.0: resolution: {integrity: sha512-Fz7a+y5sYhYZMQFRkOyCs4PLhICAnxRX/GnWYReaAoruUzuRtcf+Qnw+T0CoAWbHCuz2gBUwmWnUgQ67fb3FYw==} cpu: [arm] @@ -490,14 +556,6 @@ packages: dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.9.1: - resolution: {integrity: sha512-Yqz/Doumf3QTKplwGNrCHe/B2p9xqDghBZSlAY0/hU6ikuDVQuOUIpDP/YcmoT+447tsZTmirmjgG3znvSCR0Q==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm64-gnu@4.10.0: resolution: {integrity: sha512-yPtF9jIix88orwfTi0lJiqINnlWo6p93MtZEoaehZnmCzEmLL0eqjA3eGVeyQhMtxdV+Mlsgfwhh0+M/k1/V7Q==} cpu: [arm64] @@ -506,14 +564,6 @@ packages: dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.9.1: - resolution: {integrity: sha512-u3XkZVvxcvlAOlQJ3UsD1rFvLWqu4Ef/Ggl40WAVCuogf4S1nJPHh5RTgqYFpCOvuGJ7H5yGHabjFKEZGExk5Q==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm64-musl@4.10.0: resolution: {integrity: sha512-9GW9yA30ib+vfFiwjX+N7PnjTnCMiUffhWj4vkG4ukYv1kJ4T9gHNg8zw+ChsOccM27G9yXrEtMScf1LaCuoWQ==} cpu: [arm64] @@ -522,14 +572,6 @@ packages: dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.9.1: - resolution: {integrity: sha512-0XSYN/rfWShW+i+qjZ0phc6vZ7UWI8XWNz4E/l+6edFt+FxoEghrJHjX1EY/kcUGCnZzYYRCl31SNdfOi450Aw==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-riscv64-gnu@4.10.0: resolution: {integrity: sha512-X1ES+V4bMq2ws5fF4zHornxebNxMXye0ZZjUrzOrf7UMx1d6wMQtfcchZ8SqUnQPPHdOyOLW6fTcUiFgHFadRA==} cpu: [riscv64] @@ -538,14 +580,6 @@ packages: dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.9.1: - resolution: {integrity: sha512-LmYIO65oZVfFt9t6cpYkbC4d5lKHLYv5B4CSHRpnANq0VZUQXGcCPXHzbCXCz4RQnx7jvlYB1ISVNCE/omz5cw==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-x64-gnu@4.10.0: resolution: {integrity: sha512-w/5OpT2EnI/Xvypw4FIhV34jmNqU5PZjZue2l2Y3ty1Ootm3SqhI+AmfhlUYGBTd9JnpneZCDnt3uNOiOBkMyw==} cpu: [x64] @@ -554,14 +588,6 @@ packages: dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.9.1: - resolution: {integrity: sha512-kr8rEPQ6ns/Lmr/hiw8sEVj9aa07gh1/tQF2Y5HrNCCEPiCBGnBUt9tVusrcBBiJfIt1yNaXN6r1CCmpbFEDpg==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-x64-musl@4.10.0: resolution: {integrity: sha512-q/meftEe3QlwQiGYxD9rWwB21DoKQ9Q8wA40of/of6yGHhZuGfZO0c3WYkN9dNlopHlNT3mf5BPsUSxoPuVQaw==} cpu: [x64] @@ -570,14 +596,6 @@ packages: dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.9.1: - resolution: {integrity: sha512-t4QSR7gN+OEZLG0MiCgPqMWZGwmeHhsM4AkegJ0Kiy6TnJ9vZ8dEIwHw1LcZKhbHxTY32hp9eVCMdR3/I8MGRw==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-win32-arm64-msvc@4.10.0: resolution: {integrity: sha512-NrR6667wlUfP0BHaEIKgYM/2va+Oj+RjZSASbBMnszM9k+1AmliRjHc3lJIiOehtSSjqYiO7R6KLNrWOX+YNSQ==} cpu: [arm64] @@ -586,14 +604,6 @@ packages: dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.9.1: - resolution: {integrity: sha512-7XI4ZCBN34cb+BH557FJPmh0kmNz2c25SCQeT9OiFWEgf8+dL6ZwJ8f9RnUIit+j01u07Yvrsuu1rZGxJCc51g==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-win32-ia32-msvc@4.10.0: resolution: {integrity: sha512-FV0Tpt84LPYDduIDcXvEC7HKtyXxdvhdAOvOeWMWbQNulxViH2O07QXkT/FffX4FqEI02jEbCJbr+YcuKdyyMg==} cpu: [ia32] @@ -602,14 +612,6 @@ packages: dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.9.1: - resolution: {integrity: sha512-yE5c2j1lSWOH5jp+Q0qNL3Mdhr8WuqCNVjc6BxbVfS5cAS6zRmdiw7ktb8GNpDCEUJphILY6KACoFoRtKoqNQg==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-win32-x64-msvc@4.10.0: resolution: {integrity: sha512-OZoJd+o5TaTSQeFFQ6WjFCiltiYVjIdsXxwu/XZ8qRpsvMQr4UsVrE5UyT9RIvsnuF47DqkJKhhVZ2Q9YW9IpQ==} cpu: [x64] @@ -618,14 +620,6 @@ packages: dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.9.1: - resolution: {integrity: sha512-PyJsSsafjmIhVgaI1Zdj7m8BB8mMckFah/xbpplObyHfiXzKcI5UOUXRyOdHW7nz4DpMCuzLnF7v5IWHenCwYA==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@steeze-ui/svelte-icon@1.5.0(svelte@4.2.8): resolution: {integrity: sha512-Y0S7Qk2kO6byzOlD5SQGbOF2ZaKXJgfTkH78QUPcq579wiWMQJ5H14zL4XwtsPJ0DfkoL5qa3WaIdYkWb9A6AA==} peerDependencies: @@ -718,6 +712,129 @@ packages: - supports-color dev: true + /@swc/core-darwin-arm64@1.4.2: + resolution: {integrity: sha512-1uSdAn1MRK5C1m/TvLZ2RDvr0zLvochgrZ2xL+lRzugLlCTlSA+Q4TWtrZaOz+vnnFVliCpw7c7qu0JouhgQIw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-darwin-x64@1.4.2: + resolution: {integrity: sha512-TYD28+dCQKeuxxcy7gLJUCFLqrwDZnHtC2z7cdeGfZpbI2mbfppfTf2wUPzqZk3gEC96zHd4Yr37V3Tvzar+lQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm-gnueabihf@1.4.2: + resolution: {integrity: sha512-Eyqipf7ZPGj0vplKHo8JUOoU1un2sg5PjJMpEesX0k+6HKE2T8pdyeyXODN0YTFqzndSa/J43EEPXm+rHAsLFQ==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-gnu@1.4.2: + resolution: {integrity: sha512-wZn02DH8VYPv3FC0ub4my52Rttsus/rFw+UUfzdb3tHMHXB66LqN+rR0ssIOZrH6K+VLN6qpTw9VizjyoH0BxA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-musl@1.4.2: + resolution: {integrity: sha512-3G0D5z9hUj9bXNcwmA1eGiFTwe5rWkuL3DsoviTj73TKLpk7u64ND0XjEfO0huVv4vVu9H1jodrKb7nvln/dlw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-gnu@1.4.2: + resolution: {integrity: sha512-LFxn9U8cjmYHw3jrdPNqPAkBGglKE3tCZ8rA7hYyp0BFxuo7L2ZcEnPm4RFpmSCCsExFH+LEJWuMGgWERoktvg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-musl@1.4.2: + resolution: {integrity: sha512-dp0fAmreeVVYTUcb4u9njTPrYzKnbIH0EhH2qvC9GOYNNREUu2GezSIDgonjOXkHiTCvopG4xU7y56XtXj4VrQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-arm64-msvc@1.4.2: + resolution: {integrity: sha512-HlVIiLMQkzthAdqMslQhDkoXJ5+AOLUSTV6fm6shFKZKqc/9cJvr4S8UveNERL9zUficA36yM3bbfo36McwnvQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-ia32-msvc@1.4.2: + resolution: {integrity: sha512-WCF8faPGjCl4oIgugkp+kL9nl3nUATlzKXCEGFowMEmVVCFM0GsqlmGdPp1pjZoWc9tpYanoXQDnp5IvlDSLhA==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-x64-msvc@1.4.2: + resolution: {integrity: sha512-oV71rwiSpA5xre2C5570BhCsg1HF97SNLsZ/12xv7zayGzqr3yvFALFJN8tHKpqUdCB4FGPjoP3JFdV3i+1wUw==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core@1.4.2: + resolution: {integrity: sha512-vWgY07R/eqj1/a0vsRKLI9o9klGZfpLNOVEnrv4nrccxBgYPjcf22IWwAoaBJ+wpA7Q4fVjCUM8lP0m01dpxcg==} + engines: {node: '>=10'} + requiresBuild: true + peerDependencies: + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.5 + optionalDependencies: + '@swc/core-darwin-arm64': 1.4.2 + '@swc/core-darwin-x64': 1.4.2 + '@swc/core-linux-arm-gnueabihf': 1.4.2 + '@swc/core-linux-arm64-gnu': 1.4.2 + '@swc/core-linux-arm64-musl': 1.4.2 + '@swc/core-linux-x64-gnu': 1.4.2 + '@swc/core-linux-x64-musl': 1.4.2 + '@swc/core-win32-arm64-msvc': 1.4.2 + '@swc/core-win32-ia32-msvc': 1.4.2 + '@swc/core-win32-x64-msvc': 1.4.2 + dev: true + + /@swc/counter@0.1.3: + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + dev: true + + /@swc/types@0.1.5: + resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} + dev: true + /@types/cookie@0.6.0: resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} dev: true @@ -729,6 +846,13 @@ packages: resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} dev: true + /@types/quill@2.0.14: + resolution: {integrity: sha512-zvoXCRnc2Dl8g+7/9VSAmRWPN6oH+MVhTPizmCR+GJCITplZ5VRVzMs4+a/nOE3yzNwEZqylJJrMB07bwbM1/g==} + dependencies: + parchment: 1.1.4 + quill-delta: 5.1.0 + dev: true + /@types/resolve@1.20.2: resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} dev: true @@ -800,6 +924,17 @@ packages: engines: {node: '>=6'} dev: true + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.1 + dev: false + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -820,6 +955,11 @@ packages: fsevents: 2.3.3 dev: true + /clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + dev: false + /code-red@1.0.4: resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} dependencies: @@ -861,11 +1001,41 @@ packages: ms: 2.1.2 dev: true + /deep-equal@1.1.2: + resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==} + engines: {node: '>= 0.4'} + dependencies: + is-arguments: 1.1.1 + is-date-object: 1.0.5 + is-regex: 1.1.4 + object-is: 1.1.5 + object-keys: 1.1.1 + regexp.prototype.flags: 1.5.2 + dev: false + /deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} dev: true + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + dev: false + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + dev: false + /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -879,6 +1049,18 @@ packages: resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} dev: true + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + dev: false + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: false + /es6-promise@3.3.1: resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} dev: true @@ -933,6 +1115,22 @@ packages: dependencies: '@types/estree': 1.0.5 + /eventemitter3@2.0.3: + resolution: {integrity: sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==} + dev: false + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: false + + /fast-diff@1.1.2: + resolution: {integrity: sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==} + dev: false + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + /fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -971,7 +1169,21 @@ packages: /function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: false + + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.1 + dev: false /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -1010,16 +1222,44 @@ packages: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} dev: true + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.4 + dev: false + /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: true + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.0 + dev: false + + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + dev: false + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: false + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: false + /hasown@2.0.1: resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 - dev: true /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} @@ -1044,6 +1284,14 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: false + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -1064,6 +1312,13 @@ packages: hasown: 2.0.1 dev: true + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: false + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -1096,6 +1351,14 @@ packages: dependencies: '@types/estree': 1.0.5 + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: false + /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -1112,6 +1375,24 @@ packages: /locate-character@3.0.0: resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + /lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + dev: true + + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + dev: true + + /loro-crdt@0.11.1: + resolution: {integrity: sha512-C4+lryPZUDqUiLqX0mVp9wRb6+MPvhNngJNQhQxwIDqzn3oP/7Qra8XgY37M4d4Yvx2ZgG+1nYnR+43/xRwq7g==} + dependencies: + loro-wasm: 0.11.1 + dev: false + + /loro-wasm@0.11.1: + resolution: {integrity: sha512-/AkU2uXDRrKf6iu2WeaFIXjWzcwLgn3aWZFDW5yrIZGxc/0lB60b8F5cjyU+HqGzeXqGy0KnMrio+mTRDy1W0w==} + dev: false + /magic-string@0.30.5: resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} engines: {node: '>=12'} @@ -1188,12 +1469,32 @@ packages: engines: {node: '>=0.10.0'} dev: true + /object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + dev: false + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: false + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: true + /orderedmap@2.1.1: + resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} + dev: false + + /parchment@1.1.4: + resolution: {integrity: sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==} + /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -1235,10 +1536,129 @@ packages: source-map-js: 1.0.2 dev: true + /prosemirror-commands@1.5.2: + resolution: {integrity: sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ==} + dependencies: + prosemirror-model: 1.19.4 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + dev: false + + /prosemirror-dropcursor@1.8.1: + resolution: {integrity: sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==} + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + prosemirror-view: 1.33.1 + dev: false + + /prosemirror-gapcursor@1.3.2: + resolution: {integrity: sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==} + dependencies: + prosemirror-keymap: 1.2.2 + prosemirror-model: 1.19.4 + prosemirror-state: 1.4.3 + prosemirror-view: 1.33.1 + dev: false + + /prosemirror-history@1.3.2: + resolution: {integrity: sha512-/zm0XoU/N/+u7i5zepjmZAEnpvjDtzoPWW6VmKptcAnPadN/SStsBjMImdCEbb3seiNTpveziPTIrXQbHLtU1g==} + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + prosemirror-view: 1.33.1 + rope-sequence: 1.3.4 + dev: false + + /prosemirror-inputrules@1.4.0: + resolution: {integrity: sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==} + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + dev: false + + /prosemirror-keymap@1.2.2: + resolution: {integrity: sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==} + dependencies: + prosemirror-state: 1.4.3 + w3c-keyname: 2.2.8 + dev: false + + /prosemirror-model@1.19.4: + resolution: {integrity: sha512-RPmVXxUfOhyFdayHawjuZCxiROsm9L4FCUA6pWI+l7n2yCBsWy9VpdE1hpDHUS8Vad661YLY9AzqfjLhAKQ4iQ==} + dependencies: + orderedmap: 2.1.1 + dev: false + + /prosemirror-schema-basic@1.2.2: + resolution: {integrity: sha512-/dT4JFEGyO7QnNTe9UaKUhjDXbTNkiWTq/N4VpKaF79bBjSExVV2NXmJpcM7z/gD7mbqNjxbmWW5nf1iNSSGnw==} + dependencies: + prosemirror-model: 1.19.4 + dev: false + + /prosemirror-schema-list@1.3.0: + resolution: {integrity: sha512-Hz/7gM4skaaYfRPNgr421CU4GSwotmEwBVvJh5ltGiffUJwm7C8GfN/Bc6DR1EKEp5pDKhODmdXXyi9uIsZl5A==} + dependencies: + prosemirror-model: 1.19.4 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + dev: false + + /prosemirror-state@1.4.3: + resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==} + dependencies: + prosemirror-model: 1.19.4 + prosemirror-transform: 1.8.0 + prosemirror-view: 1.33.1 + dev: false + + /prosemirror-transform@1.8.0: + resolution: {integrity: sha512-BaSBsIMv52F1BVVMvOmp1yzD3u65uC3HTzCBQV1WDPqJRQ2LuHKcyfn0jwqodo8sR9vVzMzZyI+Dal5W9E6a9A==} + dependencies: + prosemirror-model: 1.19.4 + dev: false + + /prosemirror-view@1.33.1: + resolution: {integrity: sha512-62qkYgSJIkwIMMCpuGuPzc52DiK1Iod6TWoIMxP4ja6BTD4yO8kCUL64PZ/WhH/dJ9fW0CDO39FhH1EMyhUFEg==} + dependencies: + prosemirror-model: 1.19.4 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + dev: false + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true + /quill-delta@3.6.3: + resolution: {integrity: sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==} + engines: {node: '>=0.10'} + dependencies: + deep-equal: 1.1.2 + extend: 3.0.2 + fast-diff: 1.1.2 + dev: false + + /quill-delta@5.1.0: + resolution: {integrity: sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==} + engines: {node: '>= 12.0.0'} + dependencies: + fast-diff: 1.3.0 + lodash.clonedeep: 4.5.0 + lodash.isequal: 4.5.0 + dev: true + + /quill@1.3.7: + resolution: {integrity: sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==} + dependencies: + clone: 2.1.2 + deep-equal: 1.1.2 + eventemitter3: 2.0.3 + extend: 3.0.2 + parchment: 1.1.4 + quill-delta: 3.6.3 + dev: false + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -1246,6 +1666,16 @@ packages: picomatch: 2.3.1 dev: true + /regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + dev: false + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -1295,26 +1725,9 @@ packages: fsevents: 2.3.3 dev: true - /rollup@4.9.1: - resolution: {integrity: sha512-pgPO9DWzLoW/vIhlSoDByCzcpX92bKEorbgXuZrqxByte3JFk2xSW2JEeAcyLc9Ru9pqcNNW+Ob7ntsk2oT/Xw==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.9.1 - '@rollup/rollup-android-arm64': 4.9.1 - '@rollup/rollup-darwin-arm64': 4.9.1 - '@rollup/rollup-darwin-x64': 4.9.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.9.1 - '@rollup/rollup-linux-arm64-gnu': 4.9.1 - '@rollup/rollup-linux-arm64-musl': 4.9.1 - '@rollup/rollup-linux-riscv64-gnu': 4.9.1 - '@rollup/rollup-linux-x64-gnu': 4.9.1 - '@rollup/rollup-linux-x64-musl': 4.9.1 - '@rollup/rollup-win32-arm64-msvc': 4.9.1 - '@rollup/rollup-win32-ia32-msvc': 4.9.1 - '@rollup/rollup-win32-x64-msvc': 4.9.1 - fsevents: 2.3.3 - dev: true + /rope-sequence@1.3.4: + resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + dev: false /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -1342,6 +1755,28 @@ packages: resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} dev: true + /set-function-length@1.2.1: + resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + dev: false + + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + dev: false + /sirv@2.0.4: resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} engines: {node: '>= 10'} @@ -1511,6 +1946,33 @@ packages: hasBin: true dev: true + /uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + dev: true + + /vite-plugin-top-level-await@1.4.1(vite@5.0.10): + resolution: {integrity: sha512-hogbZ6yT7+AqBaV6lK9JRNvJDn4/IJvHLu6ET06arNfo0t2IsyCaon7el9Xa8OumH+ESuq//SDf8xscZFE0rWw==} + peerDependencies: + vite: '>=2.8' + dependencies: + '@rollup/plugin-virtual': 3.0.2 + '@swc/core': 1.4.2 + uuid: 9.0.1 + vite: 5.0.10 + transitivePeerDependencies: + - '@swc/helpers' + - rollup + dev: true + + /vite-plugin-wasm@3.3.0(vite@5.0.10): + resolution: {integrity: sha512-tVhz6w+W9MVsOCHzxo6SSMSswCeIw4HTrXEi6qL3IRzATl83jl09JVO1djBqPSwfjgnpVHNLYcaMbaDX5WB/pg==} + peerDependencies: + vite: ^2 || ^3 || ^4 || ^5 + dependencies: + vite: 5.0.10 + dev: true + /vite@5.0.10: resolution: {integrity: sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==} engines: {node: ^18.0.0 || >=20.0.0} @@ -1541,7 +2003,7 @@ packages: dependencies: esbuild: 0.19.10 postcss: 8.4.32 - rollup: 4.9.1 + rollup: 4.10.0 optionalDependencies: fsevents: 2.3.3 dev: true @@ -1557,6 +2019,10 @@ packages: vite: 5.0.10 dev: true + /w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + dev: false + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true