@feugene/granularity

  • С компонентами
  • релизов: 87
  • v1.1.1

Релизы @feugene/granularity из его CHANGELOG: последние 8 целиком, более ранние — списком версий.

тег ядра v1.1.1

На этой странице

Записи релизов — авторский текст библиотеки, и он английский. Портал его не переводит: журнал изменений — история чужого репозитория, а переписанная история перестаёт быть историей.

v1.1.12026-10-16

Fixed

  • Манифест знает части составных компонентов. Пакет собран granum 2.1: его сборка записывает в манифест 22 части у их владельцев (GrListItem у GrList, GrTabPanel у GrTabPanels, восемь частей GrDropdownMenu) — поле subcomponents. Приложение на granum 2.1 сводит подпуть части к владельцу: часть, импортированная при селекции без владельца, — ComponentOutsideSelectionError на владельце, components: 'imports' берёт владельца в селекцию, а granum doctor больше не предупреждает subcomponents-missing (с ним doctor --strict у приложения на 2.1 падал). Peer granum прежний — >=2.0.0 <3.0.0: granum 2.0 поле не читает и судит импорт части, как раньше.

v1.1.02026-10-16

Переезд на @feugene/granum 2.0 и @feugene/fint-i18n 0.9. Приложению — поднять @feugene/granum и @feugene/granum-engine-wind до ^2.0.0 и пройти раздел «From 1.x to 2.0» в MIGRATION.md granum: неизвестный ключ granum.config там стал ошибкой. @feugene/fint-i18n, если стоит, — ^0.9.0.

Changed

  • Peer @feugene/granum — >=2.0.0 <3.0.0. Пакет собран granum 2.0. Формат манифеста прежний, но рецепты темизации и запрет корневого импорта, на которые опирается документация, работают только с 2.0.
  • Компонент из корня пакета — ошибка сборки приложения. С granum 2.0 import { GrButton } from '@feugene/granularity' даёт ComponentRootImportError под js.guard: селекция видит компонент только по подпути, а корень тянет весь пакет. Компоненты берут из @feugene/granularity/components/<Имя> или virtual:granum/components; утилиты, плагины, константы и типы из корня — можно. README и документация переведены на подпути.
  • Необязательный peer @feugene/fint-i18n — >=0.9.0 <1.0.0. Пакет тестируется на 0.9; на 0.7 и 0.8 он не проверялся, и обещать их диапазон было нечем. Ломающее в fint 0.8 (beforeLoadBlock получает { block, locale }) пакет не задевает.
  • Контракт адаптера переводов — необязательное поле setLocale. Так язык меняет инстанс @feugene/fint-i18n, который подключается адаптером как есть.

Fixed

  • dist не импортирует granum. Дескрипторы компонентов тянули @feugene/granum/contract в рантайм, и SSR-сервер с внешними пакетами, задеплоенный с --omit=dev, падал на первом компоненте с ERR_MODULE_NOT_FOUND. Сборка granum 2.0 встраивает контракт в dist/granum/contract.js; снаружи у чанков остались только vue и @floating-ui/dom.
  • Рецепты темизации действуют. themes.tokenOverrides и themes.define.<тема>.tokensRef встают после файла темы пакета под его селектор и побеждают; themes.define.<имя> с extends: 'dark' наследует значения тёмной темы. granum 1.x ставил эти блоки раньше файлов тем, и рецепты не действовали. Ключ с -- в tokenOverrides — InvalidConfigError, а не ----gr-*.
  • locale у GrConfigProvider переключает язык инстанса fint-i18n. Провайдер звал только syncLocale из контракта адаптера, а у FintI18n такого метода нет — язык там меняет setLocale(). <GrConfigProvider locale="en"> при рекомендованном стеке молча ничего не делал. Теперь без syncLocale провайдер зовёт setLocale; это закреплено тестом с настоящим createFintI18n.

Docs

  • localization.md: раздел «Своё i18n: адаптер» — поля контракта и проверенный пример для vue-i18n; версия fint-i18n — 0.9; смена языка — setLocale() или проп locale у GrConfigProvider.
  • theming.md: define.<тема>.tokensRef не заменяет файл пакета, а ложится поверх него — файлу достаточно изменённых ролей; третья тема — define с extends; ключ themes.themeFiles пресета v1 убран отовсюду.
  • getting-started.md: голому Node инлайн server.deps.inline не нужен — чанки не импортируют ни .css, ни granum; авто-импорт — один GranularityResolver().
  • unplugin.md, companion-packages.md: единый резолвер на ядро и спутники, своему пакету ./resolver не нужен.
  • installation.md, granum.md, components.md, README.md: granum 2.0, dist без granum, компоненты — из подпутей.

v1.0.212026-10-13

