HIGH:
- mobile: поля задачи доступны для форм без вкладок (fallback-аккордеон)
- удаление вложений доступно на тач-устройствах (кнопка всегда видна)
- бейдж статуса: контрастный текст по яркости (statusColor.ts), также в реестре и канбане
- кнопки согласования: контрастные дефолты #15803d/#b91c1c + текст по яркости
- клавиатура: focus-visible у карандаша, focus-ring у поиска, InlineField с клавиатуры
MEDIUM:
- iOS: инпуты text-base на мобильном (убран зум при фокусе)
- системные поля унифицированы с кастомными (inline label+value)
- тач-таргеты ≥32px, кнопка удаления задачи отделена ms-auto
- токены --warning/--success/--info во всех скинах, хардкод-цвета → семантика
- заголовок задачи крупнее + title с полным текстом; мелкий текст ≥11px
- UX-тексты: «Не удалось …» вместо «Ошибка», имена вместо ID
- button.tsx: без transition-all, глобальный active:scale-[0.96]
- ARIA: aria-label инпутам, role=alert ошибкам, Escape в dropdown
- Add client/src/themes/ with tokens, built-in skins (iistwin, twenty, omegaprom)
- Add ThemeProvider with data-skin/data-theme and runtime CSS for custom skins
- Add npm run skins:generate script for build-time CSS generation
- Add organization_skins table, migration and CRUD API
- Add activeSkinId to organizations and expose it in /api/auth/me
- Add skin switcher in /profile and admin skin editor in /settings/appearance
- Adapt index.css hardcoded colors to skin tokens
- Update AGENTS.md and Obsidian notes
- number-поля теперь рендерятся как text + inputMode=numeric,
чтобы браузер не округлял значения через input type=number
- пробелы при вставке в number-поля удаляются
- бэкенд нормализует значения number-полей в строку перед сохранением
- добавлен хелпер normalizeFieldValueForStorage
Closes: искажение расчётного счёта и других длинных числовых полей