Last active
October 23, 2024 10:20
-
-
Save amk221/1f9657e92e003a3725aaa4cf86a07cc0 to your computer and use it in GitHub Desktop.
Prosemirror placeholder plugin approach
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.ProseMirror[data-placeholder]::before { | |
color: global.$placeholder-colour; | |
position: absolute; | |
content: attr(data-placeholder); | |
pointer-events: none; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 }; | |
} | |
}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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:
Will not work for multi-line inputs, and cursor will be at the end of the word, but better than an offset placeholder.