С чем связан запрос?
В @atls-ui-parts/input основной Input сейчас собирает стили через внутренний recipe-контракт size/variant. Пользовательский className фактически может перетереть внутренний className, потому что props спредятся после className. Из-за этого для прикладной стилизации нужен wrapper или риск сломать базовые стили.
Опиши план реализации
Перевести Input на явный публичный контракт по аналогии с Button: разделить визуальное состояние и форму на appearance и shape, оставить className как escape hatch и мержить его с внутренними классами корневого input.
Критерии готовности выполнения задачи
- Input принимает appearance, shape и className.
- className мержится с внутренними классами и не перетирает базовый стиль.
- Существующие состояния disabled, размеры и варианты сохранены через новый контракт.
- Stories обновлены под новый контракт.
- Сборка @atls-ui-parts/input проходит без ошибок.
С чем связан запрос?
В @atls-ui-parts/input основной Input сейчас собирает стили через внутренний recipe-контракт size/variant. Пользовательский className фактически может перетереть внутренний className, потому что props спредятся после className. Из-за этого для прикладной стилизации нужен wrapper или риск сломать базовые стили.
Опиши план реализации
Перевести Input на явный публичный контракт по аналогии с Button: разделить визуальное состояние и форму на appearance и shape, оставить className как escape hatch и мержить его с внутренними классами корневого input.
Критерии готовности выполнения задачи