Compare commits

..

2 Commits

Author SHA1 Message Date
Kevin
75bb55a6a3 🎨 Simplify search.vue & minor changes 2019-11-15 18:27:34 +01:00
Kevin
5388f2fe44 🎨 Simplify toggling between views 2019-11-15 17:56:44 +01:00
39 changed files with 4959 additions and 19337 deletions

58
.all-contributorsrc Normal file
View File

@@ -0,0 +1,58 @@
{
"files": [
"README.md"
],
"imageSize": 100,
"commit": false,
"contributors": [{
"login": "lostdesign",
"name": "wellá",
"avatar_url": "https://avatars0.githubusercontent.com/u/5164617?v=4",
"profile": "https://lost.design",
"contributions": [
"business",
"infra",
"security",
"dev",
"bug",
"code",
"content",
"ideas",
"maintenance",
"review",
"test"
]
},
{
"login": "S3B4S",
"name": "Kevin van der Werff",
"avatar_url": "https://avatars0.githubusercontent.com/u/17083334?v=4",
"profile": "https://github.com/S3B4S",
"contributions": [
"dev",
"bug",
"code",
"content",
"ideas",
"maintenance",
"review",
"test"
]
},
{
"login": "Banou26",
"name": "Banou",
"avatar_url": "https://avatars0.githubusercontent.com/u/5209149?v=4",
"profile": "https://banou.dev",
"contributions": [
"bug",
"design"
]
}
],
"contributorsPerLine": 7,
"projectName": "webgems",
"projectOwner": "webgems",
"repoType": "github",
"repoHost": "https://github.com"
}

3
.github/FUNDING.yml vendored
View File

@@ -1,3 +0,0 @@
# These are supported funding model platforms
github: [lostdesign]

View File

@@ -1,5 +1,3 @@
{
"editor.formatOnSave": false,
"vue-i18n-ally.localesPaths": "locales",
"i18n-ally.localesPaths": "locales"
"editor.formatOnSave": false
}

View File

