- HomePage: replace inline styles with <Heading>, <Text>, <Box> - SearchBar: replace <input> with <TextField>, <ul> with <Surface>, <li> with <Box>+<Text>+<Chip>, hardcoded hex with theme tokens - ESLint no-restricted-imports respected via @mui/material/Box deep import - Logic unchanged, all 111 tests pass
2.9 KiB
2.9 KiB
Pilot Migration — Implementation Plan
Architecture
Миграция слоя представления без изменения логики. HomePage меняет JSX на DS-компоненты. SearchBar заменяет inline-стили на DS-компоненты + MUI Box (разрешён layout utility).
Files
Modify
apps/frontend/src/pages/home/ui/HomePage.tsx— замена JSXapps/frontend/src/widgets/search-bar/ui/SearchBar.tsx— замена JSX
No changes
apps/frontend/src/widgets/search-bar/ui/SearchBar.test.tsx— тесты не меняются (те же тексты)apps/frontend/src/styles.css— CSS-переменные всё ещё используются broker-страницами
Step-by-step
Step 1: Migrate HomePage
// До
<div style={{ textAlign: 'center', paddingTop: 120 }}>
<h1 style={{ fontSize: 32, fontWeight: 700, marginBottom: 12 }}>MoexVibe</h1>
<p style={{ color: 'var(--color-text-secondary)', fontSize: 16, marginBottom: 32 }}>
Анализ акций и облигаций Московской биржи
</p>
<p style={{ color: '#888', fontSize: 13 }}>Введите название или тикер в строку поиска выше</p>
<p style={{ color: '#aaa', fontSize: 12, marginTop: 8 }}>
Данные задерживаются на 15 минут · Бесплатный API MOEX ISS
</p>
</div>
// После
import { Box } from '@mui/material';
import { Heading, Text } from '@moex-vibe/design-system';
<Box textAlign="center" pt={30}>
<Heading level={1} size="display">MoexVibe</Heading>
<Text tone="secondary">Анализ акций и облигаций Московской биржи</Text>
<Text tone="muted">Введите название или тикер в строку поиска выше</Text>
<Text tone="muted">Данные задерживаются на 15 минут · Бесплатный API MOEX ISS</Text>
</Box>
Step 2: Migrate SearchBar
<input>→<TextField label="Поиск" hiddenLabel placeholder="Поиск акций и облигаций..." /><ul>dropdown wrapper →<Surface elevation="sm">(с inline-стилями для absolute positioning)<li>loading →<Text tone="muted">Загрузка...</Text><li>empty →<Text tone="muted">Ничего не найдено</Text><li>result item →<Box>+<Text>+<Chip>- Hover effect (
onMouseEnter/onMouseLeave) → MUIsx={{ '&:hover': { bgcolor: 'action.hover' } }} - Hardcoded hex colors → MUI theme tokens (
text.disabled,divider, etc.)
Step 3: Verify
npm run test:frontend— все тесты проходятnpm run lint -w apps/frontend— lint чист, нет неразрешённых MUI-импортовnpm run build:frontend— сборка проходит