@feugene/granularity-editor

v0.3.12026-08-27

Fixed

  • Development warnings never reached the browser: the __GR_DEV__ guard included a typeof process check, and process is undefined in the browser, so the whole expression collapsed to false in development too. The guard now matches the core package. Production bundles are unaffected — the branch is still dropped.

v0.3.02026-08-27

Changed

  • Peer floors on @feugene/* raised to the current minor. Every peer this package declares on the ecosystem now starts at the version the monorepo actually ships:

    • @feugene/fint-i18n>=0.7.0 <1.0.0
    • @feugene/granularity>=0.36.0 <1.0.0
    • @feugene/unocss-preset-granular>=0.13.0 <1.0.0
    • @feugene/unplugin-granularity>=0.7.0 <1.0.0

    The floors had drifted far behind — some still admitted releases from a year of development ago — and a range that claims support it was never tested against is worse than a narrow one: the install succeeds and the breakage surfaces later, in the consumer’s app.

    This is breaking for anyone below a floor. Installing against an older @feugene/granularity now produces a peer conflict instead of silence. The fix is to move the core up; nothing in this package’s own API changed.

v0.2.32026-08-26

Fixed

  • Словарь пакета экспортируется под своим именем. Подпуть ./i18n отдавал grChronoMessages и GrChronoLocale — имена соседнего пакета. Докблок при этом утверждал неймспейс gr и приводил ключ gr.calendar.previousMonth, тогда как блок пакета — grEditor, а ключи выглядят как grEditor.richText.toolbar. Теперь экспорты называются grEditorMessages и GrEditorLocale.

    Корневой index.ts эти имена не реэкспортирует, поэтому смена задевает только прямой импорт из @feugene/granularity-editor/i18n. Лоадеры локалей (en, ru, es) и константа блока GR_EDITOR_I18N_BLOCK не менялись — приложения, подключающие словарь штатным способом, правок не требуют.

v0.2.22026-08-25

Fixed

  • Пузырьковый тулбар больше не вылезает за край панели. Панель поповера ограничена max-width в 22rem, а квадратная кнопка не сжимается — min-w в GrButton. Десять кнопок ступени sm (размер поля md и lg) занимали 356px против 330px доступных, и последняя кнопка выходила за скруглённый край наружу: у панели overflow: visible, так что её не обрезало, а именно выносило поверх границы. На ступенях xs и sm набор укладывался, поэтому поломка была видна только на двух размерах из четырёх.

    Закрыто с трёх сторон. Кнопка пузырька теперь всегда самой мелкой ступени независимо от размера поля: панель сверху живёт в раме поля и растёт вместе с ним, а пузырёк висит над читаемым текстом, и там уместна наименьшая площадь — 28×28 при требуемых WCAG 2.2 двадцати четырёх. Поповер получил padding="none", а поле перешло на сам пузырёк: 20px поля панели — это две трети кнопки. И ряд научился переноситься, чего не умел вовсе.

  • Пузырёк снял потолок ширины поповера. GrPopover по умолчанию держит 22rem — читаемую ширину колонки текста, — а пузырёк несёт тулбар, которому эта мера чужая. Потолок снимается хуком --gr-popover-max-width, появившимся в ядре. Предел «не шире вьюпорта» остаётся: он второй операнд min() и хуком не снимается.

    Ступень кнопок при этом осталась мельчайшей — но теперь это решение об оформлении, а не обход ограничения: пузырёк висит над читаемым текстом, и там уместна наименьшая площадь.

  • Обе панели переносятся группами, а не отдельными кнопками. Перенос по кнопкам рвёт ряд там, где кончилось место, и разлучает кнопки одного смысла: «Заголовок» остаётся в одной строке, «Подзаголовок» уезжает в другую, причём без разделителя между ними. Группа стала обёрткой с flex-none и переносится целиком со своим разделителем.

v0.2.12026-08-25

Fixed

  • The package tarball now ships LICENSE. The manifest has always declared "license": "SEE LICENSE IN LICENSE", and the file it points at was not there: npm adds LICENSE to a tarball on its own, but only when the file exists in the package directory. A consumer’s compliance scanner reads a licence reference that resolves to nothing and flags the dependency as unlicensed — a refusal on formal grounds, before anyone reads the terms.

    The copy is byte-identical to the one at the repository root and is kept that way by yarn check:licenses, a gate in CI: eleven copies of a 598-line file drift silently, and they drift exactly when the licence text is being edited.

v0.2.02026-08-23

Added

  • #header and #footer slots — bands inside the field. The component had exactly two zones, the toolbar and the text, so a caption or a character counter had to sit outside the border: it read as a separate element, since the border framed only the text and the link to the field rested on proximity alone. Both zones are optional and turn on by the mere presence of the slot; they are separated by a border from the inside, like the toolbar, because the line belongs to the boundary between zones — at the edge of the field it would meet the rounded corner. Neither carries a background: --gr-muted is the toolbar’s because it is a control panel, while these hold the consumer’s own content.

v0.1.32026-08-21

Added

  • Each toolbar action now carries its keyboard shortcut (GrRichTextAction.shortcut, in TipTap notation: Mod-B, Mod-Alt-2, …). The component does not render it — the field is there for whoever builds their own panel or writes a hint. The values are read from the extensions’ own sources, because the shortcuts belong to them, not to this package.

Fixed

  • The bubble toolbar works at all. With toolbar="bubble" (and "both") nothing showed up at the selection: the buttons sat in the popover’s default slot, and the panel renders only the content one — it opened empty. Filled, it then closed in the frame it opened: the panel takes focus by default, the field loses it, and blur clears the anchor. The panel no longer autofocuses, and a bubble button no longer steals focus on mousedown — without that the bubble vanished under the cursor after the first format and the second could not be applied. Esc closes it; an outside click does not, because a drag-select ends with exactly that click.

v0.1.22026-08-21

Fixed

  • schema and extensions now take effect on a live field. Both were read once, at mount: after that, switching schema moved the toolbar without touching the document rules — a «Heading» button on a schema that allows no headings. Changing them now rebuilds the editor, because a ProseMirror schema is immutable: the document and the commands are derived from it.

    Content is carried over as markup, not as a document. JSON is parsed strictly, and the first node missing from the new schema takes the whole text with it; HTML is parsed leniently — a heading becomes a paragraph and what was written survives.

Earlier versions

The bodies of these releases are not shown: the full feed weighs more than a page is allowed to. The file in the repository is always complete.

  • v0.1.12026-08-21
  • v0.1.02026-08-21

The package CHANGELOG in full