You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Found while reviewing #378 (icon-map rebuild). Not a regression — it has been like this — but it is a visual inconsistency in shipped components, and it invalidates an assumption the porting docs were about to encode.
What
src/runtime/dictionary/icons.ts is presented as the authority for "which b24-icon plays which semantic role". Half of the library does not read it.
$ unique `@bitrix24/b24icons-vue/…` paths under src/ : 98
$ …of those, imported by dictionary/icons.ts : 49
$ …hardcoded in components instead : 49
So a checkbox tick and a check icon rendered through the dictionary are different glyphs, and the same for the minus in an indeterminate checkbox, the close cross in a Badge, and the chevron in a Button with a dropdown.
Why it matters
Visual inconsistency — two glyphs for one meaning, in one design system.
The dictionary's authority is fictional where it is bypassed. Anything that reasons from it — including appConfig.b24ui.icons.* overrides, if a consumer sets one — silently does not apply to these components.
It nearly went into .sync/PORTING.md as a rule. chore(sync): derive icon-map.json from the shared icon keys, and guard it #378 originally said these hardcoded values are "glyphs the library does not render for those roles"; that was wrong, and the wording is being corrected there. The underlying inconsistency is what remains.
Not obviously a bug — needs a decision
Some of these may be deliberate: Cross20Icon / Minus20Icon / ChevronDownSIcon are the small variants, and a badge's close cross or a button's chevron plausibly wants a smaller glyph than a standalone icon does. If so the dictionary is simply not the right authority for size-sensitive slots, and that should be written down rather than left as an apparent contradiction.
The two readings lead to different work:
They are bugs → route these components through the dictionary and accept the visual change.
They are deliberate → document that dictionary roles are size-agnostic defaults, and that components may pick a sized variant; then say where that is allowed, so the next audit does not re-raise this.
Either way there is a third option worth considering: give the dictionary sized variants (checkS/checkL) so a component can pick a size without leaving the dictionary.
Scope
Deliberately out of scope for #378, which touches no src/ code — this needs a design call and changes what users see.
Full list of the 49 off-dictionary paths is reproducible with:
Found while reviewing #378 (icon-map rebuild). Not a regression — it has been like this — but it is a visual inconsistency in shipped components, and it invalidates an assumption the porting docs were about to encode.
What
src/runtime/dictionary/icons.tsis presented as the authority for "which b24-icon plays which semantic role". Half of the library does not read it.Where that produces a genuine contradiction:
dictionary/icons.tssayscheckoutline/CheckLIconmain/CheckIcon—src/runtime/components/Checkbox.vue:62minusactions/Minus30Iconactions/Minus20Icon—Checkbox.vue:61closeoutline/CrossMIconactions/Cross20Icon—Badge.vue:64chevronDownoutline/ChevronDownLIconoutline/ChevronDownSIcon—Button.vue:101So a checkbox tick and a
checkicon rendered through the dictionary are different glyphs, and the same for the minus in an indeterminate checkbox, the close cross in aBadge, and the chevron in aButtonwith a dropdown.Why it matters
appConfig.b24ui.icons.*overrides, if a consumer sets one — silently does not apply to these components..sync/PORTING.mdas a rule. chore(sync): deriveicon-map.jsonfrom the shared icon keys, and guard it #378 originally said these hardcoded values are "glyphs the library does not render for those roles"; that was wrong, and the wording is being corrected there. The underlying inconsistency is what remains.Not obviously a bug — needs a decision
Some of these may be deliberate:
Cross20Icon/Minus20Icon/ChevronDownSIconare the small variants, and a badge's close cross or a button's chevron plausibly wants a smaller glyph than a standalone icon does. If so the dictionary is simply not the right authority for size-sensitive slots, and that should be written down rather than left as an apparent contradiction.The two readings lead to different work:
Either way there is a third option worth considering: give the dictionary sized variants (
checkS/checkL) so a component can pick a size without leaving the dictionary.Scope
Deliberately out of scope for #378, which touches no
src/code — this needs a design call and changes what users see.Full list of the 49 off-dictionary paths is reproducible with: