Files
PaperClipAI/ui/package.json
T
Devin Foley fd1831ea3c Restore a single Lexical copy so the rich editor renders
Cherry-pick of the master fix onto the v2026.825.0-beta.1 base, so the
beta channel can ship a patched candidate without waiting for a full
rebase onto master.

The rich markdown editor fell back to its raw-source textarea on every
field, for any content including an empty one, with the render-time
error "LexicalBuilder.fromEditor: The given editor was created with
LexicalBuilder 0.48.0 but this version is 0.49.0. A project should have
exactly one copy of LexicalBuilder".

Root pnpm overrides pinned the Lexical family to 0.49.0 while
@mdxeditor/editor declares lexical ^0.48.0 — a caret on a 0.x version
pins the minor, so the override forced the editor past the only line it
supports (0.49 also carried breaking node-config changes). The override
list was incomplete besides: @lexical/extension, @lexical/history, and
@lexical/internal are reached transitively and stayed on 0.48, so the
graph mixed both lines and the LexicalBuilder invariant threw. The
browser bundle carried two @lexical/extension instances as a result.

Drop the Lexical entries from the root overrides (react, react-dom, and
rollup stay) and pin the app's own lexical and @lexical/link to 0.48.0,
so the whole graph resolves through the editor's supported line. The app
subclasses LinkNode for mention-aware links and registers it into the
editor's instance, so node identity depends on this being one copy.

Add a resolution-graph test that fails fast on a mixed graph rather than
waiting for a render crash: it asserts the app and the editor resolve
the same lexical copy, that @lexical/link and the transitively-reached
@lexical/extension sit on that version, and that the version satisfies
the editor's declared range.

The lockfile is regenerated against this base rather than taken from
master — the beta base predates several unrelated dependency bumps, so
master's lockfile does not describe this tree. Only Lexical resolutions
move; every other entry is unchanged. The conflict on ui/package.json
was lucide-react version drift, resolved in favour of this base.

Tested on the beta base: ui typecheck clean; the new resolution test
passes (3); mention-deletion, mention-aware-link-node, and
MarkdownEditor suites pass (42); the lockfile now resolves the whole
Lexical family to a single 0.48.0 line; the built bundle went from two
LexicalBuilder registrations to one. A probe rendering the real editor
(no mock) returns no fallback for empty and plain-prose content, where
both previously fell back. Prose containing bare angle brackets still
falls back on this base — that is a separate editor bug, not present on
master either, and out of scope here.
2026-08-27 09:31:40 -07:00

93 lines
3.1 KiB
JSON

{
"name": "@paperclipai/ui",
"version": "0.3.1",
"description": "Prebuilt Paperclip board UI assets.",
"license": "MIT",
"homepage": "https://github.com/paperclipai/paperclip",
"bugs": {
"url": "https://github.com/paperclipai/paperclip/issues"
},
"repository": {
"type": "git",
"url": "https://github.com/paperclipai/paperclip",
"directory": "ui"
},
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"storybook": "storybook dev -p 6006 -c storybook/.storybook",
"build-storybook": "storybook build -c storybook/.storybook -o storybook-static",
"preview": "vite preview",
"typecheck": "tsc -b",
"clean": "rm -rf dist storybook-static tsconfig.tsbuildinfo",
"prepack": "rm -f package.dev.json && cp package.json package.dev.json && node ../scripts/generate-ui-package-json.mjs",
"postpack": "if [ -f package.dev.json ]; then mv package.dev.json package.json; fi"
},
"publishConfig": {
"access": "public"
},
"dependencies": {
"@assistant-ui/react": "0.15.16",
"@base-ui/react": "^1.7.0",
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@lexical/link": "0.48.0",
"@mdxeditor/editor": "^4.2.1",
"@paperclipai/adapter-claude-local": "workspace:*",
"@paperclipai/adapter-codex-local": "workspace:*",
"@paperclipai/adapter-cursor-cloud": "workspace:*",
"@paperclipai/adapter-cursor-local": "workspace:*",
"@paperclipai/adapter-gemini-local": "workspace:*",
"@paperclipai/adapter-grok-local": "workspace:*",
"@paperclipai/adapter-kimi-local": "workspace:*",
"@paperclipai/adapter-openclaw-gateway": "workspace:*",
"@paperclipai/adapter-opencode-local": "workspace:*",
"@paperclipai/adapter-pi-local": "workspace:*",
"@paperclipai/adapter-utils": "workspace:*",
"@paperclipai/hermes-paperclip-adapter": "workspace:*",
"@paperclipai/shared": "workspace:*",
"@radix-ui/react-slot": "^1.3.0",
"@tailwindcss/typography": "^0.5.20",
"@tanstack/react-query": "^5.101.4",
"@xterm/addon-fit": "^0.11.0",
"@xterm/xterm": "^6.0.0",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"cmdk": "^1.1.1",
"i18next": "^26.3.6",
"lexical": "0.48.0",
"lucide-react": "^0.577.0",
"mermaid": "^11.16.1",
"motion": "^12.42.2",
"radix-ui": "^1.6.7",
"react": "^19.2.8",
"react-dom": "^19.2.8",
"react-i18next": "^17.0.11",
"react-markdown": "^10.1.0",
"react-resizable-panels": "^4.12.3",
"react-router-dom": "^7.18.2",
"remark-gfm": "^4.0.1",
"tailwind-merge": "^3.6.0"
},
"devDependencies": {
"@storybook/addon-a11y": "10.5.10",
"@storybook/addon-docs": "10.5.8",
"@storybook/react-vite": "10.5.10",
"@tailwindcss/vite": "^4.3.3",
"@types/node": "^24.0.0",
"@types/react": "^19.2.18",
"@types/react-dom": "^19.2.4",
"@vitejs/plugin-react": "^5.2.0",
"storybook": "10.5.10",
"tailwindcss": "^4.3.3",
"typescript": "^5.7.3",
"vite": "^6.4.3",
"vitest": "^4.1.10"
},
"engines": {
"node": ">=24.11.0"
}
}