From d73e09d2dffd72b8d2c9530bfb56979dc06095b5 Mon Sep 17 00:00:00 2001
From: "Cross, Liam (UG - Comp Sci & Elec Eng)" <lc01383@surrey.ac.uk>
Date: Sun, 10 Mar 2024 19:58:48 +0000
Subject: [PATCH] Basic Header and Footer

---
 client/package-lock.json                 | 115 +++++++++++++++++++++++
 client/package.json                      |   1 +
 client/src/App.css                       |   8 ++
 client/src/App.tsx                       |  10 +-
 client/src/components/Footer/Footer.scss |  13 +++
 client/src/components/Footer/Footer.tsx  |  15 +++
 client/src/components/Header/Header.scss |  33 +++++++
 client/src/components/Header/Header.tsx  |  20 ++++
 client/src/index.css                     |  18 ++++
 9 files changed, 232 insertions(+), 1 deletion(-)
 create mode 100644 client/src/components/Footer/Footer.scss
 create mode 100644 client/src/components/Footer/Footer.tsx
 create mode 100644 client/src/components/Header/Header.scss
 create mode 100644 client/src/components/Header/Header.tsx

diff --git a/client/package-lock.json b/client/package-lock.json
index a3f0265..5f974e4 100644
--- a/client/package-lock.json
+++ b/client/package-lock.json
@@ -20,6 +20,7 @@
         "eslint": "^8.56.0",
         "eslint-plugin-react-hooks": "^4.6.0",
         "eslint-plugin-react-refresh": "^0.4.5",
+        "sass": "^1.71.1",
         "typescript": "^5.2.2",
         "vite": "^5.1.4"
       }
@@ -1523,6 +1524,19 @@
         "node": ">=4"
       }
     },
+    "node_modules/anymatch": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+      "dev": true,
+      "dependencies": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
     "node_modules/argparse": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
@@ -1544,6 +1558,15 @@
       "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
       "dev": true
     },
+    "node_modules/binary-extensions": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/brace-expansion": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
@@ -1640,6 +1663,42 @@
         "node": ">=4"
       }
     },
+    "node_modules/chokidar": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+      "dev": true,
+      "dependencies": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
+      },
+      "engines": {
+        "node": ">= 8.10.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/chokidar/node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "dev": true,
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
     "node_modules/color-convert": {
       "version": "1.9.3",
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
@@ -2329,6 +2388,12 @@
         "node": ">= 4"
       }
     },
+    "node_modules/immutable": {
+      "version": "4.3.5",
+      "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz",
+      "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==",
+      "dev": true
+    },
     "node_modules/import-fresh": {
       "version": "3.3.0",
       "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
@@ -2370,6 +2435,18 @@
       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
       "dev": true
     },
+    "node_modules/is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+      "dev": true,
+      "dependencies": {
+        "binary-extensions": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/is-extglob": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -2610,6 +2687,15 @@
       "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
       "dev": true
     },
+    "node_modules/normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/once": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -2830,6 +2916,18 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "dev": true,
+      "dependencies": {
+        "picomatch": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=8.10.0"
+      }
+    },
     "node_modules/resolve-from": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
@@ -2919,6 +3017,23 @@
         "queue-microtask": "^1.2.2"
       }
     },
