From ef1c429f1114d9ab4c8b1a4d68c05cd7485c590b Mon Sep 17 00:00:00 2001 From: Anto Subash Date: Thu, 26 Mar 2026 23:54:36 +0100 Subject: [PATCH] refactor(pagebuilder): migrate to @puckeditor/core and auto-load module CSS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace @measured/puck@0.18 with @puckeditor/core@0.21 (package rename, same API). Add automatic CSS injection in resolvePage() so modules no longer need to manually load their stylesheets at runtime. - Update all imports from @measured/puck to @puckeditor/core - CSS import path: @measured/puck/dist/index.css → @puckeditor/core/puck.css - Move build-time CSS import to Pages/index.ts entry point - Delete puck/load-css.ts and remove useEffect(loadPuckCss) from views - ensureModuleCss() in resolve-page.ts handles CSS for all modules --- .../SimpleModule.PageBuilder/Pages/index.ts | 2 + .../SimpleModule.PageBuilder/Views/Editor.tsx | 5 +- .../SimpleModule.PageBuilder/Views/Viewer.tsx | 6 +- .../src/SimpleModule.PageBuilder/package.json | 2 +- .../puck/components/ButtonBlock.tsx | 2 +- .../puck/components/Card.tsx | 2 +- .../puck/components/Flex.tsx | 2 +- .../puck/components/Grid.tsx | 2 +- .../puck/components/Heading.tsx | 2 +- .../puck/components/Hero.tsx | 2 +- .../puck/components/Logos.tsx | 2 +- .../puck/components/Space.tsx | 2 +- .../puck/components/Stats.tsx | 2 +- .../puck/components/Text.tsx | 2 +- .../SimpleModule.PageBuilder/puck/config.tsx | 2 +- .../SimpleModule.PageBuilder/puck/load-css.ts | 12 - package-lock.json | 1004 +++++++++++++++-- .../SimpleModule.Client/src/resolve-page.ts | 21 + 18 files changed, 935 insertions(+), 139 deletions(-) delete mode 100644 modules/PageBuilder/src/SimpleModule.PageBuilder/puck/load-css.ts diff --git a/modules/PageBuilder/src/SimpleModule.PageBuilder/Pages/index.ts b/modules/PageBuilder/src/SimpleModule.PageBuilder/Pages/index.ts index 19232ef9..ff019059 100644 --- a/modules/PageBuilder/src/SimpleModule.PageBuilder/Pages/index.ts +++ b/modules/PageBuilder/src/SimpleModule.PageBuilder/Pages/index.ts @@ -1,3 +1,5 @@ +import '@puckeditor/core/puck.css'; + export const pages: Record = { 'PageBuilder/Manage': () => import('../Views/Manage'), 'PageBuilder/Editor': () => import('../Views/Editor'), diff --git a/modules/PageBuilder/src/SimpleModule.PageBuilder/Views/Editor.tsx b/modules/PageBuilder/src/SimpleModule.PageBuilder/Views/Editor.tsx index 9f514fd3..ec6d5e6d 100644 --- a/modules/PageBuilder/src/SimpleModule.PageBuilder/Views/Editor.tsx +++ b/modules/PageBuilder/src/SimpleModule.PageBuilder/Views/Editor.tsx @@ -1,5 +1,5 @@ import { router } from '@inertiajs/react'; -import { Puck, usePuck } from '@measured/puck'; +import { Puck, usePuck } from '@puckeditor/core'; import { Button, Card, @@ -16,7 +16,6 @@ import { import { useCallback, useEffect, useState } from 'react'; import { createPortal } from 'react-dom'; import { puckConfig } from '../puck/config'; -import { loadPuckCss } from '../puck/load-css'; import type { Page, PageTemplate } from '../types'; interface Props { @@ -121,8 +120,6 @@ function HeaderActions({ page }: { page: Page | null }) { export default function Editor({ page, templates }: Props) { const [showTemplatePicker, setShowTemplatePicker] = useState(!page && !!templates?.length); - useEffect(() => loadPuckCss(), []); - // Hide the Blazor shell (sidebar + toggle) so the editor has full screen useEffect(() => { const sidebar = document.getElementById('app-sidebar'); diff --git a/modules/PageBuilder/src/SimpleModule.PageBuilder/Views/Viewer.tsx b/modules/PageBuilder/src/SimpleModule.PageBuilder/Views/Viewer.tsx index 9d63f455..fcfdf65b 100644 --- a/modules/PageBuilder/src/SimpleModule.PageBuilder/Views/Viewer.tsx +++ b/modules/PageBuilder/src/SimpleModule.PageBuilder/Views/Viewer.tsx @@ -1,8 +1,7 @@ -import { Render } from '@measured/puck/rsc'; +import { Render } from '@puckeditor/core/rsc'; import { Alert, AlertDescription, Container } from '@simplemodule/ui'; -import { useEffect, useMemo } from 'react'; +import { useMemo } from 'react'; import { puckConfig } from '../puck/config'; -import { loadPuckCss } from '../puck/load-css'; import type { Page } from '../types'; interface Props { @@ -11,7 +10,6 @@ interface Props { } export default function Viewer({ page, isDraft }: Props) { - useEffect(() => loadPuckCss(), []); const data = useMemo(() => { try { const parsed = JSON.parse(page.content); diff --git a/modules/PageBuilder/src/SimpleModule.PageBuilder/package.json b/modules/PageBuilder/src/SimpleModule.PageBuilder/package.json index 5baa0a1a..99e7f503 100644 --- a/modules/PageBuilder/src/SimpleModule.PageBuilder/package.json +++ b/modules/PageBuilder/src/SimpleModule.PageBuilder/package.json @@ -12,6 +12,6 @@ "react-dom": "^19.0.0" }, "dependencies": { - "@measured/puck": "^0.18.0" + "@puckeditor/core": "^0.21.1" } } diff --git a/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/ButtonBlock.tsx b/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/ButtonBlock.tsx index 7ff6913d..efe49838 100644 --- a/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/ButtonBlock.tsx +++ b/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/ButtonBlock.tsx @@ -1,4 +1,4 @@ -import type { ComponentConfig } from '@measured/puck'; +import type { ComponentConfig } from '@puckeditor/core'; export type ButtonBlockProps = { label: string; diff --git a/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Card.tsx b/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Card.tsx index 26203a03..d443ace4 100644 --- a/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Card.tsx +++ b/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Card.tsx @@ -1,4 +1,4 @@ -import type { ComponentConfig } from '@measured/puck'; +import type { ComponentConfig } from '@puckeditor/core'; export type CardProps = { title: string; diff --git a/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Flex.tsx b/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Flex.tsx index a58f1ade..82251c61 100644 --- a/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Flex.tsx +++ b/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Flex.tsx @@ -1,4 +1,4 @@ -import type { ComponentConfig } from '@measured/puck'; +import type { ComponentConfig } from '@puckeditor/core'; export type FlexProps = { direction: 'row' | 'column'; diff --git a/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Grid.tsx b/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Grid.tsx index a713682a..90794fd8 100644 --- a/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Grid.tsx +++ b/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Grid.tsx @@ -1,4 +1,4 @@ -import type { ComponentConfig } from '@measured/puck'; +import type { ComponentConfig } from '@puckeditor/core'; export type GridProps = { columns: number; diff --git a/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Heading.tsx b/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Heading.tsx index 93bcf524..8231afaa 100644 --- a/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Heading.tsx +++ b/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Heading.tsx @@ -1,4 +1,4 @@ -import type { ComponentConfig } from '@measured/puck'; +import type { ComponentConfig } from '@puckeditor/core'; export type HeadingProps = { text: string; diff --git a/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Hero.tsx b/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Hero.tsx index bdbae120..d58b129a 100644 --- a/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Hero.tsx +++ b/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Hero.tsx @@ -1,4 +1,4 @@ -import type { ComponentConfig } from '@measured/puck'; +import type { ComponentConfig } from '@puckeditor/core'; export type HeroProps = { title: string; diff --git a/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Logos.tsx b/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Logos.tsx index 4f48d968..d9eb3b2a 100644 --- a/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Logos.tsx +++ b/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Logos.tsx @@ -1,4 +1,4 @@ -import type { ComponentConfig } from '@measured/puck'; +import type { ComponentConfig } from '@puckeditor/core'; export type LogosProps = { logos: { src: string; alt: string }[]; diff --git a/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Space.tsx b/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Space.tsx index febb1685..0c949148 100644 --- a/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Space.tsx +++ b/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Space.tsx @@ -1,4 +1,4 @@ -import type { ComponentConfig } from '@measured/puck'; +import type { ComponentConfig } from '@puckeditor/core'; export type SpaceProps = { size: string; diff --git a/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Stats.tsx b/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Stats.tsx index a2d5799b..17fe195b 100644 --- a/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Stats.tsx +++ b/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Stats.tsx @@ -1,4 +1,4 @@ -import type { ComponentConfig } from '@measured/puck'; +import type { ComponentConfig } from '@puckeditor/core'; export type StatsProps = { items: { value: string; label: string }[]; diff --git a/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Text.tsx b/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Text.tsx index 16a0251d..b3137133 100644 --- a/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Text.tsx +++ b/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/components/Text.tsx @@ -1,4 +1,4 @@ -import type { ComponentConfig } from '@measured/puck'; +import type { ComponentConfig } from '@puckeditor/core'; export type TextProps = { text: string; diff --git a/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/config.tsx b/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/config.tsx index 074f201b..8f7a37d2 100644 --- a/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/config.tsx +++ b/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/config.tsx @@ -1,4 +1,4 @@ -import type { Config } from '@measured/puck'; +import type { Config } from '@puckeditor/core'; import { ButtonBlock } from './components/ButtonBlock'; import { Card } from './components/Card'; import { Flex } from './components/Flex'; diff --git a/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/load-css.ts b/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/load-css.ts deleted file mode 100644 index fb2e60b2..00000000 --- a/modules/PageBuilder/src/SimpleModule.PageBuilder/puck/load-css.ts +++ /dev/null @@ -1,12 +0,0 @@ -import '@measured/puck/dist/index.css'; - -const CSS_ID = 'puck-editor-css'; - -export function loadPuckCss(): void { - if (document.getElementById(CSS_ID)) return; - const link = document.createElement('link'); - link.id = CSS_ID; - link.rel = 'stylesheet'; - link.href = '/_content/PageBuilder/pagebuilder.css'; - document.head.appendChild(link); -} diff --git a/package-lock.json b/package-lock.json index 340d6bb1..a7e863e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -147,7 +147,7 @@ "name": "@simplemodule/pagebuilder", "version": "0.0.0", "dependencies": { - "@measured/puck": "^0.18.0" + "@puckeditor/core": "^0.21.1" }, "peerDependencies": { "react": "^19.0.0", @@ -625,87 +625,6 @@ "integrity": "sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA==", "license": "MIT" }, - "node_modules/@dnd-kit/abstract": { - "version": "0.0.7-beta-20250130032138", - "resolved": "https://registry.npmjs.org/@dnd-kit/abstract/-/abstract-0.0.7-beta-20250130032138.tgz", - "integrity": "sha512-CFprqfJTtvSqq6ST7AEu41M1CIMk3lko5JNggTsx9seuqodJ0kCqBDul92BBWoAxPiRuQPm+TrK5vijj1tO7rg==", - "license": "MIT", - "dependencies": { - "@dnd-kit/geometry": "0.0.7-beta-20250130032138", - "@dnd-kit/state": "0.0.7-beta-20250130032138", - "tslib": "^2.6.2" - } - }, - "node_modules/@dnd-kit/collision": { - "version": "0.0.7-beta-20250130032138", - "resolved": "https://registry.npmjs.org/@dnd-kit/collision/-/collision-0.0.7-beta-20250130032138.tgz", - "integrity": "sha512-IlR3Qi1Fwc+DFDIdxHCcuolv7+l+M/0KAXdW5gd8m4y5sfW1do1pogAcRA6qNHcUvlUtbsdINf/CzFoztMJ5Bw==", - "license": "MIT", - "dependencies": { - "@dnd-kit/abstract": "0.0.7-beta-20250130032138", - "@dnd-kit/geometry": "0.0.7-beta-20250130032138", - "tslib": "^2.6.2" - } - }, - "node_modules/@dnd-kit/dom": { - "version": "0.0.7-beta-20250130032138", - "resolved": "https://registry.npmjs.org/@dnd-kit/dom/-/dom-0.0.7-beta-20250130032138.tgz", - "integrity": "sha512-LuySH+UkuvlNgMGDfRPe00cSbRMxyE9PbVNfUEmsnXUmltSW9ht5jVZrkQYAI8kZB3y7ry8h1fZtK/dOI3QFBg==", - "license": "MIT", - "dependencies": { - "@dnd-kit/abstract": "0.0.7-beta-20250130032138", - "@dnd-kit/collision": "0.0.7-beta-20250130032138", - "@dnd-kit/geometry": "0.0.7-beta-20250130032138", - "@dnd-kit/state": "0.0.7-beta-20250130032138", - "tslib": "^2.6.2" - } - }, - "node_modules/@dnd-kit/geometry": { - "version": "0.0.7-beta-20250130032138", - "resolved": "https://registry.npmjs.org/@dnd-kit/geometry/-/geometry-0.0.7-beta-20250130032138.tgz", - "integrity": "sha512-XfXqVq+LdMt5VKTjiyhvCcc68xRvD9xZilA52mdODN1qM3wh5ezpe17MyjlqefqH+sratpjmZwifHk2CONRWeg==", - "license": "MIT", - "dependencies": { - "@dnd-kit/state": "0.0.7-beta-20250130032138", - "tslib": "^2.6.2" - } - }, - "node_modules/@dnd-kit/helpers": { - "version": "0.0.7-beta-20250130032138", - "resolved": "https://registry.npmjs.org/@dnd-kit/helpers/-/helpers-0.0.7-beta-20250130032138.tgz", - "integrity": "sha512-KzZhgi3zoSJMSEwSL+6d/8GS2FfvY1s5wpIUPxEAgJM9ati+iU8uFL4T5qgxeTt8LVxobyFRzI5rVisUGgSICA==", - "license": "MIT", - "dependencies": { - "@dnd-kit/abstract": "0.0.7-beta-20250130032138", - "tslib": "^2.6.2" - } - }, - "node_modules/@dnd-kit/react": { - "version": "0.0.7-beta-20250130032138", - "resolved": "https://registry.npmjs.org/@dnd-kit/react/-/react-0.0.7-beta-20250130032138.tgz", - "integrity": "sha512-JsBHxVGoJlmFMt0mo6/7mwasrvq09Iz/uFUXcX/M7ob8UjdthNjL5y9vk8VGnJlka7yMHQxEGHJvQs6yh+FWow==", - "license": "MIT", - "dependencies": { - "@dnd-kit/abstract": "0.0.7-beta-20250130032138", - "@dnd-kit/dom": "0.0.7-beta-20250130032138", - "@dnd-kit/state": "0.0.7-beta-20250130032138", - "tslib": "^2.6.2" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@dnd-kit/state": { - "version": "0.0.7-beta-20250130032138", - "resolved": "https://registry.npmjs.org/@dnd-kit/state/-/state-0.0.7-beta-20250130032138.tgz", - "integrity": "sha512-xBW0LTG+jzXbdeha35uAlvZhO4M6F81fq7vpA54nodIu/RkBIB38NhnReMv/UrVRHxaZlwILDpW/3oHGu5h2jg==", - "license": "MIT", - "dependencies": { - "@preact/signals-core": "^1.6.0", - "tslib": "^2.6.2" - } - }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.12", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", @@ -1147,6 +1066,7 @@ "node_modules/@floating-ui/dom": { "version": "1.7.6", "license": "MIT", + "peer": true, "dependencies": { "@floating-ui/core": "^1.7.5", "@floating-ui/utils": "^0.2.11" @@ -1233,26 +1153,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@measured/puck": { - "version": "0.18.3", - "resolved": "https://registry.npmjs.org/@measured/puck/-/puck-0.18.3.tgz", - "integrity": "sha512-mw78Z7Ykk4LbyM+8n3CPsjI41SyMg1dOfYoV3VSWJiZWkMj47x6DJS6SdwfaNSyseyPpcSx6sEbL6BaOBAVoHQ==", - "deprecated": "Puck has moved. Please use @puckeditor/core instead: https://www.npmjs.com/package/@puckeditor/core", - "license": "MIT", - "dependencies": { - "@dnd-kit/helpers": "0.0.7-beta-20250130032138", - "@dnd-kit/react": "0.0.7-beta-20250130032138", - "deep-diff": "^1.0.2", - "object-hash": "^3.0.0", - "react-hotkeys-hook": "^4.6.1", - "use-debounce": "^9.0.4", - "uuid": "^9.0.1", - "zustand": "^5.0.2" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0" - } - }, "node_modules/@playwright/test": { "version": "1.58.2", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.2.tgz", @@ -1279,6 +1179,130 @@ "url": "https://opencollective.com/preact" } }, + "node_modules/@puckeditor/core": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@puckeditor/core/-/core-0.21.1.tgz", + "integrity": "sha512-Mk25WAHR8QLzHk+BtOO4bOu+y3pjzo0GowMHAJKNhrbxGVh3ETJx/bAZHaxA9dv8lKyuqK9a9AeRr7HYgg/sVw==", + "license": "MIT", + "dependencies": { + "@dnd-kit/helpers": "0.1.18", + "@dnd-kit/react": "0.1.18", + "@radix-ui/react-popover": "^1.1.15", + "@tiptap/core": "^3.11.1", + "@tiptap/extension-blockquote": "^3.11.1", + "@tiptap/extension-bold": "^3.11.1", + "@tiptap/extension-code": "^3.11.1", + "@tiptap/extension-code-block": "^3.11.1", + "@tiptap/extension-document": "^3.11.1", + "@tiptap/extension-hard-break": "^3.11.1", + "@tiptap/extension-heading": "^3.11.1", + "@tiptap/extension-horizontal-rule": "^3.11.1", + "@tiptap/extension-italic": "^3.11.1", + "@tiptap/extension-link": "^3.11.1", + "@tiptap/extension-list": "^3.11.1", + "@tiptap/extension-paragraph": "^3.11.1", + "@tiptap/extension-strike": "^3.11.1", + "@tiptap/extension-text": "^3.11.1", + "@tiptap/extension-text-align": "^3.11.1", + "@tiptap/extension-underline": "^3.11.1", + "@tiptap/html": "^3.11.1", + "@tiptap/pm": "^3.11.1", + "@tiptap/react": "^3.11.1", + "deep-diff": "^1.0.2", + "fast-equals": "5.2.2", + "flat": "^5.0.2", + "happy-dom": "^20.0.10", + "object-hash": "^3.0.0", + "react-hotkeys-hook": "^4.6.1", + "use-debounce": "^9.0.4", + "uuid": "^9.0.1", + "zustand": "^5.0.3" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@puckeditor/core/node_modules/@dnd-kit/abstract": { + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/@dnd-kit/abstract/-/abstract-0.1.21.tgz", + "integrity": "sha512-6sJut6/D21xPIK8EFMu+JJeF+fBCOmQKN1BRpeUYFi5m9P1CJpTYbBwfI107h7PHObI6a5bsckiKkRpF2orHpw==", + "license": "MIT", + "dependencies": { + "@dnd-kit/geometry": "^0.1.21", + "@dnd-kit/state": "^0.1.21", + "tslib": "^2.6.2" + } + }, + "node_modules/@puckeditor/core/node_modules/@dnd-kit/collision": { + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/@dnd-kit/collision/-/collision-0.1.21.tgz", + "integrity": "sha512-9AJ4NbuwGDexxMCZXZyKdNQhbAe93p6C6IezQaDaWmdCqZHMHmC3+ul7pGefBQfOooSarGwIf8Bn182o9SMa1A==", + "license": "MIT", + "dependencies": { + "@dnd-kit/abstract": "^0.1.21", + "@dnd-kit/geometry": "^0.1.21", + "tslib": "^2.6.2" + } + }, + "node_modules/@puckeditor/core/node_modules/@dnd-kit/dom": { + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/@dnd-kit/dom/-/dom-0.1.21.tgz", + "integrity": "sha512-6UDc1y2Y3oLQKArGlgCrZxz5pdEjRSiQujXOn5JdbuWvKqTdUR5RTYDeicr+y2sVm3liXjTqs3WlUoV+eqhqUQ==", + "license": "MIT", + "dependencies": { + "@dnd-kit/abstract": "^0.1.21", + "@dnd-kit/collision": "^0.1.21", + "@dnd-kit/geometry": "^0.1.21", + "@dnd-kit/state": "^0.1.21", + "tslib": "^2.6.2" + } + }, + "node_modules/@puckeditor/core/node_modules/@dnd-kit/geometry": { + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/@dnd-kit/geometry/-/geometry-0.1.21.tgz", + "integrity": "sha512-Tir97wNJbopN2HgkD7AjAcoB3vvrVuUHvwdPALmNDUH0fWR637c4MKQ66YjjZAbUEAR8KL6mlDiHH4MzTLd7CQ==", + "license": "MIT", + "dependencies": { + "@dnd-kit/state": "^0.1.21", + "tslib": "^2.6.2" + } + }, + "node_modules/@puckeditor/core/node_modules/@dnd-kit/helpers": { + "version": "0.1.18", + "resolved": "https://registry.npmjs.org/@dnd-kit/helpers/-/helpers-0.1.18.tgz", + "integrity": "sha512-k4hVXIb8ysPt+J0KOxbBTc6rG0JSlsrNevI/fCHLbyXvEyj1imxl7yOaAQX13cAZnte88db6JvbgsSWlVjtxbw==", + "license": "MIT", + "dependencies": { + "@dnd-kit/abstract": "^0.1.18", + "tslib": "^2.6.2" + } + }, + "node_modules/@puckeditor/core/node_modules/@dnd-kit/react": { + "version": "0.1.18", + "resolved": "https://registry.npmjs.org/@dnd-kit/react/-/react-0.1.18.tgz", + "integrity": "sha512-OCeCO9WbKnN4rVlEOEe9QWxSIFzP0m/fBFmVYfu2pDSb4pemRkfrvCsI/FH3jonuESYS8qYnN9vc8Vp3EiCWCA==", + "license": "MIT", + "dependencies": { + "@dnd-kit/abstract": "^0.1.18", + "@dnd-kit/dom": "^0.1.18", + "@dnd-kit/state": "^0.1.18", + "tslib": "^2.6.2" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@puckeditor/core/node_modules/@dnd-kit/state": { + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/@dnd-kit/state/-/state-0.1.21.tgz", + "integrity": "sha512-pdhntEPvn/QttcF295bOJpWiLsRqA/Iczh1ODOJUxGiR+E4GkYVz9VapNNm9gDq6ST0tr/e1Q2xBztUHlJqQgA==", + "license": "MIT", + "dependencies": { + "@preact/signals-core": "^1.10.0", + "tslib": "^2.6.2" + } + }, "node_modules/@radix-ui/number": { "version": "1.1.1", "license": "MIT" @@ -2686,6 +2710,12 @@ "url": "https://opencollective.com/immer" } }, + "node_modules/@remirror/core-constants": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz", + "integrity": "sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==", + "license": "MIT" + }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.27", "dev": true, @@ -3353,6 +3383,351 @@ "vite": "^5.2.0 || ^6 || ^7" } }, + "node_modules/@tiptap/core": { + "version": "3.20.5", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.20.5.tgz", + "integrity": "sha512-Pkjd41UJ4F6Z8cPV+gEvqnt1VhY2g66xMjbpxREs0ECA5jRezCNKSZcc2pueQRTMtmn1SaSzGM9U/ifhVlVYOA==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/pm": "^3.20.5" + } + }, + "node_modules/@tiptap/extension-blockquote": { + "version": "3.20.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-3.20.5.tgz", + "integrity": "sha512-0wU6H/MWWes0rGzgSW6MMU6YDs/3ofUDkqmqCqmb+Siu1ZD0bpzOYpBtujgOYDY8moB9+zCE3G9HSYGcmZxHew==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^3.20.5" + } + }, + "node_modules/@tiptap/extension-bold": { + "version": "3.20.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-3.20.5.tgz", + "integrity": "sha512-hraiiWkF58n8Jy0Wl3OGwjCTrGWwZZxez/IlexrzKQ/nMFdjDpensZucWwu59zhAM9fqZwGSLDtCFuak03WKnA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^3.20.5" + } + }, + "node_modules/@tiptap/extension-bubble-menu": { + "version": "3.20.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-3.20.5.tgz", + "integrity": "sha512-6FsASu4o32bp3FzBVb5N2ERjrBy83DtJQAGv9/ycYqsgv2kq9DNlhvtNI7GPiTW7a73ZcImjIX+jEWrARbzOlQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^3.20.5", + "@tiptap/pm": "^3.20.5" + } + }, + "node_modules/@tiptap/extension-code": { + "version": "3.20.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-3.20.5.tgz", + "integrity": "sha512-jBZK/CfdMvg1gkNK/zNAk02IExpBPwUfNLRPiJvGhReL2Q73naKxZGQGp+5Lej9VaeFB70UKuRma/iIzuZbgsA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^3.20.5" + } + }, + "node_modules/@tiptap/extension-code-block": { + "version": "3.20.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-3.20.5.tgz", + "integrity": "sha512-0YZnqfqZ1IjzKBM4aezw8j3LZWJFEfs4+mbizHNlnZSYpKzpESYLeaLWGO5SpqF9Z8tmYmSoCaf0fqi5LwgdIA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^3.20.5", + "@tiptap/pm": "^3.20.5" + } + }, + "node_modules/@tiptap/extension-document": { + "version": "3.20.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-3.20.5.tgz", + "integrity": "sha512-BpNGHtOTAjjs/6QbkrafMTlaJqb0gsPngFzd5rB0csxx7rYRE9nIEY+oZ44qMw161+2YB4u20L17SX2mUJANBw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^3.20.5" + } + }, + "node_modules/@tiptap/extension-floating-menu": { + "version": "3.20.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-3.20.5.tgz", + "integrity": "sha512-mTzBNUeAocinrxa5xV+5hGnnNCQB0pVI1GSBwUTHwdB7jNwBqfKAILmtLZONgmhxKWLmGa6WCA59sk+yDI+N0A==", + "license": "MIT", + "optional": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@floating-ui/dom": "^1.0.0", + "@tiptap/core": "^3.20.5", + "@tiptap/pm": "^3.20.5" + } + }, + "node_modules/@tiptap/extension-hard-break": { + "version": "3.20.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-3.20.5.tgz", + "integrity": "sha512-+aILNDO7BsXf0IJ4/0BYh570usFK3Q1t/ZQd8zhHuO2ATeWeDVu1x2F+ouFS4X8fmoCcioMzw15aoz93GET6kQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^3.20.5" + } + }, + "node_modules/@tiptap/extension-heading": { + "version": "3.20.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-3.20.5.tgz", + "integrity": "sha512-zXxuIrCSpzgXzRxgCbRE8DZ/NFuinVaniE3pp/9LYAWgRlsAyko8pI2XrVvzzXmDQqRGi2HrNVkNy1yutUWSWQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^3.20.5" + } + }, + "node_modules/@tiptap/extension-horizontal-rule": { + "version": "3.20.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-3.20.5.tgz", + "integrity": "sha512-4UtpUHg8cRzxWjJUGtni5VnXYbhsO7ygf1H1pr4Rv63XMBg9lfYDeSwByIuVy9biEFP7eGEFnezzb5Zlh1btmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^3.20.5", + "@tiptap/pm": "^3.20.5" + } + }, + "node_modules/@tiptap/extension-italic": { + "version": "3.20.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-3.20.5.tgz", + "integrity": "sha512-7bZCgdJVTvhR5vSmNgFQbGvgRoC6m26KcUpHqWiKA95kLL5Wk4YlMCIqdiDpvJ1eakeFEvDcGZvFLg5+1NiQ+w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^3.20.5" + } + }, + "node_modules/@tiptap/extension-link": { + "version": "3.20.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-3.20.5.tgz", + "integrity": "sha512-0PukrSYnHX2CrGSThlKfQWxpPWmL7QAvdpDUraKknGvVNSH7tUjchTshy5JdLrn/SQAU92REowRCB6zzCNEFjA==", + "license": "MIT", + "dependencies": { + "linkifyjs": "^4.3.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^3.20.5", + "@tiptap/pm": "^3.20.5" + } + }, + "node_modules/@tiptap/extension-list": { + "version": "3.20.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list/-/extension-list-3.20.5.tgz", + "integrity": "sha512-s+Y8Q7Orq+WQiwgFB/VPMYZe+6EAR2F69xCpvOynlzTInLO4cF6QpXomuGEYAZxLHe8ZBmeIaR7y8MH/OgjrDw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^3.20.5", + "@tiptap/pm": "^3.20.5" + } + }, + "node_modules/@tiptap/extension-paragraph": { + "version": "3.20.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-3.20.5.tgz", + "integrity": "sha512-mwuhwmff67IpGfOViyRvUC14IlkpsOnB+hSExVnq5+hCntjt/Cr2Z8GGOgzHeIM2FIS0UqX9Lv/b6ttUg4+Now==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^3.20.5" + } + }, + "node_modules/@tiptap/extension-strike": { + "version": "3.20.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-3.20.5.tgz", + "integrity": "sha512-uwhvmfS4ciGYJRLUg0AHbWsprMCwyWVWd2RXOLRm0ZQeWkvzonPXZhJvzIhIgsFkPLj/dsN5t0+LdiK4UQMnyA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^3.20.5" + } + }, + "node_modules/@tiptap/extension-text": { + "version": "3.20.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-3.20.5.tgz", + "integrity": "sha512-DMa9g5cH2d/Gx1KXtV7txTxaa6FBqgG8glmfug+N93VMb8sEZR1Yu1az++yAep4SGGq9GWIGZCUS3H6W66et6Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^3.20.5" + } + }, + "node_modules/@tiptap/extension-text-align": { + "version": "3.20.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-3.20.5.tgz", + "integrity": "sha512-r7xIt6AE1Zf6epMg2GLAD55YIqJewunQnLUeApLkcWdTNuCJqZUrmVIXUvTtj2Ivw0VIaPoCtnB+VBvXEuC3Kg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^3.20.5" + } + }, + "node_modules/@tiptap/extension-underline": { + "version": "3.20.5", + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-3.20.5.tgz", + "integrity": "sha512-HMhr5KIAqZsEhlN8RxKHr/ql1a8OvBa9fLf69IwUVFolBcDExHWUtaEV/axYVRQJvvIy2oKGJxlJWDZ4hkotHQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^3.20.5" + } + }, + "node_modules/@tiptap/html": { + "version": "3.20.5", + "resolved": "https://registry.npmjs.org/@tiptap/html/-/html-3.20.5.tgz", + "integrity": "sha512-IyUqfIVlYsMrbdI22AJDlzTWc/R8jMInjzav2Qrj+OPxarIW3f2b/knlI9FFgYauru3asplQmoRgx7gKnG7ruA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^3.20.5", + "@tiptap/pm": "^3.20.5", + "happy-dom": "^20.0.2" + } + }, + "node_modules/@tiptap/pm": { + "version": "3.20.5", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.20.5.tgz", + "integrity": "sha512-yJhDa7Chx2EqJMX/jlewBv0za7slf1dKHWYve1XaApuVHEkxl0Ul3EDbwnx316vIITkuFW/pWSwkSsAplyBeCw==", + "license": "MIT", + "peer": true, + "dependencies": { + "prosemirror-changeset": "^2.3.0", + "prosemirror-collab": "^1.3.1", + "prosemirror-commands": "^1.6.2", + "prosemirror-dropcursor": "^1.8.1", + "prosemirror-gapcursor": "^1.3.2", + "prosemirror-history": "^1.4.1", + "prosemirror-inputrules": "^1.4.0", + "prosemirror-keymap": "^1.2.2", + "prosemirror-markdown": "^1.13.1", + "prosemirror-menu": "^1.2.4", + "prosemirror-model": "^1.24.1", + "prosemirror-schema-basic": "^1.2.3", + "prosemirror-schema-list": "^1.5.0", + "prosemirror-state": "^1.4.3", + "prosemirror-tables": "^1.6.4", + "prosemirror-trailing-node": "^3.0.0", + "prosemirror-transform": "^1.10.2", + "prosemirror-view": "^1.38.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + } + }, + "node_modules/@tiptap/react": { + "version": "3.20.5", + "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-3.20.5.tgz", + "integrity": "sha512-in37o1Eo7JCflcHyK/SDfgkJBgX0LRN3LMk+NdLPTerRnC0zhGLQlpfBL4591TLTOUQde7QIrLv98smYO2mj+w==", + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "fast-equals": "^5.3.3", + "use-sync-external-store": "^1.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "optionalDependencies": { + "@tiptap/extension-bubble-menu": "^3.20.5", + "@tiptap/extension-floating-menu": "^3.20.5" + }, + "peerDependencies": { + "@tiptap/core": "^3.20.5", + "@tiptap/pm": "^3.20.5", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "@types/react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@tiptap/react/node_modules/fast-equals": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.0.tgz", + "integrity": "sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "dev": true, @@ -3457,6 +3832,12 @@ "version": "1.0.8", "license": "MIT" }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "license": "MIT" + }, "node_modules/@types/lodash": { "version": "4.17.24", "license": "MIT" @@ -3468,9 +3849,24 @@ "@types/lodash": "*" } }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "license": "MIT" + }, "node_modules/@types/node": { "version": "25.5.0", - "devOptional": true, "license": "MIT", "dependencies": { "undici-types": "~7.18.0" @@ -3486,7 +3882,6 @@ }, "node_modules/@types/react": { "version": "19.2.14", - "devOptional": true, "license": "MIT", "peer": true, "dependencies": { @@ -3495,7 +3890,6 @@ }, "node_modules/@types/react-dom": { "version": "19.2.3", - "devOptional": true, "license": "MIT", "peer": true, "peerDependencies": { @@ -3508,6 +3902,21 @@ "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", "license": "MIT" }, + "node_modules/@types/whatwg-mimetype": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-mimetype/-/whatwg-mimetype-3.0.2.tgz", + "integrity": "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@vitejs/plugin-react": { "version": "4.7.0", "dev": true, @@ -3547,6 +3956,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, "node_modules/aria-hidden": { "version": "1.2.6", "license": "MIT", @@ -3734,6 +4149,12 @@ "dev": true, "license": "MIT" }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "license": "MIT" + }, "node_modules/cross-env": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", @@ -3770,7 +4191,6 @@ }, "node_modules/csstype": { "version": "3.2.3", - "devOptional": true, "license": "MIT" }, "node_modules/d3-array": { @@ -4002,6 +4422,18 @@ "node": ">=10.13.0" } }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "license": "MIT", @@ -4097,12 +4529,33 @@ "node": ">=6" } }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eventemitter3": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "license": "MIT" }, + "node_modules/fast-equals": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz", + "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/fdir": { "version": "6.5.0", "license": "MIT", @@ -4129,6 +4582,15 @@ "node": ">=8" } }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, "node_modules/follow-redirects": { "version": "1.15.11", "funding": [ @@ -4252,6 +4714,24 @@ "dev": true, "license": "ISC" }, + "node_modules/happy-dom": { + "version": "20.8.8", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-20.8.8.tgz", + "integrity": "sha512-5/F8wxkNxYtsN0bXfMwIyNLZ9WYsoOYPbmoluqVJqv8KBUbcyKZawJ7uYK4WTX8IHBLYv+VXIwfeNDPy1oKMwQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": ">=20.0.0", + "@types/whatwg-mimetype": "^3.0.2", + "@types/ws": "^8.18.1", + "entities": "^7.0.1", + "whatwg-mimetype": "^3.0.0", + "ws": "^8.18.3" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/has-symbols": { "version": "1.1.0", "license": "MIT", @@ -4606,6 +5086,21 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/linkifyjs": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.3.2.tgz", + "integrity": "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==", + "license": "MIT" + }, "node_modules/locate-path": { "version": "5.0.0", "license": "MIT", @@ -4636,6 +5131,35 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/markdown-it": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "license": "MIT", @@ -4643,6 +5167,12 @@ "node": ">= 0.4" } }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "license": "MIT" + }, "node_modules/mime-db": { "version": "1.52.0", "license": "MIT", @@ -4705,6 +5235,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/orderedmap": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", + "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==", + "license": "MIT" + }, "node_modules/p-limit": { "version": "2.3.0", "license": "MIT", @@ -4847,10 +5383,217 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/prosemirror-changeset": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.4.0.tgz", + "integrity": "sha512-LvqH2v7Q2SF6yxatuPP2e8vSUKS/L+xAU7dPDC4RMyHMhZoGDfBC74mYuyYF4gLqOEG758wajtyhNnsTkuhvng==", + "license": "MIT", + "dependencies": { + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-collab": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz", + "integrity": "sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0" + } + }, + "node_modules/prosemirror-commands": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.1.tgz", + "integrity": "sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.10.2" + } + }, + "node_modules/prosemirror-dropcursor": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.2.tgz", + "integrity": "sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0", + "prosemirror-view": "^1.1.0" + } + }, + "node_modules/prosemirror-gapcursor": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.4.1.tgz", + "integrity": "sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==", + "license": "MIT", + "dependencies": { + "prosemirror-keymap": "^1.0.0", + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-view": "^1.0.0" + } + }, + "node_modules/prosemirror-history": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.5.0.tgz", + "integrity": "sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.31.0", + "rope-sequence": "^1.3.0" + } + }, + "node_modules/prosemirror-inputrules": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.5.1.tgz", + "integrity": "sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-keymap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz", + "integrity": "sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } + }, + "node_modules/prosemirror-markdown": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.4.tgz", + "integrity": "sha512-D98dm4cQ3Hs6EmjK500TdAOew4Z03EV71ajEFiWra3Upr7diytJsjF4mPV2dW+eK5uNectiRj0xFxYI9NLXDbw==", + "license": "MIT", + "dependencies": { + "@types/markdown-it": "^14.0.0", + "markdown-it": "^14.0.0", + "prosemirror-model": "^1.25.0" + } + }, + "node_modules/prosemirror-menu": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.3.0.tgz", + "integrity": "sha512-TImyPXCHPcDsSka2/lwJ6WjTASr4re/qWq1yoTTuLOqfXucwF6VcRa2LWCkM/EyTD1UO3CUwiH8qURJoWJRxwg==", + "license": "MIT", + "dependencies": { + "crelt": "^1.0.0", + "prosemirror-commands": "^1.0.0", + "prosemirror-history": "^1.0.0", + "prosemirror-state": "^1.0.0" + } + }, + "node_modules/prosemirror-model": { + "version": "1.25.4", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.4.tgz", + "integrity": "sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==", + "license": "MIT", + "peer": true, + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-schema-basic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.4.tgz", + "integrity": "sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.25.0" + } + }, + "node_modules/prosemirror-schema-list": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz", + "integrity": "sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.7.3" + } + }, + "node_modules/prosemirror-state": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.4.tgz", + "integrity": "sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==", + "license": "MIT", + "peer": true, + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.27.0" + } + }, + "node_modules/prosemirror-tables": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.8.5.tgz", + "integrity": "sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==", + "license": "MIT", + "dependencies": { + "prosemirror-keymap": "^1.2.3", + "prosemirror-model": "^1.25.4", + "prosemirror-state": "^1.4.4", + "prosemirror-transform": "^1.10.5", + "prosemirror-view": "^1.41.4" + } + }, + "node_modules/prosemirror-trailing-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-3.0.0.tgz", + "integrity": "sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==", + "license": "MIT", + "dependencies": { + "@remirror/core-constants": "3.0.0", + "escape-string-regexp": "^4.0.0" + }, + "peerDependencies": { + "prosemirror-model": "^1.22.1", + "prosemirror-state": "^1.4.2", + "prosemirror-view": "^1.33.8" + } + }, + "node_modules/prosemirror-transform": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.11.0.tgz", + "integrity": "sha512-4I7Ce4KpygXb9bkiPS3hTEk4dSHorfRw8uI0pE8IhxlK2GXsqv5tIA7JUSxtSu7u8APVOTtbUBxTmnHIxVkIJw==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.21.0" + } + }, + "node_modules/prosemirror-view": { + "version": "1.41.7", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.41.7.tgz", + "integrity": "sha512-jUwKNCEIGiqdvhlS91/2QAg21e4dfU5bH2iwmSDQeosXJgKF7smG0YSplOWK0cjSNgIqXe7VXqo7EIfUFJdt3w==", + "license": "MIT", + "peer": true, + "dependencies": { + "prosemirror-model": "^1.20.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "license": "MIT" }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/qrcode": { "version": "1.5.4", "license": "MIT", @@ -5137,6 +5880,12 @@ "fsevents": "~2.3.2" } }, + "node_modules/rope-sequence": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", + "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==", + "license": "MIT" + }, "node_modules/scheduler": { "version": "0.27.0", "license": "MIT" @@ -5329,9 +6078,14 @@ "node": ">=14.17" } }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "license": "MIT" + }, "node_modules/undici-types": { "version": "7.18.2", - "devOptional": true, "license": "MIT" }, "node_modules/update-browserslist-db": { @@ -5530,6 +6284,21 @@ } } }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "license": "MIT" + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5562,6 +6331,27 @@ "node": ">=8" } }, + "node_modules/ws": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "license": "MIT", + "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 + } + } + }, "node_modules/y18n": { "version": "4.0.3", "license": "ISC" diff --git a/packages/SimpleModule.Client/src/resolve-page.ts b/packages/SimpleModule.Client/src/resolve-page.ts index a3a5dc36..5b93b593 100644 --- a/packages/SimpleModule.Client/src/resolve-page.ts +++ b/packages/SimpleModule.Client/src/resolve-page.ts @@ -1,9 +1,30 @@ +const loadedCss = new Set(); + +function ensureModuleCss(moduleName: string, cacheBuster: string | undefined) { + if (loadedCss.has(moduleName)) return; + loadedCss.add(moduleName); + + const suffix = cacheBuster ? `?v=${cacheBuster}` : ''; + const href = `/_content/${moduleName}/${moduleName.toLowerCase()}.css${suffix}`; + const link = document.createElement('link'); + link.rel = 'stylesheet'; + link.href = href; + link.onerror = () => { + // Module has no CSS — remove the broken link and suppress further attempts + link.remove(); + }; + document.head.appendChild(link); +} + export async function resolvePage(name: string) { const moduleName = name.split('/')[0]; const assemblyName = `SimpleModule.${moduleName}`; const cacheBuster = (document.querySelector('meta[name="cache-buster"]') as HTMLMetaElement) ?.content; const suffix = cacheBuster ? `?v=${cacheBuster}` : ''; + + ensureModuleCss(moduleName, cacheBuster); + const mod = await import( /* @vite-ignore */ `/_content/${assemblyName}/${assemblyName}.pages.js${suffix}`