@@ -7,4 +7,3 @@ These are lovely people who have helped this project:
- [jacobparis](https://github.com/jacobparis) : Team Devcord
* twitter: @jacobmparis
- [JonasPardon](https://github.com/JonasPardon)
- [AadityaSahay](https://github.com/AadityaSahay) : :crab:

View File

@@ -23,4 +23,22 @@ See also the list of [contributors](https://github.com/webgems/webgems/contribut
## License
This project is licensed under the GNU General Public License v3.0 - see the [LICENSE](https://github.com/webgems/webgems/blob/master/LICENSE) file for details
This project is licensed under the GNU General Public License v3.0 - see the [LICENSE](https://github.com/webgems/webgems/blob/master/LICENSE) file for details
## Contributors ✨
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore -->
<table>
<tr>
<td align="center"><a href="https://lost.design"><img src="https://avatars0.githubusercontent.com/u/5164617?v=4" width="100px;" alt="wellá"/><br /><sub><b>wellá</b></sub></a><br /><a href="#business-lostdesign" title="Business development">💼</a> <a href="#infra-lostdesign" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#security-lostdesign" title="Security">🛡️</a> <a href="https://github.com/webgems/webgems/issues?q=author%3Alostdesign" title="Bug reports">🐛</a> <a href="https://github.com/webgems/webgems/commits?author=lostdesign" title="Code">💻</a> <a href="#content-lostdesign" title="Content">🖋</a> <a href="#ideas-lostdesign" title="Ideas, Planning, & Feedback">🤔</a> <a href="#maintenance-lostdesign" title="Maintenance">🚧</a> <a href="#review-lostdesign" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/webgems/webgems/commits?author=lostdesign" title="Tests">⚠️</a></td>
<td align="center"><a href="https://github.com/S3B4S"><img src="https://avatars0.githubusercontent.com/u/17083334?v=4" width="100px;" alt="Kevin van der Werff"/><br /><sub><b>Kevin van der Werff</b></sub></a><br /><a href="https://github.com/webgems/webgems/issues?q=author%3AS3B4S" title="Bug reports">🐛</a> <a href="https://github.com/webgems/webgems/commits?author=S3B4S" title="Code">💻</a> <a href="#content-S3B4S" title="Content">🖋</a> <a href="#ideas-S3B4S" title="Ideas, Planning, & Feedback">🤔</a> <a href="#maintenance-S3B4S" title="Maintenance">🚧</a> <a href="#review-S3B4S" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/webgems/webgems/commits?author=S3B4S" title="Tests">⚠️</a></td>
<td align="center"><a href="https://banou.dev"><img src="https://avatars0.githubusercontent.com/u/5209149?v=4" width="100px;" alt="Banou"/><br /><sub><b>Banou</b></sub></a><br /><a href="https://github.com/webgems/webgems/issues?q=author%3ABanou26" title="Bug reports">🐛</a> <a href="#design-Banou26" title="Design">🎨</a></td>
</tr>
</table>
<!-- ALL-CONTRIBUTORS-LIST:END -->
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!

View File

@@ -1,11 +1,26 @@
<!DOCTYPE html>
<html {{ HTML_ATTRS }}>
<head {{ HEAD_ATTRS }}>
<!-- Fathom - beautiful, simple website analytics -->
<script src="https://cdn.usefathom.com/script.js" data-spa="auto" data-site="XVSLUORL" defer></script>
<!-- / Fathom -->
{{ HEAD }}
<!-- Matomo -->
<script type="text/javascript">
var _paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(["setDocumentTitle", document.domain + "/" + document.title]);
_paq.push(["setCookieDomain", "*.webgems.io"]);
_paq.push(["setDomains", ["*.webgems.io"]]);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//stats.lost.services/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<noscript><p><img src="//stats.lost.services/matomo.php?idsite=1&amp;rec=1" style="border:0;" alt="" /></p></noscript>
<!-- End Matomo Code -->
</head>
<body {{ BODY_ATTRS }}>
{{ APP }}

View File

@@ -2,7 +2,7 @@
.card(:class="{ cardActive: isActive }")
.card--meta
img.card--favicon(:src="'https://www.google.com/s2/favicons?domain=' + resource.url" aria-hidden="true")
a.card--title(:href="resource.url" :target='resource.title' rel='noreferrer') {{resource.title}}
p.card--title {{resource.title}}
p.card--description {{resource.desc}}
.card--links
a.card--reference(@click='createCopyUrl(resource)') Copy
@@ -68,10 +68,9 @@ export default {
}
}
&--title {
font-size: 16px !important;
font-weight: 600;
margin: 0 !important;
&--title {
font-weight: 900;
margin: 0;
}
&--description {

13
components/CardsView.vue Normal file
View File

@@ -0,0 +1,13 @@
<template lang="pug">
.cards
Card(v-for='resource in resources' :resource='resource' :key='resource.title' :createCopyUrl="createCopyUrl" :isActive='activeCard === resource.cleanTitle')
</template>
<script>
import Card from './Card'
export default {
components: { Card },
props: ['resources', 'createCopyUrl', 'activeCard'],
}
</script>

View File

@@ -0,0 +1,3 @@
<template lang="pug">
iframe(style="border: 0; width: 100%; border-radius: 3px; font-family:Poppins,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;" src="https://stats.lost.services/index.php?module=CoreAdminHome&action=optOut&language=en&backgroundColor=08e5ff&fontColor=212121&fontSize=&fontFamily=Poppins")
</template>

View File

@@ -1,5 +1,5 @@
<template lang="pug">
input.search(v-model="searchInput" @keydown.enter="onEnter" type="text" placeholder="Search")
input.search(v-model="searchInput" type="text" placeholder="Search")
</template>
<script>
@@ -13,6 +13,16 @@ export default {
searchPath: '/search',
}
},
methods: {
// isTag :: String -> Bool
isTag: R.startsWith('#'),
// removeFirstChar :: String -> String
removeFirstChar: R.compose(
R.join(''),
R.adjust(0, () => '')
),
},
watch: {
searchInput(input) {
const words = R.filter(isNotEmpty, R.split(' ', input))
@@ -22,32 +32,9 @@ export default {
const searchParams = new URLSearchParams()
if (isNotEmpty(titles))
searchParams.append('keywords', titles)
if (isNotEmpty(tags))
if (isNotEmpty(tags))
searchParams.append('tags', R.map(this.removeFirstChar, tags))
this.$router.push(this.searchPath + '?' + searchParams.toString())
},
},
mounted() {
let keywords = this.$route.query.keywords || ''
keywords = keywords.split(',').join(' ')
let tags = this.$route.query.tags || ''
tags = R.filter(this.isTag, tags.split(',')).map(tag => `#${tag}`).join(' ')
this.searchInput = `${tags} ${keywords}`.trim()
},
methods: {
// isTag :: String -> Bool
isTag: R.startsWith('#'),
// removeFirstChar :: String -> String
removeFirstChar: R.compose(
R.join(''),
R.adjust(0, () => ''),
),
onEnter() {
const searchParams = new URLSearchParams({ ...this.$route.query, enter: true })
this.$router.push(this.searchPath + '?' + searchParams.toString())
},
},
@@ -56,13 +43,10 @@ export default {
<style lang="scss">
input {
font-family: "Poppins";
padding: .5rem 1.5rem .5rem 1.5rem;
border-radius: .3rem;
border: none;
background: #2E2E40;
font-size: 14px;
color: #fff;
background: #eee;
font-size:12px;
&:focus {
outline:none;

View File

@@ -5,7 +5,13 @@
//- nuxt-link(:to='$i18n.path(category.slug)') {{ category.title }}
nuxt-link(:to='category.slug') {{ category.title }}
hr
nuxt-link(to='/legal-notice') Legal Notice
nuxt-link(to='/privacy-policy') Privacy Policy
nuxt-link(to='/cookie-policy') Cookie Policy
nuxt-link(to='/imprint') Imprint
hr
div(class="toggleWrapper" @click="toggleCardsVisible")
div(class="viewToggle" :class="{active: areCardsVisible}") Cards
div(class="viewToggle" :class="{active: !areCardsVisible}") Table
</template>
<script>

97
components/TableRow.vue Normal file
View File

@@ -0,0 +1,97 @@
<template lang="pug">
tr.tableRow(:class="{ rowActive: isActive }")
td.tableRow--favicon
img(:src="'https://www.google.com/s2/favicons?domain=' + resource.url" aria-hidden="true")
td.tableRow--title {{resource.title}}
td.tableRow--description {{resource.desc}}
td.tableRow--links
tr
td
a.tableRow--reference(@click="createCopyUrl(resource)") Copy
td
a.tableRow--target(:href="resource.url" :target='resource.title' rel='noreferrer') Open
</template>
<script>
export default {
props: {
resource: Object,
isActive: Boolean,
createCopyUrl: Function,
},
}
</script>
<style lang="scss" scoped>
.rowActive {
box-shadow:inset 0px 0px 0px 3px #08e5ff;
}
.tableRow {
background: #2d3748;
margin-bottom: 1rem;
padding: 0.5rem;
border-radius: .3rem;
transition: 0.2s ease-in-out;
width: 1fr;
display: grid;
grid-template-columns: 1.5rem minmax(150px, 2fr) 8fr 125px;
&--title {
color: white;
font-weight: 900;
width: 80%;
}
&--description {
line-height: 1.3;
font-size: 13px;
color: white;
width: 80%;
}
&--links {
cursor: pointer;
tr {
width: 100%;
display: flex;
justify-content: space-between;
}
img {
width: 1rem;
margin-left: 0.5rem;
}
&:hover::before {
opacity: 0.5;
}
}
&--reference {
font-size: 12px;
&::before {
position: absolute;
height: 0.95rem;
width: 0.95rem;
margin-left: -1.15rem;
margin-top: 0.3rem;
content: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iIzA4ZTVmZiI+PHBhdGggZD0iTSA0IDIgQyAzLjkwNSAyIDMuODE1NjA5NCAyLjAxNDM0MzggMy43MjQ2MDk0IDIuMDI3MzQzOCBDIDMuNDM0NjA5NCAyLjE0MzM0MzggMy4xMzk3MDMxIDIuMjU3MDkzOCAyLjg0NTcwMzEgMi4zNzEwOTM4IEMgMi4zMzQ3MDMxIDIuNzMzMDkzOCAyIDMuMzI2IDIgNCBMIDIgMTggTCA0IDE4IEwgNCA0IEwgMTggNCBMIDE4IDIgTCA0IDIgeiBNIDggNiBDIDYuODk1IDYgNiA2Ljg5NSA2IDggTCA2IDIwIEMgNiAyMS4xMDUgNi44OTUgMjIgOCAyMiBMIDIwIDIyIEMgMjEuMTA1IDIyIDIyIDIxLjEwNSAyMiAyMCBMIDIyIDggQyAyMiA2Ljg5NSAyMS4xMDUgNiAyMCA2IEwgOCA2IHogTSAxNyA4LjAwMTk1MzEgQyAxNy43NjggOC4wMDE5NTMxIDE4LjUzNjA5NCA4LjI5MzkwNjIgMTkuMTIxMDk0IDguODc4OTA2MiBDIDE5LjY4ODA5NCA5LjQ0NDkwNjMgMjAgMTAuMTk5IDIwIDExIEMgMjAgMTEuODAxIDE5LjY4ODA5NCAxMi41NTQwOTQgMTkuMTIxMDk0IDEzLjEyMTA5NCBMIDE3LjIyNDYwOSAxNS4wMTc1NzggTCAxNS44MTA1NDcgMTMuNjAzNTE2IEwgMTcuNzA3MDMxIDExLjcwNzAzMSBDIDE3Ljg5NjAzMSAxMS41MTgwMzEgMTggMTEuMjY3IDE4IDExIEMgMTggMTAuNzMzIDE3Ljg5NjAzMSAxMC40ODE5NjkgMTcuNzA3MDMxIDEwLjI5Mjk2OSBDIDE3LjMxNjAzMSA5LjkwMTk2ODcgMTYuNjgzOTY5IDkuOTAyOTY4OCAxNi4yOTI5NjkgMTAuMjkyOTY5IEwgMTQuMzkwNjI1IDEyLjE5NTMxMiBMIDE1LjgwNDY4OCAxMy42MDkzNzUgTCAxMy44MDA3ODEgMTUuNjEzMjgxIEwgMTUuMjE0ODQ0IDE3LjAyNzM0NCBMIDEzLjExOTE0MSAxOS4xMjEwOTQgQyAxMi41NTQxNDEgMTkuNjg3MDk0IDExLjgwMSAyMCAxMSAyMCBDIDEwLjE5OSAyMCA5LjQ0NDkwNjMgMTkuNjg4MDk0IDguODc4OTA2MiAxOS4xMjEwOTQgQyA4LjMxMjkwNjMgMTguNTU1MDk0IDggMTcuODAxIDggMTcgQyA4IDE2LjE5OSA4LjMxMjkwNjIgMTUuNDQ1OTA2IDguODc4OTA2MiAxNC44Nzg5MDYgTCAxMC45NzI2NTYgMTIuNzg1MTU2IEwgMTIuMzg2NzE5IDE0LjE5OTIxOSBMIDE0LjM2OTE0MSAxMi4yMTY3OTcgTCAxMi45NTUwNzggMTAuODAyNzM0IEwgMTQuODc4OTA2IDguODc4OTA2MiBDIDE1LjQ2MzkwNiA4LjI5MzkwNjIgMTYuMjMyIDguMDAxOTUzMSAxNyA4LjAwMTk1MzEgeiBNIDEyLjM3MzA0NyAxNC4yMTI4OTEgTCAxMC4yOTI5NjkgMTYuMjkyOTY5IEMgMTAuMTAzOTY5IDE2LjQ4MTk2OSAxMCAxNi43MzMgMTAgMTcgQyAxMCAxNy4yNjcgMTAuMTAzOTY5IDE3LjUxODAzMSAxMC4yOTI5NjkgMTcuNzA3MDMxIEMgMTAuNjcxOTY5IDE4LjA4NjAzMSAxMS4zMjgwMzEgMTguMDg1MDMxIDExLjcwNzAzMSAxNy43MDcwMzEgTCAxMy43ODcxMDkgMTUuNjI2OTUzIEwgMTIuMzczMDQ3IDE0LjIxMjg5MSB6IiBmaWxsPSIjMDhlNWZmIi8+PC9zdmc+Cg==");
}
}
&--target {
font-size: 12px;
&::before {
position: absolute;
height: 0.95rem;
width: 0.95rem;
margin-left: -1.15rem;
margin-top: 0.3rem;
content: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iIzA4ZTVmZiI+PHBhdGggc3R5bGU9ImxpbmUtaGVpZ2h0Om5vcm1hbDt0ZXh0LWluZGVudDowO3RleHQtYWxpZ246c3RhcnQ7dGV4dC1kZWNvcmF0aW9uLWxpbmU6bm9uZTt0ZXh0LWRlY29yYXRpb24tc3R5bGU6c29saWQ7dGV4dC1kZWNvcmF0aW9uLWNvbG9yOiMwMDA7dGV4dC10cmFuc2Zvcm06bm9uZTtibG9jay1wcm9ncmVzc2lvbjp0Yjtpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiIGQ9Ik0gNSAzIEMgMy45MDY5MzcyIDMgMyAzLjkwNjkzNzIgMyA1IEwgMyAxOSBDIDMgMjAuMDkzMDYzIDMuOTA2OTM3MiAyMSA1IDIxIEwgMTkgMjEgQyAyMC4wOTMwNjMgMjEgMjEgMjAuMDkzMDYzIDIxIDE5IEwgMjEgMTIgTCAxOSAxMiBMIDE5IDE5IEwgNSAxOSBMIDUgNSBMIDEyIDUgTCAxMiAzIEwgNSAzIHogTSAxNCAzIEwgMTQgNSBMIDE3LjU4NTkzOCA1IEwgOC4yOTI5Njg4IDE0LjI5Mjk2OSBMIDkuNzA3MDMxMiAxNS43MDcwMzEgTCAxOSA2LjQxNDA2MjUgTCAxOSAxMCBMIDIxIDEwIEwgMjEgMyBMIDE0IDMgeiIgZm9udC13ZWlnaHQ9IjQwMCIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHdoaXRlLXNwYWNlPSJub3JtYWwiIG92ZXJmbG93PSJ2aXNpYmxlIiBmaWxsPSIjMDhlNWZmIi8+PC9zdmc+Cg==");
}
}
}
</style>

13
components/TableView.vue Normal file
View File

@@ -0,0 +1,13 @@
<template lang="pug">
table
TableRow(v-for='resource in resources' :resource='resource' :key='resource.title' :createCopyUrl="createCopyUrl" :isActive='activeCard === resource.cleanTitle')
</template>
<script>
import TableRow from '../components/TableRow'
export default {
components: { TableRow },
props: ['resources', 'createCopyUrl', 'activeCard'],
}
</script>

View File

@@ -4,7 +4,14 @@
Logo
Search
Sidebar
no-ssr
template(v-if="showNotice")
.cookie
p This site uses cookies, please read our&nbsp;
nuxt-link.highlighted(to="privacy-policy") Privacy policy.
button.highlighted(@click.preventDefault="hideCookieNotice" type="button") X
nuxt.content
</template>
<script>
@@ -37,6 +44,27 @@ export default {
showNotice: false,
}
},
beforeMount() {
this.checkCookieNoticeHidden()
},
methods: {
hideCookieNotice() {
if(typeof(Storage) !== 'undefined'){
localStorage.setItem('cookieNoticeHidden', true)
this.showNotice = false
}
},
checkCookieNoticeHidden() {
if(typeof(Storage) !== 'undefined'){
let cookieNotice = localStorage.getItem('cookieNoticeHidden')
if(cookieNotice) {
this.showNotice = false
} else {
this.showNotice = true
}
}
},
},
}
</script>
@@ -158,7 +186,6 @@ h1 {
grid-template-areas:
'logo'
'sidebar'
'search'
'content';
}
hr {

8
middleware/README.md Normal file
View File

@@ -0,0 +1,8 @@
# MIDDLEWARE
**This directory is not required, you can delete it if you don't want to use it.**
This directory contains your application middleware.
Middleware let you define custom functions that can be run before rendering either a page or a group of pages.
More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/routing#middleware).

View File

@@ -14,11 +14,11 @@ export default {
{ charset: 'utf-8' },
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
{ hid: 'description', name: 'description', content: pkg.description },
{ hid: 'keywords', name: 'keywords', content: 'css, html, php, server, resources, design, gems, nuxt, javascript, tutorials, development, software, js, vue, seo, rust, sql, databases'},
{ hid: 'keywords', name: 'keywords', content: 'css, html, php, server, resources, design, gems, nuxt, javascript, tutorials, development, software'},
{ name: 'robots', content: 'index, follow' },
{ name: 'distribution', content: 'global'},
{ name: 'distribution', content: 'global'},
{ name:'theme-color', content: '#ffffff' },
{ name: 'msapplication-TileColor', content: '#da532c' },
{ rel: 'mask-icon', href: '/safari-pinned-tab.svg', color: '#5bbad5' },

11015
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -15,21 +15,21 @@
},
"dependencies": {
"cross-env": "^5.2.0",
"nuxt": "^2.14.6",
"nuxt": "^2.4.0",
"nuxt-clipboard2": "^0.2.1",
"ramda": "^0.26.1",
"vue-i18n": "^8.21.1"
"vue-i18n": "^8.11.2"
},
"devDependencies": {
"@babel/core": "^7.11.6",
"@babel/preset-env": "^7.11.5",
"@vue/test-utils": "^1.1.0",
"@babel/core": "^7.6.4",
"@babel/preset-env": "^7.6.3",
"@vue/test-utils": "^1.0.0-beta.29",
"autoprefixer": "^8.6.4",
"babel-core": "^7.0.0-bridge.0",
"babel-eslint": "^10.0.3",
"babel-jest": "^24.9.0",
"eslint": "^6.5.1",
"eslint-config-prettier": "^6.12.0",
"eslint-config-prettier": "^6.3.0",
"eslint-loader": "^3.0.2",
"eslint-plugin-prettier": "^3.1.1",
"eslint-plugin-vue": "^5.2.3",
@@ -42,6 +42,6 @@
"pug-plain-loader": "^1.0.0",
"sass-loader": "^7.1.0",
"tailwindcss": "^0.7.0",
"vue-jest": "^3.0.7"
"vue-jest": "^3.0.5"
}
}

View File

@@ -3,16 +3,21 @@
transition(name="fade-title" @after-enter="afterEnter")
h1(v-if="showTitle") {{ category.title }}
transition(name="fade-card")
.cards(v-if="areCardsVisible && showCards")
template(v-for='resource in category.resources' )
Card(:resource='resource' :key='resource.title' :createCopyUrl="createCopyUrl" :isActive='activeCard === resource.cleanTitle')
div(v-if="showCards")
component(
:is="areCardsVisible ? 'CardsView' : 'TableView'"
:resources="category.resources"
:createCopyUrl="createCopyUrl"
:activeCard='activeCard'
)
</template>
<script>
import Card from '../components/Card'
import CardsView from '../components/CardsView'
import TableView from '../components/TableView'
export default {
components: { Card },
components: { CardsView, TableView },
data() {
return {
categoryRouteTitle: this.$route.params.category,

56
pages/cookie-policy.vue Normal file
View File

@@ -0,0 +1,56 @@
<template lang="pug">
main
h1 Our Cookie Policy
p We believe in being transparent about how we collect and use data. This policy provides information about how and when we use cookies for these purposes. Capitalized terms used in this policy but not defined have the meaning set forth in our&nbsp;
nuxt-link.highlighted(to="privacy-policy") Privacy Policy
| &nbsp;which also includes additional details about the collection and use of information at webgems.
h2 What Is A Cookie?
p Cookies are small text files sent by us to your computer or mobile device, which enables webgems features and functionality. They are unique to your account or your browser. Session-based cookies last only while your browser is open and are automatically deleted when you close your browser. Persistent cookies last until you or your browser delete them or until they expire.
p To find out more about cookies, visit&nbsp;
a.highlighted(href="https://www.allaboutcookies.org/") this
| &nbsp;site.
h2 Does Webgems Use Cookies?
p Yes, unless your browser has "Do Not Track" enabled. Matomo creates a persistent cookie inside your browser which contains a Session ID. This Session ID is being used to analyze the usage of our website. No further cookies are created by webgems.
h2 How Can You Get Rid Of Cookies?
p Browser manufacturers provide help pages relating to cookie management in their products. Please see below for more information.
ul
li
a(href="https://support.google.com/chrome/answer/95647?hl=en-GB", title="Google Chrome") Google Chrome
li
a(href="https://support.apple.com/en-us/guide/safari/manage-cookies-and-website-data-sfri11471/mac", title="Google Chrome") Safari Desktop
li
a(href="https://support.apple.com/en-us/HT201265", title="Google Chrome") Safari Mobile
li
a(href="https://support.mozilla.org/en-US/kb/cookies-information-websites-store-on-your-computer", title="Google Chrome") Mozilla Firefox
li
a(href="http://support.google.com/ics/nexus/bin/answer.py?hl=en&answer=2425067", title="Google Chrome") Android
li
a(href="https://support.microsoft.com/en-us/kb/260971", title="Google Chrome") Internet Explorer
h2 Opt Out From Tracking
OptOutIframe
</template>
<script>
import OptOutIframe from '@/components/OptOutIframe.vue'
export default {
components: {
OptOutIframe,
},
}
</script>
<style lang="scss" scoped>
h2 {
margin-top: 2rem;
margin-bottom: 0.5rem;
}
p {
margin-top: 0;
}
</style>

View File

@@ -1,6 +1,6 @@
<template lang="pug">
div
h1 Legal Notice
h1 Imprint
p Webgems.io is a project of&nbsp;
a.highlighted(href="https://lost.design", title="Visit lost.design") www.lost.design

View File

@@ -3,7 +3,7 @@
main
h1.text-black.font-bold.text-xl.mb-2 What is&nbsp;
span 💎 webgems?
p webgems is a goto place for devs and designers to find new resources and more. As a beginner, it's sometimes not easy to find what you need since you don't know where to look for what.
p Webgems is a goto place for devs and designers to find new resources and more. As a beginner, it's sometimes not easy to find what you need since you don't know where to look for what.
p Therefore we created this project to have the most common and best resources for beginners and veterans in one place kind of like a bookmarks list for devs and designers, containing only the best gems out there.
p If you want to add your gem, go ahead and open a pull request on GitHub (click on that octocat at the top right corner).
p By the way, this project lives by getting shared; if you find this worthy, please share it with others.
@@ -14,7 +14,7 @@
span extends&nbsp;
a(href="https://github.com/S3B4S") @S3B4S&nbsp;
span and&nbsp;
a(href="https://devcord.com") devcord
a(href="https://devcord.com") Devcord
</template>

93
pages/privacy-policy.vue Normal file
View File

@@ -0,0 +1,93 @@
<template lang="pug">
main
h1 Our Privacy Policy
p This Privacy Policy describes how webgems collects, uses and discloses information, and what choices you have with respect to the information. We respect the Browser's "Do Not Track" feature, you won't be affected by this policy if enabled.
h2 Information We Collect
p This website uses the web analysis service software Matomo (www.matomo.org), a service of the provider InnoCraft Ltd., 150 Willis St, 6011 Wellington, New Zealand, (Matomo) to collect and store data based on our legitimate interest in the statistical analysis of the user behavior for optimization and marketing purposes as per article 6(1) lit. f GDPR.
p This data can be used to create and evaluate pseudonymized usage profiles for the same purpose. For this purpose, cookies may be used. The data collected with the Matomo technology (including its pseudonymized IP address) is processed on servers, which are hosted by Contabo GmbH.
p Contabo GmbH does not have access to the servers nor the data that is processed (§ 6 Server-administration, Contabo's Terms & Conditions). For more information visit&nbsp;
a.highlighted(href="https://contabo.com/agb.html") Contabo's Terms & Conditions.
p The information generated by the cookie in the pseudonymous user profile will not be used to personally identify the visitor to this website and will not be combined with personal data about the bearer of the pseudonym.
h2 Proccessed Data
p The following information is processed when visiting webgems:
ol(type="I")
li
strong Cookie Information.&nbsp;
| Webgems uses cookies on this website that are necessary for Matomo's analytics. The Websites and Services we provide, do not include cookies and similar tracking technologies of third parties. For more details about how we use these technologies, please see our&nbsp;
nuxt-link.highlighted(to="cookie-policy") Cookie Policy.
li
strong Log data.&nbsp;
| As with most websites and technology services delivered over the Internet, our servers automatically collect information when you access or use our Websites or Services and record it in log files. This log data may include the Internet Protocol (IP) address, the address of the web page visited before using the Website or Services, browser type and settings, the date and time the Services were used, information about browser configuration and plugins, language preferences and cookie data.
li
strong Device information.&nbsp;
| Matomo collects information about devices accessing the Services, including type of device, what operating system is used, device settings, application IDs, unique device identifiers and crash data. Whether we collect some or all of this Other Information often depends on the type of device used and its settings.
li
strong IP information.&nbsp;
| Your IP address will be pseudonymized by 2 byte(s) before any further processing of your data, e.g. 192.168.xxx.xxx.
li
strong Location information.&nbsp;
| Matomo uses your pseudonymized IP address in order to approximate determine your location by country.
h2 Data Retention
p All data that is being processed, will be automatically deleted after 180 days.
h2 How We Disclose and Share Information
p The analytics for this project will not be shared with third parties at any given point. Long time contributors of the project may have access to view analytics interface while not being able to alter the data itself.
h2 Opt Out From Tracking
p If you do not agree to this data from your visit being stored and evaluated, then you can object to the storage and use at any time by clicking below. In this case, an opt-out cookie will be placed in your browser, which means that Matomo does not collect any session data. Please note that the complete deletion of your cookies means that the opt-out cookie will be deleted too and you may need to activate it again.
OptOutIframe
h2 Re-Enable Cookie Banner
p Click&nbsp;
a.highlighted(@click.preventDefault="restoreCookieNotice") here!
h2 Contact Us
p For any data privacy related enquiries, such as requesting a copy of your information or complete deletion, please contact us via mail at&nbsp;
a(href="mailto:dataprivacy@webgems.io") dataprivacy@webgems.io
</template>
<script>
import OptOutIframe from '@/components/OptOutIframe.vue'
export default {
components: {
OptOutIframe,
},
data() {
return {
}
},
methods: {
restoreCookieNotice() {
if(typeof(Storage) !== 'undefined'){
localStorage.removeItem('cookieNoticeHidden')
location.reload()
}
},
checkCookieNoticeRestore() {
if(typeof(Storage) !== 'undefined'){
let cookieNotice = localStorage.getItem('cookieNoticeRestore')
if(cookieNotice === true) {
this.showRestore = true
console.log('as', this.showRestore)
} else {
this.showRestore = false
}
}
},
},
}
</script>
<style lang="scss" scoped>
h2 {
margin-top: 2rem;
margin-bottom: 0.5rem;
}
p {
margin-top: 0;
}
</style>

View File

@@ -3,19 +3,24 @@
transition(name="fade-title" @after-enter="afterEnter")
h1(v-if="showTitle") Search
transition(name="fade-card")
.cards(v-if="areCardsVisible && showCards")
template(v-if="resources.length")
template(v-for='resource in resources' )
Card(:resource='resource' :key='resource.title' :createCopyUrl="createCopyUrl" :isActive='activeCard === resource.cleanTitle')
div(showCards)
component(
v-if="resources.length"
:is="areCardsVisible ? 'CardsView' : 'TableView'"
:createCopyUrl="createCopyUrl"
:activeCard="activeCard"
:resources="resources"
)
p(v-else) No results
</template>
<script>
import Card from '../components/Card'
import CardsView from '../components/CardsView'
import TableView from '../components/TableView'
import * as R from 'ramda'
export default {
components: { Card },
components: { CardsView, TableView },
data() {
return {
activeCard: '',
@@ -34,19 +39,14 @@ export default {
watch: {
$route(updatedChanges) {
clearTimeout(this.debounceID)
const updateSearch = () => {
this.debounceID = setTimeout(() => {
const keywords = updatedChanges.query.keywords
const tags = updatedChanges.query.tags
this.searchInput = {
keywords: keywords && R.split(',', keywords),
tags: tags && R.split(',', tags),
}
}
if (updatedChanges.query.enter !== 'true')
this.debounceID = setTimeout(updateSearch, 300)
else
updateSearch()
}, 500)
},
searchInput(searchInput) {
this.resources = this.$store.getters['data/findBySearchInputs'](searchInput.keywords, searchInput.tags)
@@ -54,13 +54,6 @@ export default {
},
mounted() {
this.showTitle = true
const keywords = this.$route.query.keywords
const tags = this.$route.query.tags
this.searchInput = {
keywords: keywords && R.split(',', keywords),
tags: tags && R.split(',', tags),
}
},
methods: {
async createCopyUrl(resource) {

View File

@@ -23,7 +23,7 @@
{
"title": "The web accessibility basics",
"desc": "The absolute web accessibility basics every web developer should know about.",
"url": "https://www.marcozehe.de/articles/2015-12-14-the-web-accessibility-basics/",
"url": "https://www.marcozehe.de/2015/12/14/the-web-accessibility-basics/",
"tags": ["blog", "video", "semantics", "basics"]
}
]

View File

@@ -1,113 +0,0 @@
{
"title": "Content Creators",
"slug": "/content-creators",
"resources": [
{
"title": "Traversy Media",
"desc": "Traversy Media is owned by Brad Traversy. The channel has a lot of great tutorials to learn full web development and coding. It features online web development and programming tutorials for the latest web technologies including Node.js, Angular 2, React.js, PHP, Rails, HTML, CSS, and more.",
"url": "https://www.youtube.com/user/TechGuyWeb",
"tags": [
"beginner",
"fullstack",
"frontend",
"javascript",
"mongodb",
"node",
"php",
"wordpress",
"tutorial",
"programming"
]
},
{
"title": "The Net Ninja",
"desc": "The Net Ninja is a channel to strengthen your web skills. It has many tutorials for designers and developers.",
"url": "https://www.youtube.com/channel/UCW5YeuERMmlnqo4oq8vwUpg",
"tags": ["javascript", "beginner", "css", "tutorial", "programming"]
},
{
"title": "The Futur",
"desc": "The mission of The Futur is to be the future of online education for creative entrepreneurs. It features design content on identity design and branding, user experience, logos and lettering, typography, the business of design, and plenty of case studies.",
"url": "https://www.youtube.com/channel/UC-b3c7kxa5vU-bnmaROgvog",
"tags": [
"marketing",
"design",
"logo",
"tutorial",
"business",
"ui",
"ux",
"webdesign"
]
},
{
"title": "Tutvid",
"desc": "Nathaniel Dodsons Tutvid is a site to learn advanced graphic design skills, with tutorials in Adobe Photoshop and Adobe Illustrator. Tutvid also includes tutorials to master animation and video with Adobe Premiere Pro, Adobe After Effects, and Adobe Lightroom. Tutvids “Daily Photoshop Tutorials” playlist covers tools, features, and tricks.",
"url": "https://www.youtube.com/user/tutvid",
"tags": [
"photoshop",
"tutorial",
"videoediting",
"webdesign",
"programming"
]
},
{
"title": "CharliMarieTV",
"desc": "Charli Marie TV is a channel from Charli Marie, a web and graphic designer in London. Videos are posted weekly about tools, projects, and concepts. There are also weekly videos about her life as a designer.",
"url": "https://www.youtube.com/user/charlimarieTV",
"tags": ["design", "webdesign", "tutorial"]
},
{
"title": "Funfunfunction",
"desc": "Fun Fun Function is like a show about programming. Not a database of tutorials and courses, a show. A regular show with an different topic every week, with an entertaining host that explains things well, with the purpose of keeping you curious and excited about the programming craft. Basically, the purpose of Fun Fun Function is to keep programming fun.",
"url": "https://www.youtube.com/channel/UCO1cgjhGzsSYb1rsB4bFe4Q",
"tags": ["machinelearning", "testing", "live"]
},
{
"title": "Getify",
"desc": "Getify writes about JavaScript, finding new and useful ways to teach it to more learners, and exploring and researching JavaScript through OSS coding.",
"url": "https://twitter.com/getify",
"tags": ["tips", "programming", "javascript"]
},
{
"title": "Steve Schoger",
"desc": "Steve Schoger is a visual designer from Canada. Many people know him as the guy who shares design tips on Twitter or refactors UIs on YouTube.",
"url": "https://www.youtube.com/channel/UCxqiDtkXtOCNJdckODHk9YA",
"tags": ["tips", "webdesign", "ui"]
},
{
"title": "DevTips",
"desc": "DevTips is a weekly show for YOU who want to be inspired 👍 and learn 🖖 about programming. Hosted by David and MPJ - two notorious bug generators 💖 and teachers 🤗. Exploring code together and learning programming along the way - yay!",
"url": "https://www.youtube.com/user/DevTipsForDesigners",
"tags": ["tips", "webdesign", "ui", "tutorial", "programming"]
},
{
"title": "LevelUpTuts",
"desc": "840+ free video tutorials created, recorded, edited, published and maintained by Scott Tolinski.",
"url": "https://www.youtube.com/user/LevelUpTuts",
"tags": ["tips", "webdesign", "ui", "tutorial", "programming"]
},
{
"title": "Wes Bos",
"desc": "HTML, CSS, JavaScript and WordPress web development tutorials!",
"url": "https://www.youtube.com/user/wesbos",
"tags": [
"tips",
"webdesign",
"ui",
"tutorial",
"programming",
"javascript",
"wordpress"
]
},
{
"title": "Mayuko",
"desc": "Mayuko is a Senior iOS Software Engineer from San Diego. She makes Youtube videos about what life is like as a Software Engineer living and working in Silicon Valley. She aims to make the tech industry feel more accessible to those entering the industry.",
"url": "https://www.youtube.com/user/hellomayuko",
"categories": "Life experiences sharing",
"tags": ["vlog", "techadvice", "programming"]
}
]
}

View File

@@ -35,7 +35,7 @@
{
"title": "30 Seconds of Code",
"desc": "A curated collection of useful CSS snippets you can understand in 30 seconds or less.",
"url": "https://www.30secondsofcode.org/css/",
"url": "https://30-seconds.github.io/30-seconds-of-css/",
"tags": ["tips", "tricks", "collection"]
},
{
@@ -139,12 +139,6 @@
"desc": "This CSS clip-path maker helps you understand the clip-path property and all the cool things you can do with it.",
"url": "https://bennettfeely.com/clippy/",
"tags": ["interactive", "visual", "shapes"]
},
{
"title": "SVG to CSS Base64 background-image",
"desc": "This tool will convert your SVG code to CSS background-image compatible Base64 image.",
"url": "https://yoksel.github.io/url-encoder/",
"tags": ["convert", "generator", "icons"]
}
]
}
}

View File

@@ -43,12 +43,6 @@
"desc": "The five best design links, every day.",
"url": "https://sidebar.io/",
"tags": ["design", "reading", "aggregator"]
},
{
"title": "daily.dev",
"desc": "Daily delivers the best programming news every new tab. It is a browser extension that boosts your professional growth.",
"url": "https://daily.dev/",
"tags": ["development", "reading", "aggregator", "discover"]
}
]
}
}

View File

@@ -14,12 +14,6 @@
"url": "https://undraw.co",
"tags": ["illustration", "svg", "ui"]
},
{
"title": "Dribbble",
"desc": "Gain inspiration and feedback. Basically social media for designers",
"url": "https://dribbble.com/",
"tags": ["career", "ux", "ui"]
},
{
"title": "Practical UI tips",
"desc": "7 Tips to boost your UI design.",

View File

@@ -55,39 +55,6 @@
"desc": "I write tutorials for JavaScript and Web Developers.",
"url": "https://flaviocopes.com/",
"tags": ["mentor", "books", "tutorial"]
},
{
"title": "Interneting is hard",
"desc": "Friendly web development tutorials for complete beginners in HTML and CSS",
"url": "https://www.internetingishard.com/",
"tags": ["html", "semantic", "css", "typography"]
},
{
"title": "Periodic Table of Web APIs",
"desc": "A visual map of almost all browser APIs with links to tutorials and documentation, color-coded by browser support",
"url": "https://wwwperiodictable.surge.sh/",
"tags": [
"resources",
"aggregator",
"fundamentals",
"web",
"visual",
"browser",
"frontend",
"overview",
"guides",
"tutorial",
"compatibility",
"lists",
"obselete",
"reference",
"specification",
"standards",
"comprehensive",
"advanced",
"guides",
"links"
]
}
]
}

View File

@@ -5,7 +5,7 @@
{
"title": "freeCodeCamp curriculum",
"desc": "We have thousands of coding lessons to help you improve your skills. You can earn each certification by completing its 5 final projects. And yes - all of this is 100% free, thanks to the thousands of campers who donate to our nonprofit. If you are new to coding, we recommend you start at the beginning.",
"url": "https://www.freecodecamp.org/learn/",
"url": "https://learn.freecodecamp.org",
"tags": ["design", "javascript", "courses", "security", "interview"]
},
{

View File

@@ -29,7 +29,7 @@
{
"title": "Developer Roadmap",
"desc": "Below you find a set of charts demonstrating the paths that you can take and the technologies that you would want to adopt in order to become a frontend, backend or a devops.",
"url": "https://github.com/kamranahmedse/developer-roadmap/blob/master/README.md",
"url": "https://github.com/kamranahmedse/developer-roadmap/blob/master/readme.md",
"tags": ["roadmaps", "visual", "graphics", "connections"]
},
{
@@ -67,18 +67,6 @@
"desc": "Take a whirlwind tour of your next favorite language. Community-driven!",
"url": "https://learnxinyminutes.com/",
"tags": ["languages", "quick", "resources", "basics"]
},
{
"title": "webgems.io",
"desc": "It's a great collection for learning materials for all sorts of programming topics.",
"url": "https://webgems.io",
"tags": ["quick", "resources", "basics", "search", "aggregator"]
},
{
"title": "Codesignal",
"desc": "Online programming tournaments to practice your skills. Play with random people, your friends, or in the singleplayer arcade mode.",
"url": "https://codesignal.com/developers/",
"tags": ["game", "practice", "multiplayer"]
}
]
}

View File

@@ -14,8 +14,6 @@ import server from './server'
import utility from './utility'
import icons from './icons'
import accessibility from './accessibility'
import rust from './rust'
import contentCreators from './content-creators'
const sortByTitle = ({ title: titleA }, { title: titleB }) => {
if(titleA < titleB) return -1
@@ -40,6 +38,4 @@ export default [
utility,
icons,
accessibility,
rust,
contentCreators,
].sort(sortByTitle)

View File

@@ -40,16 +40,10 @@
},
{
"title": "YDKJS",
"desc": "This is a free series of books diving deep into the core mechanisms of the JavaScript language. The first edition of the series is now complete, and the first two chapters of the second edition have already been published.",
"desc": "This is a free series of books diving deep into the core mechanisms of the JavaScript language. The first edition of the series is now complete.",
"url": "https://github.com/getify/You-Dont-Know-JS",
"tags": ["online", "comprehensive", "courses"]
},
{
"title": "Deep JavaScript",
"desc": "A high-end book by Dr. Axel Rauschmayer which answers some of the questions that experienced JS developers might still encounter through their career.",
"url": "https://exploringjs.com/deep-js/",
"tags": ["book", "basics", "advanced"]
},
{
"title": "Eloquent Javascript 3rd Edition",
"desc": "This is a book about javascript, programming, and the wonders of the digital. You can read it online or get a paperback copy of it.",
@@ -98,12 +92,6 @@
"url": "https://learnjavascript.online/",
"tags": ["flashcards", "challenges", "fundamentals"]
},
{
"title": "Loupe",
"desc": "Loupe is a little visualisation to help you understand how JavaScript's call stack/event loop/callback queue interact with each other.",
"url": "http://latentflip.com/loupe/",
"tags": ["event", "queue", "visualizer"]
},
{
"title": "Code to go",
"desc": "Find up to date snippets for common JavaScript use cases",
@@ -123,4 +111,4 @@
"tags": ["email", "solutions", "detailed"]
}
]
}
}

View File

@@ -67,12 +67,6 @@
"desc": "134 Slides to help fix your code. Performance and testing are just one aspect of code, to really be successful your code needs to be readable, maintainable and generally easier to comprehend and work with.",
"url": "https://www.slideshare.net/rdohms/your-code-sucks-lets-fix-it-15471808",
"tags": ["slides", "readability", "rules"]
},
{
"title": "Clean Code PHP",
"desc": "Software engineering principles, from Robert C. Martin's book Clean Code, adapted for PHP.",
"url": "https://github.com/jupeter/clean-code-php",
"tags": ["book", "guide", "rules", "standards"]
}
]
}
}

View File

@@ -1,114 +0,0 @@
{
"title": "Rust",
"slug": "/rust",
"resources": [
{
"title": "The Rust Book",
"desc": "The Rust Programming Language book will give you an overview of the language from first principles.",
"url": "https://doc.rust-lang.org/book/",
"tags": ["official", "reference", "guide"]
},
{
"title": "Rustlings",
"desc": "Small exercises to get you used to reading and writing Rust code.",
"url": "https://github.com/rust-lang/rustlings/",
"tags": ["official", "excercises", "guide"]
},
{
"title": "Rust Playground",
"desc": "An online playground to try out rust.",
"url": "https://play.rust-lang.org/",
"tags": ["official", "playground"]
},
{
"title": "Are we web yet?",
"desc": "List of resources for web development in Rust",
"url": "https://www.arewewebyet.org/",
"tags": ["official", "web"]
},
{
"title": "Rust and WebAssembly",
"desc": "A small book that describes how to use Rust and WebAssembly together.",
"url": "https://rustwasm.github.io/docs/book/",
"tags": ["official", "web", "webassembly"]
},
{
"title": "Rocket",
"desc": "Rocket is a web framework for Rust that makes it simple to write fast, secure web applications without sacrificing flexibility, usability, or type safety.",
"url": "https://rocket.rs/v0.4/guide/",
"tags": ["framework", "web", "application"]
},
{
"title": "Actix",
"desc": "Rust's powerful actor system and most fun web framework",
"url": "https://actix.rs/",
"tags": ["framework", "web", "application"]
},
{
"title": "Rust 101",
"desc": "A small, interactive and hands-on tutorial into the rust language.",
"url": "https://www.ralfj.de/projects/rust-101/main.html",
"tags": ["guide", "tutorial", "basics"]
},
{
"title": "Warp",
"desc": "A super-easy, composable, web server framework for warp speeds.",
"url": "https://github.com/seanmonstar/warp",
"tags": ["web", "framework", "application"]
},
{
"title": "Rust by Example",
"desc": "Rust by Example (RBE) is a collection of runnable examples that illustrate various Rust concepts and standard libraries.",
"url": "https://doc.rust-lang.org/stable/rust-by-example/index.html",
"tags": ["official", "guide", "tutorial"]
},
{
"title": "Yew",
"desc": "A modern Rust framework for creating multi-threaded front-end web apps with WebAssembly.",
"url": "https://yew.rs/docs/en/intro/",
"tags": ["web", "webassembly", "frontend"]
},
{
"title": "Seed",
"desc": "Rust framework for creating fast and reliable web apps",
"url": "https://seed-rs.org/",
"tags": ["web", "webassembly", "frontend"]
},
{
"title": "Rust blog",
"desc": "This is the main Rust blog. The core team uses this blog to announce big developments in the world of Rust.",
"url": "https://blog.rust-lang.org/",
"tags": ["blog", "official", "history", "features"]
},
{
"title": "The Embedded Rust Book",
"desc": "An introductory book about using the Rust Programming Language on \"Bare Metal\" embedded systems, such as Microcontrollers.",
"url": "https://rust-embedded.github.io/book/",
"tags": ["microcontrollers", "embedded", "guide"]
},
{
"title": "Rusoto",
"desc": "An AWS SDK for rust.",
"url": "https://www.rusoto.org/",
"tags": ["aws", "servers", "infrastructure"]
},
{
"title": "Tokio",
"desc": "An asynchronous runtime for the Rust programming language. It provides the building blocks needed for writing network applications.",
"url": "https://tokio.rs/",
"tags": ["networking", "async", "server"]
},
{
"title": "Juniper",
"desc": "Juniper is a GraphQL server library for Rust. Build type-safe and fast API servers with minimal boilerplate and configuration.",
"url": "https://graphql-rust.github.io/juniper/current/",
"tags": ["web", "application", "graphql", "api"]
},
{
"title": "Diesel",
"desc": "Diesel is a Safe, Extensible ORM and Query Builder for Rust",
"url": "https://diesel.rs/",
"tags": ["web", "database", "orm"]
}
]
}

View File

@@ -175,24 +175,6 @@
"desc": "Messed up some of your commits? Make it undone",
"url": "https://bokub.github.io/git-history-editor/",
"tags": ["import", "export", "author", "messages"]
},
{
"title": "CodeSandbox.io",
"desc": "CodeSandbox is an online code editor with a focus on creating and sharing web application projects",
"url": "https://codesandbox.io/",
"tags": ["development", "ide","editor", "share", "testing"]
},
{
"title": "Hoppscotch",
"desc": "The Hoppscotch API request builder helps you create your requests faster, saving you precious time on your development.",
"url": "https://hoppscotch.io/",
"tags": ["testing","api"]
},
{
"title": "NoPaste",
"desc": "A privacy-focused service where you can paste and share any piece of code. Similar to Pastebin, except the service stores nothing",
"url": "https://nopaste.ml/",
"tags": ["paste", "url", "interactive", "share", "privacy"]
}
]
}

