Gratulacje, Nawigatorze! Dotarłeś do końca tego modułu i nadszedł czas, aby połączyć wszystkie poznane techniki stylowania w jeden, kompleksowy projekt. Twoim zadaniem jest stworzenie Kosmicznego Panelu Kontroli Misji — interaktywnego dashboardu, który wykorzysta wiedzę z całego modułu.
Zbudujesz panel kontrolny statku kosmicznego, który łączy:
@keyframesProjekt składa się z kilku kluczowych sekcji:
Wykorzystujemy
ThemeProvider ze styled-components, aby zarządzać kolorami i stylami w całej aplikacji:1const darkTheme = {
2 bg: '#0a0a1a',
3 surface: '#12122a',
4 accent: '#00ff88',
5 text: '#e0e0e0',
6 danger: '#ff4444',
7 warning: '#ffaa00'
8};
9
10const lightTheme = {
11 bg: '#f0f4f8',
12 surface: '#ffffff',
13 accent: '#0066ff',
14 text: '#1a1a2e',
15 danger: '#cc0000',
16 warning: '#cc8800'
17};Panel wykorzystuje kilka typów animacji, które poznałeś w module:
1/* Pulsowanie statusu */
2@keyframes pulse {
3 0%, 100% { opacity: 1; }
4 50% { opacity: 0.5; }
5}
6
7/* Wjazd z przesunięciem */
8@keyframes slideIn {
9 from {
10 opacity: 0;
11 transform: translateY(20px);
12 }
13 to {
14 opacity: 1;
15 transform: translateY(0);
16 }
17}
18
19/* Obracanie radaru */
20@keyframes rotate {
21 from { transform: rotate(0deg); }
22 to { transform: rotate(360deg); }
23}Dynamiczne stylowanie komponentów na podstawie przekazanych propsów:
1const StatusBadge = styled.span\`
2 padding: 4px 12px;
3 border-radius: 12px;
4 font-size: 12px;
5 font-weight: bold;
6 background: \${props => props.active ? '#00ff8833' : '#ff444433'};
7 color: \${props => props.active ? '#00ff88' : '#ff4444'};
8 animation: pulse 2s infinite;
9\`;
10
11const Card = styled.div\`
12 background: \${props => props.theme.surface};
13 border: 1px solid \${props => props.theme.accent}33;
14 border-radius: 12px;
15 padding: 20px;
16 transition: transform 0.3s ease, box-shadow 0.3s ease;
17
18 &:hover {
19 transform: translateY(-4px);
20 box-shadow: 0 8px 25px rgba(0, 255, 136, 0.15);
21 }
22\`;Panel automatycznie dostosowuje się do szerokości ekranu:
1.dashboard-grid {
2 display: grid;
3 grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
4 gap: 20px;
5 padding: 20px;
6}
7
8@media (max-width: 768px) {
9 .dashboard-grid {
10 grid-template-columns: 1fr;
11 }
12}Główny komponent
App łączy wszystkie elementy:1function App() {
2 const [isDark, setIsDark] = useState(true);
3
4 return (
5 <ThemeProvider theme={isDark ? darkTheme : lightTheme}>
6 <GlobalStyle />
7 <Header>
8 <Title>Mission Control</Title>
9 <ThemeToggle onClick={() => setIsDark(!isDark)}>
10 {isDark ? '☀️' : '🌙'}
11 </ThemeToggle>
12 </Header>
13 <DashboardGrid>
14 <StatusCard systems={systemsData} />
15 <RadarCard />
16 <MissionsCard missions={missionsData} />
17 <CrewCard crew={crewData} />
18 </DashboardGrid>
19 </ThemeProvider>
20 );
21}| Technika | Zastosowanie w projekcie | |----------|--------------------------| | Styled Components | Wszystkie komponenty UI | | ThemeProvider | Przełączanie dark/light mode | |
@keyframes | Pulsowanie statusów, obrót radaru, wjazd kart |
| CSS Grid | Layout dashboardu |
| Flexbox | Układ wewnętrzny kart |
| transition | Efekty hover na kartach i przyciskach |
| Props dynamiczne | Kolory statusów, warunkowe style |
| Responsywność | auto-fit i minmax w gridzie |W tym module poznałeś pełne spektrum technik stylowania w React:
@keyframes, transition i zaawansowane efektyKażda z tych technik ma swoje miejsce w arsenale kosmicznego programisty. Najlepsi inżynierowie potrafią łączyć je w spójny system — dokładnie tak, jak w tym projekcie.
Wypróbuj panel poniżej i eksperymentuj z kodem — zmień kolory motywu, dodaj nowe animacje lub rozbuduj sekcje dashboardu!