diff --git a/hotel-management/package.json b/hotel-management/package.json index 9da29e1..7413ab6 100644 --- a/hotel-management/package.json +++ b/hotel-management/package.json @@ -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" }, diff --git a/hotel-management/pnpm-lock.yaml b/hotel-management/pnpm-lock.yaml index 59e9bad..5901b2c 100644 --- a/hotel-management/pnpm-lock.yaml +++ b/hotel-management/pnpm-lock.yaml @@ -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'} diff --git a/hotel-management/src/App.css b/hotel-management/src/App.css deleted file mode 100644 index b9d355d..0000000 --- a/hotel-management/src/App.css +++ /dev/null @@ -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; -} diff --git a/hotel-management/src/App.tsx b/hotel-management/src/App.tsx index 7025ee4..5bfd75d 100644 --- a/hotel-management/src/App.tsx +++ b/hotel-management/src/App.tsx @@ -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 ( <> -
- - Vite logo - - - React logo - -
-

Vite + React

-
- -

- Edit src/App.tsx and save to test HMR -

-
-

- Click on the Vite and React logos to learn more -

+
); } diff --git a/hotel-management/src/index.css b/hotel-management/src/index.css deleted file mode 100644 index 2c3fac6..0000000 --- a/hotel-management/src/index.css +++ /dev/null @@ -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; - } -} diff --git a/hotel-management/src/main.tsx b/hotel-management/src/main.tsx index 9bb419d..99da247 100644 --- a/hotel-management/src/main.tsx +++ b/hotel-management/src/main.tsx @@ -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( diff --git a/hotel-management/src/styles/abstracts/variables.css b/hotel-management/src/styles/abstracts/variables.css new file mode 100644 index 0000000..9dea583 --- /dev/null +++ b/hotel-management/src/styles/abstracts/variables.css @@ -0,0 +1,4 @@ +:root { + --border-color: #8c8c8c; + --radius-sm: 10px; +} diff --git a/hotel-management/src/styles/bases/common.css b/hotel-management/src/styles/bases/common.css new file mode 100644 index 0000000..1e8e0fd --- /dev/null +++ b/hotel-management/src/styles/bases/common.css @@ -0,0 +1,5 @@ +button:has(svg) { + line-height: 0; + + cursor: pointer; +} diff --git a/hotel-management/src/styles/bases/reset.css b/hotel-management/src/styles/bases/reset.css new file mode 100644 index 0000000..a296281 --- /dev/null +++ b/hotel-management/src/styles/bases/reset.css @@ -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; +} diff --git a/hotel-management/src/styles/bases/typography.css b/hotel-management/src/styles/bases/typography.css new file mode 100644 index 0000000..75bd0b6 --- /dev/null +++ b/hotel-management/src/styles/bases/typography.css @@ -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; +} diff --git a/hotel-management/src/styles/index.css b/hotel-management/src/styles/index.css new file mode 100644 index 0000000..4fadfc2 --- /dev/null +++ b/hotel-management/src/styles/index.css @@ -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); diff --git a/hotel-management/src/ui/ButtonIcon.tsx b/hotel-management/src/ui/ButtonIcon.tsx new file mode 100644 index 0000000..33912ce --- /dev/null +++ b/hotel-management/src/ui/ButtonIcon.tsx @@ -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; diff --git a/hotel-management/src/ui/Header.tsx b/hotel-management/src/ui/Header.tsx new file mode 100644 index 0000000..271827c --- /dev/null +++ b/hotel-management/src/ui/Header.tsx @@ -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 ( + +

Hi, Admin!

+ +
+ ); +}; + +export default Header; diff --git a/hotel-management/src/ui/HeaderMenu.tsx b/hotel-management/src/ui/HeaderMenu.tsx new file mode 100644 index 0000000..d9615ba --- /dev/null +++ b/hotel-management/src/ui/HeaderMenu.tsx @@ -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 ( + + + + + + + + + ); +}; + +export default HeaderMenu;