diff --git a/SPRINTS.md b/SPRINTS.md
index c31fb97..2649792 100644
--- a/SPRINTS.md
+++ b/SPRINTS.md
@@ -79,5 +79,18 @@ _заполнить в конце спринта_
- [x] Добавить 5-ю палитру **Бриз** — вариант Лагуны с приглушённым primary `#63BAC3` (яркий `#29AEE3` переехал в p300, warm/accent/success/fg-4 наследуются от Лагуны)
- [ ] Визуальная проверка всех экранов в новой палитре: кнопки, чипы, CTA, прогресс восстановления, успех-галочка, таббар-бейджи
+---
+
+## Спринт 4 · 20 апр 2026
+
+**Цель:** служебные экраны для разработчиков — визуализация дизайн-системы прямо в прототипе, чтобы переключая палитру сразу видеть все цвета и их применение.
+
+### План
+- [x] Пробросить текущую палитру через `ctx.palette` (чтобы dev-экраны могли прочитать все поля)
+- [x] Экран **DEV · Палитра**: таблица всех цветов (primary / warm / accent / status / neutrals / text), у каждой строки — свотч, название роли, CSS-переменная, hex-код, краткое описание применения
+- [x] Экран **DEV · Примеры**: реальные компоненты (кнопки, чипы, карточки, текстовая иерархия, статусы) с подписями «какая CSS-переменная используется»
+- [x] Добавить оба экрана в SCREEN_OPTIONS Tweaks
+- [x] Динамический рендер: при переключении палитры значения hex обновляются автоматически
+
### Итоги
_заполнить в конце спринта_
diff --git a/src/App.jsx b/src/App.jsx
index 5929e90..65beb2d 100644
--- a/src/App.jsx
+++ b/src/App.jsx
@@ -83,6 +83,8 @@ const SCREEN_OPTIONS = [
{ id: 'search', lb: 'Поиск' },
{ id: 'contacts', lb: 'Контакты' },
{ id: 'prices', lb: 'Цены' },
+ { id: 'dev-colors', lb: 'DEV · Палитра' },
+ { id: 'dev-examples', lb: 'DEV · Примеры' },
];
function applyTheme(tw) {
@@ -213,7 +215,8 @@ export default function App() {
useEffect(() => { applyTheme(tw); }, [tw.accent, tw.font]);
- const ctx = { homeVariant: tw.homeVariant, docVariant: tw.docVariant, density: tw.density };
+ const palette = ACCENT_OPTIONS.find(a => a.id === tw.accent) || ACCENT_OPTIONS[0];
+ const ctx = { homeVariant: tw.homeVariant, docVariant: tw.docVariant, density: tw.density, palette };
const content = useMemo(() => {
if (tw.layout === 'home3') {
diff --git a/src/PhoneApp.jsx b/src/PhoneApp.jsx
index 513be9d..d69e392 100644
--- a/src/PhoneApp.jsx
+++ b/src/PhoneApp.jsx
@@ -16,6 +16,7 @@ import {
import { ChatsListScreen, ChatConversationScreen } from './screens/screens-chats.jsx';
import { ArticlesScreen, ArticleDetailScreen } from './screens/screens-articles.jsx';
import { HomeV2Screen, SearchScreen, ContactsScreen, PricesScreen } from './screens/screens-v2.jsx';
+import { DevColorsScreen, DevExamplesScreen } from './screens/screens-dev.jsx';
function renderScreen(screenId, nav, ctx) {
const parts = screenId.split(':');
@@ -51,6 +52,8 @@ function renderScreen(screenId, nav, ctx) {
case 'search': return ;
case 'contacts': return ;
case 'prices': return ;
+ case 'dev-colors': return ;
+ case 'dev-examples': return ;
default: return
Экран не найден: {screenId}
;
}
}
diff --git a/src/screens/screens-dev.jsx b/src/screens/screens-dev.jsx
new file mode 100644
index 0000000..2ff79e2
--- /dev/null
+++ b/src/screens/screens-dev.jsx
@@ -0,0 +1,411 @@
+import React from 'react';
+import { I } from '../icons.jsx';
+import { Avatar, ScreenHeader } from '../components.jsx';
+
+// ─────────────────────────────────────────────────────────────
+// DEV · Colors palette reference
+// Shows every design-system color with role, CSS var, hex, and usage.
+// Dynamic values (primary/accent/warm/etc.) come from ctx.palette and
+// update automatically when user switches the accent in Tweaks.
+// ─────────────────────────────────────────────────────────────
+
+function ColorRow({ c }) {
+ return (
+