Skip to content

Commit ef643ee

Browse files
committed
feat: add routing
1 parent e753dd6 commit ef643ee

16 files changed

+243
-73
lines changed

eslint.config.js

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export default tseslint.config({
2121
'react-hooks': reactHooks,
2222
'react-refresh': reactRefresh,
2323
'react-compiler': reactCompiler,
24+
...eslintConfigPrettier.plugins,
2425
prettier: eslintPluginPrettier,
2526
},
2627
rules: {
@@ -45,6 +46,7 @@ export default tseslint.config({
4546
allowExpressions: true,
4647
},
4748
],
49+
...eslintConfigPrettier.rules,
4850
},
4951
settings: {
5052
react: {

package-lock.json

+87-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+4-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
},
1717
"dependencies": {
1818
"react": "^18.3.1",
19-
"react-dom": "^18.3.1"
19+
"react-dom": "^18.3.1",
20+
"react-router-dom": "^6.26.0"
2021
},
2122
"devDependencies": {
2223
"@eslint/js": "^9.8.0",
@@ -36,6 +37,7 @@
3637
"prettier": "3.3.3",
3738
"typescript": "^5.5.3",
3839
"typescript-eslint": "^8.0.0",
39-
"vite": "^5.4.0"
40+
"vite": "^5.4.0",
41+
"vite-tsconfig-paths": "^5.0.1"
4042
}
4143
}

src/App.tsx

-9
This file was deleted.
+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
.headerWrapper {
2+
max-width: 1600px;
3+
width: 100%;
4+
padding: 16px clamp(2.188rem, 1.027rem + 5.8vw, 6.25rem);
5+
display: flex;
6+
align-items: center;
7+
justify-content: center;
8+
}
9+
10+
.header {
11+
position: sticky;
12+
top: 0;
13+
z-index: 1;
14+
background-color: #3d5a80;
15+
color: white;
16+
box-shadow: rgba(0, 0, 0, 0.2) 0 0 20px;
17+
}
18+
19+
.navPanel {
20+
display: flex;
21+
gap: 12px;
22+
a.active {
23+
color: #00ffe5;
24+
border-bottom: 2px solid #00ffe5;
25+
}
26+
}
27+

src/components/header/header.tsx

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import type { JSX } from 'react';
2+
import styles from './header.module.css';
3+
import { NavLink } from 'react-router-dom';
4+
5+
export function Header(): JSX.Element {
6+
return (
7+
<header className={styles.header}>
8+
<div className={styles.headerWrapper}>
9+
<nav className={styles.navPanel}>
10+
<NavLink
11+
className={({ isActive }) => (isActive ? `${styles['active']}` : '')}
12+
to="/uncontrolled-form"
13+
>
14+
Uncontrolled form
15+
</NavLink>
16+
<NavLink className={({ isActive }) => (isActive ? `${styles['active']}` : '')} to="/">
17+
Main
18+
</NavLink>
19+
<NavLink
20+
className={({ isActive }) => (isActive ? `${styles['active']}` : '')}
21+
to="/controlled-form"
22+
>
23+
Controlled form
24+
</NavLink>
25+
</nav>
26+
</div>
27+
</header>
28+
);
29+
}
30+
31+
export default Header;

src/components/header/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { Header } from './header';

src/index.css

+43-56
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,62 @@
1+
@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@300..900&display=swap');
2+
13
#root {
2-
max-width: 1280px;
4+
max-width: 1600px;
35
margin: 0 auto;
4-
padding: 2rem;
5-
text-align: center;
66
}
77

8-
:root {
9-
font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
10-
line-height: 1.5;
11-
font-weight: 400;
12-
13-
color-scheme: light dark;
14-
color: rgba(255, 255, 255, 0.87);
15-
background-color: #242424;
16-
17-
font-synthesis: none;
18-
text-rendering: optimizeLegibility;
19-
-webkit-font-smoothing: antialiased;
20-
-moz-osx-font-smoothing: grayscale;
8+
html {
9+
box-sizing: border-box;
2110
}
2211

23-
a {
24-
font-weight: 500;
25-
color: #646cff;
26-
text-decoration: inherit;
27-
}
28-
a:hover {
29-
color: #535bf2;
12+
*,
13+
*:after,
14+
*:before {
15+
margin: 0;
16+
padding: 0;
17+
box-sizing: inherit;
3018
}
3119

3220
body {
33-
margin: 0;
34-
display: flex;
35-
place-items: center;
36-
min-width: 320px;
37-
min-height: 100vh;
21+
font-family: 'Montserrat', sans-serif;
22+
background-color: #98c1d9;
23+
color: #293241;
3824
}
3925

40-
h1 {
41-
font-size: 3.2em;
42-
line-height: 1.1;
26+
img,
27+
svg {
28+
display: block;
29+
max-width: 100%;
30+
height: auto;
31+
}
32+
33+
svg {
34+
max-height: 100%;
4335
}
4436

4537
button {
46-
border-radius: 8px;
47-
border: 1px solid transparent;
48-
padding: 0.6em 1.2em;
49-
font-size: 1em;
50-
font-weight: 500;
51-
font-family: inherit;
52-
background-color: #1a1a1a;
38+
padding: 0;
5339
cursor: pointer;
54-
transition: border-color 0.25s;
55-
}
56-
button:hover {
57-
border-color: #646cff;
40+
border: none;
41+
background-color: transparent;
42+
color: inherit;
5843
}
59-
button:focus,
60-
button:focus-visible {
61-
outline: 4px auto -webkit-focus-ring-color;
44+
45+
a {
46+
text-decoration: none;
47+
color: inherit;
6248
}
6349

64-
@media (prefers-color-scheme: light) {
65-
:root {
66-
color: #213547;
67-
background-color: #ffffff;
68-
}
69-
a:hover {
70-
color: #747bff;
71-
}
72-
button {
73-
background-color: #f9f9f9;
74-
}
50+
ul {
51+
padding: 0;
52+
margin: 0;
53+
list-style: none;
7554
}
55+
56+
h1,
57+
h2,
58+
h3,
59+
p,
60+
figure {
61+
margin: 0;
62+
}

src/main.tsx

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import { StrictMode } from 'react';
22
import { createRoot } from 'react-dom/client';
3-
import App from './App.tsx';
43
import './index.css';
4+
import { PageRoutes } from './routes';
5+
import { BrowserRouter } from 'react-router-dom';
56

67
createRoot(document.getElementById('root')!).render(
78
<StrictMode>
8-
<App />
9+
<BrowserRouter>
10+
<PageRoutes />
11+
</BrowserRouter>
912
</StrictMode>,
1013
);

src/pages/main-page/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { MainPage } from './main-page';

src/pages/main-page/main-page.tsx

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import type { JSX } from 'react';
2+
import { Header } from '@/components/header';
3+
4+
export function MainPage(): JSX.Element {
5+
return <Header />;
6+
}
7+
8+
export default MainPage;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { UncontrolledFormPage } from './uncontrolled-form-page';

0 commit comments

Comments
 (0)