View File

@@ -21,7 +21,7 @@ export const getters = {
findCategory: state => categoryTitle => {
// equalsCategoryTitle :: Category -> Bool
const equalsCategoryTitle = R.compose(
R.equals(cleanString(categoryTitle)), R.replace(/ /g, '-') ,cleanString, R.prop('title'),
R.equals(cleanString(categoryTitle)), cleanString, R.prop('title')
)
// findCategory :: [Category] -> Category
const findCategory = R.find(equalsCategoryTitle)
@@ -31,8 +31,8 @@ export const getters = {
const cleaned = R.map(cleanString, names)
// [Resource] -> [Resource]
const appearsInResource = R.filter(({ cleanTitle, url, desc }) =>
partiallyIncludesElOf([cleanTitle, url, desc], cleaned),
const appearsInResource = R.filter(({ cleanTitle, url, desc }) =>
partiallyIncludesElOf([cleanTitle, url, desc], cleaned)
)
// [Category] -> [Resource]
const getDesiredResources = R.compose(appearsInResource, getAllResources)
@@ -78,6 +78,6 @@ const compareTitles = (x, y) => {
}
}
const equalResources = (a, b) =>
const equalResources = (a, b) =>
a.title === b.title &&
a.cleanTitle == b.cleanTitle

12365
yarn.lock

File diff suppressed because it is too large Load Diff