diff --git a/.gitignore b/.gitignore
index ceaea36..3715fa6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -130,3 +130,4 @@ dist
.yarn/install-state.gz
.pnp.*
+/.idea/git_toolbox_blame.xml
diff --git a/.idea/Webshop.iml b/.idea/Webshop.iml
index d6ebd48..533a2cb 100644
--- a/.idea/Webshop.iml
+++ b/.idea/Webshop.iml
@@ -5,5 +5,6 @@
+
\ No newline at end of file
diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml
new file mode 100644
index 0000000..63a12b6
--- /dev/null
+++ b/.idea/dataSources.xml
@@ -0,0 +1,18 @@
+
+
+
+
+ postgresql
+ true
+ org.postgresql.Driver
+ jdbc:postgresql://localhost:5432/postgres
+
+
+
+
+
+
+ $ProjectFileDir$
+
+
+
\ No newline at end of file
diff --git a/.idea/git_toolbox_prj.xml b/.idea/git_toolbox_prj.xml
new file mode 100644
index 0000000..02b915b
--- /dev/null
+++ b/.idea/git_toolbox_prj.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/jsLibraryMappings.xml b/.idea/jsLibraryMappings.xml
new file mode 100644
index 0000000..9da3653
--- /dev/null
+++ b/.idea/jsLibraryMappings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml
new file mode 100644
index 0000000..a8b32a1
--- /dev/null
+++ b/.idea/sqldialects.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/src/01_counter/styles.css b/.idea/src/01_counter/styles.css
deleted file mode 100644
index 84e807e..0000000
--- a/.idea/src/01_counter/styles.css
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
-===============
-Fonts
-===============
-*/
-@import url("https://fonts.googleapis.com/css?family=Open+Sans|Roboto:400,700&display=swap");
-
-/*
-===============
-Variables
-===============
-*/
-
-:root {
- /* dark shades of primary color*/
- --clr-primary-1: hsl(205, 86%, 17%);
- --clr-primary-2: hsl(205, 77%, 27%);
- --clr-primary-3: hsl(205, 72%, 37%);
- --clr-primary-4: hsl(205, 63%, 48%);
- /* primary/main color */
- --clr-primary-5: hsl(205, 78%, 60%);
- /* lighter shades of primary color */
- --clr-primary-6: hsl(205, 89%, 70%);
- --clr-primary-7: hsl(205, 90%, 76%);
- --clr-primary-8: hsl(205, 86%, 81%);
- --clr-primary-9: hsl(205, 90%, 88%);
- --clr-primary-10: hsl(205, 100%, 96%);
- /* darkest grey - used for headings */
- --clr-grey-1: hsl(209, 61%, 16%);
- --clr-grey-2: hsl(211, 39%, 23%);
- --clr-grey-3: hsl(209, 34%, 30%);
- --clr-grey-4: hsl(209, 28%, 39%);
- /* grey used for paragraphs */
- --clr-grey-5: hsl(210, 22%, 49%);
- --clr-grey-6: hsl(209, 23%, 60%);
- --clr-grey-7: hsl(211, 27%, 70%);
- --clr-grey-8: hsl(210, 31%, 80%);
- --clr-grey-9: hsl(212, 33%, 89%);
- --clr-grey-10: hsl(210, 36%, 96%);
- --clr-white: #fff;
- --clr-red-dark: hsl(360, 67%, 44%);
- --clr-red-light: hsl(360, 71%, 66%);
- --clr-green-dark: hsl(125, 67%, 44%);
- --clr-green-light: hsl(125, 71%, 66%);
- --clr-black: #222;
- --ff-primary: "Roboto", sans-serif;
- --ff-secondary: "Open Sans", sans-serif;
- --transition: all 0.3s linear;
- --spacing: 0.1rem;
- --radius: 0.25rem;
- --light-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
- --dark-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
- --max-width: 1170px;
- --fixed-width: 620px;
-}
-/*
-===============
-Global Styles
-===============
-*/
-
-*,
-::after,
-::before {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-body {
- font-family: var(--ff-secondary);
- background: var(--clr-grey-10);
- color: var(--clr-grey-1);
- line-height: 1.5;
- font-size: 0.875rem;
-}
-ul {
- list-style-type: none;
-}
-a {
- text-decoration: none;
-}
-h1,
-h2,
-h3,
-h4 {
- letter-spacing: var(--spacing);
- text-transform: capitalize;
- line-height: 1.25;
- margin-bottom: 0.75rem;
- font-family: var(--ff-primary);
-}
-h1 {
- font-size: 3rem;
-}
-h2 {
- font-size: 2rem;
-}
-h3 {
- font-size: 1.25rem;
-}
-h4 {
- font-size: 0.875rem;
-}
-p {
- margin-bottom: 1.25rem;
- color: var(--clr-grey-5);
-}
-@media screen and (min-width: 800px) {
- h1 {
- font-size: 4rem;
- }
- h2 {
- font-size: 2.5rem;
- }
- h3 {
- font-size: 1.75rem;
- }
- h4 {
- font-size: 1rem;
- }
- body {
- font-size: 1rem;
- }
- h1,
- h2,
- h3,
- h4 {
- line-height: 1;
- }
-}
-/* global classes */
-
-/* section */
-.section {
- padding: 5rem 0;
-}
-
-.section-center {
- width: 90vw;
- margin: 0 auto;
- max-width: 1170px;
-}
-@media screen and (min-width: 992px) {
- .section-center {
- width: 95vw;
- }
-}
-main {
- min-height: 100vh;
- display: grid;
- place-items: center;
-}
-
-/*
-===============
-Counter
-===============
-*/
-
-main {
- min-height: 100vh;
- display: grid;
- place-items: center;
-}
-.container {
- text-align: center;
-}
-#value {
- font-size: 6rem;
- font-weight: bold;
-}
-.btn {
- text-transform: uppercase;
- background: transparent;
- color: var(--clr-black);
- padding: 0.375rem 0.75rem;
- letter-spacing: var(--spacing);
- display: inline-block;
- transition: var(--transition);
- font-size: 0.875rem;
- border: 2px solid var(--clr-black);
- cursor: pointer;
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
- border-radius: var(--radius);
- margin: 0.5rem;
-}
-.btn:hover {
- color: var(--clr-white);
- background: var(--clr-black);
-}
\ No newline at end of file
diff --git a/sql_scripts/createDB.sql b/sql_scripts/createDB.sql
new file mode 100644
index 0000000..c5b57e8
--- /dev/null
+++ b/sql_scripts/createDB.sql
@@ -0,0 +1,26 @@
+CREATE
+ DATABASE autohaendler;
+\c
+autohaendler
+
+CREATE TYPE color;
+CREATE TYPE make;
+CREATE TYPE model;
+CREATE TYPE engine;
+CREATE TYPE price;
+CREATE TYPE doors;
+
+CREATE
+ EXTENSION IF NOT EXISTS "uuid-ossp";
+
+CREATE TABLE autohaendler_stock
+(
+ color TEXT NOT NULL,
+ make TEXT NOT NULL,
+ model TEXT NOT NULL,
+ engine TEXT NOT NULL,
+ price TEXT NOT NULL,
+ doors TEXT NOT NULL,
+);
+
+INSERT INTO autohaendler_stock (color, make, model, engine, price, doors);
diff --git a/sql_scripts/rollbackDB.sql b/sql_scripts/rollbackDB.sql
new file mode 100644
index 0000000..07aa47c
--- /dev/null
+++ b/sql_scripts/rollbackDB.sql
@@ -0,0 +1,17 @@
+\c
+autohaendler
+
+DROP TABLE autohaendler;
+
+DROP TYPE IF EXISTS color;
+DROP TYPE IF EXISTS make;
+DROP TYPE IF EXISTS model;
+DROP TYPE IF EXISTS engine;
+DROP TYPE IF EXISTS price;
+DROP TYPE IF EXISTS doors;
+
+\c
+postgres
+
+DROP
+DATABASE autohaendler;
diff --git a/src/backend/example/database_calls/getDatabaseTable.php b/src/backend/example/database_calls/getDatabaseTable.php
new file mode 100644
index 0000000..e8323de
--- /dev/null
+++ b/src/backend/example/database_calls/getDatabaseTable.php
@@ -0,0 +1,38 @@
+set_charset("utf8mb4");
+// close connection on error
+if ($conn->connect_error) {
+ die("Connection failed: " . $conn->connect_error);
+}
+
+// prepare SQL statement and execute on database
+$sql = "SELECT * FROM table";
+// get data from database
+$result = $conn->query($sql);
+$conn->close();
+
+// check if result is empty & has more than "0" rows
+if (!empty($result) && (int)$result->num_rows > 0) {
+ while ($row = $result->fetch_assoc()) {
+ $sqlArray[] = $row;
+ }
+ echo json_encode($sqlArray);
+} else {
+ echo "0 results";
+}
+exit();
diff --git a/src/backend/example/database_calls/startAjax.js b/src/backend/example/database_calls/startAjax.js
new file mode 100644
index 0000000..6d68ea2
--- /dev/null
+++ b/src/backend/example/database_calls/startAjax.js
@@ -0,0 +1,17 @@
+$(document).ready(function () {
+
+ // ajax function to call PHP script on webserver
+ $.ajax({
+ type: "POST", // use what "type" is necessary, POST is most common
+ url: "getDatabaseTable.php", // path to .php file that will be executed
+ dataType: "json", // return type of the PHP script
+ success: function (data) {
+ console.log("successfully called PHP file!")
+ console.log(data)
+ // implement logic to write json into HTML here
+ },
+ error: function () {
+ console.log("failed to call PHP file!")
+ }
+ });
+})
\ No newline at end of file
diff --git a/.idea/src/01_counter/app.js b/src/frontend/example/01_counter/app.js
similarity index 89%
rename from .idea/src/01_counter/app.js
rename to src/frontend/example/01_counter/app.js
index b609b85..44f3afb 100644
--- a/.idea/src/01_counter/app.js
+++ b/src/frontend/example/01_counter/app.js
@@ -3,9 +3,9 @@ let count = 0;
// select value and buttons
const value = document.querySelector("#value");
-const btns = document.querySelectorAll(".btn");
+const buttons = document.querySelectorAll(".btn");
-btns.forEach(function (btn) {
+buttons.forEach(function (btn) {
btn.addEventListener("click", function (e) {
const styles = e.currentTarget.classList;
if (styles.contains("decrease")) {
diff --git a/.idea/src/01_counter/index.html b/src/frontend/example/01_counter/index.html
similarity index 91%
rename from .idea/src/01_counter/index.html
rename to src/frontend/example/01_counter/index.html
index c43c7f4..b1e6e92 100644
--- a/.idea/src/01_counter/index.html
+++ b/src/frontend/example/01_counter/index.html
@@ -7,7 +7,7 @@
Counter
-
+
diff --git a/src/frontend/example/01_counter/styles.css b/src/frontend/example/01_counter/styles.css
new file mode 100644
index 0000000..cf1668c
--- /dev/null
+++ b/src/frontend/example/01_counter/styles.css
@@ -0,0 +1,207 @@
+/*
+===============
+Fonts
+===============
+*/
+@import url("https://fonts.googleapis.com/css?family=Open+Sans|Roboto:400,700&display=swap");
+
+/*
+===============
+Variables
+===============
+*/
+
+:root {
+ /* dark shades of primary color*/
+ --clr-primary-1: hsl(205, 86%, 17%);
+ --clr-primary-2: hsl(205, 77%, 27%);
+ --clr-primary-3: hsl(205, 72%, 37%);
+ --clr-primary-4: hsl(205, 63%, 48%);
+ /* primary/main color */
+ --clr-primary-5: hsl(205, 78%, 60%);
+ /* lighter shades of primary color */
+ --clr-primary-6: hsl(205, 89%, 70%);
+ --clr-primary-7: hsl(205, 90%, 76%);
+ --clr-primary-8: hsl(205, 86%, 81%);
+ --clr-primary-9: hsl(205, 90%, 88%);
+ --clr-primary-10: hsl(205, 100%, 96%);
+ /* darkest grey - used for headings */
+ --clr-grey-1: hsl(209, 61%, 16%);
+ --clr-grey-2: hsl(211, 39%, 23%);
+ --clr-grey-3: hsl(209, 34%, 30%);
+ --clr-grey-4: hsl(209, 28%, 39%);
+ /* grey used for paragraphs */
+ --clr-grey-5: hsl(210, 22%, 49%);
+ --clr-grey-6: hsl(209, 23%, 60%);
+ --clr-grey-7: hsl(211, 27%, 70%);
+ --clr-grey-8: hsl(210, 31%, 80%);
+ --clr-grey-9: hsl(212, 33%, 89%);
+ --clr-grey-10: hsl(210, 36%, 96%);
+ --clr-white: #fff;
+ --clr-red-dark: hsl(360, 67%, 44%);
+ --clr-red-light: hsl(360, 71%, 66%);
+ --clr-green-dark: hsl(125, 67%, 44%);
+ --clr-green-light: hsl(125, 71%, 66%);
+ --clr-black: #222;
+ --ff-primary: "Roboto", sans-serif;
+ --ff-secondary: "Open Sans", sans-serif;
+ --transition: all 0.3s linear;
+ --spacing: 0.1rem;
+ --radius: 0.25rem;
+ --light-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
+ --dark-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
+ --max-width: 1170px;
+ --fixed-width: 620px;
+}
+
+/*
+===============
+Global Styles
+===============
+*/
+
+*,
+::after,
+::before {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: var(--ff-secondary);
+ background: var(--clr-grey-10);
+ color: var(--clr-grey-1);
+ line-height: 1.5;
+ font-size: 0.875rem;
+}
+
+ul {
+ list-style-type: none;
+}
+
+a {
+ text-decoration: none;
+}
+
+h1,
+h2,
+h3,
+h4 {
+ letter-spacing: var(--spacing);
+ text-transform: capitalize;
+ line-height: 1.25;
+ margin-bottom: 0.75rem;
+ font-family: var(--ff-primary);
+}
+
+h1 {
+ font-size: 3rem;
+}
+
+h2 {
+ font-size: 2rem;
+}
+
+h3 {
+ font-size: 1.25rem;
+}
+
+h4 {
+ font-size: 0.875rem;
+}
+
+p {
+ margin-bottom: 1.25rem;
+ color: var(--clr-grey-5);
+}
+
+@media screen and (min-width: 800px) {
+ h1 {
+ font-size: 4rem;
+ }
+
+ h2 {
+ font-size: 2.5rem;
+ }
+
+ h3 {
+ font-size: 1.75rem;
+ }
+
+ h4 {
+ font-size: 1rem;
+ }
+
+ body {
+ font-size: 1rem;
+ }
+
+ h1,
+ h2,
+ h3,
+ h4 {
+ line-height: 1;
+ }
+}
+
+/* global classes */
+
+/* section */
+.section {
+ padding: 5rem 0;
+}
+
+.section-center {
+ width: 90vw;
+ margin: 0 auto;
+ max-width: 1170px;
+}
+
+@media screen and (min-width: 992px) {
+ .section-center {
+ width: 95vw;
+ }
+}
+
+main {
+ min-height: 100vh;
+ display: grid;
+ place-items: center;
+}
+
+/*
+===============
+Counter
+===============
+*/
+
+.container {
+ text-align: center;
+}
+
+#value {
+ font-size: 6rem;
+ font-weight: bold;
+}
+
+.btn {
+ text-transform: uppercase;
+ background: transparent;
+ color: var(--clr-black);
+ padding: 0.375rem 0.75rem;
+ letter-spacing: var(--spacing);
+ display: inline-block;
+ transition: var(--transition);
+ font-size: 0.875rem;
+ border: 2px solid var(--clr-black);
+ cursor: pointer;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
+ border-radius: var(--radius);
+ margin: 0.5rem;
+}
+
+.btn:hover {
+ color: var(--clr-white);
+ background: var(--clr-black);
+}
\ No newline at end of file
diff --git a/src/frontend/example/05_sidebar/app.js b/src/frontend/example/05_sidebar/app.js
new file mode 100644
index 0000000..0bf53f3
--- /dev/null
+++ b/src/frontend/example/05_sidebar/app.js
@@ -0,0 +1,16 @@
+const toggleBtn = document.querySelector(".sidebar-toggle");
+const closeBtn = document.querySelector(".close-btn");
+const sidebar = document.querySelector(".sidebar");
+
+toggleBtn.addEventListener("click", function () {
+ // if (sidebar.classList.contains("show-sidebar")) {
+ // sidebar.classList.remove("show-sidebar");
+ // } else {
+ // sidebar.classList.add("show-sidebar");
+ // }
+ sidebar.classList.toggle("show-sidebar");
+});
+
+closeBtn.addEventListener("click", function () {
+ sidebar.classList.remove("show-sidebar");
+});
diff --git a/src/frontend/example/05_sidebar/index.html b/src/frontend/example/05_sidebar/index.html
new file mode 100644
index 0000000..f4fb120
--- /dev/null
+++ b/src/frontend/example/05_sidebar/index.html
@@ -0,0 +1,69 @@
+
+
+
+
+
+
Sidebar
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/frontend/example/05_sidebar/logo.svg b/src/frontend/example/05_sidebar/logo.svg
new file mode 100644
index 0000000..cccc49b
--- /dev/null
+++ b/src/frontend/example/05_sidebar/logo.svg
@@ -0,0 +1,17 @@
+
diff --git a/src/frontend/example/05_sidebar/styles.css b/src/frontend/example/05_sidebar/styles.css
new file mode 100644
index 0000000..2bfcaf8
--- /dev/null
+++ b/src/frontend/example/05_sidebar/styles.css
@@ -0,0 +1,289 @@
+/*
+===============
+Fonts
+===============
+*/
+@import url('https://fonts.googleapis.com/css?family=Open+Sans|Roboto:400,700&display=swap');
+
+/*
+===============
+Variables
+===============
+*/
+
+:root {
+ /* dark shades of primary color*/
+ --clr-primary-1: hsl(205, 86%, 17%);
+ --clr-primary-2: hsl(205, 77%, 27%);
+ --clr-primary-3: hsl(205, 72%, 37%);
+ --clr-primary-4: hsl(205, 63%, 48%);
+ /* primary/main color */
+ --clr-primary-5: hsl(205, 78%, 60%);
+ /* lighter shades of primary color */
+ --clr-primary-6: hsl(205, 89%, 70%);
+ --clr-primary-7: hsl(205, 90%, 76%);
+ --clr-primary-8: hsl(205, 86%, 81%);
+ --clr-primary-9: hsl(205, 90%, 88%);
+ --clr-primary-10: hsl(205, 100%, 96%);
+ /* darkest grey - used for headings */
+ --clr-grey-1: hsl(209, 61%, 16%);
+ --clr-grey-2: hsl(211, 39%, 23%);
+ --clr-grey-3: hsl(209, 34%, 30%);
+ --clr-grey-4: hsl(209, 28%, 39%);
+ /* grey used for paragraphs */
+ --clr-grey-5: hsl(210, 22%, 49%);
+ --clr-grey-6: hsl(209, 23%, 60%);
+ --clr-grey-7: hsl(211, 27%, 70%);
+ --clr-grey-8: hsl(210, 31%, 80%);
+ --clr-grey-9: hsl(212, 33%, 89%);
+ --clr-grey-10: hsl(210, 36%, 96%);
+ --clr-white: #fff;
+ --clr-red-dark: hsl(360, 67%, 44%);
+ --clr-red-light: hsl(360, 71%, 66%);
+ --clr-green-dark: hsl(125, 67%, 44%);
+ --clr-green-light: hsl(125, 71%, 66%);
+ --clr-black: #222;
+ --ff-primary: 'Roboto', sans-serif;
+ --ff-secondary: 'Open Sans', sans-serif;
+ --transition: all 0.3s linear;
+ --spacing: 0.1rem;
+ --radius: 0.25rem;
+ --light-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
+ --dark-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
+ --max-width: 1170px;
+ --fixed-width: 620px;
+}
+
+/*
+===============
+Global Styles
+===============
+*/
+
+*,
+::after,
+::before {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: var(--ff-secondary);
+ background: var(--clr-grey-10);
+ color: var(--clr-grey-1);
+ line-height: 1.5;
+ font-size: 0.875rem;
+}
+
+ul {
+ list-style-type: none;
+}
+
+a {
+ text-decoration: none;
+}
+
+h1,
+h2,
+h3,
+h4 {
+ letter-spacing: var(--spacing);
+ text-transform: capitalize;
+ line-height: 1.25;
+ margin-bottom: 0.75rem;
+ font-family: var(--ff-primary);
+}
+
+h1 {
+ font-size: 3rem;
+}
+
+h2 {
+ font-size: 2rem;
+}
+
+h3 {
+ font-size: 1.25rem;
+}
+
+h4 {
+ font-size: 0.875rem;
+}
+
+p {
+ margin-bottom: 1.25rem;
+ color: var(--clr-grey-5);
+}
+
+@media screen and (min-width: 800px) {
+ h1 {
+ font-size: 4rem;
+ }
+
+ h2 {
+ font-size: 2.5rem;
+ }
+
+ h3 {
+ font-size: 1.75rem;
+ }
+
+ h4 {
+ font-size: 1rem;
+ }
+
+ body {
+ font-size: 1rem;
+ }
+
+ h1,
+ h2,
+ h3,
+ h4 {
+ line-height: 1;
+ }
+}
+
+/* global classes */
+
+/* section */
+.section {
+ padding: 5rem 0;
+}
+
+.section-center {
+ width: 90vw;
+ margin: 0 auto;
+ max-width: 1170px;
+}
+
+@media screen and (min-width: 992px) {
+ .section-center {
+ width: 95vw;
+ }
+}
+
+main {
+ min-height: 100vh;
+ display: grid;
+ place-items: center;
+}
+
+/*
+===============
+Sidebar
+===============
+*/
+.sidebar-toggle {
+ position: fixed;
+ top: 2rem;
+ right: 3rem;
+ font-size: 2rem;
+ background: transparent;
+ border-color: transparent;
+ color: var(--clr-primary-5);
+ transition: var(--transition);
+ cursor: pointer;
+ animation: bounce 2s ease-in-out infinite;
+}
+
+.sidebar-toggle:hover {
+ color: var(--clr-primary-7);
+}
+
+@keyframes bounce {
+ 0% {
+ transform: scale(1);
+ }
+ 50% {
+ transform: scale(1.5);
+ }
+ 100% {
+ transform: scale(1);
+ }
+}
+
+.sidebar-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 1rem 1.5rem;
+}
+
+.close-btn {
+ font-size: 1.75rem;
+ background: transparent;
+ border-color: transparent;
+ color: var(--clr-primary-5);
+ transition: var(--transition);
+ cursor: pointer;
+ color: var(--clr-red-dark);
+}
+
+.close-btn:hover {
+ color: var(--clr-red-light);
+ transform: rotate(360deg);
+}
+
+.logo {
+ justify-self: center;
+ height: 40px;
+}
+
+.links a {
+ display: block;
+ font-size: 1.5rem;
+ text-transform: capitalize;
+ padding: 1rem 1.5rem;
+ color: var(--clr-grey-5);
+ transition: var(--transition);
+}
+
+.links a:hover {
+ background: var(--clr-primary-8);
+ color: var(--clr-primary-5);
+ padding-left: 1.75rem;
+}
+
+.social-icons {
+ justify-self: center;
+ display: flex;
+ padding-bottom: 2rem;
+}
+
+.social-icons a {
+ font-size: 1.5rem;
+ margin: 0 0.5rem;
+ color: var(--clr-primary-5);
+ transition: var(--transition);
+}
+
+.social-icons a:hover {
+ color: var(--clr-primary-1);
+}
+
+.sidebar {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: var(--clr-white);
+ display: grid;
+ grid-template-rows: auto 1fr auto;
+ row-gap: 1rem;
+ box-shadow: var(--clr-red-dark);
+ transition: var(--transition);
+ /* transform: translate(-100%); */
+}
+
+.show-sidebar {
+ transform: translate(0);
+}
+
+@media screen and (min-width: 676px) {
+ .sidebar {
+ width: 400px;
+ }
+}
diff --git a/src/frontend/example/grid_layout/grid_layout.css b/src/frontend/example/grid_layout/grid_layout.css
new file mode 100644
index 0000000..9be4f0e
--- /dev/null
+++ b/src/frontend/example/grid_layout/grid_layout.css
@@ -0,0 +1,37 @@
+.item1 {
+ grid-area: header;
+}
+
+.item2 {
+ grid-area: menu;
+}
+
+.item3 {
+ grid-area: main;
+}
+
+.item4 {
+ grid-area: right;
+}
+
+.item5 {
+ grid-area: footer;
+}
+
+.grid-container {
+ display: grid;
+ grid-template-areas:
+ 'header header header header header header'
+ 'menu main main main main right'
+ 'menu footer footer footer footer footer';
+ gap: 10px;
+ background-color: whitesmoke;
+ padding: 10px;
+}
+
+.grid-container > div {
+ background-color: rgba(255, 255, 255, 0.8);
+ text-align: center;
+ padding: 20px 0;
+ font-size: 30px;
+}
\ No newline at end of file
diff --git a/src/frontend/example/grid_layout/index.html b/src/frontend/example/grid_layout/index.html
new file mode 100644
index 0000000..39c892c
--- /dev/null
+++ b/src/frontend/example/grid_layout/index.html
@@ -0,0 +1,18 @@
+
+
+
+
+
Example 1
+
+
+
+
+
+
header
+
menu
+
main
+
right
+
footer
+
+
+
\ No newline at end of file
diff --git a/src/frontend/example/toggle_dark_light/app.js b/src/frontend/example/toggle_dark_light/app.js
new file mode 100644
index 0000000..9b25a26
--- /dev/null
+++ b/src/frontend/example/toggle_dark_light/app.js
@@ -0,0 +1,4 @@
+function switchLightDark() {
+ let element = document.body
+ element.classList.toggle("dark-mode")
+}
\ No newline at end of file
diff --git a/src/frontend/example/toggle_dark_light/index.html b/src/frontend/example/toggle_dark_light/index.html
new file mode 100644
index 0000000..2b0ee21
--- /dev/null
+++ b/src/frontend/example/toggle_dark_light/index.html
@@ -0,0 +1,17 @@
+
+
+
+
+
+
Darkmode
+
+
+
+
Toggle Dark/Light Mode
+
Click the button to toggle between dark and light mode for this page.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/frontend/example/toggle_dark_light/styles.css b/src/frontend/example/toggle_dark_light/styles.css
new file mode 100644
index 0000000..aebb339
--- /dev/null
+++ b/src/frontend/example/toggle_dark_light/styles.css
@@ -0,0 +1,11 @@
+body {
+ padding: 25px;
+ background-color: white;
+ color: black;
+ font-size: 25px;
+}
+
+.dark-mode {
+ background-color: black;
+ color: white;
+}
\ No newline at end of file