boilerplate more

This commit is contained in:
biglyderv 2025-02-25 16:02:31 -05:00
parent bf77320bc7
commit ae511a3871
Signed by: biglyderv
GPG key ID: 0E2EB0B4CD7397B5
8 changed files with 301 additions and 74 deletions

View file

@ -1,28 +1,15 @@
import express from "express"; import express from "express";
import { doInit } from "./init.js";
const app = express() const app = express()
const port = 3000; const port = 3000;
app.use(express.static('public')); app.use(express.static('public'));
app.set('view engine', 'ejs'); app.set('view engine', 'ejs');
app.enable('view cache');
app.listen(port, () => { app.listen(port, () => {
console.log(`Example app listening on port ${port}`) console.log(`Example app listening on port ${port}`)
}) })
app.use((req, res, next) => { doInit(app);
res.ctx = {
mainPage: '404.ejs',
mainCtx: {},
headerCtx: {}
};
next();
})
app.use('/api', (req, res, next) => {
res.send(res.ctx);
})
app.use((req, res, next) => {
res.render('root.ejs', res.ctx)
})

38
init.js Normal file
View file

@ -0,0 +1,38 @@
const aliases = {
'/': '/walls/get/home'
};
function doAliases(app) {
for (let alias in aliases) {
app.all(alias, (req,res,next) => {
res.redirect(aliases[alias])
})
}
}
function doInit(app) {
app.use((req, res, next) => {
res.ctx = {
mainPage: '404.ejs',
mainCtx: {},
headerCtx: [
{ link: '/walls/get/home', icon: '/icon.svg', name: 'DervNet' },
{ link: '/walls/list', icon: '/walls.svg', name: 'Explore' },
{ link: '/you/logout', icon: '/logout.svg', name: 'Leave' } // fix icon
]
};
next();
})
doAliases(app);
app.use('/api', (req, res, next) => {
res.send(res.ctx);
})
app.use((req, res, next) => {
res.render('root.ejs', res.ctx)
})
}
export { doInit };

View file

