Add header component

This commit is contained in:
2023-10-17 16:33:20 +07:00
parent 99a3bf57f6
commit 5a497273c0
14 changed files with 263 additions and 138 deletions
+1
View File
@@ -25,6 +25,7 @@
"dependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-icons": "^4.11.0",
"react-router-dom": "^6.17.0",
"styled-components": "^6.1.0"
},
+11
View File
@@ -11,6 +11,9 @@ dependencies:
react-dom:
specifier: ^18.2.0
version: 18.2.0(react@18.2.0)
react-icons:
specifier: ^4.11.0
version: 4.11.0(react@18.2.0)
react-router-dom:
specifier: ^6.17.0
version: 6.17.0(react-dom@18.2.0)(react@18.2.0)
@@ -1798,6 +1801,14 @@ packages:
scheduler: 0.23.0
dev: false
/react-icons@4.11.0(react@18.2.0):
resolution: {integrity: sha512-V+4khzYcE5EBk/BvcuYRq6V/osf11ODUM2J8hg2FDSswRrGvqiYUYPRy4OdrWaQOBj4NcpJfmHZLNaD+VH0TyA==}
peerDependencies:
react: '*'
dependencies:
react: 18.2.0
dev: false
/react-refresh@0.14.0:
resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==}
engines: {node: '>=0.10.0'}
-42
View File
@@ -1,42 +0,0 @@
#root {
max-width: 1280px;
margin: 0 auto;
padding: 2rem;
text-align: center;
}
.logo {
height: 6em;
padding: 1.5em;
will-change: filter;
transition: filter 300ms;
}
.logo:hover {
filter: drop-shadow(0 0 2em #646cffaa);
}
.logo.react:hover {
filter: drop-shadow(0 0 2em #61dafbaa);
}
@keyframes logo-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
@media (prefers-reduced-motion: no-preference) {
a:nth-of-type(2) .logo {
animation: logo-spin infinite 20s linear;
}
}
.card {
padding: 2em;
}
.read-the-docs {
color: #888;
}
+2 -26
View File
@@ -1,33 +1,9 @@
import { useState } from 'react';
import reactLogo from './assets/react.svg';
import viteLogo from '/vite.svg';
import './App.css';
import Header from './ui/Header';
function App() {
const [count, setCount] = useState(0);
return (
<>
<div>
<a href="https://vitejs.dev" target="_blank">
<img src={viteLogo} className="logo" alt="Vite logo" />
</a>
<a href="https://react.dev" target="_blank">
<img src={reactLogo} className="logo react" alt="React logo" />
</a>
</div>
<h1>Vite + React</h1>
<div className="card">
<button onClick={() => setCount((count) => count + 1)}>
count is {count}
</button>
<p>
Edit <code>src/App.tsx</code> and save to test HMR
</p>
</div>
<p className="read-the-docs">
Click on the Vite and React logos to learn more
</p>
<Header />
</>
);
}
-69
View File
@@ -1,69 +0,0 @@
:root {
font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
line-height: 1.5;
font-weight: 400;
color-scheme: light dark;
color: rgba(255, 255, 255, 0.87);
background-color: #242424;
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
-webkit-text-size-adjust: 100%;
}
a {
font-weight: 500;
color: #646cff;
text-decoration: inherit;
}
a:hover {
color: #535bf2;
}
body {
margin: 0;
display: flex;
place-items: center;
min-width: 320px;
min-height: 100vh;
}
h1 {
font-size: 3.2em;
line-height: 1.1;
}
button {
border-radius: 8px;
border: 1px solid transparent;
padding: 0.6em 1.2em;
font-size: 1em;
font-weight: 500;
font-family: inherit;
background-color: #1a1a1a;
cursor: pointer;
transition: border-color 0.25s;
}
button:hover {
border-color: #646cff;
}
button:focus,
button:focus-visible {
outline: 4px auto -webkit-focus-ring-color;
}
@media (prefers-color-scheme: light) {
:root {
color: #213547;
background-color: #ffffff;
}
a:hover {
color: #747bff;
}
button {
background-color: #f9f9f9;
}
}
+1 -1
View File
@@ -1,7 +1,7 @@
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App.tsx';
import './index.css';
import './styles/index.css';
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
@@ -0,0 +1,4 @@
:root {
--border-color: #8c8c8c;
--radius-sm: 10px;
}
@@ -0,0 +1,5 @@
button:has(svg) {
line-height: 0;
cursor: pointer;
}
+128
View File
@@ -0,0 +1,128 @@
/* http://meyerweb.com/eric/tools/css/reset/
v2.0 | 20110126
License: none (public domain)
*/
html,
body,
div,
span,
applet,
object,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
acronym,
address,
big,
cite,
code,
del,
dfn,
em,
img,
ins,
kbd,
q,
s,
samp,
small,
strike,
strong,
sub,
sup,
tt,
var,
b,
u,
i,
center,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td,
article,
aside,
canvas,
details,
embed,
figure,
figcaption,
footer,
header,
hgroup,
menu,
nav,
output,
ruby,
section,
summary,
time,
mark,
audio,
video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
menu,
nav,
section {
display: block;
}
body {
line-height: 1;
}
ol,
ul {
list-style: none;
}
blockquote,
q {
quotes: none;
}
blockquote:before,
blockquote:after,
q:before,
q:after {
content: '';
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
@@ -0,0 +1,39 @@
@font-face {
font-family: 'Poppins';
src: url('../../assets/fonts/Poppins-Regular.woff2') format('woff2'),
url('../../assets/fonts/Poppins-Regular.ttf') format('truetype');
font-weight: 400;
font-display: swap;
}
@font-face {
font-family: 'Poppins';
src: url('../../assets/fonts/Poppins-Medium.woff2') format('woff2'),
url('../../assets/fonts/Poppins-Medium.ttf') format('truetype');
font-weight: 500;
font-display: swap;
}
@font-face {
font-family: 'Poppins';
src: url('../../assets/fonts/Poppins-SemiBold.woff2') format('woff2'),
url('../../assets/fonts/Poppins-SemiBold.ttf') format('truetype');
font-weight: 600;
font-display: swap;
}
@font-face {
font-family: 'Poppins';
src: url('../../assets/fonts/Poppins-Bold.woff2') format('woff2'),
url('../../assets/fonts/Poppins-Bold.ttf') format('truetype');
font-weight: 700;
font-display: swap;
}
* {
font-family: 'Poppins', Times, serif;
}
+5
View File
@@ -0,0 +1,5 @@
/* Base */
@import url(./abstracts/variables.css);
@import url(./bases/common.css);
@import url(./bases/typography.css);
@import url(./bases/reset.css);
+20
View File
@@ -0,0 +1,20 @@
import styled from 'styled-components';
const ButtonIcon = styled.button`
background: none;
border: none;
padding: 8px;
transition: all 0.2s;
border-radius: var(--radius-sm);
&:hover {
background-color: #f3f4f6;
}
& svg {
width: 25px;
height: 25px;
}
`;
export default ButtonIcon;
+23
View File
@@ -0,0 +1,23 @@
import styled from 'styled-components';
import HeaderMenu from './HeaderMenu';
const StyledHeader = styled.header`
border-bottom: 1px solid var(--border-color);
padding: 20px 40px;
display: flex;
justify-content: flex-end;
align-items: center;
gap: 30px;
`;
const Header = () => {
return (
<StyledHeader>
<p>Hi, Admin!</p>
<HeaderMenu />
</StyledHeader>
);
};
export default Header;
+24
View File
@@ -0,0 +1,24 @@
import styled from 'styled-components';
import ButtonIcon from './ButtonIcon';
import { IoPersonCircleOutline } from 'react-icons/io5';
import { HiOutlineLogout } from 'react-icons/hi';
const StyledHeaderMenu = styled.ul`
display: flex;
gap: 10px;
`;
const HeaderMenu = () => {
return (
<StyledHeaderMenu>
<ButtonIcon>
<IoPersonCircleOutline />
</ButtonIcon>
<ButtonIcon>
<HiOutlineLogout />
</ButtonIcon>
</StyledHeaderMenu>
);
};
export default HeaderMenu;