Crepe appends the slash menu to .milkdown and (in this version) doesn't expose
a way to portal it to <body>, so it's clipped by the editor's scroll box. That
box sat inside the card's p-5 padding, so the menu cut off at the padding edge.
Move the padding onto the ProseMirror content instead and drop the redundant
inner scroll container, so the menu's clipping bounds become the full card.
https://claude.ai/code/session_019DU6V5z6Nr4Vu7b1fBDnq4
The floating menus (slash menu, toolbar, link tooltip) portal to <body>,
outside .milkdown, so the --crepe-* overrides never reached them and their
background fell back to transparent — unreadable over the content. Declare the
palette on those selectors too, keep --crepe-color-surface (near-)opaque so the
menus read clearly, and add a backdrop blur.
Also set --crepe-font-default/title to inherit (and a monospace stack for code)
so the editor uses the application font instead of Crepe's bundled Noto faces.
https://claude.ai/code/session_019DU6V5z6Nr4Vu7b1fBDnq4
Replace the two-engine setup (MDXEditor for editing + react-markdown for
display) with a single Crepe-based component used for both. Editing is inline
WYSIWYG with full GFM that actually works — task lists, tables, and code
blocks via type-to-create / the slash menu — and read-only mode renders the
exact same way, so write and read can no longer drift (the root cause of the
heading/list/table/checkbox bugs).
- markdown-editor.tsx: Crepe wrapper supporting edit + readOnly, themed to the
glass card via --crepe-* variable overrides (scoped to .milkdown so they win
over frame-dark's own definitions).
- text-particle-view.tsx: render the message card with the read-only editor;
drop the react-markdown component map.
- Remove now-unused deps: @mdxeditor/editor, react-markdown, remark-gfm,
rehype-highlight, highlight.js.
The compose immersive mode (short, centered plain text) is unchanged.
https://claude.ai/code/session_019DU6V5z6Nr4Vu7b1fBDnq4
Editor: add tablePlugin so markdown tables round-trip and render. Task
lists (`- [ ]`), strikethrough, code (inline + fenced), headings, lists,
quotes, and links already work via listsPlugin/core/markdownShortcut. CSS:
suppress the disc bullet on task-list items (they draw their own checkbox)
and style tables.
Display: render task-list checkboxes (no stray bullet), GFM tables, and
strikethrough so the read view matches what the editor produces.
https://claude.ai/code/session_019DU6V5z6Nr4Vu7b1fBDnq4
- Restore heading/list typography in the editor: MDXEditor relies on the
browser's default styles for <h1>/<ul> sizing, which Tailwind's Preflight
resets. Markdown shortcuts fired but the block looked unchanged. Style the
editor content explicitly, mirroring the rendered display.
- Keep pasted/typed URLs as plain text (linkPlugin disableAutoLink) so they
don't become `[url](url)`, which duplicated both the URL and its preview
card. Also dedupe extractUrls defensively so a repeated URL yields one card.
https://claude.ai/code/session_019DU6V5z6Nr4Vu7b1fBDnq4
Desktop: replace the Write/Preview tab toggle in the compose card with
MDXEditor, an inline WYSIWYG that renders markdown as you type (Obsidian/
Notion feel) and round-trips plain markdown, matching how particle content
is stored. Immersive mode is unchanged — short, plain notes still get the
centered large-type textarea, and ⌘+M still drops into the rich editor.
Shortcut handling moves to the capture phase so ⌘+Enter / Esc win over the
editor's own key handling.
Mobile: render markdown on the display side via react-native-marked's
useMarkdown hook (no FlatList, so it nests cleanly in the existing
ScrollView). Mirrors desktop's immersive-vs-card logic: short plain notes
stay centered; anything with markdown renders formatted instead of showing
raw syntax. Composer stays plain text.
https://claude.ai/code/session_019DU6V5z6Nr4Vu7b1fBDnq4