{"_id":"blintz","_rev":"5-5aef46e27597228943cd3ec5aba44767","name":"blintz","dist-tags":{"latest":"0.5.0"},"versions":{"0.1.0":{"name":"blintz","version":"0.1.0","keywords":["markdown","markdown-editor","wysiwyg","editor","react","milkdown","crepe","prosemirror","remark"],"author":{"name":"Dork Labs"},"license":"MIT","_id":"blintz@0.1.0","maintainers":[{"name":"dorkian","email":"dorian.collier@gmail.com"}],"homepage":"https://github.com/dork-labs/blintz#readme","bugs":{"url":"https://github.com/dork-labs/blintz/issues"},"dist":{"shasum":"ebb41eb94d1388b5729d5662387b689c0812591e","tarball":"https://registry.npmjs.org/blintz/-/blintz-0.1.0.tgz","fileCount":78,"integrity":"sha512-ouBjWfkLmRMgert8Q2j3GjJePCJrywyLGnBLQ6kiPFORhMOYfO9fpjIJf5PTvFhbMAxWruA6T9PEEmrZ2IRyCg==","signatures":[{"sig":"MEQCIEh7FDxgCmhKkr+h9//+pgPadCk5x7f18F9vaqpHIFE8AiBLj/x8ns/WE+bc63HwyWc93qAzKLcLEoi9cXA8rm4hEQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2048280},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/blintz.css"},"gitHead":"bbb8247c570f8f7608fa4cda9e0cc7646ba2bfec","scripts":{"build":"vite build","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"dorkian","email":"dorian.collier@gmail.com"},"repository":{"url":"git+https://github.com/dork-labs/blintz.git","type":"git","directory":"packages/blintz"},"_npmVersion":"10.9.7","description":"Blintz — a Vue-free React port of Milkdown's Crepe editor: the polished WYSIWYG markdown UX (slash menu, block drag handle, selection toolbar, rich node views) rebuilt as React components, with clean markdown round-tripping.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"22.22.2","dependencies":{"katex":"^0.17.0","dompurify":"^3.4.11","codemirror":"^6.0.2","remark-math":"^6.0.0","@milkdown/kit":"^7.21.2","lucide-static":"^1.21.0","@milkdown/react":"^7.21.2","@codemirror/view":"^6.43.1","@floating-ui/dom":"^1.7.6","unist-util-visit":"^5.0.0","@codemirror/state":"^6.6.0","@codemirror/commands":"^6.10.3","@codemirror/language":"^6.12.3","@milkdown/theme-nord":"^7.21.2","@codemirror/language-data":"^6.5.2","@codemirror/theme-one-dark":"^6.1.3","@prosemirror-adapter/react":"0.5.3","prosemirror-virtual-cursor":"^0.4.2"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","typescript":"^5.9.0","@types/react":"^19.2.0","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.2.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/blintz_0.1.0_1782343398786_0.15886734195536456","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"blintz","version":"0.2.0","keywords":["markdown","markdown-editor","wysiwyg","editor","react","milkdown","crepe","prosemirror","remark"],"author":{"name":"Dork Labs"},"license":"MIT","_id":"blintz@0.2.0","maintainers":[{"name":"dorkian","email":"dorian.collier@gmail.com"}],"homepage":"https://github.com/dork-labs/blintz#readme","bugs":{"url":"https://github.com/dork-labs/blintz/issues"},"dist":{"shasum":"5d00b28bc290d8059aef066dd10a595360357e79","tarball":"https://registry.npmjs.org/blintz/-/blintz-0.2.0.tgz","fileCount":80,"integrity":"sha512-+lm2KHXNren/TVHGPZ3cevyxgiFaJfwH/PpKYcGvJJZ5EixYiFGdhT+ZUhjqXnYMOMbwMMO5HLAAUjkbPAlCcQ==","signatures":[{"sig":"MEQCIAKtkWHbNjxWWWl0WBfmAD9Ifxhzdk/7kFEBZssOJKu4AiBPw/hosLEQutxKpMUJqjRmmdsmKGF+8bHftd0P1WsPUA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2058766},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/blintz.css"},"gitHead":"3602f55499c846453f0e2f4ad1b1bb59079d6cd6","scripts":{"build":"vite build","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"dorkian","email":"dorian.collier@gmail.com"},"repository":{"url":"git+https://github.com/dork-labs/blintz.git","type":"git","directory":"packages/blintz"},"_npmVersion":"11.11.0","description":"Blintz — a Vue-free React port of Milkdown's Crepe editor: the polished WYSIWYG markdown UX (slash menu, block drag handle, selection toolbar, rich node views) rebuilt as React components, with clean markdown round-tripping.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"24.14.1","dependencies":{"katex":"^0.17.0","dompurify":"^3.4.11","codemirror":"^6.0.2","remark-math":"^6.0.0","@milkdown/kit":"^7.21.2","lucide-static":"^1.21.0","@milkdown/react":"^7.21.2","@codemirror/view":"^6.43.1","@floating-ui/dom":"^1.7.6","unist-util-visit":"^5.0.0","@codemirror/state":"^6.6.0","@codemirror/commands":"^6.10.3","@codemirror/language":"^6.12.3","@milkdown/theme-nord":"^7.21.2","@codemirror/language-data":"^6.5.2","@codemirror/theme-one-dark":"^6.1.3","@prosemirror-adapter/react":"0.5.3","prosemirror-virtual-cursor":"^0.4.2"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","typescript":"^5.9.0","@types/react":"^19.2.0","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.2.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/blintz_0.2.0_1782523694690_0.780892590149717","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"blintz","version":"0.3.0","keywords":["markdown","markdown-editor","wysiwyg","editor","react","milkdown","crepe","prosemirror","remark"],"author":{"name":"Dork Labs"},"license":"MIT","_id":"blintz@0.3.0","maintainers":[{"name":"dorkian","email":"dorian.collier@gmail.com"}],"homepage":"https://github.com/dork-labs/blintz#readme","bugs":{"url":"https://github.com/dork-labs/blintz/issues"},"dist":{"shasum":"3e17324b60263675a0ad3952b61467fc624ef83c","tarball":"https://registry.npmjs.org/blintz/-/blintz-0.3.0.tgz","fileCount":83,"integrity":"sha512-BuE3legUXeRTieyRts3fVIPT7vMeJR+o1WdYbNNiO1tledj49dbqzm8Z3vHDRJP6UaJh0GupJf3gfJ+byqtbaA==","signatures":[{"sig":"MEUCIHPpJGMoKYJKFKe3GxHfsoMTh79oafoRRkurm0R0AzmVAiEApXouGmlAlzUX+p79TZL0o5JylFko4R9BjvdeLfaD2yg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2067443},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/blintz.css"},"gitHead":"dd0664c3d8f773cb3024fff4fb4427f71cd20e1f","scripts":{"build":"vite build","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"dorkian","email":"dorian.collier@gmail.com"},"repository":{"url":"git+https://github.com/dork-labs/blintz.git","type":"git","directory":"packages/blintz"},"_npmVersion":"11.11.0","description":"Blintz — a Vue-free React port of Milkdown's Crepe editor: the polished WYSIWYG markdown UX (slash menu, block drag handle, selection toolbar, rich node views) rebuilt as React components, with clean markdown round-tripping.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"24.14.1","dependencies":{"katex":"^0.17.0","dompurify":"^3.4.11","codemirror":"^6.0.2","remark-math":"^6.0.0","@milkdown/kit":"^7.21.2","lucide-static":"^1.21.0","@milkdown/react":"^7.21.2","@codemirror/view":"^6.43.1","@floating-ui/dom":"^1.7.6","unist-util-visit":"^5.0.0","@codemirror/state":"^6.6.0","remark-frontmatter":"^5.0.0","@codemirror/commands":"^6.10.3","@codemirror/language":"^6.12.3","@milkdown/theme-nord":"^7.21.2","@codemirror/language-data":"^6.5.2","@codemirror/theme-one-dark":"^6.1.3","@prosemirror-adapter/react":"0.5.3","prosemirror-virtual-cursor":"^0.4.2"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","typescript":"^5.9.0","@types/react":"^19.2.0","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.2.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/blintz_0.3.0_1782528372835_0.6773951965975029","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"blintz","version":"0.4.0","keywords":["markdown","markdown-editor","wysiwyg","editor","react","milkdown","crepe","prosemirror","remark"],"author":{"name":"Dork Labs"},"license":"MIT","_id":"blintz@0.4.0","maintainers":[{"name":"dorkian","email":"dorian.collier@gmail.com"}],"homepage":"https://github.com/dork-labs/blintz#readme","bugs":{"url":"https://github.com/dork-labs/blintz/issues"},"dist":{"shasum":"69a9ccae6bda66b55a37219d6a9e7f97c9c33668","tarball":"https://registry.npmjs.org/blintz/-/blintz-0.4.0.tgz","fileCount":83,"integrity":"sha512-mrwJnhsbJZs/BT68FKS3nGlr6K7yTmYjDZRBitYQ3Wwxd4RYRN3fJuzEznSiWH3rkQyF3Q1FRsbLt8YDJq/t6A==","signatures":[{"sig":"MEUCIQDh90XpW/sveC9pliNd8lKZ7+C6/3XspQq1tkWapVdYzAIgDXeX1nLO/RbwH/tgWKpQxFqNbwyL7LaP2SvXO6wUDpo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2074372},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/blintz.css"},"gitHead":"dc475053423ec4501f7471a30d9e2a5eb4c96063","scripts":{"build":"vite build","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"dorkian","email":"dorian.collier@gmail.com"},"repository":{"url":"git+https://github.com/dork-labs/blintz.git","type":"git","directory":"packages/blintz"},"_npmVersion":"11.11.0","description":"Blintz — a Vue-free React port of Milkdown's Crepe editor: the polished WYSIWYG markdown UX (slash menu, block drag handle, selection toolbar, rich node views) rebuilt as React components, with clean markdown round-tripping.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"24.14.1","dependencies":{"katex":"^0.17.0","dompurify":"^3.4.11","codemirror":"^6.0.2","remark-math":"^6.0.0","@milkdown/kit":"^7.21.2","lucide-static":"^1.21.0","@milkdown/react":"^7.21.2","@codemirror/view":"^6.43.1","@floating-ui/dom":"^1.7.6","unist-util-visit":"^5.0.0","@codemirror/state":"^6.6.0","remark-frontmatter":"^5.0.0","@codemirror/commands":"^6.10.3","@codemirror/language":"^6.12.3","@milkdown/theme-nord":"^7.21.2","@codemirror/language-data":"^6.5.2","@codemirror/theme-one-dark":"^6.1.3","@prosemirror-adapter/react":"0.5.3","prosemirror-virtual-cursor":"^0.4.2"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","typescript":"^5.9.0","@types/react":"^19.2.0","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.2.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/blintz_0.4.0_1784743294938_0.03079511433567972","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"_id":"blintz@0.5.0","bugs":{"url":"https://github.com/dork-labs/blintz/issues"},"dist":{"shasum":"ff93c5dd168dcbf895a18c2f56a734a306288f4a","tarball":"https://registry.npmjs.org/blintz/-/blintz-0.5.0.tgz","fileCount":86,"integrity":"sha512-uBxPrXxciCk3mYHfeLFy8oel+2Hga38SpvM9FnNjeZ9bEoUja0syIxHoW2ZgkCHb+lALB8gXD683QpJ+aRVfdA==","signatures":[{"sig":"MEYCIQDIiWzvP4GzfWOyxquikt5iRFairRp12u/snNv2MPtHDAIhAJMMeUjRsMJ8a6FipEDnGbt+0v0FThVX47iar2jaxPK3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDbLY/XfcNgjW8+8IaOuFTWBUa7wcXvFbLQ0ysTIHJeuAIhAMxoVTboCcKwtJLGuDTo92pQdBjlJY4GcBCBnYO3om4m"}],"unpackedSize":2114580},"main":"./dist/index.js","name":"blintz","type":"module","types":"./dist/index.d.ts","author":{"name":"Dork Labs"},"module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/blintz.css"},"license":"MIT","scripts":{"build":"vite build","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"version":"0.5.0","_npmUser":{"name":"dorkian","email":"dorian.collier@gmail.com"},"homepage":"https://github.com/dork-labs/blintz#readme","keywords":["markdown","markdown-editor","wysiwyg","editor","react","milkdown","crepe","prosemirror","remark"],"repository":{"url":"git+https://github.com/dork-labs/blintz.git","type":"git","directory":"packages/blintz"},"_npmVersion":"10.9.7","description":"Blintz — a Vue-free React port of Milkdown's Crepe editor: the polished WYSIWYG markdown UX (slash menu, block drag handle, selection toolbar, rich node views) rebuilt as React components, with clean markdown round-tripping.","directories":{},"maintainers":[{"name":"dorkian","email":"dorian.collier@gmail.com"}],"sideEffects":["*.css"],"_nodeVersion":"22.22.2","dependencies":{"katex":"^0.17.0","dompurify":"^3.4.15","codemirror":"^6.0.2","remark-math":"^6.0.0","@milkdown/kit":"^7.22.1","lucide-static":"^1.21.0","@milkdown/react":"^7.22.1","@codemirror/view":"^6.43.11","@floating-ui/dom":"^1.8.0","@lezer/highlight":"^1.2.3","unist-util-visit":"^5.0.0","@codemirror/state":"^6.7.4","remark-frontmatter":"^5.0.0","@codemirror/commands":"^6.11.0","@codemirror/language":"^6.12.4","@codemirror/language-data":"^6.5.2","@prosemirror-adapter/react":"0.5.5","prosemirror-virtual-cursor":"^0.4.2"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.6","typescript":"^5.9.0","@types/react":"^19.2.0","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.2.0","@vitejs/plugin-react":"^4.7.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/blintz_0.5.0_1789415460000_0.24429715641515837"}}},"time":{"created":"2026-06-24T23:23:18.728Z","modified":"2026-09-14T19:51:00.358Z","0.1.0":"2026-06-24T23:23:18.994Z","0.2.0":"2026-06-27T01:28:14.904Z","0.3.0":"2026-06-27T02:46:13.011Z","0.4.0":"2026-07-22T18:01:35.168Z","0.5.0":"2026-09-14T19:51:00.185Z"},"bugs":{"url":"https://github.com/dork-labs/blintz/issues"},"author":{"name":"Dork Labs"},"license":"MIT","homepage":"https://github.com/dork-labs/blintz#readme","keywords":["markdown","markdown-editor","wysiwyg","editor","react","milkdown","crepe","prosemirror","remark"],"repository":{"url":"git+https://github.com/dork-labs/blintz.git","type":"git","directory":"packages/blintz"},"description":"Blintz — a Vue-free React port of Milkdown's Crepe editor: the polished WYSIWYG markdown UX (slash menu, block drag handle, selection toolbar, rich node views) rebuilt as React components, with clean markdown round-tripping.","maintainers":[{"name":"dorkian","email":"dorian.collier@gmail.com"}],"readme":"# Blintz\n\nA React port of [Milkdown](https://milkdown.dev)'s _Crepe_ editor: a Notion-style WYSIWYG markdown editor (selection toolbar, slash menu, block drag handle, rich node views) that round-trips clean markdown, with no Vue in the bundle.\n\n> Why \"Blintz\"? A blintz is a thin crêpe folded around a filling. That's the idea here: Milkdown's Crepe, wrapped up for React, with a few fillings of our own. Blintz is an independent derivative. It isn't affiliated with or endorsed by the Milkdown project.\n\n```bash\nnpm install blintz\n# peer deps: react >=18, react-dom >=18\n```\n\n```tsx\nimport { MarkdownEditor } from \"blintz\";\nimport \"blintz/styles.css\"; // required when consuming the built package\n\nfunction Example() {\n  const [md, setMd] = useState(\"# Hello\\n\\nType `/` for commands.\");\n  return <MarkdownEditor value={md} onChange={setMd} />;\n}\n```\n\nThe whole public surface is one controlled `<MarkdownEditor value onChange />` component, plus `editable`, `placeholder`, `theme`, and `className`. The Milkdown engine, the Crepe-derived feature views, and the theme CSS sit behind it.\n\n## Read-only mode\n\nPass `editable={false}` to render a document read-only. The content still renders with full fidelity (lists, code with highlighting, tables, images, links, math), but editing is off: ProseMirror's `contenteditable` is disabled and the editing chrome is suppressed (the slash menu, the `+`/`::` block handle and drag-to-reorder, the selection toolbar, the link-edit popovers, and the placeholder).\n\n```tsx\n<MarkdownEditor value={md} editable={false} />\n```\n\n`editable` defaults to `true`, so existing consumers are unaffected. It is reactive: toggle it on a mounted editor and the change takes effect right away, with no remount. The editor turns editable or read-only in place, so scroll position and selection are kept and the editing chrome (slash menu, block handle, drag) works the moment editing is enabled.\n\n```tsx\n<MarkdownEditor value={md} editable={mode === \"edit\"} onChange={setMd} />\n```\n\n(The `plugins` prop is the exception: it is read once at mount, so changing the extension set still needs a remount.)\n\n## Why Blintz\n\nMilkdown's [Crepe](https://milkdown.dev) is its ready-made editor on top of ProseMirror. Crepe builds its UI (toolbars, menus, node views) in Vue, so dropping it into a React app means bundling and bridging a second framework. Blintz gives you the same editing experience in React, and it treats markdown as the source of truth, so what you type comes back as clean markdown when you save (handy when you store the markdown).\n\nIt works at the seam Milkdown itself draws. The engine is framework-agnostic: ProseMirror and remark, the schema, commands, input rules, keymaps, and the provider controllers that drive tooltips, menus, and handles. Blintz keeps all of that from `@milkdown/kit`. It rewrites only the view layer in React, mounting components through [`@prosemirror-adapter/react`](https://github.com/prosemirror-adapter/prosemirror-adapter)'s node-view and plugin-view factory hooks.\n\n## Design goals\n\n1. **Round-trip fidelity comes first.** Load markdown, edit, save markdown, and the result stays faithful and clean. Blintz turns off Milkdown's empty-line `<br />` behavior so stored prose stays free of HTML noise: blank lines collapse the markdown-native way, and standalone legacy `<br />` artifacts are stripped on load. Inline HTML breaks become markdown hard breaks.\n2. No Vue. Blintz never imports `@milkdown/crepe`, the Vue-bundled `@milkdown/kit/component/*`, or `createApp`. The build is checked for Vue runtime markers; the only allowed `vue` string is CodeMirror's `.vue` syntax pack.\n3. A small, host-agnostic API: one controlled component, no router or store assumptions, themed with CSS variables.\n4. Works on React 18 and 19. `react` and `react-dom` are peer deps.\n\n## Features\n\n- Block editing: a slash `/` command menu and a floating `+`/`::` block handle. Drag-to-reorder keeps list items in the right list and renumbers them.\n- Lists: ordered, bullet, and task lists with live numbering.\n- Code blocks: a real CodeMirror editor per block, with a language picker and a preview.\n- Math: inline `$…$` and block math via KaTeX, round-tripping to `$$…$$`.\n- Images: uploader or URL input, with captions.\n- Tables: GFM tables with column and row drag handles, plus a keyboard and touch menu to add, move or delete rows and columns.\n- Links: hover preview and an inline edit tooltip.\n- A selection toolbar (bold, italic, strikethrough, code, link), a block placeholder, a virtual cursor, and dark mode.\n\nIcons come from [Lucide](https://lucide.dev), rendered through a sanitized `<Icon>`.\n\n## Theming\n\nBlintz ships its own scoped typography, so importing its stylesheet does not reset the host app. Body text is 16px with a 1.65 line height, lists have one marker, and code, tables and editing controls share one palette.\n\nUse `theme=\"light\"` or `theme=\"dark\"` to set the palette. The default, `theme=\"auto\"`, follows the nearest `.light`, `.dark`, or `data-theme=\"light|dark\"` ancestor, then the OS preference. A theme change updates the mounted editor without resetting content, selection or history.\n\n```tsx\n<MarkdownEditor value={md} onChange={setMd} theme={appTheme} />\n```\n\nSet public `--blintz-*` variables on the editor's `className` or any ancestor to match your app. Variables contain complete CSS colors, not raw HSL channels. Both theme palettes respect these overrides.\n\n```css\n.document-editor {\n  --blintz-color-background: var(--app-background);\n  --blintz-color-on-background: var(--app-text);\n  --blintz-color-surface: var(--app-surface);\n  --blintz-color-on-surface: var(--app-text);\n  --blintz-color-primary: var(--app-link);\n  --blintz-font-default: var(--app-font);\n  --blintz-font-title: var(--app-font);\n  --blintz-font-code: var(--app-monospace);\n}\n```\n\nColor inputs: `--blintz-color-` followed by `background`, `on-background`, `surface`, `surface-low`, `on-surface`, `on-surface-variant`, `outline`, `primary`, `secondary`, `on-secondary`, `inverse`, `on-inverse`, `inline-code`, `error`, `hover`, `selected`, or `inline-area`. Supply contrasting foreground/background pairs together.\n\nSyntax inputs: `--blintz-code-keyword`, `--blintz-code-string`, `--blintz-code-number`, `--blintz-code-comment`, `--blintz-code-function`, `--blintz-code-type`, and `--blintz-code-operator`. CodeMirror reads these live, including when switching themes.\n\nLayout inputs: `--blintz-font-size`, `--blintz-padding`, `--blintz-readonly-padding`, and `--crepe-block-handle-gutter`. The default gutter shrinks on narrow screens. Read-only documents do not reserve room for editing handles. `--blintz-shadow-1` and `--blintz-shadow-2` customize floating controls.\n\nExisting `--crepe-*` feature variables remain available as outputs. Legacy overrides must target `.milkdown` directly with sufficient specificity; ancestor overrides should use the new `--blintz-*` inputs. Remove external `.prose` classes and Nord-specific CSS from the editor surface, since Blintz now owns the complete prose styling.\n\n## Architecture\n\n- `src/MarkdownEditor.tsx`: the public component and the provider stack (`MilkdownProvider` over `ProsemirrorAdapterProvider`, with an `EditorCtxProvider` so portal-rendered views can read the live Milkdown `Ctx`).\n- `src/useBlintzEditor.ts`: the engine baseline and feature registration, a React rebuild of Crepe's `CrepeBuilder` core, assembled from `@milkdown/kit` (commonmark, gfm, history, indent, trailing, clipboard, upload, listener), then each feature.\n- `src/features/*`: one folder per feature. Each reuses the engine (schema, commands, providers) and rewrites only the view.\n- `src/shared/*`: the sanitized `Icon`, the ctx-to-React bridge, and `GroupBuilder`.\n- `src/theme/*`: feature CSS, the `--crepe-*` tokens, and the dark-mode variables.\n\n## Development\n\nThe repo ships a playground that mounts Blintz next to other React markdown editors and shows live markdown output for round-trip comparison.\n\n```bash\nnpm install\nnpm run typecheck   # the package and its React 18/19 consumers\nnpm test            # vitest, including the empty-paragraph round-trip guard\n```\n\n## Dependency troubleshooting\n\nProseMirror plugins must share the same installed `prosemirror-model`, `prosemirror-state`, and `prosemirror-view` versions. An older pnpm lockfile can retain separate copies after updating Blintz. The editor may render correctly until a node selection throws an error such as `DecorationGroup` or `localsInner`, because objects from the two copies fail identity checks.\n\nRun `pnpm why prosemirror-model`, `pnpm why prosemirror-state`, and `pnpm why prosemirror-view` to inspect the dependency paths. Update and deduplicate compatible versions together. If the host still retains separate copies, use its `pnpm.overrides` to select one compatible version of each package for the whole app, then reinstall. Avoid forcing versions outside the dependent packages' supported ranges. Restart the dev server and clear its dependency prebundle cache after changing the graph.\n\n## License and attribution\n\n[MIT](./LICENSE), © Dork Labs. Blintz is a derivative of Milkdown's Crepe (MIT, © Mirone) and bundles other open-source work: ProseMirror, remark, KaTeX, CodeMirror, Lucide, Floating UI, and DOMPurify. See [ATTRIBUTION.md](./ATTRIBUTION.md) for the full credits and the upstream-sync notes.\n","readmeFilename":"README.md"}