Compare commits
62 Commits
features/t
...
dependabot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7ad676ebd7 | ||
|
|
112d3ff0e1 | ||
|
|
d0b35fa7d7 | ||
|
|
1e2d09415d | ||
|
|
3813af3ba6 | ||
|
|
4f3cc37760 | ||
|
|
5b9ea44d2d | ||
|
|
b301a694a4 | ||
|
|
2b792abc2a | ||
|
|
03498686ec | ||
|
|
77cec39c4b | ||
|
|
75c49a0787 | ||
|
|
520e713c37 | ||
|
|
66c491ef0c | ||
|
|
f9f1ae011e | ||
|
|
6e362d106c | ||
|
|
f78140f8d5 | ||
|
|
0ce189170b | ||
|
|
6fb923e8ea | ||
|
|
53c5a7c12f | ||
|
|
a338f7457e | ||
|
|
7f514b525a | ||
|
|
e429e17f65 | ||
|
|
281c68b8d3 | ||
|
|
9dc30dd8f7 | ||
|
|
435aa0622e | ||
|
|
c1fc2d4748 | ||
|
|
18e10b9a9b | ||
|
|
2d10c4eeca | ||
|
|
d3703d709a | ||
|
|
33240796d2 | ||
|
|
a4d761968b | ||
|
|
059263b4b0 | ||
|
|
cfc4259209 | ||
|
|
35516bc932 | ||
|
|
c414b639fd | ||
|
|
5dbc3cefc3 | ||
|
|
5625999eca | ||
|
|
a35ba613f2 | ||
|
|
3225ca900a | ||
|
|
aeddd782b7 | ||
|
|
949ab79b3f | ||
|
|
0e88b0c57e | ||
|
|
431de4eca1 | ||
|
|
eb38c86ae4 | ||
|
|
25eaa6d7b0 | ||
|
|
c81d73e512 | ||
|
|
ab135b6984 | ||
|
|
9436d68077 | ||
|
|
fe7a35a346 | ||
|
|
0b59e2d7f7 | ||
|
|
3ada0da370 | ||
|
|
7ee963313d | ||
|
|
0122e5b8bd | ||
|
|
11b67a8bfc | ||
|
|
c77e9072f5 | ||
|
|
3a4f384517 | ||
|
|
ee06cb0caf | ||
|
|
b114754da7 | ||
|
|
cfbd8ef9db | ||
|
|
3e34dcdf18 | ||
|
|
31e9d598db |
@@ -1,58 +0,0 @@
|
||||
{
|
||||
"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
Normal file
3
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: [lostdesign]
|
||||
@@ -7,3 +7,4 @@ 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:
|
||||
|
||||
20
README.md
20
README.md
@@ -23,22 +23,4 @@ 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
|
||||
|
||||
## 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!
|
||||
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
|
||||
7
app.html
7
app.html
@@ -1,6 +1,13 @@
|
||||
<!DOCTYPE html>
|
||||
<html {{ HTML_ATTRS }}>
|
||||
<head {{ HEAD_ATTRS }}>
|
||||
<!-- Fathom - beautiful, simple website analytics -->
|
||||
<script src="https://cdn.usefathom.com/3.js" site="OCSVINVR"></script>
|
||||
<script>
|
||||
window.fathom || document.write('<script src="https://quokka.webgems.io/core.js"><\/script>');
|
||||
</script>
|
||||
<!-- / Fathom -->
|
||||
|
||||
{{ HEAD }}
|
||||
</head>
|
||||
<body {{ BODY_ATTRS }}>
|
||||
|
||||
@@ -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")
|
||||
p.card--title {{resource.title}}
|
||||
a.card--title(:href="resource.url" :target='resource.title' rel='noreferrer') {{resource.title}}
|
||||
p.card--description {{resource.desc}}
|
||||
.card--links
|
||||
a.card--reference(@click='createCopyUrl(resource)') Copy
|
||||
@@ -68,9 +68,10 @@ export default {
|
||||
}
|
||||
}
|
||||
|
||||
&--title {
|
||||
font-weight: 900;
|
||||
margin: 0;
|
||||
&--title {
|
||||
font-size: 16px !important;
|
||||
font-weight: 600;
|
||||
margin: 0 !important;
|
||||
}
|
||||
|
||||
&--description {
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
<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>
|
||||
@@ -1,5 +1,5 @@
|
||||
<template lang="pug">
|
||||
input.search(v-model="searchInput" type="text" placeholder="Search")
|
||||
input.search(v-model="searchInput" @keydown.enter="onEnter" type="text" placeholder="Search")
|
||||
</template>
|
||||
|
||||
<script>
|
||||
@@ -13,16 +13,6 @@ 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))
|
||||
@@ -32,9 +22,32 @@ 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())
|
||||
},
|
||||
},
|
||||
@@ -43,10 +56,13 @@ export default {
|
||||
|
||||
<style lang="scss">
|
||||
input {
|
||||
font-family: "Poppins";
|
||||
padding: .5rem 1.5rem .5rem 1.5rem;
|
||||
border-radius: .3rem;
|
||||
background: #eee;
|
||||
font-size:12px;
|
||||
border: none;
|
||||
background: #2E2E40;
|
||||
font-size: 14px;
|
||||
color: #fff;
|
||||
|
||||
&:focus {
|
||||
outline:none;
|
||||
|
||||
@@ -5,13 +5,7 @@
|
||||
//- nuxt-link(:to='$i18n.path(category.slug)') {{ category.title }}
|
||||
nuxt-link(:to='category.slug') {{ category.title }}
|
||||
hr
|
||||
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
|
||||
nuxt-link(to='/legal-notice') Legal Notice
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
@@ -1,97 +0,0 @@
|
||||
<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>
|
||||
@@ -4,14 +4,7 @@
|
||||
Logo
|
||||
Search
|
||||
Sidebar
|
||||
no-ssr
|
||||
template(v-if="showNotice")
|
||||
.cookie
|
||||
p This site uses cookies, please read our
|
||||
nuxt-link.highlighted(to="privacy-policy") Privacy policy.
|
||||
button.highlighted(@click.preventDefault="hideCookieNotice" type="button") X
|
||||
nuxt.content
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
@@ -44,27 +37,6 @@ 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>
|
||||
|
||||
@@ -186,6 +158,7 @@ h1 {
|
||||
grid-template-areas:
|
||||
'logo'
|
||||
'sidebar'
|
||||
'search'
|
||||
'content';
|
||||
}
|
||||
hr {
|
||||
|
||||
@@ -14,7 +14,7 @@ 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'},
|
||||
{ hid: 'keywords', name: 'keywords', content: 'css, html, php, server, resources, design, gems, nuxt, javascript, tutorials, development, software, js, vue, seo, rust, sql, databases'},
|
||||
|
||||
{ name: 'robots', content: 'index, follow' },
|
||||
{ name: 'distribution', content: 'global'},
|
||||
@@ -62,10 +62,6 @@ export default {
|
||||
|
||||
plugins: [
|
||||
'~/plugins/i18n.js',
|
||||
{
|
||||
src: '~/plugins/vue-matomo.js',
|
||||
ssr: false,
|
||||
},
|
||||
],
|
||||
/*
|
||||
** Nuxt.js modules
|
||||
|
||||
11023
package-lock.json
generated
11023
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
15
package.json
15
package.json
@@ -15,22 +15,21 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"cross-env": "^5.2.0",
|
||||
"nuxt": "^2.4.0",
|
||||
"nuxt": "^2.14.6",
|
||||
"nuxt-clipboard2": "^0.2.1",
|
||||
"vue-i18n": "^8.11.2",
|
||||
"ramda": "^0.26.1",
|
||||
"vue-matomo": "^3.12.0-5"
|
||||
"vue-i18n": "^8.21.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.6.4",
|
||||
"@babel/preset-env": "^7.6.3",
|
||||
"@vue/test-utils": "^1.0.0-beta.29",
|
||||
"@babel/core": "^7.11.6",
|
||||
"@babel/preset-env": "^7.11.5",
|
||||
"@vue/test-utils": "^1.1.0",
|
||||
"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.3.0",
|
||||
"eslint-config-prettier": "^6.12.0",
|
||||
"eslint-loader": "^3.0.2",
|
||||
"eslint-plugin-prettier": "^3.1.1",
|
||||
"eslint-plugin-vue": "^5.2.3",
|
||||
@@ -43,6 +42,6 @@
|
||||
"pug-plain-loader": "^1.0.0",
|
||||
"sass-loader": "^7.1.0",
|
||||
"tailwindcss": "^0.7.0",
|
||||
"vue-jest": "^3.0.5"
|
||||
"vue-jest": "^3.0.7"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,18 +6,13 @@
|
||||
.cards(v-if="areCardsVisible && showCards")
|
||||
template(v-for='resource in category.resources' )
|
||||
Card(:resource='resource' :key='resource.title' :createCopyUrl="createCopyUrl" :isActive='activeCard === resource.cleanTitle')
|
||||
transition(name="fade-card")
|
||||
table(v-if="!areCardsVisible && showCards")
|
||||
template(v-for='resource in category.resources' )
|
||||
TableRow(:resource='resource' :key='resource.title' :createCopyUrl="createCopyUrl" :isActive='activeCard === resource.cleanTitle')
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Card from '../components/Card'
|
||||
import TableRow from '../components/TableRow'
|
||||
|
||||
export default {
|
||||
components: { Card, TableRow },
|
||||
components: { Card },
|
||||
data() {
|
||||
return {
|
||||
categoryRouteTitle: this.$route.params.category,
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
<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
|
||||
nuxt-link.highlighted(to="privacy-policy") Privacy Policy
|
||||
| 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
|
||||
a.highlighted(href="https://www.allaboutcookies.org/") this
|
||||
| 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>
|
||||
@@ -3,7 +3,7 @@
|
||||
main
|
||||
h1.text-black.font-bold.text-xl.mb-2 What is
|
||||
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
|
||||
a(href="https://github.com/S3B4S") @S3B4S
|
||||
span and
|
||||
a(href="https://devcord.com") Devcord
|
||||
a(href="https://devcord.com") devcord
|
||||
|
||||
|
||||
</template>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template lang="pug">
|
||||
div
|
||||
h1 Imprint
|
||||
h1 Legal Notice
|
||||
p Webgems.io is a project of
|
||||
a.highlighted(href="https://lost.design", title="Visit lost.design") www.lost.design
|
||||
|
||||
@@ -1,93 +0,0 @@
|
||||
<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
|
||||
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.
|
||||
| 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
|
||||
nuxt-link.highlighted(to="cookie-policy") Cookie Policy.
|
||||
li
|
||||
strong Log data.
|
||||
| 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.
|
||||
| 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.
|
||||
| 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.
|
||||
| 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
|
||||
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
|
||||
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>
|
||||
@@ -8,21 +8,14 @@
|
||||
template(v-for='resource in resources' )
|
||||
Card(:resource='resource' :key='resource.title' :createCopyUrl="createCopyUrl" :isActive='activeCard === resource.cleanTitle')
|
||||
p(v-else) No results
|
||||
transition(name="fade-card")
|
||||
table(v-if="!areCardsVisible && showCards")
|
||||
template(v-if="resources.length")
|
||||
template(v-for='resource in resources' )
|
||||
TableRow(:resource='resource' :key='resource.title' :createCopyUrl="createCopyUrl" :isActive='activeCard === resource.cleanTitle')
|
||||
p(v-else) No results
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Card from '../components/Card'
|
||||
import TableRow from '../components/TableRow'
|
||||
import * as R from 'ramda'
|
||||
|
||||
export default {
|
||||
components: { Card, TableRow },
|
||||
components: { Card },
|
||||
data() {
|
||||
return {
|
||||
activeCard: '',
|
||||
@@ -41,14 +34,19 @@ export default {
|
||||
watch: {
|
||||
$route(updatedChanges) {
|
||||
clearTimeout(this.debounceID)
|
||||
this.debounceID = setTimeout(() => {
|
||||
const updateSearch = () => {
|
||||
const keywords = updatedChanges.query.keywords
|
||||
const tags = updatedChanges.query.tags
|
||||
this.searchInput = {
|
||||
keywords: keywords && R.split(',', keywords),
|
||||
tags: tags && R.split(',', tags),
|
||||
}
|
||||
}, 500)
|
||||
}
|
||||
|
||||
if (updatedChanges.query.enter !== 'true')
|
||||
this.debounceID = setTimeout(updateSearch, 300)
|
||||
else
|
||||
updateSearch()
|
||||
},
|
||||
searchInput(searchInput) {
|
||||
this.resources = this.$store.getters['data/findBySearchInputs'](searchInput.keywords, searchInput.tags)
|
||||
@@ -56,6 +54,13 @@ 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) {
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
import Vue from 'vue'
|
||||
import VueMatomo from 'vue-matomo'
|
||||
|
||||
export default ({
|
||||
app,
|
||||
}) => {
|
||||
Vue.use(VueMatomo, {
|
||||
router: app.router,
|
||||
// Configure your matomo server and site by providing
|
||||
host: 'https://stats.lost.services',
|
||||
siteId: 1,
|
||||
|
||||
// Changes the default .js and .php endpoint's filename
|
||||
// Default: 'piwik'
|
||||
trackerFileName: 'matomo',
|
||||
|
||||
// Enables link tracking on regular links. Note that this won't
|
||||
// work for routing links (ie. internal Vue router links)
|
||||
// Default: true
|
||||
enableLinkTracking: true,
|
||||
|
||||
// Require consent before sending tracking information to matomo
|
||||
// Default: false
|
||||
requireConsent: false,
|
||||
|
||||
// Whether to track the initial page view
|
||||
// Default: true
|
||||
trackInitialView: true,
|
||||
|
||||
// Whether or not to log debug information
|
||||
// Default: false
|
||||
debug: false,
|
||||
})
|
||||
}
|
||||
@@ -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/2015/12/14/the-web-accessibility-basics/",
|
||||
"url": "https://www.marcozehe.de/articles/2015-12-14-the-web-accessibility-basics/",
|
||||
"tags": ["blog", "video", "semantics", "basics"]
|
||||
}
|
||||
]
|
||||
|
||||
113
resources/content-creators.json
Normal file
113
resources/content-creators.json
Normal file
@@ -0,0 +1,113 @@
|
||||
{
|
||||
"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 Dodson’s 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. Tutvid’s “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 UI’s 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"]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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://30-seconds.github.io/30-seconds-of-css/",
|
||||
"url": "https://www.30secondsofcode.org/css/",
|
||||
"tags": ["tips", "tricks", "collection"]
|
||||
},
|
||||
{
|
||||
@@ -139,6 +139,12 @@
|
||||
"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"]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,6 +43,12 @@
|
||||
"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"]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,6 +55,12 @@
|
||||
"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"]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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://learn.freecodecamp.org",
|
||||
"url": "https://www.freecodecamp.org/learn/",
|
||||
"tags": ["design", "javascript", "courses", "security", "interview"]
|
||||
},
|
||||
{
|
||||
|
||||
@@ -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,6 +67,18 @@
|
||||
"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"]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -14,6 +14,8 @@ 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
|
||||
@@ -38,4 +40,6 @@ export default [
|
||||
utility,
|
||||
icons,
|
||||
accessibility,
|
||||
rust,
|
||||
contentCreators,
|
||||
].sort(sortByTitle)
|
||||
|
||||
@@ -40,10 +40,16 @@
|
||||
},
|
||||
{
|
||||
"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.",
|
||||
"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.",
|
||||
"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.",
|
||||
@@ -92,6 +98,12 @@
|
||||
"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",
|
||||
@@ -111,4 +123,4 @@
|
||||
"tags": ["email", "solutions", "detailed"]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
114
resources/rust.json
Normal file
114
resources/rust.json
Normal file
@@ -0,0 +1,114 @@
|
||||
{
|
||||
"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"]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -187,6 +187,12 @@
|
||||
"desc": "The Postwoman API request builder helps you create your requests faster, saving you precious time on your development.",
|
||||
"url": "https://Postwoman.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"]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ export const getters = {
|
||||
findCategory: state => categoryTitle => {
|
||||
// equalsCategoryTitle :: Category -> Bool
|
||||
const equalsCategoryTitle = R.compose(
|
||||
R.equals(cleanString(categoryTitle)), cleanString, R.prop('title')
|
||||
R.equals(cleanString(categoryTitle)), R.replace(/ /g, '-') ,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
|
||||
Reference in New Issue
Block a user