diff --git a/apps/showcase/package.json b/apps/showcase/package.json index cd4d1601..770bb8a7 100644 --- a/apps/showcase/package.json +++ b/apps/showcase/package.json @@ -14,7 +14,7 @@ "@feugene/granularity-editor": "^0.3.1", "@feugene/granularity-forms-schema": "^0.4.0", "@feugene/granularity-media": "^0.7.1", - "@feugene/unocss-preset-granular": "^0.14.1", + "@feugene/unocss-preset-granular": "^0.15.0", "@floating-ui/dom": "^1.8.0", "vue": "^3.5.42", "vue-router": "^4.6.4" diff --git a/packages/granularity-charts/package.json b/packages/granularity-charts/package.json index 54fe8bf9..c0fb3c64 100644 --- a/packages/granularity-charts/package.json +++ b/packages/granularity-charts/package.json @@ -157,7 +157,7 @@ "@feugene/fint-i18n": "^0.7.0", "@feugene/granularity": "^0.38.0", "@feugene/granularity-test-kit": "^0.8.1", - "@feugene/unocss-preset-granular": "^0.14.1", + "@feugene/unocss-preset-granular": "^0.15.0", "@feugene/unplugin-granularity": "^0.7.0", "@types/node": "^26.4.0", "@vitejs/plugin-vue": "^6.0.8", diff --git a/packages/granularity-chrono/package.json b/packages/granularity-chrono/package.json index be9624c6..bc9cc933 100644 --- a/packages/granularity-chrono/package.json +++ b/packages/granularity-chrono/package.json @@ -132,7 +132,7 @@ "@feugene/fint-i18n": "^0.7.0", "@feugene/granularity": "^0.38.0", "@feugene/granularity-test-kit": "^0.8.1", - "@feugene/unocss-preset-granular": "^0.14.1", + "@feugene/unocss-preset-granular": "^0.15.0", "@feugene/unplugin-granularity": "^0.7.0", "@types/node": "^26.4.0", "@vitejs/plugin-vue": "^6.0.8", diff --git a/packages/granularity-dashboard/package.json b/packages/granularity-dashboard/package.json index ccecf884..1627ed8c 100644 --- a/packages/granularity-dashboard/package.json +++ b/packages/granularity-dashboard/package.json @@ -133,7 +133,7 @@ "@feugene/fint-i18n": "^0.7.0", "@feugene/granularity": "^0.38.0", "@feugene/granularity-test-kit": "^0.8.1", - "@feugene/unocss-preset-granular": "^0.14.1", + "@feugene/unocss-preset-granular": "^0.15.0", "@feugene/unplugin-granularity": "^0.7.0", "@types/node": "^26.4.0", "@vitejs/plugin-vue": "^6.0.8", diff --git a/packages/granularity-devtools/CHANGELOG.md b/packages/granularity-devtools/CHANGELOG.md index f27bcf29..df786f0d 100644 --- a/packages/granularity-devtools/CHANGELOG.md +++ b/packages/granularity-devtools/CHANGELOG.md @@ -7,6 +7,20 @@ to [Semantic Versioning](https://semver.org/). ## [Unreleased] +## [v0.3.1] 2026-08-28 + +### Changed + +- The rationale for "tokens resolving to nothing" is corrected in the README. Preset `0.15.0` closed the + `themes.tokensFile` blind spot the section was justified by — the fix landed on the feedback this package + filed. Swapping the token file on `apps/playground` now moves `doctor` from 8 findings to 52. + + What the panel adds is no longer "the static check is blind here" but "the static check answers a different + question": not «does any layer define this token in this configuration» but «is it empty right now, on this + element». Measured on the same stand — healthy: `doctor` 8, panel 0; swapped: `doctor` 52, panel 11. The eight + on a healthy stand are tokens `GrAlert` assigns itself with an inline style, which static analysis cannot tell + apart from undefined. + ## [v0.3.0] 2026-08-28 ### Added diff --git a/packages/granularity-devtools/README.md b/packages/granularity-devtools/README.md index e637e4a8..3deb4321 100644 --- a/packages/granularity-devtools/README.md +++ b/packages/granularity-devtools/README.md @@ -44,13 +44,25 @@ **Токены, разрешающиеся в пустоту** — отдельной секцией: `--gr-*`, который правило компонента читает **без запасного значения**, а браузер отдаёт пустым. Такое объявление отбраковывается на этапе вычисления, и компонент выходит без -фона, без рамки, с прямыми углами — при зелёной сборке и валидном CSS. Смежную -проверку делает `granular doctor` (диагностика `token-undefined` с 0.14.0), но -она статическая и слепа ровно там, где ошибаются чаще всего: `themes.tokensFile` -**заменяет** `tokens.css` пакета, а доктор считает заданным объединение обоих -файлов. В `0.14.1` ту же дыру закрыли для `themes.themeFiles`, но не для -`themes.tokensFile`: стенд с такой подменой доктор по-прежнему проходит молча — -панель показывает одиннадцать пустых токенов типографики и анимации. +фона, без рамки, с прямыми углами — при зелёной сборке и валидном CSS. + +Смежную проверку делает `granular doctor` (диагностика `token-undefined`), и с +пресета `0.15.0` она этот класс ловит: подмена `tokens.css` через +`themes.tokensFile` поднимает на стенде `apps/playground` число находок с 8 до +52. Панель отвечает на другой вопрос — не «задаёт ли токен хоть один слой в этой +конфигурации», а «пуст ли он **сейчас, на этом элементе**». Замеры на том же +стенде: + +| | `doctor` | панель | +| --- | --- | --- | +| штатный конфиг | 8 находок | 0 | +| подмена `tokensFile` | 52 | 11 | + +Расхождения не противоречие. Восемь находок на здоровом стенде — токены, +которые `GrAlert` выставляет себе сам инлайновым стилем: статикой такое не +отличить от незаданного, а браузер их видит заданными. Пятьдесят две против +одиннадцати — это весь замкнутый набор выбранных компонентов против того, что +реально на экране, с именем класса, который токен читает. **Issues** — все предупреждения пакета одним списком со счётчиком повторов, вместо тонущих в консоли строк. Сюда же попадают **недостающие обязательные diff --git a/packages/granularity-devtools/package.json b/packages/granularity-devtools/package.json index 50e157c2..5bf74883 100644 --- a/packages/granularity-devtools/package.json +++ b/packages/granularity-devtools/package.json @@ -1,7 +1,7 @@ { "name": "@feugene/granularity-devtools", "description": "Vue DevTools panel for @feugene/granularity — where a prop value came from, the overlay layer stack and design-system warnings.", - "version": "0.3.0", + "version": "0.3.1", "license": "SEE LICENSE IN LICENSE", "author": { "name": "Evgeniy Fureev", diff --git a/packages/granularity-devtools/src/resolve/emptyTokens.ts b/packages/granularity-devtools/src/resolve/emptyTokens.ts index f5148aac..5343dd50 100644 --- a/packages/granularity-devtools/src/resolve/emptyTokens.ts +++ b/packages/granularity-devtools/src/resolve/emptyTokens.ts @@ -5,11 +5,11 @@ * свойство отбраковывается на этапе вычисления, и компонент выходит без фона, * без рамки, с прямыми углами. Сборка при этом зелёная — CSS валиден. * - * Статический `granular doctor` отвечает на смежный вопрос («какой токен не - * задаёт ни один granular-слой») и слеп ровно там, где ошибаются чаще всего: - * `themes.tokensFile` **заменяет** `tokens.css` пакета, но доктор считает - * заданным объединение обоих файлов — и подмену базовых токенов приложением не - * замечает. Здесь источник истины — сам браузер: читается то, что получилось. + * Статический `granular doctor` отвечает на смежный вопрос — «задаёт ли токен + * хоть один granular-слой в этой конфигурации». Здесь вопрос другой: «пуст ли он + * сейчас, на этом элементе». Разница видна на живом стенде: токен, который + * компонент выставляет себе сам инлайновым стилем, статике неотличим от + * незаданного, а браузеру — заданный. * * Секция `unset` из `tokenUsage` отвечает на другой вопрос: там объявленные * токены компонента, и пустота в них — норма (`kind: 'hook'`, состояния diff --git a/packages/granularity-editor/package.json b/packages/granularity-editor/package.json index d77419d3..1cdf4b03 100644 --- a/packages/granularity-editor/package.json +++ b/packages/granularity-editor/package.json @@ -116,7 +116,7 @@ "@feugene/fint-i18n": "^0.7.0", "@feugene/granularity": "^0.38.0", "@feugene/granularity-test-kit": "^0.8.1", - "@feugene/unocss-preset-granular": "^0.14.1", + "@feugene/unocss-preset-granular": "^0.15.0", "@feugene/unplugin-granularity": "^0.7.0", "@tiptap/core": "^3.30.5", "@tiptap/extensions": "^3.30.5", diff --git a/packages/granularity-forms-schema/package.json b/packages/granularity-forms-schema/package.json index 857f4898..5e0c6b61 100644 --- a/packages/granularity-forms-schema/package.json +++ b/packages/granularity-forms-schema/package.json @@ -166,7 +166,7 @@ "@feugene/granularity": "^0.38.0", "@feugene/granularity-chrono": "^0.10.0", "@feugene/granularity-test-kit": "^0.8.1", - "@feugene/unocss-preset-granular": "^0.14.1", + "@feugene/unocss-preset-granular": "^0.15.0", "@feugene/unplugin-granularity": "^0.7.0", "@types/node": "^26.4.0", "@vitejs/plugin-vue": "^6.0.8", diff --git a/packages/granularity-media/package.json b/packages/granularity-media/package.json index eb477d2a..bd0ab008 100644 --- a/packages/granularity-media/package.json +++ b/packages/granularity-media/package.json @@ -121,7 +121,7 @@ "@feugene/fint-i18n": "^0.7.0", "@feugene/granularity": "^0.38.0", "@feugene/granularity-test-kit": "^0.8.1", - "@feugene/unocss-preset-granular": "^0.14.1", + "@feugene/unocss-preset-granular": "^0.15.0", "@feugene/unplugin-granularity": "^0.7.0", "@types/node": "^26.4.0", "@vitejs/plugin-vue": "^6.0.8", diff --git a/packages/granularity-test-kit/package.json b/packages/granularity-test-kit/package.json index 52f5152c..40d7061d 100644 --- a/packages/granularity-test-kit/package.json +++ b/packages/granularity-test-kit/package.json @@ -105,7 +105,7 @@ "devDependencies": { "@antfu/eslint-config": "^9.3.0", "@axe-core/playwright": "^4.13.0", - "@feugene/unocss-preset-granular": "^0.14.1", + "@feugene/unocss-preset-granular": "^0.15.0", "@playwright/test": "^1.62.1", "@types/node": "^26.4.0", "@vue/test-utils": "^2.4.11", diff --git a/packages/granularity/package.json b/packages/granularity/package.json index 5a635c79..da0e2397 100644 --- a/packages/granularity/package.json +++ b/packages/granularity/package.json @@ -608,7 +608,7 @@ "@antfu/eslint-config": "^9.3.0", "@feugene/fint-i18n": "^0.7.0", "@feugene/granularity-test-kit": "^0.8.1", - "@feugene/unocss-preset-granular": "^0.14.1", + "@feugene/unocss-preset-granular": "^0.15.0", "@floating-ui/dom": "^1.8.0", "@iconify-json/lucide": "^1.2.126", "@types/node": "^25.9.5", diff --git a/yarn.lock b/yarn.lock index 41feea32..597b6259 100644 --- a/yarn.lock +++ b/yarn.lock @@ -659,10 +659,10 @@ "@unocss/preset-mini" "^66.7.5" "@unocss/rule-utils" "^66.7.5" -"@feugene/unocss-preset-granular@^0.14.1": - version "0.14.1" - resolved "https://registry.yarnpkg.com/@feugene/unocss-preset-granular/-/unocss-preset-granular-0.14.1.tgz#a9359fdbab9ad10d5af6b3db18c11e4adb551aa3" - integrity sha512-eNoY01qUwIPnal1cfVJCJO0wZzSYMjISJkJ148yOeqdH+pWkmLXQlhnC/Orv+IEIAVSjExOULLrSmsa0/dhiNA== +"@feugene/unocss-preset-granular@^0.15.0": + version "0.15.0" + resolved "https://registry.yarnpkg.com/@feugene/unocss-preset-granular/-/unocss-preset-granular-0.15.0.tgz#f4706af3152a310dc108d658fcdac51dc484a9ac" + integrity sha512-mXejPG3H5nwgKPkxLeaQoD/G1l714refIZqnEsSkoJ6SARcoCcEmi2iO55zwNppHz54Q+5RK7ljCHhRCo2v2aQ== dependencies: "@feugene/unocss-mini-extra-rules" "^0.8.1"