diff --git a/public/assets/logo.svg b/public/assets/logo.svg index 0aac8d9..daeca1d 100644 --- a/public/assets/logo.svg +++ b/public/assets/logo.svg @@ -3,7 +3,7 @@ + c0-5.1,0-10.2-0.1-15.4c-0.1-2.4,0.6-3.5,3.2-3.5c6.5,0,6.4-0.1,6.3,6.4C188.2,247.2,188.3,256.1,188.3,265L188.3,265z"/> + C242.5,247,242.5,255.9,242.6,264.8L242.6,264.8z"/> + C417.3,247.2,417.2,256.1,417.3,265L417.3,265z"/> diff --git a/public/css/style.css b/public/css/style.css index 0798297..1d42e56 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -1,10 +1,27 @@ @import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;600;800&display=swap'); +/* +================= Base Styles ================= +*/ + +ul { + margin: 0; + list-style: none; +} + +.middle-br { + margin: .5rem 0; +} + +/* +================= Additional Styles ================= +*/ + /* html */ html { font-family: 'Montserrat', sans-serif; - color: #141414; + color: rgb(30, 30, 30); } html * { @@ -16,7 +33,7 @@ html * { .frame { padding: 0; margin: 0; - border: solid 8px #141414; + border: solid 8px rgb(30, 30, 30); margin: 2rem; border-radius: 4rem; overflow: hidden; @@ -50,7 +67,8 @@ nav > img { /* contributors */ .contributors { - --color: #141414; + --color: rgb(30, 30, 30); + background-color: #fff; position: relative; overflow: hidden; border: 3px solid var(--color); @@ -87,7 +105,7 @@ nav > img { } .contributors:active:before { - background: #141414; + background: rgb(30, 30, 30); transition: background 0s; } @@ -130,7 +148,7 @@ main { display: flex; flex-wrap: wrap; flex-direction: column; - justify-content: space-between; + justify-content: space-around; align-items: center; } @@ -143,13 +161,12 @@ main { .api-test form input { width: 65%; - padding: 0 0; border-radius: 15px 0px 0px 15px; font-size: 0.8rem; padding-left: 1rem; transition: width 500ms ease; - border: solid 2px #141414; + border: solid 3px rgb(30, 30, 30); font-size: 1rem; font-weight: 600; } @@ -170,8 +187,8 @@ main { .api-test form button { width: 10%; - background-color: #141414; - border: solid 2px #141414; + background-color: rgb(30, 30, 30); + border: solid 2px rgb(30, 30, 30); border-radius: 0 15px 15px 0; font-size: 20px; } @@ -191,12 +208,45 @@ main { /* result */ .result { + overflow: hidden; + border-radius: 25px; width: 90%; - height: 70%; +} + + +.scroll-container { + overflow-y: scroll; + overflow-x: hidden; + width: 100%; + height: 300px; border: dashed lightgray 2px; border-radius: 25px; } +.scroll-container::-webkit-scrollbar { + width: 12px; + background-color: #F5F5F5; +} + +.scroll-container::-webkit-scrollbar-thumb { + border-radius: 10px; + background-color: rgb(177, 177, 177); +} + +.scroll-container::-webkit-scrollbar-track { + border-radius: 10px; + background-color: #dbdbdb; +} + +.json { + display: block; + white-space: pre-wrap; +} + +.indent { + padding-left: 1rem; +} + /* documentation */ .documentation { diff --git a/public/js/main.js b/public/js/main.js index c43718c..d2821b1 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -1,14 +1,31 @@ -let resources; -fetchResources(); +const btn = document.getElementById('keyword-btn'); +btn.addEventListener('click', getMatches); -async function fetchResources() { - const response = await fetch(`/api/`); - const data = await response.json(); - resources = data; +async function getMatches() { + const keyword = document.querySelector('input').value; + + try { + const res = await fetch('/api'); + const data = await res.json(); + const matches = data.filter(resource => resource.keywords.some(str => str.includes(keyword))); + renderMatches(matches); + } catch(err) { + console.error(err); + } } -document.getElementById('keyword-btn').addEventListener('click', async () => { - const keyword = document.querySelector('input').value; - const matches = await resources.filter((obj) => obj.keywords.some(str => str.includes(keyword))); +function renderMatches(matches) { const list = document.getElementById('result-list'); -}); + list.innerHTML = ''; + + matches.forEach(match => { + const li = document.createElement('li'); + + li.innerHTML = ` +
{

name: ${match.name},
url: ${match.url},
keywords: [${match.keywords.map(keyword => `'${keyword}'`).join(", ")}]

}
+
+ `; + + list.appendChild(li); + }); +} \ No newline at end of file diff --git a/server.js b/server.js index 7639721..707c260 100644 --- a/server.js +++ b/server.js @@ -10,10 +10,14 @@ app.use(express.static(__dirname + '/public')); app.use('/public', express.static(__dirname + '/public')); app.get('/', (req, res) => { - if (resources) { - res.render('index.ejs', { resources }); - } else { - console.error('no resources found'); + try { + if (resources) { + res.render('index.ejs', { resources }); + } else { + throw new Error('Resources not found.') + } + } catch (err) { + console.error(err); } }); @@ -23,14 +27,19 @@ app.get('/api', (req, res) => { app.get('/api/:keyword', (req, res) => { const keyword = req.params.keyword.toLowerCase(); - + // filter resources array, return items that match query; tag. - const matches = resources.filter((obj) => obj.keywords.includes(keyword)); + const matches = resources.filter((obj) => obj.keywords.some(str => str.includes(keyword))); - if (matches.length > 0) { - res.json(matches); - } else { - throw new Error('Resource not found.'); + try { + // if matches were found respond with json else throw error + if (matches.length) { + res.json(matches); + } else { + throw new Error('No resources found.'); + } + } catch(err) { + console.error(err); } }); diff --git a/views/index.ejs b/views/index.ejs index 88844cc..d4aae88 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -47,12 +47,23 @@ value="" placeholder="/api/'keyword'" /> - +
- +
+ +