diff --git a/public/css/footer.css b/public/css/footer.css deleted file mode 100644 index 42615c5..0000000 --- a/public/css/footer.css +++ /dev/null @@ -1,100 +0,0 @@ -footer { - background-color: #34495e; - color: #ecf0f1; - padding: 2rem 0; - text-align: center; - border-top: none; - box-shadow: 0 -2px 5px rgba(0,0,0,0.1); - font-size: 0.9rem; -} - -footer .container { - display: flex; - flex-direction: column; - align-items: center; - gap: 1rem; -} - -footer p { - font-size: 0.85rem; - color: #bdc3c7; - line-height: 1.5; - margin: 0; - max-width: 600px; -} - -footer p a { - color: #9bd3ff; - text-decoration: none; - transition: color 0.2s ease-in-out; -} - -footer p a:hover { - color: #ecf0f1; - text-decoration: underline; -} - -footer img { - vertical-align: middle; - margin-left: 0.5rem; - opacity: 0.8; - transition: opacity 0.2s ease-in-out; -} - -footer img:hover { - opacity: 1; -} - -footer nav { - margin-top: 0; - margin-bottom: 0; - display: flex; - gap: 1.5rem; /* Adjust this value to control spacing between links */ - /* If you want them centered within the nav */ - justify-content: center; - /* Allow items to wrap to the next line on smaller screens */ - flex-wrap: wrap; -} - -footer nav p { - margin: 0; - -} - -footer .social-contact { - display: flex; - gap: 1rem; - flex-wrap: wrap; - justify-content: center; - margin-top: 1rem; -} - -footer .social-contact p { - margin: 0; - font-size: 1rem; - font-weight: 600; -} - -footer .social-contact p img, -footer .social-contact p svg { - vertical-align: middle; - margin: 0 0.25rem; - width: 24px; - height: 24px; - opacity: 0.9; - transition: opacity 0.2s ease-in-out; -} - -footer .social-contact p img:hover, -footer .social-contact p svg:hover { - opacity: 1; -} - -@media (max-width: 600px) { - footer .container { - padding: 1.5rem; - } - footer p { - font-size: 0.8rem; - } -} diff --git a/public/css/styles.css b/public/css/styles.css index 7ad3a39..951db84 100644 --- a/public/css/styles.css +++ b/public/css/styles.css @@ -1,9 +1,3 @@ -/* Reset */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} /* Base styles */ html, body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; @@ -18,18 +12,91 @@ margin: 0 auto; padding: 1rem 1.5rem; } -/* Layout */ -.layout { - display: flex; - max-width: 1200px; - margin: 2rem auto; - padding: 0 1.5rem; - gap: 2rem; +footer { + background-color: #34495e; + color: #ecf0f1; + padding: 2rem 0; + text-align: center; + border-top: none; + box-shadow: 0 -2px 5px rgba(0,0,0,0.1); + font-size: 0.9rem; } -/* Responsive layout */ -@media (max-width: 900px) { - .layout { - flex-direction: column; +footer .container { + display: flex; + flex-direction: column; + align-items: center; + gap: 1rem; +} +footer p { + font-size: 0.85rem; + color: #bdc3c7; + line-height: 1.5; + margin: 0; + max-width: 600px; +} +footer p a { + color: #9bd3ff; + text-decoration: none; + transition: color 0.2s ease-in-out; +} +footer p a:hover { + color: #ecf0f1; + text-decoration: underline; +} +footer img { + vertical-align: middle; + margin-left: 0.5rem; + opacity: 0.8; + transition: opacity 0.2s ease-in-out; +} +footer img:hover { + opacity: 1; +} +footer nav { + margin-top: 0; + margin-bottom: 0; + display: flex; + gap: 1.5rem; /* Adjust this value to control spacing between links */ + /* If you want them centered within the nav */ + justify-content: center; + /* Allow items to wrap to the next line on smaller screens */ + flex-wrap: wrap; +} +footer nav p { + margin: 0; + +} +footer .social-contact { + display: flex; + gap: 1rem; + flex-wrap: wrap; + justify-content: center; + margin-top: 1rem; +} +footer .social-contact p { + margin: 0; + font-size: 1rem; + font-weight: 600; +} +footer .social-contact p img, +footer .social-contact p svg { + vertical-align: middle; + margin: 0 0.25rem; + width: 24px; + height: 24px; + opacity: 0.9; + transition: opacity 0.2s ease-in-out; +} +footer .social-contact p img:hover, +footer .social-contact p svg:hover { + opacity: 1; +} +@media (max-width: 600px) { + footer .container { + padding: 1.5rem; + } + footer p { + font-size: 0.8rem; } } /* Header */ @@ -87,6 +154,160 @@ header nav a:focus { background-color: #34495e; } +/* Layout */ +.layout { + display: flex; + max-width: 1200px; + margin: 2rem auto; + padding: 0 1.5rem; + gap: 2rem; +} +/* Responsive layout */ +@media (max-width: 900px) { + .layout { + flex-direction: column; + } +} +/* Main content */ +main.container { + flex: 1; + background-color: #ffffff; + padding: 2rem; + border-radius: 6px; + box-shadow: 0 2px 6px rgba(0,0,0,0.05); +} +main h1 { + font-size: 1.5rem; + font-weight: 600; + margin-bottom: 1rem; + border-bottom: 2px solid #2c3e50; + padding-bottom: 0.3rem; +} +main article p { + font-size: 1rem; + color: #444; +} +/* Content area */ +main { + margin-left: 200px; + padding: 1rem; +} +/* Responsive main */ +@media (max-width: 900px) { + main.container { + margin: 0; + } +} +@media (max-width: 600px) { + main { + margin-left: 0; + padding: 1rem 0.5rem; + } +} +.menu-years, +.menu-months, +.menu-posts { + list-style: none; + padding-left: 0; + margin: 0; +} +.menu-year { + margin-bottom: 1em; +} +.year-label { + font-weight: bold; + font-size: 1.2em; + display: block; + margin-bottom: 0.5em; +} +.menu-month { + margin-left: 1em; + margin-bottom: 0.5em; +} +.month-label { + font-weight: normal; + display: block; + margin-bottom: 0.3em; +} +.menu-posts { + margin-left: 1em; +} +.menu-posts li { + margin-bottom: 0.3em; +} +.menu-posts a { + text-decoration: none; + color: #007bff; +} +.menu-posts a:hover { + text-decoration: underline; +} +/* Navigation adjustments for small screens */ +@media (max-width: 600px) { + nav { + width: 100%; + height: auto; + float: none; + padding: 0.5rem; + text-align: center; + border-bottom: 1px solid #444; + background: #111; + } + nav ul { + display: block; + justify-content: center; + flex-wrap: wrap; + gap: 1rem; + padding: 0.5rem 0; + margin: 0; + list-style: none; + } + nav ul li { + margin: 0.25rem 0; + border: none; + } + nav ul li a { + padding: 0.5rem 1rem; + display: block; + border-radius: 0; + } + nav a { + text-transform: capitalize; + } +} +/* Reset */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} +.dropdown { + position: relative; + display: inline-block; +} +.dropbtn { + display: inline-block; +} +.dropdown-content { + display: none; + position: absolute; + background-color: white; + min-width: 160px; + z-index: 1; + box-shadow: 0px 8px 16px rgba(0,0,0,0.2); +} +.dropdown-content a { + display: block; + padding: 12px 16px; + text-decoration: none; + color: black; +} +.dropdown-content a:hover { + background-color: #f1f1f1; +} +.dropdown:hover .dropdown-content { + display: block; +} /* Sidebar */ .sidebar { width: 250px; @@ -308,198 +529,3 @@ transform: translateY(0); } } -/* Main content */ -main.container { - flex: 1; - background-color: #ffffff; - padding: 2rem; - border-radius: 6px; - box-shadow: 0 2px 6px rgba(0,0,0,0.05); -} -main h1 { - font-size: 1.5rem; - font-weight: 600; - margin-bottom: 1rem; - border-bottom: 2px solid #2c3e50; - padding-bottom: 0.3rem; -} -main article p { - font-size: 1rem; - color: #444; -} -/* Content area */ -main { - margin-left: 200px; - padding: 1rem; -} -/* Responsive main */ -@media (max-width: 900px) { - main.container { - margin: 0; - } -} -@media (max-width: 600px) { - main { - margin-left: 0; - padding: 1rem 0.5rem; - } -} -footer { - background-color: #34495e; - color: #ecf0f1; - padding: 2rem 0; - text-align: center; - border-top: none; - box-shadow: 0 -2px 5px rgba(0,0,0,0.1); - font-size: 0.9rem; -} -footer .container { - display: flex; - flex-direction: column; - align-items: center; - gap: 1rem; -} -footer p { - font-size: 0.85rem; - color: #bdc3c7; - line-height: 1.5; - margin: 0; - max-width: 600px; -} -footer p a { - color: #9bd3ff; - text-decoration: none; - transition: color 0.2s ease-in-out; -} -footer p a:hover { - color: #ecf0f1; - text-decoration: underline; -} -footer img { - vertical-align: middle; - margin-left: 0.5rem; - opacity: 0.8; - transition: opacity 0.2s ease-in-out; -} -footer img:hover { - opacity: 1; -} -footer nav { - margin-top: 0; - margin-bottom: 0; - display: flex; - gap: 1.5rem; /* Adjust this value to control spacing between links */ - /* If you want them centered within the nav */ - justify-content: center; - /* Allow items to wrap to the next line on smaller screens */ - flex-wrap: wrap; -} -footer nav p { - margin: 0; - -} -footer .social-contact { - display: flex; - gap: 1rem; - flex-wrap: wrap; - justify-content: center; - margin-top: 1rem; -} -footer .social-contact p { - margin: 0; - font-size: 1rem; - font-weight: 600; -} -footer .social-contact p img, -footer .social-contact p svg { - vertical-align: middle; - margin: 0 0.25rem; - width: 24px; - height: 24px; - opacity: 0.9; - transition: opacity 0.2s ease-in-out; -} -footer .social-contact p img:hover, -footer .social-contact p svg:hover { - opacity: 1; -} -@media (max-width: 600px) { - footer .container { - padding: 1.5rem; - } - footer p { - font-size: 0.8rem; - } -} -.menu-years, -.menu-months, -.menu-posts { - list-style: none; - padding-left: 0; - margin: 0; -} -.menu-year { - margin-bottom: 1em; -} -.year-label { - font-weight: bold; - font-size: 1.2em; - display: block; - margin-bottom: 0.5em; -} -.menu-month { - margin-left: 1em; - margin-bottom: 0.5em; -} -.month-label { - font-weight: normal; - display: block; - margin-bottom: 0.3em; -} -.menu-posts { - margin-left: 1em; -} -.menu-posts li { - margin-bottom: 0.3em; -} -.menu-posts a { - text-decoration: none; - color: #007bff; -} -.menu-posts a:hover { - text-decoration: underline; -} -/* Navigation adjustments for small screens */ -@media (max-width: 600px) { - nav { - width: 100%; - height: auto; - float: none; - padding: 0.5rem; - text-align: center; - border-bottom: 1px solid #444; - background: #111; - } - nav ul { - display: block; - justify-content: center; - flex-wrap: wrap; - gap: 1rem; - padding: 0.5rem 0; - margin: 0; - list-style: none; - } - nav ul li { - margin: 0.25rem 0; - border: none; - } - nav ul li a { - padding: 0.5rem 1rem; - display: block; - border-radius: 0; - } - nav a { - text-transform: capitalize; - } -} - diff --git a/src/css/footer.css b/src/css/footer.css new file mode 100644 index 0000000..42615c5 --- /dev/null +++ b/src/css/footer.css @@ -0,0 +1,100 @@ +footer { + background-color: #34495e; + color: #ecf0f1; + padding: 2rem 0; + text-align: center; + border-top: none; + box-shadow: 0 -2px 5px rgba(0,0,0,0.1); + font-size: 0.9rem; +} + +footer .container { + display: flex; + flex-direction: column; + align-items: center; + gap: 1rem; +} + +footer p { + font-size: 0.85rem; + color: #bdc3c7; + line-height: 1.5; + margin: 0; + max-width: 600px; +} + +footer p a { + color: #9bd3ff; + text-decoration: none; + transition: color 0.2s ease-in-out; +} + +footer p a:hover { + color: #ecf0f1; + text-decoration: underline; +} + +footer img { + vertical-align: middle; + margin-left: 0.5rem; + opacity: 0.8; + transition: opacity 0.2s ease-in-out; +} + +footer img:hover { + opacity: 1; +} + +footer nav { + margin-top: 0; + margin-bottom: 0; + display: flex; + gap: 1.5rem; /* Adjust this value to control spacing between links */ + /* If you want them centered within the nav */ + justify-content: center; + /* Allow items to wrap to the next line on smaller screens */ + flex-wrap: wrap; +} + +footer nav p { + margin: 0; + +} + +footer .social-contact { + display: flex; + gap: 1rem; + flex-wrap: wrap; + justify-content: center; + margin-top: 1rem; +} + +footer .social-contact p { + margin: 0; + font-size: 1rem; + font-weight: 600; +} + +footer .social-contact p img, +footer .social-contact p svg { + vertical-align: middle; + margin: 0 0.25rem; + width: 24px; + height: 24px; + opacity: 0.9; + transition: opacity 0.2s ease-in-out; +} + +footer .social-contact p img:hover, +footer .social-contact p svg:hover { + opacity: 1; +} + +@media (max-width: 600px) { + footer .container { + padding: 1.5rem; + } + footer p { + font-size: 0.8rem; + } +} diff --git a/src/css/styles.css b/src/css/styles.css index 3fb8646..a350669 100644 --- a/src/css/styles.css +++ b/src/css/styles.css @@ -7,5 +7,6 @@ @import url('nav.css'); @import url('reset.css'); @import url('responsive.css'); +@import url('submenu.css'); @import url('sidebar.css'); @import url('toc.css'); diff --git a/src/css/submenu.css b/src/css/submenu.css new file mode 100644 index 0000000..8dd6dd0 --- /dev/null +++ b/src/css/submenu.css @@ -0,0 +1,32 @@ +.dropdown { + position: relative; + display: inline-block; +} + +.dropbtn { + display: inline-block; +} + +.dropdown-content { + display: none; + position: absolute; + background-color: white; + min-width: 160px; + z-index: 1; + box-shadow: 0px 8px 16px rgba(0,0,0,0.2); +} + +.dropdown-content a { + display: block; + padding: 12px 16px; + text-decoration: none; + color: black; +} + +.dropdown-content a:hover { + background-color: #f1f1f1; +} + +.dropdown:hover .dropdown-content { + display: block; +} diff --git a/src/routes/about.js b/src/routes/about.js index 2547c96..a9f1d69 100644 --- a/src/routes/about.js +++ b/src/routes/about.js @@ -1,37 +1,9 @@ // src/routes/about.js const express = require("express"); const router = express.Router(); +const markdownPage = require("../utils/markdownPage"); +const constructionPage = require("../utils/constructionPage"); -const { marked } = require("marked"); -const fs = require("fs").promises; -const path = require("path"); -const matter = require("gray-matter"); - -const getBaseContext = require("../utils/baseContext"); - -// router.get("/about", async (req, res) => { -// const context = await getBaseContext({ -// title: "About", -// }); -// res.render("pages/about.handlebars", context); -// }); - -router.get("/about", async (req, res, next) => { - try { - const aboutPath = path.join(__dirname, "../../content/pages/about.md"); - const fileContent = await fs.readFile(aboutPath, "utf8"); - const { data: frontmatter, content } = matter(fileContent); - const htmlContent = marked(content); - const context = await getBaseContext({ - title: frontmatter.title, - author: frontmatter.author, - date: frontmatter.date, - content: htmlContent, - }); - res.render("pages/page", context); - } catch (err) { - err.statusCode = 500; - next(err); - } -}); +markdownPage("/about/me", "about-me"); +constructionPage("/about/blog", "About this blog"); module.exports = router; diff --git a/src/routes/construction.js b/src/routes/construction.js deleted file mode 100644 index 9927584..0000000 --- a/src/routes/construction.js +++ /dev/null @@ -1,71 +0,0 @@ -// src/routes/construction.js -const express = require("express"); -const router = express.Router(); -const getBaseContext = require("../utils/baseContext"); - -// const construction = async (req, res) => { -// const context = await getBaseContext({ -// title: "Page Under Construction", -// }); -// res.render("pages/construction.handlebars", context); -// }; - -const construction = async (path, title) => { - router.get(path, async (req, res) => { - const context = await getBaseContext({ - title, - }); - res.render("pages/construction.handlebars", context); - }); -}; -const fs = require("fs/promises"); -const path = require("path"); -const matter = require("gray-matter"); -const { marked } = require("marked"); - -const page = async ( - routePath, - markdownFile = "page", - handlebarsFile = "page" -) => { - router.get(routePath, async (req, res, next) => { - try { - const filePath = path.join( - __dirname, - `../../content/pages/${markdownFile}.md` - ); - const fileContent = await fs.readFile(filePath, "utf8"); - const { data: frontmatter, content } = matter(fileContent); - const htmlContent = marked(content); - - const context = await getBaseContext({ - title: frontmatter.title, - content: htmlContent, - }); - - res.render(`pages/${handlebarsFile}`, context); - } catch (err) { - err.statusCode = 500; - next(err); - } - }); -}; - -if (process.env.NODE_ENV === "production") { - construction("/newsletter", "Newsletter"); - construction("/projects", "Projects"); -} else { - page("/projects", "projects"); - const newsletter = require("./newsletter"); - router.use(newsletter); -} - -construction("/changelog", "Changelog"); -construction("/archive", "Archive"); -construction("/rss-feed.xml", "RSS Feed"); -construction("/tags", "Tags"); -construction("/blog", "Blog"); - -page("/tools", "tools", "tools"); - -module.exports = router; diff --git a/src/routes/index.js b/src/routes/index.js index db3eae6..e609324 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -6,32 +6,16 @@ // const newsletter = require("./newsletter"); const contact = require("./contact"); -const about = require("./about"); const site_map = require("./site-map"); const post = require("./post"); -const construction = require("./construction"); - -// const isProduction = process.env.NODE_ENV === "production"; - -// if (isProduction) { -// router.get("/newsletter", (req, res) => { -// res.render("pages/construction", { -// title: "Newsletter", -// message: "This page is under construction. Please check back soon.", -// }); -// }); -// } else { -// router.use(newsletter); -// } +const pages = require("./pages"); router.use(contact); -router.use(about); router.use(site_map); +router.use(pages); router.get("/post/:year/:month/:name", post); -router.use(construction); - router.get("/", async (req, res) => { const context = await getBaseContext({ title: "Blog Home", diff --git a/src/routes/pages.js b/src/routes/pages.js new file mode 100644 index 0000000..5e8fdc2 --- /dev/null +++ b/src/routes/pages.js @@ -0,0 +1,33 @@ +// src/routes/pages.js +const express = require("express"); +const router = express.Router(); +const ConstructionRoutes = require("../utils/ConstructionRoutes"); +const MarkdownRoutes = require("../utils/MarkdownRoutes"); + +const construction = new ConstructionRoutes(); +const markdown = new MarkdownRoutes(); + +if (process.env.NODE_ENV === "production") { + construction.register("/newsletter", "Newsletter"); + construction.register("/projects", "Projects"); + construction.register("/about/blog", "About this blog"); +} else { + markdown.register("/about/blog", "about-blog"); + markdown.register("/projects", "projects"); + const newsletter = require("./newsletter"); + router.use(newsletter); +} + +construction.register("/changelog", "Changelog"); +construction.register("/archive", "Archive"); +construction.register("/rss-feed.xml", "RSS Feed"); +construction.register("/tags", "Tags"); +construction.register("/blog", "Blog"); + +markdown.register("/tools", "tools", "tools"); +markdown.register("/about/me", "about-me"); + +router.use(construction.getRouter()); +router.use(markdown.getRouter()); + +module.exports = router; diff --git a/src/utils/BaseRoute.js b/src/utils/BaseRoute.js new file mode 100644 index 0000000..4b9539e --- /dev/null +++ b/src/utils/BaseRoute.js @@ -0,0 +1,14 @@ +// src/utils/BaseRoute.js +const express = require("express"); + +class BaseRoute { + constructor() { + this.router = express.Router(); + } + + getRouter() { + return this.router; + } +} + +module.exports = BaseRoute; diff --git a/src/utils/ConstructionRoutes.js b/src/utils/ConstructionRoutes.js new file mode 100644 index 0000000..d944bd3 --- /dev/null +++ b/src/utils/ConstructionRoutes.js @@ -0,0 +1,18 @@ +// src/utils/ConstructionRoutes.js +const BaseRoute = require("./BaseRoute"); +const getBaseContext = require("./baseContext"); + +class ConstructionRoutes extends BaseRoute { + constructor() { + super(); + } + + register(path, title) { + this.router.get(path, async (req, res) => { + const context = await getBaseContext({ title }); + res.render("pages/construction.handlebars", context); + }); + } +} + +module.exports = ConstructionRoutes; diff --git a/src/utils/MarkdownRoutes.js b/src/utils/MarkdownRoutes.js new file mode 100644 index 0000000..7ca3345 --- /dev/null +++ b/src/utils/MarkdownRoutes.js @@ -0,0 +1,37 @@ +// src/utils/MarkdownRoutes.js +const BaseRoute = require("./BaseRoute"); +const fs = require("fs/promises"); +const path = require("path"); +const matter = require("gray-matter"); +const { marked } = require("marked"); +const getBaseContext = require("./baseContext"); + +class MarkdownRoutes extends BaseRoute { + constructor() { + super(); + } + + register(routePath, markdownFile = "page", handlebarsFile = "page") { + this.router.get(routePath, async (req, res, next) => { + try { + const filePath = path.join( + __dirname, + `../../content/pages/${markdownFile}.md` + ); + const fileContent = await fs.readFile(filePath, "utf8"); + const { data: frontmatter, content } = matter(fileContent); + const htmlContent = marked(content); + const context = await getBaseContext({ + title: frontmatter.title, + content: htmlContent, + }); + res.render(`pages/${handlebarsFile}`, context); + } catch (err) { + err.statusCode = 500; + next(err); + } + }); + } +} + +module.exports = MarkdownRoutes; diff --git a/src/utils/baseContext.js b/src/utils/baseContext.js index b98ff46..a2665d5 100644 --- a/src/utils/baseContext.js +++ b/src/utils/baseContext.js @@ -11,7 +11,14 @@ originCountry: process.env.COUNTRY, navLinks: [ { href: "/", label: "Home" }, - { href: "/about", label: "About" }, + { + href: "/about", + label: "About", + submenu: [ + { href: "/about/me", label: "About Me" }, + { href: "/about/blog", label: "About This Blog" }, + ], + }, { href: "/newsletter", label: "Newsletter" }, { href: "/tools", label: "Tools I use" }, { href: "/projects", label: "Projects" }, diff --git a/src/utils/constructionPage.js b/src/utils/constructionPage.js new file mode 100644 index 0000000..3a24d1e --- /dev/null +++ b/src/utils/constructionPage.js @@ -0,0 +1,14 @@ +// src/utils/constructionPage.js +const express = require("express"); +const router = express.Router(); +const getBaseContext = require("../utils/baseContext"); + +const constructionPage = async (path, title) => { + router.get(path, async (req, res) => { + const context = await getBaseContext({ + title, + }); + res.render("pages/construction.handlebars", context); + }); +}; +module.exports = constructionPage; diff --git a/src/utils/markdownPage.js b/src/utils/markdownPage.js new file mode 100644 index 0000000..574c135 --- /dev/null +++ b/src/utils/markdownPage.js @@ -0,0 +1,38 @@ +// src/utils/markdownPage.js +const express = require("express"); +const router = express.Router(); +const getBaseContext = require("../utils/baseContext"); + +const fs = require("fs/promises"); +const path = require("path"); +const matter = require("gray-matter"); +const { marked } = require("marked"); + +const markdownPage = async ( + routePath, + markdownFile = "page", + handlebarsFile = "page" +) => { + router.get(routePath, async (req, res, next) => { + try { + const filePath = path.join( + __dirname, + `../../content/pages/${markdownFile}.md` + ); + const fileContent = await fs.readFile(filePath, "utf8"); + const { data: frontmatter, content } = matter(fileContent); + const htmlContent = marked(content); + + const context = await getBaseContext({ + title: frontmatter.title, + content: htmlContent, + }); + + res.render(`pages/${handlebarsFile}`, context); + } catch (err) { + err.statusCode = 500; + next(err); + } + }); +}; +module.exports = markdownPage; diff --git a/src/views/partials/headers.handlebars b/src/views/partials/headers.handlebars index 539b84e..0b9f332 100644 --- a/src/views/partials/headers.handlebars +++ b/src/views/partials/headers.handlebars @@ -5,7 +5,18 @@