@ -2,20 +2,20 @@
<!-- Created with Inkscape (http://www.inkscape.org/) --> <!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg <svg
width="58.538853" width="65.538361"
height="62.269379" height="69.269028"
viewBox="0 0 58.538853 62.269381" viewBox="0 0 65.538361 69.26903"
version="1.1" version="1.1"
id="svg1" id="svg1"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)" inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
sodipodi:docname="icon.svg" sodipodi:docname="icon.svg"
xml:space="preserve"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"> xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
<sodipodi:namedview
id="namedview1" id="namedview1"
pagecolor="#000000" pagecolor="#ffffff"
bordercolor="#000000" bordercolor="#000000"
borderopacity="0.25" borderopacity="0.25"
inkscape:showpageshadow="2" inkscape:showpageshadow="2"
@ -23,66 +23,50 @@
inkscape:pagecheckerboard="0" inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px" inkscape:document-units="px"
showguides="true" showguides="false"
inkscape:zoom="6.768" inkscape:zoom="8"
inkscape:cx="28.959811" inkscape:cx="33.25"
inkscape:cy="26.521868" inkscape:cy="37.6875"
inkscape:window-width="1918" inkscape:window-width="1918"
inkscape:window-height="1056" inkscape:window-height="1056"
inkscape:window-x="0" inkscape:window-x="0"
inkscape:window-y="22" inkscape:window-y="22"
inkscape:window-maximized="1" inkscape:window-maximized="1"
inkscape:current-layer="g4" inkscape:current-layer="g4"
showgrid="false" /> showgrid="false"
<defs inkscape:lockguides="true" /><defs
id="defs1" /> id="defs1" /><g
<g
inkscape:label="Layer 1" inkscape:label="Layer 1"
inkscape:groupmode="layer" inkscape:groupmode="layer"
id="layer1" id="layer1"
transform="translate(-52.872929,-52.41062)"> transform="translate(-49.373422,-48.91062)"><g
<g id="g4"
id="g4"> style="stroke-width:10;stroke-dasharray:none"><path
<path
id="path1" id="path1"
style="fill:#350050;fill-opacity:1;stroke:#ffffff;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers" style="fill:#ab88aa;fill-opacity:1;stroke:#0d0c11;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
d="m 84.835608,53.91062 a 25.074709,25.074709 0 0 0 -25.074219,25.074219 25.074709,25.074709 0 0 0 5.835938,16.035156 l -11.22461,18.160155 25.271485,-9.72851 a 25.074709,25.074709 0 0 0 5.191406,0.60937 A 25.074709,25.074709 0 0 0 109.91178,78.984839 25.074709,25.074709 0 0 0 84.835608,53.91062 Z" /> d="m 84.835608,53.91062 a 25.074709,25.074709 0 0 0 -25.074219,25.074219 25.074709,25.074709 0 0 0 5.835938,16.035156 l -11.22461,18.160155 25.271485,-9.72851 a 25.074709,25.074709 0 0 0 5.191406,0.60937 A 25.074709,25.074709 0 0 0 109.91178,78.984839 25.074709,25.074709 0 0 0 84.835608,53.91062 Z" /><circle
<circle style="fill:#2f2835;fill-opacity:1;stroke:none;stroke-width:12.5237;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
style="fill:#7500b1;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="circle8"
r="19.014986"
cy="78.985329"
cx="84.836098" />
<circle
style="fill:#cb65ff;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="circle3" id="circle3"
r="13.373178" r="16.748178"
cy="78.985329" cy="78.985329"
cx="84.836098" /> cx="84.836098" /><circle
<circle style="fill:#f8e0f5;fill-opacity:1;stroke:none;stroke-width:11.0203;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="path5" id="path5"
cx="85.701805" cx="85.849609"
cy="70.552505" cy="69.51593"
r="2.7164268" /> r="2.9935966" /><circle
<circle style="fill:#f8e0f5;fill-opacity:1;stroke:none;stroke-width:11.0203;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="circle5" id="circle5"
cx="84.836098" cx="84.895569"
cy="78.985329" cy="78.809196"
r="4.8582249" /> r="5.3539319" /><circle
<circle style="fill:#f8e0f5;fill-opacity:1;stroke:none;stroke-width:11.0203;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="circle6" id="circle6"
cx="93.328705" cx="94.254715"
cy="80.164467" cy="80.108643"
r="1.6716473" /> r="1.8422132" /><circle
<circle style="fill:#f8e0f5;fill-opacity:1;stroke:none;stroke-width:11.0203;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="circle7" id="circle7"
cx="76.716713" cx="75.947723"
cy="86.537621" cy="87.13208"
r="1.2537355" /> r="1.38166" /></g></g></svg>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

50
public/logout.svg Normal file
View file

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="50.735596"
height="50.735592"
viewBox="0 0 50.735596 50.735593"
version="1.1"
id="svg1"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
sodipodi:docname="logout.svg"
xml:space="preserve"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
showguides="false"
inkscape:zoom="8"
inkscape:cx="14.375"
inkscape:cy="14.6875"
inkscape:window-width="1918"
inkscape:window-height="1056"
inkscape:window-x="0"
inkscape:window-y="22"
inkscape:window-maximized="1"
inkscape:current-layer="g4"
showgrid="false"
inkscape:lockguides="true" /><defs
id="defs1" /><g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-59.542179,-61.057033)"><g
id="g4"
style="stroke-width:10;stroke-dasharray:none"><path
style="fill:none;fill-opacity:1;stroke:#0d0c11;stroke-width:4.45824;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
d="M 61.118405,62.633259 108.70155,110.2164"
id="path25" /><path
style="fill:none;fill-opacity:1;stroke:#0d0c11;stroke-width:4.45824;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
d="M 108.70155,62.633259 61.118405,110.2164"
id="path26" /></g></g></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

167
public/walls.svg Normal file
View file

