@feugene/granularity
Релизы @feugene/granularity из его CHANGELOG: последние 8 целиком, более ранние — списком версий.
Записи релизов — авторский текст библиотеки, и он английский. Портал его не переводит: журнал изменений — история чужого репозитория, а переписанная история перестаёт быть историей.
v3.7.22026-10-28
Fixed
zIndexBaseсдвигает шкалу слоёв целиком.GrConfigProviderпересчитывал от базы пять слоёв из семи:--gr-z-bottom-navи--gr-z-loadingоставались на 850 и 1150, и при базе 5000 полноэкранная загрузка иv-loadingложились под модалку, а нижняя навигация — под шапку. Теперь сдвигаются все семь с теми же шагами, что у темы (гейт сверяет смещения со шкалой каждой темы каталога). Предупреждение о втором провайдере срабатывает только на разную базу — одинаковая шкалу не меняет.- Уходящий модальный слой не перехватывает клики у
GrDrawer,GrImageViewerиGrSidebarв режимеoverlay. Правило было только уGrModal: остальные слои 150 мс ухода оставались растянутыми на вьюпорт и забирали клик себе. Корень полноэкранного слоя на время ухода —inert(флагisLeavingизuseModalOverlay), у всех одинаково;GrModalперешёл на тот же механизм сpointer-events: none, который не останавливал потомков сpointer-events: auto. resetGranularityDomснимает сервис диалогов. Неотвеченный диалог прошлого теста стоял головой очереди, и новый не появлялся; диалог внеsetupбрал словарь, захваченный прошлым тестом. Сервис записывает свою уборку во внутренний реестр, и подпутьtestingего граф не тянет.
Changed
- Документация сверена с кодом.
ssr.md: якоря телепортов вставлять ради компонентов пакета не нужно (только вашим телепортам, включённым на сервере); модальные слои без содержимого на сервере — ещёGrDrawer,GrImageViewerиGrSidebarв режимеoverlay; на сервере бросают только открывающие методыuseDialogService; устаревшие числа и неполный перечень изоморфных компонентов убраны — реестр держит SSR-стенд.@floating-ui/domв README иinstallation.md— правилом вместо перечня, с настоящим падением (ошибка сборки, а не рантайма).testing.mdи JSDoc помощников:PointerEventв jsdom есть,isComposingчерезtriggerдоходит — объяснено, зачем помощники всё равно нужны; «Уборка» называетenableAutoUnmount.
v3.7.12026-10-28
Changed
- Документация спутников: нижние peer-границы при значениях у темы.
docs/companion-packages.mdназывает их явно: ядро>=3.1.0, granum>=3.10.0, при разделе группы —>=3.11.0. Код иdistне менялись; выпуск сводит в одну точку ядро и патчи спутников — chrono, code и editor 4.0.1, dashboard и forms-schema 3.0.1 с исправленными границами.
v3.7.02026-10-28
Added
- Заголовок
GrFormSection— по теме. Шрифт — шрифт заголовков темы (--gr-font-display), как уGrCardи окон; кегль, интерлиньяж и начертание — токены видаtheme--gr-form-section-title-size,-title-leading,-title-weight. «Сланец», «Тактильная» и «Чертёж» — прежний полужирный текст ступениsm, «Глина» — антиква 20px: значения в темах@feugene/granularity-tokens2.5.0, зависимость поднята до^2.5.0.
v3.6.02026-10-28
Changed
- Недоступное поле гасится ролями недоступного контрола — подложка
--gr-disabled-bg, текст--gr-disabled-fg, как рамка--gr-disabled-brd, — у всех полей одинаково. Раньше так гасился толькоGrNumberInput, остальные поля — приглушённой поверхностью--gr-muted; у самогоGrNumberInputзначение в поле оставалось тёмным. - Триггер
GrColorPickerоткликается, как поле: в фокусе — рамка--gr-input-focus-brd, под указателем сфокусированного — она же. Цвет под указателем по-прежнему — ручка темы--gr-color-picker-trigger-hover-brd; темы каталога ставят ей--gr-input-hover(пакет токенов 2.4.0), её значение по умолчанию в реестре — тоже.
v3.5.02026-10-28
Added
grFieldLookAttrs— рамка поля для своих компонентов (@feugene/granularity/components/GrInput,docs/field.md). Компонент ядра, спутника или приложения ставит её атрибуты на элемент рамки и объявляетGrInputвdependencies— рамку, скругление по ступени, подложку, отклик на указатель и фокус, кольцо, подсветку, ошибку и недоступность рисует общий лист.
Changed
- Рамку полей рисует один лист — лист
GrInputпо атрибутам, а не утилиты в каждом поле. ПереведеныGrInput,GrTextarea,GrNumberInput,GrSelect,GrAutocomplete,GrInputTag,GrTreeSelectи триггерGrColorPicker(docs/markup-weight.md). Разметка полей легче:GrInput— на 38 %,GrTextarea— на 33 %,GrNumberInput— на 35 %, набор из восьми полей — на 16 %. Вычисленные стили совпадают с прежними во всех состояниях, четырёх темах и обоих режимах, кроме двух исправлений ниже; переходы цвета рамки идут по кривой темы--gr-ease-out. Свои отличия полей сохранены их листами:GrNumberInputгасит недоступное ролями--gr-disabled-*, триггерGrColorPickerоткликается на указатель ручкой--gr-color-picker-trigger-hover-brd. - Если тесты или стили приложения искали у полей классы рамки (
border-[var(--gr-input)],h-10,rounded-[var(--gr-radius-control-md)]), им теперь нужны атрибуты:data-gr-field,data-gr-size,data-gr-invalid,data-gr-off.
Fixed
- Кольцо фокуса поля с ошибкой и с подсветкой
danger— в цвете состояния. У них кольцо было цвета--gr-ring: утилита цвета проигрывала базовой порядком правил в собранном CSS. У подсветкиsuccessиwarningкольцо и раньше было в её цвете. Теперь кольцо в цвете состояния у всех, как обещаютGrInput.mdи роль--gr-invalid-ring. - Недоступный триггер
GrColorPickerгасит текст (--gr-disabled-fg): задуманный цвет проигрывал--gr-fgпо той же причине, и недоступный триггер выглядел рабочим. - Триггер
GrColorPickerс ошибкой под указателем держит рамку ошибки, как остальные поля: отклик на указатель перекрашивал её в цвет наведения.
v3.4.12026-10-28
Changed
- Листы
GrSwitch,GrPaginationиGrButtonвместе легче на 3,1 КБ минифицированного CSS. Ступень теперь одно правило с переменными--gr-<имя>-step-*на корне, а размеры элементов внутри читают их одним правилом на все ступени, вместо правила на каждый элемент каждой ступени (docs/markup-weight.md). Вид не изменился: вычисленные стили сверены во всех состояниях, четырёх темах и обоих режимах. Ручки--gr-button-square-sizeи--gr-switch-state-text-sizeперекрывают ступень, как и прежде.
v3.4.02026-10-28
Changed
- Вид повторяющихся компонентов — лист по атрибутам, а не утилиты, как у
GrButtonв 3.3.0 (docs/markup-weight.md). ПереведеныGrBadge,GrChip,GrCheckbox,GrSwitch,GrRadio,GrTabs,GrPaginationиGrSegmented.- Экземпляр несёт только состояние:
data-gr-size,data-gr-tone,data-gr-variantи флаги. Всё, что в разметке уже есть, —aria-checked,aria-selected,aria-current,aria-disabled,aria-invalid,:disabled— лист читает напрямую. - Ушли строки классов, инлайн-переменные
GrSwitchиGrSegmented, скрытый инлайн-стиль нативного поляGrCheckboxи атрибутыscoped-стиляGrBadge. - Палитру тонов и радиусы
GrChipберёт у листаGrBadge: в одном ряду они обязаны совпадать. - Вычисленные стили каждого компонента совпадают с прежними до свойства, кроме кривой переходов
и двух исправлений
GrSegmentedниже: сверены все состояния в четырёх темах и обоих режимах. - Классы-маркеры
gr-badge,gr-badge__label,gr-badge__textиgr-checkbox-iconубраны: селектор метки —[data-gr-badge]. ВариантGrSegmentedтеперь вdata-gr-variant, а не вdata-variant. - Переходы цвета у
GrCheckbox,GrSwitch,GrRadio,GrTabs,GrPaginationиGrSegmentedидут по кривой темы--gr-ease-out, а не по кривой движка: так движение задаёт дизайн-система (motion.md). - Если тесты или стили приложения искали у этих компонентов классы, им теперь нужны атрибуты.
- Экземпляр несёт только состояние:
Fixed
- Подпись
GrSegmentedберёт вес из темы. Утилитаfont-[var(--gr-segmented-font-weight)]движок собирал вfont-family, и--gr-segmented-label-weightне действовал: подписи стояли обычным начертанием, а не semibold «Сланца» и medium «Глины». - Недоступный сегмент
GrSegmentedгаснет. Цвет--gr-disabled-fgпроигрывал базовому цвету сегмента: утилиты одной специфичности, и решал порядок в собранном CSS. Недоступный сегмент выглядел рабочим и отличался только курсором.
v3.3.02026-10-27
Changed
GrButtonрисуется листом компонента, а не утилитами, — разметка кнопки стала в восемь раз легче. Вес, тон, ступень, недоступность и аддоны переехали в атрибуты:data-gr-variant,data-gr-tone,data-gr-size,data-gr-square,data-gr-block,data-gr-off,data-gr-pre,data-gr-post,data-gr-cell. Цвета, размеры и движение задают по ним правила<style>компонента. Строка классов в полторы-две тысячи символов на каждую кнопку исчезла: кнопка по умолчанию весит около 210 символов HTML вместо ~1 800. Safelist кнопки пуст, модуль её стилей вdist— 0,9 КБ вместо 21,5 КБ. Вид не изменился: вычисленные стили 2 640 состояний совпадают до свойства. Сверялись четыре темы в обоих режимах, все веса, тона и ступени, нажатие, недоступность, загрузка, группы и радио в виде кнопки. Лист лежит в слоеgranum.components, утилиты — вgranum.utilities, поэтому класс на экземпляре (<GrButton class="…">) перекрывает вид кнопки предсказуемо, без гонки за порядок утилит.GrRadioв виде кнопки несёт те же атрибуты. Если тесты или стили приложения искали у кнопки классы (h-10,bg-[var(--gr-button-primary-bg)]), им теперь нужны атрибуты: ступень —data-gr-size, тон —data-gr-tone.
Fixed
- Контур фокуса в «Тактильной» въезжает с задуманного отступа. В покое
outline-noneсвоими 2px перебивал--gr-button-focus-offset-from, который у «Тактильной» равен 6px. Из-за этого фокус начинал движение не с того отступа, который задала тема. Теперь отступ покоя берётся из токена темы. В темах, где он равен отступу фокуса, ничего не меняется.
Более ранние версии
Тела этих релизов не показываются: лента целиком весит больше, чем страница имеет право весить. Файл в репозитории всегда полон.
v3.2.22026-10-27v3.2.12026-10-27v3.2.02026-10-26v3.1.12026-10-22v3.1.02026-10-21v3.0.02026-10-21v2.4.02026-10-21v2.3.02026-10-20v2.2.02026-10-20v2.1.02026-10-20v2.0.02026-10-19v1.1.12026-10-16v1.1.02026-10-16v1.0.212026-10-13v1.0.202026-10-13v1.0.192026-10-13v1.0.182026-10-07v1.0.172026-10-07v1.0.162026-10-07v1.0.152026-10-07v1.0.142026-10-07v1.0.132026-10-07v1.0.122026-10-07v1.0.112026-10-06v1.0.102026-10-06v1.0.92026-10-06v1.0.82026-10-06v1.0.72026-10-06v1.0.62026-10-06v1.0.52026-10-06v1.0.42026-10-06v1.0.32026-10-06v1.0.22026-10-05v1.0.12026-09-29v1.0.02026-09-28v0.53.12026-09-11v0.53.02026-09-11v0.52.02026-09-10v0.51.02026-09-10v0.50.02026-09-09v0.49.02026-09-06v0.48.02026-09-06v0.47.02026-09-05v0.46.02026-09-04v0.45.02026-09-03v0.44.02026-09-03v0.43.02026-09-02v0.42.02026-09-01v0.41.02026-08-31v0.40.02026-08-30v0.39.02026-08-29v0.38.02026-08-28v0.37.02026-08-27v0.36.02026-08-27v0.35.02026-08-25v0.34.22026-08-25v0.34.12026-08-25v0.34.02026-08-25v0.33.02026-08-25v0.32.02026-08-24v0.31.12026-08-23v0.31.02026-08-23v0.30.02026-08-23v0.29.12026-08-22v0.29.02026-08-22v0.28.42026-08-22v0.28.32026-08-22v0.28.22026-08-22v0.28.12026-08-22v0.27.22026-08-20v0.27.12026-08-19v0.27.02026-08-19v0.26.02026-08-18v0.25.02026-08-18v0.24.12026-08-18v0.24.02026-08-18v0.23.02026-08-17v0.22.02026-08-17v0.21.12026-08-17v0.21.02026-08-17v0.20.02026-08-13v0.19.02026-08-13v0.18.02026-08-12v0.17.02026-08-12v0.16.02026-08-11v0.15.02026-08-07v0.14.02026-08-05v0.13.02026-07-28v0.12.02026-07-20v0.11.02026-07-19v0.10.02026-07-17v0.9.42026-06-23v0.9.32026-06-09v0.9.22026-06-08v0.9.12026-06-07v0.9.02026-06-02v0.8.02026-06-01v0.1.0