Перейти до вмісту
tatetUI

Prose

Оформлення вмісту, спільне для редактора й публічної сторінки.

Компонент майже порожній — уся цінність у ui-prose.css, який він підключає своїм класом. UiRichTextEditor ставить рівно той самий клас на корінь ProseMirror, тож редактор і читалка не можуть роз'їхатись: це WYSIWYG за побудовою, а не за домовленістю.

Приклад

Оформлення вмісту

Абзац зі жирним, курсивом, підкресленням, інлайновим кодом та посиланням.

Пресет «lead»: вступний абзац, більший за основний текст.

Іконка малюється через CSS, а не розмітку — інакше серверний санітайзер зніс би її, і варіант виродився б у звичайну цитату.

Попередження.

Помилка або незворотна дія.

Списки

  • Перший рівень
    • другий — коло
      • третій — квадрат
  • Ще пункт

Таблиця

ТокенРоль
--inkосновний текст
--ink-mutedдругорядний текст
--lineмежі
const html = editor.getHTML()

API

Props

НазваТипТиповоОпис
asdivarticlesection"div"Кореневий тег. `article` для самостійного матеріалу, `div` для фрагмента.
htmlstringHTML як рядок — типовий випадок для вмісту з бази чи редактора. Вставляється через `v-html` і НЕ санітизується: компонент не має власного санітайзера і не вдає, що має. Джерело HTML — ваша відповідальність, і чистити його треба на сервері.

Слоти

НазваОпис
defaultВміст як розмітка Vue — альтернатива пропу `html`.

Коли використовувати

Для будь-якого HTML, який написала людина: стаття з бази, опис товару, результат роботи редактора.

Коли НЕ використовувати

Не для інтерфейсу. Тут навмисно перевизначено ul, table, a, code — усередині форми чи картки це заважатиме.

Не як заміну санітайзеру. Компонент вставляє HTML через v-html і не чистить його. Джерело HTML — ваша відповідальність, і чистити треба на сервері.

Чому окремий компонент, а не стилі всередині редактора

Бо публічна сторінка редактора не має. Якби оформлення жило в scoped-стилях UiRichTextEditor, читалці довелося б мати власну копію — і копії розійшлися б за перший же тиждень.

Цей клас багів уже коштував продакшену. Іконки варіантів цитат колись малювалися як <div> усередині renderHTML — вони існували лише в редакторі: серверний санітайзер зносив їх на публічних сторінках (ні div, ні mask-image не входять до allowlist), і всі вісім варіантів вироджувались у звичайну цитату. Тому іконка тут іде з CSS через ::before, а ключем слугує data-blockquote-type — атрибут, який санітизацію переживає.

Варіанти цитат

П'ять: quote, info, success, warning, danger — рівно стільки статусних родин токенів у бібліотеці.

В оригіналі їх було вісім, але note, tip і caution лягали на ті самі кольори, тобто були синонімами, які існували лише щоб їх плутали. Старі назви лишаються псевдонімами на вході, тож наявний HTML читається без змін.

Специфічність

Селектор подвоєний: .ui-prose.ui-prose, і це не описка.

Демо на цьому сайті рендеряться всередині .docs-prose, чиї правила мають ту саму вагу. За однакової ваги виграв би той, хто нижче в зібраному CSS — тобто випадковий порядок імпортів. Подвоєння знімає цю залежність.

Помітили б це лише на власному сайті: у чужому проєкті .docs-prose немає, і компонент виглядав би правильно. Найгірша форма помилки — та, де бреше саме еталон.