+    "node_modules/sass": {
+      "version": "1.71.1",
+      "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.1.tgz",
+      "integrity": "sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==",
+      "dev": true,
+      "dependencies": {
+        "chokidar": ">=3.0.0 <4.0.0",
+        "immutable": "^4.0.0",
+        "source-map-js": ">=0.6.2 <2.0.0"
+      },
+      "bin": {
+        "sass": "sass.js"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
     "node_modules/scheduler": {
       "version": "0.23.0",
       "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
diff --git a/client/package.json b/client/package.json
index 9c2ae3d..816e54c 100644
--- a/client/package.json
+++ b/client/package.json
@@ -22,6 +22,7 @@
     "eslint": "^8.56.0",
     "eslint-plugin-react-hooks": "^4.6.0",
     "eslint-plugin-react-refresh": "^0.4.5",
+    "sass": "^1.71.1",
     "typescript": "^5.2.2",
     "vite": "^5.1.4"
   }
diff --git a/client/src/App.css b/client/src/App.css
index e69de29..3876ac7 100644
--- a/client/src/App.css
+++ b/client/src/App.css
@@ -0,0 +1,8 @@
+.wrapper {
+  display: flex;
+  flex-direction: column;
+}
+
+.main {
+  height: 85vh;
+}
\ No newline at end of file
diff --git a/client/src/App.tsx b/client/src/App.tsx
index 54670a6..e73504e 100644
--- a/client/src/App.tsx
+++ b/client/src/App.tsx
@@ -1,9 +1,17 @@
 import './App.css';
+import Header from './components/Header/Header';
+import Footer from './components/Footer/Footer';
 
 function App() {
   return (
     <>
-      Hello World
+      <div className='wrapper'>
+        <Header></Header>
+        <div className='main'>
+          {/* Main content goes Here */}
+        </div>
+        <Footer></Footer>
+      </div>
     </>
   );
 }
diff --git a/client/src/components/Footer/Footer.scss b/client/src/components/Footer/Footer.scss
new file mode 100644
index 0000000..43b4e13
--- /dev/null
+++ b/client/src/components/Footer/Footer.scss
@@ -0,0 +1,13 @@
+.footer {
+  display: flex;
+  height: 5vh;
+  width: 100%;
+  background-color: var(--main);
+  justify-content: flex-end;
+  align-items: center;
+}
+
+.footer-content {
+ color: white;
+ padding-right: 1.5rem;
+}
\ No newline at end of file
diff --git a/client/src/components/Footer/Footer.tsx b/client/src/components/Footer/Footer.tsx
new file mode 100644
index 0000000..6d00b9f
--- /dev/null
+++ b/client/src/components/Footer/Footer.tsx
@@ -0,0 +1,15 @@
+import './Footer.scss';
+
+function Footer() {
+  return (
+    <>
+      <div className='footer'>
+        <div className='footer-content'>
+          <span>COM3014 Group 5</span>
+        </div>
+      </div>
+    </>
+  );
+}
+
+export default Footer;
\ No newline at end of file
diff --git a/client/src/components/Header/Header.scss b/client/src/components/Header/Header.scss
new file mode 100644
index 0000000..61cfa62
--- /dev/null
+++ b/client/src/components/Header/Header.scss
@@ -0,0 +1,33 @@
+.header {
+  display: flex;
+  height: 10vh;
+  width: 100%;
+  background-color: var(--main);
+  color: white;
+  flex-direction: row;
+  align-items: center;
+}
+
+.header-content {
+  display: flex;
+  padding-left: 2rem;
+  padding-right: 2rem;
+  width: 100%;
+  flex-direction: row;
+  justify-content: space-between;
+}
+
+.header-title {
+  font-size: 3rem;
+}
+
+.nav {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+}
+
+.nav-item {
+  margin-left: 0.5rem;
+  margin-right: 0.5rem;
+}
\ No newline at end of file
diff --git a/client/src/components/Header/Header.tsx b/client/src/components/Header/Header.tsx
new file mode 100644
index 0000000..2cd9b3f
--- /dev/null
+++ b/client/src/components/Header/Header.tsx
@@ -0,0 +1,20 @@
+import './Header.scss';
+
+function Header() {
+  return (
+    <>
+      <div className='header'>
+        <div className='header-content'>
+          <span className='header-title'>Airline Booking</span>
+
+          <nav className='nav'>
+            <a className='nav-item'>Example Nav 1</a>
+            <a className='nav-item'>Nav 2</a>
+          </nav>
+        </div>
+      </div>
+    </>
+  );
+}
+
+export default Header;
\ No newline at end of file
diff --git a/client/src/index.css b/client/src/index.css
index e69de29..d8a001f 100644
--- a/client/src/index.css
+++ b/client/src/index.css
@@ -0,0 +1,18 @@
+@import url('https://fonts.googleapis.com/css2?family=Lato&display=swap');
+
+/* Unifies font across frontend */
+* {
+  font-family: "Lato", sans-serif;
+  font-weight: 400;
+  font-style: normal;
+}
+
+/* Stops whitespace surrounding page */
+body {
+  margin: 0;
+}
+
+/* CSS Variables */
+:root {
+  --main: #000055;
+}
\ No newline at end of file
-- 
GitLab