@ -0,0 +1,167 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="48.672703"
height="53.811192"
viewBox="0 0 48.672703 53.811193"
version="1.1"
id="svg1"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
sodipodi:docname="walls.svg"
xml:space="preserve"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
showguides="false"
inkscape:zoom="8"
inkscape:cx="14.875"
inkscape:cy="17.0625"
inkscape:window-width="1918"
inkscape:window-height="1056"
inkscape:window-x="0"
inkscape:window-y="22"
inkscape:window-maximized="1"
inkscape:current-layer="g4"
showgrid="false"
inkscape:lockguides="true" /><defs
id="defs1" /><g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-59.066227,-58.706081)"><g
id="g4"
style="stroke-width:10;stroke-dasharray:none"><path
style="fill:#f8e0f5;fill-opacity:1;stroke:#0d0c11;stroke-width:3.25;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
d="m 69.997002,71.564705 -9.038422,33.731855 8.989306,5.18997 25.043748,-25.043743"
id="path2" /><g
id="g11"
transform="rotate(30,85.351954,98.307072)"><path
id="path1"
style="fill:#ab88aa;fill-opacity:1;stroke:#0d0c11;stroke-width:3.56524;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
d="m 81.016571,58.516151 a 8.939758,8.939758 0 0 0 -8.939583,8.93959 8.939758,8.939758 0 0 0 2.080659,5.716912 l -4.001855,6.47455 9.009917,-3.468429 a 8.939758,8.939758 0 0 0 1.850862,0.217242 8.939758,8.939758 0 0 0 8.940282,-8.940275 8.939758,8.939758 0 0 0 -8.940282,-8.93959 z" /><circle
style="fill:#2f2835;fill-opacity:1;stroke:none;stroke-width:4.465;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="circle3"
cy="67.455902"
cx="81.016754"
r="5.9711423" /><circle
style="fill:#f8e0f5;fill-opacity:1;stroke:none;stroke-width:3.92901;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="path5"
cx="81.378105"
cy="64.079811"
r="1.0672917" /><circle
style="fill:#f8e0f5;fill-opacity:1;stroke:none;stroke-width:3.92901;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="circle5"
cx="81.037964"
cy="67.393112"
r="1.90881" /><circle
style="fill:#f8e0f5;fill-opacity:1;stroke:none;stroke-width:3.92901;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="circle6"
cx="84.374725"
cy="67.856392"
r="0.65679485" /><circle
style="fill:#f8e0f5;fill-opacity:1;stroke:none;stroke-width:3.92901;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="circle7"
cx="77.847824"
cy="70.36042"
r="0.49259618" /></g><g
id="g15"
transform="matrix(0.4846688,0.27982366,-0.27982366,0.4846688,58.894002,29.396523)"><path
id="path11"
style="fill:#ab88aa;fill-opacity:1;stroke:#0d0c11;stroke-width:3.56524;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
d="m 81.016571,58.516151 a 8.939758,8.939758 0 0 0 -8.939583,8.93959 8.939758,8.939758 0 0 0 2.080659,5.716912 l -4.001855,6.47455 9.009917,-3.468429 a 8.939758,8.939758 0 0 0 1.850862,0.217242 8.939758,8.939758 0 0 0 8.940282,-8.940275 8.939758,8.939758 0 0 0 -8.940282,-8.93959 z" /><circle
style="fill:#2f2835;fill-opacity:1;stroke:none;stroke-width:4.465;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="circle11"
cy="67.455902"
cx="81.016754"
r="5.9711423" /><circle
style="fill:#f8e0f5;fill-opacity:1;stroke:none;stroke-width:3.92901;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="circle12"
cx="81.378105"
cy="64.079811"
r="1.0672917" /><circle
style="fill:#f8e0f5;fill-opacity:1;stroke:none;stroke-width:3.92901;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="circle13"
cx="81.037964"
cy="67.393112"
r="1.90881" /><circle
style="fill:#f8e0f5;fill-opacity:1;stroke:none;stroke-width:3.92901;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="circle14"
cx="84.374725"
cy="67.856392"
r="0.65679485" /><circle
style="fill:#f8e0f5;fill-opacity:1;stroke:none;stroke-width:3.92901;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="circle15"
cx="77.847824"
cy="70.36042"
r="0.49259618" /></g><g
id="g20"
transform="matrix(0.21728082,0.12544714,-0.12544714,0.21728082,61.483694,69.882052)"><path
id="path15"
style="fill:#ab88aa;fill-opacity:1;stroke:#0d0c11;stroke-width:3.56524;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
d="m 81.016571,58.516151 a 8.939758,8.939758 0 0 0 -8.939583,8.93959 8.939758,8.939758 0 0 0 2.080659,5.716912 l -4.001855,6.47455 9.009917,-3.468429 a 8.939758,8.939758 0 0 0 1.850862,0.217242 8.939758,8.939758 0 0 0 8.940282,-8.940275 8.939758,8.939758 0 0 0 -8.940282,-8.93959 z" /><circle
style="fill:#2f2835;fill-opacity:1;stroke:none;stroke-width:4.465;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="circle16"
cy="67.455902"
cx="81.016754"
r="5.9711423" /><circle
style="fill:#f8e0f5;fill-opacity:1;stroke:none;stroke-width:3.92901;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="circle17"
cx="81.378105"
cy="64.079811"
r="1.0672917" /><circle
style="fill:#f8e0f5;fill-opacity:1;stroke:none;stroke-width:3.92901;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="circle18"
cx="81.037964"
cy="67.393112"
r="1.90881" /><circle
style="fill:#f8e0f5;fill-opacity:1;stroke:none;stroke-width:3.92901;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="circle19"
cx="84.374725"
cy="67.856392"
r="0.65679485" /><circle
style="fill:#f8e0f5;fill-opacity:1;stroke:none;stroke-width:3.92901;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="circle20"
cx="77.847824"
cy="70.36042"
r="0.49259618" /></g><g
id="g25"
transform="matrix(0.18487168,-0.07196427,0.07196427,0.18487168,49.231001,96.575288)"><path
id="path20"
style="fill:#ab88aa;fill-opacity:1;stroke:#0d0c11;stroke-width:3.56524;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
d="m 81.016571,58.516151 a 8.939758,8.939758 0 0 0 -8.939583,8.93959 8.939758,8.939758 0 0 0 2.080659,5.716912 l -4.001855,6.47455 9.009917,-3.468429 a 8.939758,8.939758 0 0 0 1.850862,0.217242 8.939758,8.939758 0 0 0 8.940282,-8.940275 8.939758,8.939758 0 0 0 -8.940282,-8.93959 z" /><circle
style="fill:#2f2835;fill-opacity:1;stroke:none;stroke-width:4.465;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="circle21"
cy="67.455902"
cx="81.016754"
r="5.9711423" /><circle
style="fill:#f8e0f5;fill-opacity:1;stroke:none;stroke-width:3.92901;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="circle22"
cx="81.378105"
cy="64.079811"
r="1.0672917" /><circle
style="fill:#f8e0f5;fill-opacity:1;stroke:none;stroke-width:3.92901;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="circle23"
cx="81.037964"
cy="67.393112"
r="1.90881" /><circle
style="fill:#f8e0f5;fill-opacity:1;stroke:none;stroke-width:3.92901;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="circle24"
cx="84.374725"
cy="67.856392"
r="0.65679485" /><circle
style="fill:#f8e0f5;fill-opacity:1;stroke:none;stroke-width:3.92901;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="circle25"
cx="77.847824"
cy="70.36042"
r="0.49259618" /></g></g></g></svg>

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -1,5 +1,5 @@
<div class="nav"> <div class="nav">
<a class='header-a' href="/"><img class="header-img" src="/icon.svg">DervNet</a> <% for (let headerEnt of headerCtx) { %>
<a class='header-a' href="/"><img class="header-img" src="/icon.svg">Filler1</a> <%- include ('vblock.ejs', headerEnt) %>
<a class='header-a' href="/"><img class="header-img" src="/icon.svg">Filler2</a> <% } %>
</div> </div>

View file

@ -3,13 +3,13 @@
<head> <head>
<title>DervNet</title> <title>DervNet</title>
<link rel="stylesheet" href="index.css"> <link rel="stylesheet" href="/index.css">
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
</head> </head>
<body> <body>
<%- include('header.ejs',headerCtx); %> <%- include('header.ejs',{headerCtx}); %>
<%- include(mainPage, mainCtx); %> <%- include(mainPage, mainCtx); %>
</body> </body>

1
views/vblock.ejs Normal file
View file

@ -0,0 +1 @@
<a class='header-a' href="<%= link %>"><img class="header-img" src="<%= icon %>"><%= name %></a>