Forcing inputStyle to contenteditable (previous commit) didn't fix it on
iPhone, confirming this is CodeMirror 5's own long-standing weakness with
CJK IME composition on iOS WebKit, not just the iPad desktop-UA detection
issue. There's no reliable fix short of dropping CodeMirror for the journal
content field, so EasyMDE is removed entirely and the textarea goes back to
a native, uncontrolled <textarea> — nothing intercepts/re-renders it during
composition, so iOS's IME just works.
The markdown toolbar buttons (bold/italic/heading/quote/lists/code/link)
now manipulate the textarea's selection directly via a small JournalEditor
JS API instead of calling EasyMDE/CodeMirror commands, and image paste
tracks its upload placeholder by a unique text marker instead of a
CodeMirror bookmark. Also drops the vendored easymde.min.js/css (no longer
referenced) and bumps the service worker CACHE_NAME so stale cached copies
of the old vendor files get evicted.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Replace the plain textarea with EasyMDE (vendored locally, no CDN) for
markdown authoring: syntax highlighting, smart list continuation, and a
custom text-based toolbar (built-in EasyMDE toolbar icons require Font
Awesome from a CDN, which this app doesn't use). unorderedListStyle is set
to "-" to match the app's own template convention.
- Add a preview/edit toggle button that swaps the editor for the exact same
server-rendered markdown (via /journal/preview) shown after saving, instead
of always showing both.
- Fix create/edit entry routes to verify the submitted category_id actually
belongs to the current user before inserting -- every other write path in
this app already checked ownership; this one didn't (found while manually
testing the new editor with a typo'd category id that happened to belong to
someone else's category, which surfaced as an IntegrityError 500 instead of
a clean 404-equivalent).
- Fix the default "일상" category template: bare "-" bullet lines don't parse
as list items in the markdown renderer (they need a trailing space), and
the content_template validator was silently stripping that trailing space
off on every save. Backfill migration updates any category still holding
the old, broken template text.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>