feat(devtools): секция токенов, разрешающихся в пустоту; пресет 0.14.1 - #12
Merged
Conversation
added 2 commits
August 28, 2026 12:50
`--gr-*`, который правило компонента читает без запасного значения, а браузер отдаёт пустым: объявление отбраковывается на этапе вычисления, и компонент выходит без фона, без рамки, с прямыми углами — при зелёной сборке и валидном CSS. Индекс стилей попутно собирает «класс → токены без запаса» тем же обходом, что и «классы без правил»: `@media`/`@supports`/`@layer` внутрь, последний `var()` цепочки запасных учитывается — пустой, он роняет объявление так же. Считаются только `--gr-*`: UnoCSS читает свои `--un-shadow-inset`, `--un-ring-inset`, `--un-space-y-reverse` без запаса по всей утилитной раскладке, и на чистом стенде это три находки чужой внутренней механики. Идея — из `token-undefined`, заведённой в `granular doctor` пресетом 0.14.0. Статическая проверка слепа там, где приложения ошибаются чаще всего: `themes.tokensFile` заменяет `tokens.css` пакета, а доктор считает заданным объединение обоих файлов. Замерено на `apps/playground`: с подменой файла theme-CSS падает с 22 504 до 15 703 байт и теряет `--gr-radius-control`, доктор отчитывается теми же 17 находками, панель называет 11 пустых токенов типографики и анимации. В 0.14.1 ту же дыру закрыли для `themes.themeFiles`, для `tokensFile` — нет. Пресет поднят до 0.14.1. Его новая диагностика роняла бы `doctor --strict` в семи пакетах: на ядре 33 находки, и все до единой — токены, которые компонент выставляет себе сам инлайновым стилем. Гейтом теперь служит `scripts/granular-doctor.mjs`: `--strict` минус `token-undefined` на токенах, объявленных `tokens.json` любого пакета монорепо. Токен, которого не объявляет никто, роняет гейт — это опечатка в имени.
Обратная сторона секции объявленных токенов: что компонент потребляет на самом деле — четырьмя группами по владельцу. `own` — объявлено им самим; `from other components` — с именем владельца, чтобы было видно, кого заденет правка; `foundation` — палитра, шкалы, тени, длительности; `unregistered` — не объявлен ни одним реестром, почти всегда опечатка. В строке фактическое значение и пометка `has fallback`. Включения между двумя множествами нет ни в одну сторону: объявленный токен может не потребляться, а потребляет компонент в основном чужое. Живой `GrButton` на стенде читает двенадцать токенов, своих из них два. Отсюда виден и путь значения: `--gr-button-primary-bg` отдаёт `#e546bd`, потому что его запас — `--gr-primary`, перекрашенный приложением. Индекс стилей теперь пишет потребление и с запасом тоже, помечая токен строгим, если хоть одно чтение идёт без запаса. Секция пустых токенов отбирает по этому флагу: чтение с запасом при пустом токене рисует запасным значением и находкой быть не может.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Панель —
granularity-devtools0.3.0Новая секция на инспекторе компонента:
--gr-*, который правило читает без запасного значения, а браузер отдаёт пустым. Такое объявление отбраковывается на этапе вычисления — компонент выходит без фона, без рамки, с прямыми углами, при зелёной сборке и валидном CSS.Индекс стилей попутно собирает «класс → токены без запаса» тем же обходом, что и «классы без правил». Считаются только
--gr-*: UnoCSS читает свои--un-*без запаса по всей утилитной раскладке, и на чистом стенде это три находки чужой механики.Что компонент читает — четыре секции по владельцу
Обратная сторона секции объявленных токенов:
own,from other components(с именем владельца — правка заденет и его),foundation(палитра, шкалы, тени, длительности) иunregistered(не объявлен ни одним реестром — опечатка). В строке значение и пометкаhas fallback.Включения между множествами нет ни в одну сторону: объявленный токен может не потребляться, а потребляет компонент в основном чужое. Живой
GrButtonна стенде читает двенадцать токенов, своих из них два — и видно, откуда берётся цвет:--gr-button-primary-bgотдаёт#e546bd, потому что его запас--gr-primaryперекрашен приложением.Почему не хватило статики
Идея — из
token-undefined, заведённой вgranular doctorпресетом 0.14.0. Проверка слепа там, где приложения ошибаются чаще всего:themes.tokensFileзаменяетtokens.cssпакета, а доктор считает заданным объединение обоих файлов.Замерено на
apps/playground:tokensFile--gr-radius-controldoctorВ 0.14.1 ту же дыру закрыли для
themes.themeFiles, дляtokensFile— нет.Пресет 0.14.1 и гейт
doctorНовая диагностика роняла бы
doctor --strictв семи пакетах. Разобрал все находки: на ядре их 33, и все до единой — токены, которые компонент выставляет себе сам инлайновым стилем (grAlertStyles.ts,grSegmentedStyles.ts,GrSwitch.vue).Гейтом теперь служит
scripts/granular-doctor.mjs:--strictминусtoken-undefinedна токенах, объявленныхtokens.jsonлюбого пакета монорепо. Токен, которого не объявляет никто, роняет гейт — это опечатка в имени. По дороге правило поймало--gr-floating-available-height, пока реестр читался только изcomponents/*.Проверено
doctor: 7 пакетов, exit 0granularity: 4832 тестаgranularity-devtools: 160 тестов (+31), линт и типы чистоGrButton— 12 потребляемых, 8 строгих