@iconicompany/ui
v0.17.2
Published
Бренд платформы iconicompany: токены, оболочка кабинета, оболочка сайта, реестр модулей
Readme
@iconicompany/ui
Бренд платформы iconicompany: оболочка кабинета, реестр модулей, токены бренда. Публикуется в npm
и подключается КАЖДЫМ модулем платформы — лендингом (/), админкой (/iadmin), подбором
(/italent). Ради этого он и существует: скопированная оболочка у каждого своя и расходится
молча, а обновление пакета видно в bun.lock.
Каталог называется packages/ui, как последний сегмент имени пакета — конвенция организации
(@icomponents/react лежит в packages/react).
Что отдаёт
| подпуть | что |
|---|---|
| @iconicompany/ui/nav | реестр PLATFORM_MODULES, отбор по ролям проектов, подсветка активного модуля и раздела |
| @iconicompany/ui/dashboard-shell | DashboardShell — сайдбар, шапка, слоты модуля |
| @iconicompany/ui/brand.css | токены бренда + блок [data-brand="iconicompany"] и темы (themes/*.css) |
| @iconicompany/ui/themes | реестр тем BRAND_THEMES: идентификатор + подпись |
| @iconicompany/ui/palette-switch | PaletteSwitch — выбор палитры, ставит data-brand и помнит выбор |
Темы
Тема — блок [data-brand="<id>"]: значения в src/themes/<id>.css, подпись в src/themes.ts.
Выбор рисует DashboardShell сам; выключается у модуля без выпуска пакета — controls={{ palette: false }}.
Добавляя тему: файл рядом с соседями, @import в brand.css, запись в реестре. Набор имён обязан
совпадать с блоком бренда платформы — это проверяет src/themes/theme-parity.test.ts.
TODO: единый вид CRM — базовая палитра тоже в пакет
Сейчас тема — это ВЫБОР поверх базовой палитры, а базовая у каждого модуля своя: у подбора свой
регистр в dashboard/theme.css, у лендинга — бренд платформы из этого пакета, у остальных — что
сложилось. Это части ОДНОЙ CRM, и выглядеть они обязаны одинаково, а не «каждый свой вид»: человек
переходит между модулями за один клик, и смена оттенков читается как переход на чужой сайт.
Что сделать: свести базовые палитры к одной в этом пакете (включая тёмную пару, которой у бренда платформы сейчас нет), оставив модулю право только на ВЫБОР темы, а не на собственные значения. Разница, которая всплывёт при сведении, — не мелочь и не вкус: у подбора тёмная тема рабочая, у бренда платформы её нет вовсе, и пока это так, свести их нельзя без потери.
Имена тем НЕЙТРАЛЬНЫЕ, по палитре, а не по заказчику: палитра iconic называлась «брендом
платформы», бренд сменил цвет — и имя стало враньём, а тему пришлось снять.
Подключение в модуле — см. комментарий в начале src/brand.css. Кратко: @source на
node_modules обязателен, автодетект Tailwind туда не заходит.
Правила для агентов и хук
AGENTS.md — как модулю работать с меню, шапкой и стилем. Едет в npm вместе с пакетом, поэтому
продукт видит правила СВОЕЙ версии. Хук hooks/session-rules.ts печатает его раздел «Коротко» в
начале каждой сессии там, где пакет установлен (регистрация — SessionStart в
~/.claude/settings.json, по образцу хука idevops). Правило меняется — правится AGENTS.md.
Как выпускается
Только через GitHub Actions. Локальный npm publish не сработает: право публиковать выдано
паре «репозиторий + имя файла воркфлоу» (npm trusted publisher, OIDC), а не человеку с токеном.
Секрета NPM_TOKEN в репозитории нет и заводить его не нужно.
bun run release:ui -- minor # ui-v0.1.0 → ui-v0.2.0
bun run release:ui # patch
bun run release:ui -- --dry-run # какая версия получится, ничего не создаётсяСкрипт ставит тег ui-v* и создаёт GitHub Release; публикацию делает
.github/workflows/publish-ui.yml, срабатывающий на пуш этого тега. Версию в package.json
проставляет ВОРКФЛОУ из тега — руками её не правят, иначе она живёт в двух местах и однажды
разойдётся.
Префикс тега свой, не общий v*: тем же репозиторием деплоится лендинг, и публикация пакета не
должна ехать с каждой выкаткой сайта — иначе версия пакета отвечает на вопрос «когда выкатили
сайт», а не «что изменилось в оболочке».
Что сломается, если переименовать файл воркфлоу
Доверие npm привязано к .github/workflows/publish-ui.yml по имени. Переименуете файл —
публикация начнёт получать отказ в авторизации, и по сообщению причина не читается. Меняете имя —
меняйте и в настройках пакета на npmjs.com.
