Skip to content

Instantly share code, notes, and snippets.

@amk221
Last active May 3, 2024 13:11
Show Gist options
  • Star 9 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save amk221/1f9657e92e003a3725aaa4cf86a07cc0 to your computer and use it in GitHub Desktop.
Save amk221/1f9657e92e003a3725aaa4cf86a07cc0 to your computer and use it in GitHub Desktop.
Prosemirror placeholder plugin approach
.ProseMirror[data-placeholder]::before {
color: global.$placeholder-colour;
position: absolute;
content: attr(data-placeholder);
pointer-events: none;
}
import { Plugin } from 'prosemirror-state';
export default function placeholder(text) {
const update = (view) => {
if (view.state.doc.textContent) {
view.dom.removeAttribute('data-placeholder');
} else {
view.dom.setAttribute('data-placeholder', text);
}
};
return new Plugin({
view(view) {
update(view);
return { update };
}
});
}
@michael
Copy link

michael commented Jul 6, 2023

Yeah, and the placeholder ideally works without knowing about layout details. But yeah this seems to be a hard nut to crack. I tried once, and ended up with a workaround too. If I find a way to do it, I will let you know here! :)

For now I have this hack in place:

/* HACK to fix centered placeholders in bio */
.__centered .ProseMirror[data-placeholder]::before {
  position: static;
}

Will not work for multi-line inputs, and cursor will be at the end of the word, but better than an offset placeholder.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment