From 384d76137831ba36d8b856a66222457d8ddb7099 Mon Sep 17 00:00:00 2001
From: Beatrimo <59887924+Beatrimo@users.noreply.github.com>
Date: Mon, 26 Sep 2022 11:34:24 -0400
Subject: [PATCH 01/27] Add files via upload
---
.env | 6 ++
.glitchdotcom.json | 1 +
.node-gyp | 0
README.md | 2 +-
package.json | 30 +++++++
server.improved.js | 201 +++++++++++++++++++++++++++++++++++++++++++++
6 files changed, 239 insertions(+), 1 deletion(-)
create mode 100644 .env
create mode 100644 .glitchdotcom.json
create mode 100644 .node-gyp
create mode 100644 package.json
create mode 100644 server.improved.js
diff --git a/.env b/.env
new file mode 100644
index 000000000..6e67ac899
--- /dev/null
+++ b/.env
@@ -0,0 +1,6 @@
+USER="sizheli"
+PASS="a89IblxEVumqBScl"
+HOST="cluster0.wmbk7c6.mongodb.net"
+PORT=3000
+GITHUB_ID="216e302e6a21aba13aaa"
+GITHUB_SECRET="89a0bb89fd2eda0289b8734cf47da54de9d99fcc"
\ No newline at end of file
diff --git a/.glitchdotcom.json b/.glitchdotcom.json
new file mode 100644
index 000000000..afcf92ab0
--- /dev/null
+++ b/.glitchdotcom.json
@@ -0,0 +1 @@
+{"appType":"node","buildDirectory":null}
diff --git a/.node-gyp b/.node-gyp
new file mode 100644
index 000000000..e69de29bb
diff --git a/README.md b/README.md
index 1ba2c7a4c..7badb27cc 100644
--- a/README.md
+++ b/README.md
@@ -113,4 +113,4 @@ add a little more detail about what it does.
- **Tech Achievement 1**: I used OAuth authentication via the GitHub strategy
### Design/Evaluation Achievements
-- **Design Achievement 1**: I followed the following tips from the W3C Web Accessibility Initiative...
+- **Design Achievement 1**: I followed the following tips from the W3C Web Accessibility Initiative...
\ No newline at end of file
diff --git a/package.json b/package.json
new file mode 100644
index 000000000..31e42887e
--- /dev/null
+++ b/package.json
@@ -0,0 +1,30 @@
+{
+ "name": "a3-sizhe-li",
+ "version": "1.0",
+ "description": "",
+ "author": "Sizhe Li",
+ "scripts": {
+ "start": "node server.improved.js"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "dependencies": {
+ "body-parser": "^1.19.0",
+ "connect-timeout": "^1.9.0",
+ "cookie-parser": "^1.4.5",
+ "cookie-session": "^1.4.0",
+ "dotenv": "^10.0.0",
+ "envkey": "^1.3.1",
+ "express": "^4.17.1",
+ "mime": "^2.4.4",
+ "mongodb": "^4.1.2",
+ "mongoose": "^6.0.7",
+ "node": "^16.10.0",
+ "passport": "^0.5.0",
+ "passport-github2": "^0.1.12",
+ "request": "^2.88.2",
+ "serve-static": "^1.14.1",
+ "text-encoder": "^0.0.4"
+ }
+}
diff --git a/server.improved.js b/server.improved.js
new file mode 100644
index 000000000..af87eedf1
--- /dev/null
+++ b/server.improved.js
@@ -0,0 +1,201 @@
+const express = require('express'),
+app = express(),
+ serveStatic = require('serve-static'),
+ bodyparser = require('body-parser'),
+ cookieSession = require("cookie-session"),
+ cookieParser = require("cookie-parser"),
+ mongoose = require('mongoose'),
+ GitHubStrategy = require('passport-github2').Strategy,
+ passport = require('passport');
+
+// use express.urlencoded to get data sent by defaut form actions
+// or GET requests
+app.use(express.urlencoded({ extended: true }));
+app.use(cookieParser());
+
+
+
+require('dotenv').config();
+
+app.use(cookieSession({
+ name: "session",
+ keys: [process.env.KEY1, process.env.KEY2]
+}))
+
+mongoose.connect(process.env.MONGO_DB_URL);
+
+const userSchema = new mongoose.Schema({
+ username: String,
+ password: String,
+
+ responseList: {
+ response: [{
+ name: String,
+ gameName: String,
+ score: Number,
+ comment: Number,
+ degree: String
+ }]
+ }
+});
+
+const User = mongoose.model("User", userSchema);
+
+app.use(express.static('public'))
+app.use(bodyparser.json())
+app.use(serveStatic('public', { 'index': ['login.html'] }))
+
+passport.serializeUser(function(user, done) {
+ done(null, user);
+});
+passport.deserializeUser(function(user, done) {
+ done(null, user);
+});
+passport.use(new GitHubStrategy({
+ clientID: process.env.GITHUB_CLIENT_ID,
+ clientSecret: process.env.GITHUB_SECRET,
+ callbackURL: "https://wgngamereviews.herokuapp.com/github/logs"
+},
+function(accessToken, refreshToken, profile, done) {
+ return done(null, profile);
+}));
+
+app.use(passport.initialize());
+app.use(passport.session());
+
+app.get('/auth/error', (req, res) => response.send("Unknown Error"))
+app.get('/github/logs', passport.authenticate('github', { failureRedirect: '/auth/error'}),
+function(req, res) {
+ res.redirect('/response?id=' + req.user.id)
+})
+
+app.get('/response', async (req, res) => {
+ const githubUser = new User( {
+ username: req.query.id,
+ password: "",
+ responseList: {
+ response: []
+ }
+ });
+ githubUser.save();
+ req.session.login = true;
+ req.session.username = req.query.id;
+ res.redirect("edit.html")
+});
+app.get('/redirectToEdit', bodyparser.json(), (req, res) => {
+ if (req.session.login === true) {
+ res.json({ redirect: true });
+ } else {
+ res.json({ redirect: false });
+ }
+})
+
+
+
+app.get('/redirectToEdit', bodyparser.json(), (req, res) => {
+ if (req.session.login === true) {
+ res.json({ redirect: true });
+ } else {
+ res.json({ redirect: false });
+ }
+})
+
+
+app.get('/getUsername', bodyparser.json(), (req, res) => {
+ let username = req.session.username;
+ res.json({ username: username });
+})
+
+app.post('/getTableData', bodyparser.json(), async (req, res) => {
+ const user = await User.findOne({ username: req.body.username });
+ if (user !== null) {
+ console.log(user.responseList);
+ res.json({ rows: user.responseList });
+ }
+})
+
++app.post('/delete', bodyparser.json(), async (req, res) => {
+ console.log("Deleting a row!");
+ const user = await User.findOne({ username: req.body.username });
+ if (user !== null) {
+ console.log("Found the user!");
+ let rowIndex = req.body.deletingItem;
+ user.responseList.response.splice(rowIndex, 1);
+ user.save();
+ res.json({ success: true });
+ }
+})
+
+app.post('/edit', bodyparser.json(), async (req, res) => {
+ const user = await User.findOne({ username: req.body.username });
+ if (user !== null) {
+ let rowIndex = req.body.index;
+ console.log("splicing at index" + rowIndex);
+ user.responseList.response.splice(rowIndex, 1, req.body);
+ console.log(req.body);
+ user.save();
+ res.json({ success: true });
+ }
+})
+
+app.post('/submit', bodyparser.json(), async (req, res) => {
+ const user = await User.findOne({ username: req.body.username });
+ if (user !== null) {
+ user.responseList.response.push(req.body);
+ user.save();
+ res.json({ success: true });
+ }
+})
+
+
+app.post('/login', bodyparser.json(), async (req, res) => {
+ console.log(req.body.username);
+ const user = await User.findOne({ username: req.body.username, password: req.body.password });
+ if (user == null) {
+ req.session.login = false;
+ res.json({ loginSuccess: false });
+ } else {
+ req.session.login = true;
+ req.session.username = req.body.username;
+ res.json({ loginSuccess: true });
+ console.log("Successful login!");
+ }
+
+
+})
+
+app.put('/signOut', (req, res) => {
+ req.session.login = false;
+ req.session.username = "";
+ res.json({ signOutSuccess: true });
+});
+
+app.post('/createAccount', bodyparser.json(), async (req, res) => {
+ const user = await User.findOne({ username: req.body.username });
+ if (user == null) {
+ const newUser = new User({
+ username: req.body.username,
+ password: req.body.password,
+ responseList: {
+ response: []
+ }
+ });
+ newUser.save();
+
+ req.session.login = true;
+ req.session.username = req.body.username;
+ res.json({ registrationSuccess: true });
+ console.log("Successful created account!");
+ } else {
+ req.session.login = false;
+ res.json({ registrationSuccess: false });
+ }
+})
+
+
+
+
+
+const listener = app.listen(process.env.PORT || 3000, () => {
+ console.log("Your app is listening on port " + listener.address().port);
+});
From 34035273adb85b60d7c86ee01c2a2c9826abe9bd Mon Sep 17 00:00:00 2001
From: Beatrimo <59887924+Beatrimo@users.noreply.github.com>
Date: Mon, 26 Sep 2022 11:34:44 -0400
Subject: [PATCH 02/27] Add files via upload
---
edit.html | 133 ++++++++++++++++++++++++++++++++++++++++++++
login.html | 78 ++++++++++++++++++++++++++
response.html | 151 ++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 362 insertions(+)
create mode 100644 edit.html
create mode 100644 login.html
create mode 100644 response.html
diff --git a/edit.html b/edit.html
new file mode 100644
index 000000000..8586bc28f
--- /dev/null
+++ b/edit.html
@@ -0,0 +1,133 @@
+
+
+
+
+
+ WGN Game Reviews
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Add a Response
+
+
+
+
+
+
+
Response Table
+
+
+
+
+
+
+
+
+
Add A Response
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Add
+
+
+
+
+
+
Edit Response
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Edit
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/login.html b/login.html
new file mode 100644
index 000000000..cc8a08416
--- /dev/null
+++ b/login.html
@@ -0,0 +1,78 @@
+
+
+
+
+
+ WGN Game Review Login page
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/response.html b/response.html
new file mode 100644
index 000000000..36672c263
--- /dev/null
+++ b/response.html
@@ -0,0 +1,151 @@
+
+
+
+ CS4241 Assignment 2
+
+
+
+
+
+
+
+
+
+
+
+
+
WGN - Share your Game Review !
+
+
+
+
+
+
About this website
+
WGN (with game name) is a place to share your review of video games you've played.
+ The review of the game can not only help game developers to make the game better,
+ but also allow you to recognize more friends. Come and share your first review!
+
+
+
+
+
+
+
+
+
+
Survey Result:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
From c1119f5a327e45d3c922968f54ef79ce279dc96e Mon Sep 17 00:00:00 2001
From: Beatrimo <59887924+Beatrimo@users.noreply.github.com>
Date: Mon, 26 Sep 2022 11:35:54 -0400
Subject: [PATCH 03/27] Add files via upload
---
editPage.js | 261 +++++++++++++++++++++++++++++++++++++++++++++++++
githublogo.png | Bin 0 -> 8640 bytes
loginPage.js | 86 ++++++++++++++++
style.css | 193 ++++++++++++++++++++++++++++++++++++
title.png | Bin 0 -> 1511890 bytes
5 files changed, 540 insertions(+)
create mode 100644 editPage.js
create mode 100644 githublogo.png
create mode 100644 loginPage.js
create mode 100644 style.css
create mode 100644 title.png
diff --git a/editPage.js b/editPage.js
new file mode 100644
index 000000000..cdb99774a
--- /dev/null
+++ b/editPage.js
@@ -0,0 +1,261 @@
+let global_username = "";
+
+window.onload = function () {
+
+
+ document.getElementById("addResponseBlock").style.display = "none";
+ document.getElementById("editResponseBlock").style.display = "none";
+
+ fetch('/getUsername', {
+ method: 'GET',
+ headers: { 'Content-Type': 'application/json' },
+ }).then(res => {
+ return res.json();
+ }).then(json => {
+ let username = json.username;
+ global_username = username;
+ let tableTitle = document.getElementById("tableTitle");
+ if (tableTitle != null) {
+ tableTitle.innerHTML="Response Table for: " + global_username;
+ }
+ console.log("Username is " + username);
+ if (username == null || username === "") {
+ window.location.replace("/login.html");
+ }
+ })
+
+ setTimeout(function () {
+ updateUserTable();
+ }, 1000);
+ const signOut = document.getElementById("signOutButton");
+ signOut.onclick = signOutFunction;
+
+ document.getElementById("addResponseButton").onclick = function(){
+ document.getElementById("addResponseBlock").style.display = "block";
+ document.getElementById("editResponseBlock").style.display = "none";
+ }
+
+}
+
+function showEditBlock() {
+ document.getElementById("addResponseBlock").style.display = "none";
+ document.getElementById("editResponseBlock").style.display = "block";
+}
+
+function closeAllBlocks() {
+ document.getElementById("addResponseBlock").style.display = "none";
+ document.getElementById("editResponseBlock").style.display = "none";
+}
+
+
+const signOutFunction = function () {
+ fetch('/signOut', {
+ method: 'PUT',
+ headers: { 'Content-Type': 'application/json' },
+ }).then(res => {
+ return res.json();
+ }).then(json => {
+ let signOutSuccess = json.signOutSuccess;
+ if (signOutSuccess) {
+ console.log("Signing out succeed");
+ window.location.replace("/login.html");
+ }
+ })
+}
+
+
+function updateUserTable() {
+ let table = document.getElementById("response");
+ table.innerHTML = 'Name Game Name Score Comment Recommendation Edit Delete '
+ const jsonData = {
+ username: global_username
+ }
+
+ fetch('/getTableData', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(jsonData)
+ }).then(res => {
+ return res.json();
+ }).then(json => {
+ let rowIndex = 0;
+ for (let rowData of json.rows.response) {
+
+ let row = table.insertRow(-1);
+
+ let name = row.insertCell(0);
+ let gameName = row.insertCell(1);
+ let score = row.insertCell(2);
+ let comment = row.insertCell(3);
+ let degree = row.insertCell(4);
+ let editCell = row.insertCell(5);
+ let deleteCell = row.insertCell(6);
+
+ row.cells[0].innerHTML = rowData.name;
+ row.cells[1].innerHTML = rowData.gameName;
+ row.cells[2].innerHTML = rowData.score;
+ row.cells[3].innerHTML = rowData.comment;
+ row.cells[4].innerHTML = getDegree(rowData.score);
+ row.cells[5].innerHTML = rowData.fruit;
+ row.cells[6].innerHTML = 'Edit ';
+ row.cells[7].innerHTML = 'Delete ';
+
+ rowIndex++;
+ }
+ })
+}
+
+function getDegree(score) {
+
+ if(score>=0 && score<=19){
+ return "Strongly Not Recommended";
+ }else if(response.score>=20 && response.score<=39){
+ return "Relatively Not Recommended";
+ }else if(response.score>=40 && response.score<=59){
+ return "Neutral";
+ }else if(response.score>=60 && response.score<=79){
+ return "Relatively Recommended";
+ }else if(response.score>=80 && response.score<=100){
+ return "Strongly Recommended";
+ }
+ else{"Please enter a valid score"}
+}
+
+
+
+const submit = function () {
+
+ const name = document.getElementById('name').value;
+ const gameName = document.getElementById('gameName').value;
+ const score = document.getElementById('score').value;
+ const comment = document.getElementById('comment').value;
+ const degree = getDegree(score);
+
+ if (name.trim() === '' || gameName.trim() === '' || score.trim() === '' || comment.trim() === '' || degree.trim() === '') {
+ alert("Please answer all questions.");
+ return false;
+ } else {
+ const jsonData = {
+ username: global_username,
+ name: name,
+ gameName: gameName,
+ score: score,
+ comment: comment,
+ degree: degree,
+ }
+
+ fetch('/submit', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(jsonData)
+ }).then(res => {
+ return res.json();
+ }).then(json => {
+ console.log("Data uploaded")
+ })
+
+ setTimeout(function () {
+ updateUserTable();
+ }, 1000);
+
+ clearForm();
+ closeAllBlocks();
+ return true;
+ }
+}
+
+function clearForm() {
+ document.getElementById('name').value = "";
+ document.getElementById('gameName').value = "";
+ document.getElementById('score').value = "";
+ document.getElementById('comment').value = "";
+ document.getElementById('degree').value = "";
+}
+
+function editRow(rowIndex) {
+ showEditBlock();
+ let table = document.getElementById("response");
+ let row = table.rows[rowIndex+1];
+
+ document.getElementById('editname').value = row.cells[0].innerHTML;
+ document.getElementById('editgameName').value = row.cells[1].innerHTML;
+ document.getElementById('editscore').value = row.cells[2].innerHTML;
+ document.getElementById('editcomment').value = row.cells[3].innerHTML;
+ document.getElementById('hiddenRowIndex').value = rowIndex;
+
+}
+
+function editClicked() {
+ const name = document.getElementById('editname').value;
+ const gameName = document.getElementById('editgameName').value;
+ const score = document.getElementById('editscore').value;
+ const comment = document.getElementById('editcomment').value;
+ const degree = getDegree(score);
+ const rowIndex = document.getElementById('hiddenRowIndex').value;
+
+ if (rowIndex === "") {
+ alert("You must first select 'Edit This Row' on a row to edit its data!");
+ return false;
+ }
+
+ if (name.trim() === '' || gameName.trim() === '' || score.trim() === '' || comment.trim() === '' ) {
+ alert("Please answer all questions")
+ return false;
+ } else {
+ const jsonData = {
+ index: rowIndex,
+ username: global_username,
+ name: name,
+ gameName: gameName,
+ score: score,
+ comment: comment,
+ degree: degree,
+ }
+
+ fetch('/edit', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(jsonData)
+ }).then(res => {
+ return res.json();
+ }).then(json => {
+ console.log("Data edited success");
+ })
+
+ setTimeout(function () {
+ updateUserTable();
+ }, 1000);
+
+ document.getElementById('editname').value = "";
+ document.getElementById('editgameName').value = "";
+ document.getElementById('editscore').value = "";
+ document.getElementById('editcomment').value = "";
+ document.getElementById('hiddenRowIndex').value = "";
+ closeAllBlocks();
+ return true;
+ }
+}
+
+function deleteRow(rowIndex) {
+ let confirmDelete = confirm("Are you sure you'd like to delete this row?");
+ if (confirmDelete) {
+ const json = {
+ username: global_username,
+ deletingItem: rowIndex
+ }
+
+ console.log("Deleting row " + rowIndex);
+ fetch('/delete', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(json)
+ }).then(res => {
+ return res.json();
+ }).then(json => {
+ console.log("response deleted");
+ setTimeout(function () {
+ updateUserTable();
+ }, 1000);
+ })
+ }
+}
\ No newline at end of file
diff --git a/githublogo.png b/githublogo.png
new file mode 100644
index 0000000000000000000000000000000000000000..9490ffc6d2e158b266f719d58365905c1c5060cb
GIT binary patch
literal 8640
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
literal 0
HcmV?d00001
diff --git a/loginPage.js b/loginPage.js
new file mode 100644
index 000000000..97fa91c18
--- /dev/null
+++ b/loginPage.js
@@ -0,0 +1,86 @@
+window.onload = function () {
+ fetch('/redirectToEdit', {
+ method: 'GET',
+ headers: { 'Content-Type': 'application/json' },
+ }).then(res => {
+ return res.json();
+ }).then(json => {
+ if (json.redirect) {
+ window.location.replace("/edit.html");
+ }
+ })
+
+
+ const signIn = document.getElementById("signInButton");
+ signIn.onclick = signInFunction;
+
+ const register = document.getElementById("registerAccountButton");
+ register.onclick = registerFunction;
+}
+
+const signInFunction = function (event) {
+ event.preventDefault();
+ const username = document.getElementById("loginUsername").value;
+ const password = document.getElementById("loginPassword").value;
+
+ let data = {
+ username: username,
+ password: password
+ }
+
+ fetch('/login', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(data)
+ }).then(res => {
+ console.log("Within JSON");
+ return res.json();
+ }).then(json => {
+ console.log("Back at JSON!");
+
+ document.getElementById("loginUsername").value = "";
+ document.getElementById("loginPassword").value = "";
+
+ console.log(json.loginSuccess);
+ if (json.loginSuccess) {
+ window.location.replace("/edit.html");
+ } else {
+ alert("Incorrect username or password!");
+ }
+ })
+}
+
+const registerFunction = function (event) {
+ event.preventDefault();
+ let username = document.getElementById("registerUsername").value;
+ let password = document.getElementById("registerPassword").value;
+
+ if (username.trim() === "" || password.trim() === "") {
+ document.getElementById("registerUsername").value = "";
+ document.getElementById("registerPassword").value = "";
+ alert("Your username or password cannot be empty or whitespace!");
+ } else {
+ let data = {
+ username: username,
+ password: password
+ }
+
+ fetch('/createAccount', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(data)
+ }).then(res => {
+ return res.json();
+ }).then(json => {
+ document.getElementById("registerUsername").value = "";
+ document.getElementById("registerPassword").value = "";
+
+ if (json.registrationSuccess) {
+ alert("Your account has been successfully registered!");
+ window.location.replace("/edit.html");
+ } else {
+ alert("The username " + username + " is already taken!");
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/style.css b/style.css
new file mode 100644
index 000000000..32a7d85e0
--- /dev/null
+++ b/style.css
@@ -0,0 +1,193 @@
+/*Style your own assignment! This is fun! */
+
+body{padding: 4.5rem;
+ margin: 0;
+ background: #edc0bf;
+
+ background: linear-gradient(217deg, rgba(255,0,0,.8), rgba(255,0,0,0) 70.71%),
+ linear-gradient(127deg, rgba(0,255,0,.8), rgba(0,255,0,0) 70.71%),
+ linear-gradient(336deg, rgba(0,0,255,.8), rgba(0,0,255,0) 70.71%);
+ background-position: center center;
+ background-repeat: no-repeat;
+ background-attachment:fixed;
+ background-size: cover;
+ font-family: 'Inter', sans-serif;}
+
+
+ table {
+ border-collapse: collapse;
+ border: 2px solid black;
+ letter-spacing: 1px;
+ width: 90%;
+ }
+
+ th, td {
+ border: 1px solid;
+ padding: 20px;
+ }
+
+
+ #blogText {
+ margin-left: 100px;
+ margin-right: 100px;
+ padding: 10px;
+ line-height: 1.6;
+ text-indent:2em;
+ }
+
+ #buttons {
+ display: flex;
+ background-color: #f49097;
+ color: #083d77;
+ font-weight: bold;
+ text-decoration: none;
+
+ align-items: center;
+ padding: 10px;
+ height: 30px;
+ display: flex;
+ justify-content: center;
+ margin-top: 20px;
+ background: rgba(255, 255, 255, .7);
+ -webkit-backdrop-filter: blur(10px);
+ backdrop-filter: blur(10px);
+ text-align: center;
+ border-radius: 1rem;
+ margin-left: 30px;
+ margin-right: 30px;
+ margin-top: 30px;
+ margin-bottom: 30px;
+ }
+
+ #mainTitle {
+ text-align: center;
+ vertical-align:top;
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ font-family: 'Silkscreen', cursive;
+ font-size: 2em;
+ color: #f4a83a;
+ text-shadow: 0 4px 0 #333333;
+ background: url("../images/title.png") no-repeat fixed;
+ background-position: center;
+ background-repeat: no-repeat;
+ background-attachment:fixed;
+ background-size: cover;
+ height: 230px;
+ margin-top: -80px;
+ }
+
+ #review{
+ padding: 2rem;
+ font-family: 'Silkscreen', cursive;
+ }
+ #resultTable {
+ margin-left: 30px;
+ margin-right:30px;
+ margin-top: 30px;
+ margin-bottom: 30px;
+ background: rgba(255, 255, 255, .7);
+ -webkit-backdrop-filter: blur(10px);
+ backdrop-filter: blur(10px);
+ border-radius: 1rem;
+ }
+ #textboxid
+ {
+ height:200px;
+ font-size:14pt;
+ }
+
+ .autoMargin {
+ margin-left: auto;
+ margin-right: auto;
+ margin-top: auto;
+ margin-bottom: auto;
+ }
+
+ .centerText {
+ text-align: center;
+ margin-top: 10px;
+ justify-content: space-around;
+ }
+
+
+ .card {
+ height: auto;
+ padding: 2rem;
+ border-radius: 1rem;
+ margin-top: 10px;
+ /* other styles */
+ background: rgba(255, 255, 255, .7);
+ -webkit-backdrop-filter: blur(10px);
+ backdrop-filter: blur(10px);
+ margin-left: 30px;
+ margin-right: 30px;
+ margin-top: 30px;
+ margin-bottom: 30px;
+ }
+
+ .card-title {
+ margin-top: 0;
+ margin-bottom: .5rem;
+ font-size: 1.2rem;
+ font-family: 'Silkscreen', cursive;
+ }
+
+ .deleteButton {
+ text-decoration: none;
+ border: none;
+ padding: 12px 40px;
+ font-size: 16px;
+ background: rgba(255, 255, 255, .7);
+
+
+ }.deleteButton:active {
+ transform: scale(0.98);
+ /* Scaling button to 0.98 to its original size */
+ box-shadow: 3px 2px 22px 1px rgba(0, 0, 0, 0.24);
+ /* Lowering the shadow */
+ }
+ .submitButton {
+ text-decoration: none;
+ border: none;
+ padding: 12px 40px;
+ font-size: 16px;
+ background: rgba(255, 255, 255, .7);
+ -webkit-backdrop-filter: blur(10px);
+ backdrop-filter: blur(10px);
+ color: black;
+ border-radius: 5px;
+ box-shadow: 7px 6px 28px 1px rgba(0, 0, 0, 0.24);
+ cursor: pointer;
+ outline: none;
+ transition: 0.2s all;
+ text-align: center;
+ }
+ /* Adding transformation when the button is active */
+
+ .submitButton:active {
+ transform: scale(0.98);
+ /* Scaling button to 0.98 to its original size */
+ box-shadow: 3px 2px 22px 1px rgba(0, 0, 0, 0.24);
+ /* Lowering the shadow */
+ }
+
+
+ .header-footer-background {
+ background-image: url("../images/title.png");
+ background-color: #f5e960;
+ height: 250px;
+ background-repeat: no-repeat;
+ background-position: center;
+
+ }
+ .responses-background {
+ background-color: #f3ffbd;
+ }
+
+
+
+
+
+
\ No newline at end of file
diff --git a/title.png b/title.png
new file mode 100644
index 0000000000000000000000000000000000000000..e7b631df4ed3b01c1a1b01af02ea80ed92762160
GIT binary patch
literal 1511890
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