Fixed

  • Подсказка пустого нативного GrSelect — цветом подсказки. Опция-подсказка из 1.0.20 и опция очистки рисовались цветом значения и читались выбранными. Пока поле пустое, текст <select> — --gr-muted-fg, как ::placeholder у GrInput, а опции раскрытого списка — обычным цветом. Пустое поле помечено data-gr-select-empty. Цвет ставится стилем в строке: утилиты с теми же телами сливались с общими правилами и сдвигали их порядок — у элементов с двумя классами цвета менялся победитель.

v1.0.202026-10-13

Fixed

  • Пустой нативный GrSelect без clearable не показывает первую опцию. Пустую опцию поле рисовало только с clearable; без неё и без выбранной опции браузер ставил первую сам — поле показывало «Germany» при пустой модели, select.value уходил в форму «DE», а форма из схемы писала «This field is required» прямо под «Germany». Теперь пустая модель одиночного нативного выбора показывает опцию-подсказку <option value="" disabled hidden selected> с текстом placeholder или переведённым «Select…»; выбрать её обратно нельзя, а с clearable остаётся прежняя опция очистки.

Added

  • Строка gr.select.placeholder — подсказка пустого нативного выбора: «Select…», «Выберите…», «Seleccione…».

v1.0.192026-10-13

Fixed

  • Цвет динамики GrStatistic следует полярности. Строка под значением красила рост зелёным, а падение красным при любой polarity: растущий отток получал зелёную стрелку, падающая просрочка — красную. Теперь тон динамики считает deltaTone(направление, полярность): negative-good красит up в danger, down — в success, none — без тона. Без полярности рост по-прежнему хорош.

Added

  • trendPolarity у GrStatistic. Полярность только для динамики: абсолютному показателю (отток 2.4 %) знака у значения нет, и polarity красила бы само число красным за то, что оно положительное. С trendPolarity="negative-good" значение остаётся нейтральным, а «↑ +0.6 п. п.» — красным. Не задан — берётся polarity; настраивается и через GrConfigProvider.

v1.0.182026-10-07

Fixed

  • Значения GrJsonViewer в узкой панели не пропадают. Ключ не сжимался и в глубоком узле на 232px забирал всю строку: значение обрезалось до нуля, и у amount_paid не было видно ничего. Теперь ключ и значение сжимаются вместе (ключ — охотнее), а у значения остаётся минимум в 5 знаков; остальное уходит в многоточие.

v1.0.172026-10-07

Fixed

  • Поиск в панели GrTreeSelect не забирает контекст GrFormField. Внутри поля с required и ошибкой поиск получал id контрола — тот же, что у триггера (дубль в DOM навсегда: поиск живёт в DOM и при закрытой панели), — а с ним подсказку и ошибку в aria-describedby, aria-required и aria-invalid: скринридер объявлял поиск «обязательным, с ошибкой». Теперь вспомогательные поля внутри контролов стоят за границей контекста поля и называются сами: поиск GrTreeSelect и GrSelect, поиск GrTransfer, hex у GrColorPicker.
  • Подсказка поиска видна. GrInput гасил placeholder на фокусе, а панель GrTreeSelect уводит фокус в поиск сразу — «Search…» не был виден ни разу. У type="search" placeholder теперь остаётся, пока поле пустое; у прочих полей — как прежде.
  • Строки дерева в панели GrTreeSelect — на шаге контрола. На md дерево наследовало кегль страницы, и строки в панели были 16px против 14px у поля. Теперь панель набирается кеглем контрола своего размера.
  • Заголовок группы GrTreeSections без внешних отступов. С headingLevel он — настоящий <h2>…<h6>, и базовый слой страницы (h2 { margin-block: 2.5rem 1rem }) раздвигал группы: секция на 147px при заголовке в 21px. Теперь у заголовка m-0, отступы задают gap корня и секции.

v1.0.162026-10-07

Changed

  • GrTextarea всегда в обёртке. Раньше без кнопки, признака и счётчиков корнем был сам <textarea>. Теперь корень — обёртка data-gr-textarea-wrap: class и style потребителя ложатся на неё, остальные атрибуты (aria-*, data-*, spellcheck) — на <textarea>, как у GrInput. Селекторы потребителя вида textarea.my-class стоит заменить на .my-class textarea.
  • В вертикальном GrTabs содержимое вкладки — у начала. Колонка разделов настроек («Profile / Security 1 / Notifications / Delete account») с центрированным содержимым ставила значки рваной линией и читалась меню из кнопок. Теперь в колонке значки — ровной линией, подпись занимает остаток, бейдж и крестик — у конца; в ряду вкладки центрированы, как прежде. То же правило, что у вертикального GrSegmented; GrTabsWithPanels получает его вместе с GrTabs.

