Это js.
Contenteditable может вообще не использоваться, так как поведение от браузера к браузеру отличается. Изначально это кажется прикольной идеей, но потом понимаешь, что технология нулевая.
Gdoc, facebook и некоторые другие ребята делают вообще полностью свое решение. Трекают нажатия клавиш, рисуют кастомный курсор, записывают контент в виде неких блоков, которым можно задать свойства или подменить на валидный html.
Тема достаточно сложная. Наверное, во фронтенде это в принципе одна из самых замороченных штук.