Fixed

  • GrTextarea не теряет фокус посреди набора. Обёртка появлялась вместе с признаком состояния, кнопкой очистки или счётчиком, и <textarea> пересоздавался: на «1100-445» state становился success, фокус уходил на <body>, и «␣Lisboa» не набиралось никуда. Теперь разметка одна и та же, соседи лишь появляются рядом с полем; поле внутри блочное, и высота с ними и без них одинакова (раньше под строчным <textarea> оставался зазор базовой линии в 5px).
  • Первая строка GrTextarea clearable не уходит под «×». Поле держало обычный отступ справа, а кнопка шириной 24px лежала поверх текста. Теперь место под кнопку (и под признак состояния рядом с ней) зарезервировано, пока кнопка может появиться.
  • Delete у GrTabs закрывает вкладку под фокусом, а не выбранную. Обработчик брал индекс из роверного ключа, который отставал от фокуса: при программном фокусе и в activation-mode="manual", где фокус и выбор законно расходятся, Delete на «payment-failed.mjml» эмитил close('invoice-paid.mjml'). Теперь вкладка берётся из самого события — тот же путь и у Enter/Space в ручном режиме.
  • Закрытый последний тост не роняет фокус на <body>. Пришедший в стек GrToaster по F6 и закрывший тост Delete оказывался в начале документа. Теперь фокус переходит на соседний тост, а когда тостов не осталось — туда, откуда пришли в стек (его запоминают F6 и focus()), если тот элемент ещё в документе. Так же — крестик и кнопки действий с dismissOnClick, когда фокус на них.
  • Выключенный GrTooltip не держит таб-стоп. Обёртка вокруг нефокусируемого триггера оставалась остановкой Tab и с disabled: список клиентов, где подсказка включена только у обрезанного имени, давал по остановке на каждую строку. Теперь без подсказки обёртка снимает tabindex и aria-describedby. Заодно block прижимает содержимое триггера к началу, как строку списка, а не к центру.

Более ранние версии

Тела этих релизов не показываются: лента целиком весит больше, чем страница имеет право весить. Файл в репозитории всегда полон.

  • v1.0.152026-10-07
  • v1.0.142026-10-07
  • v1.0.132026-10-07
  • v1.0.122026-10-07
  • v1.0.112026-10-06
  • v1.0.102026-10-06
  • v1.0.92026-10-06
  • v1.0.82026-10-06
  • v1.0.72026-10-06
  • v1.0.62026-10-06
  • v1.0.52026-10-06
  • v1.0.42026-10-06
  • v1.0.32026-10-06
  • v1.0.22026-10-05
  • v1.0.12026-09-29
  • v1.0.02026-09-28
  • v0.53.12026-09-11
  • v0.53.02026-09-11
  • v0.52.02026-09-10
  • v0.51.02026-09-10
  • v0.50.02026-09-09
  • v0.49.02026-09-06
  • v0.48.02026-09-06
  • v0.47.02026-09-05
  • v0.46.02026-09-04
  • v0.45.02026-09-03
  • v0.44.02026-09-03
  • v0.43.02026-09-02
  • v0.42.02026-09-01
  • v0.41.02026-08-31
  • v0.40.02026-08-30
  • v0.39.02026-08-29
  • v0.38.02026-08-28
  • v0.37.02026-08-27
  • v0.36.02026-08-27
  • v0.35.02026-08-25
  • v0.34.22026-08-25
  • v0.34.12026-08-25
  • v0.34.02026-08-25
  • v0.33.02026-08-25
  • v0.32.02026-08-24
  • v0.31.12026-08-23
  • v0.31.02026-08-23
  • v0.30.02026-08-23
  • v0.29.12026-08-22
  • v0.29.02026-08-22
  • v0.28.42026-08-22
  • v0.28.32026-08-22
  • v0.28.22026-08-22
  • v0.28.12026-08-22
  • v0.27.22026-08-20
  • v0.27.12026-08-19
  • v0.27.02026-08-19
  • v0.26.02026-08-18
  • v0.25.02026-08-18
  • v0.24.12026-08-18
  • v0.24.02026-08-18
  • v0.23.02026-08-17
  • v0.22.02026-08-17
  • v0.21.12026-08-17
  • v0.21.02026-08-17
  • v0.20.02026-08-13
  • v0.19.02026-08-13
  • v0.18.02026-08-12
  • v0.17.02026-08-12
  • v0.16.02026-08-11
  • v0.15.02026-08-07
  • v0.14.02026-08-05
  • v0.13.02026-07-28
  • v0.12.02026-07-20
  • v0.11.02026-07-19
  • v0.10.02026-07-17
  • v0.9.42026-06-23
  • v0.9.32026-06-09
  • v0.9.22026-06-08
  • v0.9.12026-06-07
  • v0.9.02026-06-02
  • v0.8.02026-06-01
  • v0.1.0

CHANGELOG пакета целиком