feat: add blog

This commit is contained in:
limes.pink 2025-04-16 13:53:42 +02:00
parent 6119c1a861
commit a0f5fdd205
90 changed files with 643 additions and 32 deletions

17
content.config.ts Normal file
View File

@ -0,0 +1,17 @@
import { defineContentConfig, defineCollection, z } from '@nuxt/content';
export default defineContentConfig({
collections: {
blog: defineCollection({
type: 'page',
source: 'blog/*.md',
schema: z.object({
author: z.string(),
author_image: z.string(),
date: z.string(),
caption: z.string(),
cover_image: z.string()
})
})
}
});

View File

@ -83,7 +83,7 @@ In the latest version of the Cemu 2.0 experimental builds, support for Pretendo
If you haven't yet seen this video by Good Vibes Gaming, go check it out! I won't go anywhere...
[yt-iframe](Xtc9DJ6LYas)
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/Xtc9DJ6LYas" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
All done? Welcome back! Yes, you aren't dreaming - Wii U Chat is finally here! The journey leading up to this point has been an adventurous one, so grab your popcorn as we go back to the beginning.

View File

@ -33,19 +33,19 @@ Both Mario Kart 7 and Mario Kart 8 have started going online and can play matche
![Screenshot of Billy showing off CTGP-7](/assets/images/blogposts/screenshot-of-billy-showing-off-ctgp-7.webp)
[yt-iframe](W974FEDIoAA)
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/W974FEDIoAA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
## Hello YouTube!
An unintended side effect of working on Miiverse support in Mario Kart 8 was YouTube uploading being re-enabled! You can now upload race clips from Mario Kart 8 to YouTube again. Patrons who run the Miiverse patch can try this feature out right now
[yt-iframe](d3Bq7auupV0)
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/d3Bq7auupV0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
## Squid Game
Splatoon multiplayer battles now works! As of now only private friend battles have been tested, but they seem to be working without issue
[yt-iframe](d_qFnXrP7a4)
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/d_qFnXrP7a4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
## Friendship is magic

View File

@ -32,7 +32,7 @@ Juxt started out before I actually even joined the Pretendo Network development
From there we quickly realized that the scope of this project was going to be much larger than we though, and moved on to experimenting with the Miiverse Applet itself
[yt-iframe](d9VAr9sEvCo)
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/d9VAr9sEvCo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
> Check out this ancient video of the first demo website that was running in the Miiverse Applet.
@ -40,11 +40,11 @@ Shortly after this the project was absorbed into the Pretendo Network, and our f
2020 was a big year for Juxt, going from the simple api server before, to rapidly building out its web interface and features across both the 3DS and Wii u
[yt-iframe](NrfaOx5xcJY)
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/NrfaOx5xcJY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
> First attempt at an interface for the 3DS
[yt-iframe](IXnJOacx_gE)
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/IXnJOacx_gE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
> Community page Demo on the Wii U

View File

@ -1,13 +1,13 @@
---
title: "Test"
author: "pinklimes"
author_image: "https://github.com/pinklimes.png"
author: "limes.pink"
author_image: "https://github.com/gitlimes.png"
date: "January 20, 2038"
caption: "A post to test the styling of the various elements we might use (rename to _test.md before deploying the blog section)"
caption: "A post to test the styling of the various elements we might use"
cover_image: "https://media.discordapp.net/attachments/413884110667251722/886474243662037062/image1.jpg"
---
A post to test the styling of the various elements we might use (rename to _test.md before deploying the blog section)
A post to test the styling of the various elements we might use
**bold**
@ -126,14 +126,18 @@ console.log(trueOrFalseJSON);
<cite>Adapted from [blockquote: The Block Quotation element, from MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/blockquote)</cite>
[yt-iframe](djV11Xbc914)
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/djV11Xbc914" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
```[yt-iframe](djV11Xbc914)```
```<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/djV11Xbc914" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>```
![test](https://media.discordapp.net/attachments/413884110667251722/886474243662037062/image1.jpg)
![test](https://upload.wikimedia.org/wikipedia/commons/5/57/View_of_the_Turin_Metro_tracks_from_Fermi_terminal.jpg)
<a href="https://commons.wikimedia.org/wiki/File:View_of_the_Turin_Metro_tracks_from_Fermi_terminal.jpg">Wikilimes</a> (that's me!), <a href="https://creativecommons.org/licenses/by-sa/4.0">CC BY-SA 4.0</a>, via Wikimedia Commons
***
<video controls>
<source src="https://cdn.discordapp.com/attachments/413884110667251722/878216238940160040/video0.mov">
<source src="https://upload.wikimedia.org/wikipedia/commons/transcoded/5/5f/Steamboat_Willie_%281928%29_by_Walt_Disney.webm/Steamboat_Willie_%281928%29_by_Walt_Disney.webm.720p.vp9.webm">
</video>
Blogposts whose filename starts with a \_ will not show up on the /blogs page, but will still be accessible from the url (keep in mind that the file is still going to be publicly accessible on GitHub).
Blogposts with filename starting with \_ will not show up on the /blogs page, but will still be accessible via the url.

View File

@ -26,6 +26,16 @@ export default defineNuxtConfig({
}
},
content: {
build: {
markdown: {
highlight: {
theme: 'github-dark'
}
}
}
},
i18n: {
compilation: {
strictMessage: false

View File

@ -50,7 +50,8 @@ body,
}
code {
background-color: var(--bg-shade-0);
display: inline-block;
background-color: #191919;
padding: 4px;
border-radius: 4px;
font-family: Consolas, Monaco, "Andale Mono", monospace;
@ -58,6 +59,20 @@ code {
color: var(--text-shade-2);
}
h1.dot:not([data-title-suffix]):after,
h2.dot:not([data-title-suffix]):after {
content: ".";
display: inline-block;
color: var(--accent-shade-1);
}
h1.dot[data-title-suffix]:after,
h2.dot[data-title-suffix]:after {
content: attr(data-title-suffix);
display: inline-block;
color: var(--accent-shade-1);
}
/* BUTTONS */
button,
@ -186,7 +201,7 @@ input[type="checkbox"] {
cursor: pointer;
}
input[type="checkbox"]:checked {
background: no-repeat center/contain url(../images/check.svg), var(--accent-shade-0);
background: no-repeat center/contain url(/assets/images/check.svg), var(--accent-shade-0);
}
input {

309
src/pages/blog/[slug].vue Normal file
View File

@ -0,0 +1,309 @@
<script setup>
const slug = useRoute().params.slug;
const { data: post } = await useAsyncData(`blog-${slug}`, () => {
return queryCollection('blog').path(`/blog/${slug}`).first();
});
useHead({
title: `${post.value.title} | Pretendo Network Blog`,
meta: [
{ property: 'description', content: post.value.caption },
{ property: 'og:title', content: `${post.value.title} | Pretendo Network Blog` },
{ property: 'og:description', content: post.value.caption },
{ property: 'og:type', content: 'website' },
{ property: 'og:url', content: 'https://pretendo.network/' },
{ property: 'og:image', content: post.value.cover_image },
{ property: 'og:image:alt', content: 'Pretendo Network' },
{ property: 'og:site_name', content: 'Pretendo Network' },
{ name: 'twitter:url', content: 'https://pretendo.network/' },
{ name: 'twitter:card', content: 'summary_large_image' },
{ name: 'twitter:site', content: '@PretendoNetwork' },
{ name: 'twitter:title', content: `${post.value.title} | Pretendo Network Blog` },
{ name: 'twitter:description', content: post.value.caption },
{ name: 'twitter:image', content: post.value.cover_image }
]
});
</script>
<template>
<div class="card-wrap">
<div class="blog-card">
<h1 class="title">
{{ post.title }}
</h1>
<div class="pub-info">
<span>{{ $t('blogPage.published') }}</span>
<div class="profile">
<img
class="profile-picture"
:src="post.author_image"
:alt="post.author"
>
<span>{{ post.author }}</span>
</div>
<span>{{ $t('blogPage.publishedOn') }}
<span class="date">{{ post.date }}</span>
</span>
</div>
<ContentRenderer :value="post" />
</div>
</div>
</template>
<style scoped>
.card-wrap {
width: 100%;
display: flex;
flex-flow: column nowrap;
align-items: center;
margin: 8rem 0;
}
.blog-card {
padding: 60px;
border-radius: 10px;
background: var(--bg-shade-0);
max-width: 1100px;
color: var(--text-shade-1);
}
.blog-card :deep(h1),
.blog-card :deep(h2),
.blog-card :deep(h3),
.blog-card :deep(h4),
.blog-card :deep(h5),
.blog-card :deep(h6) {
margin: 40px 0 10px;
color: var(--text-shade-3) !important;
}
.blog-card :deep(strong) {
color: var(--text-shade-3);
}
.blog-card :deep(a), .blog-card :deep(a) * {
color: inherit;
text-decoration: none;
}
.blog-card :deep(a:hover), .blog-card :deep(a:hover) * {
text-decoration: underline;
}
.blog-card :deep(*:not(h1, h2, h3, h4, h5, h6) > a),
.blog-card :deep(*:not(h1, h2, h3, h4, h5, h6) > a) * {
color: var(--accent-shade-1);
text-decoration: none;
font-weight: bold;
}
.blog-card :deep(*:not(h1, h2, h3, h4, h5, h6) > a):hover,
.blog-card :deep(*:not(h1, h2, h3, h4, h5, h6) > a):hover * {
text-decoration: underline;
}
.blog-card .title {
margin: 0;
margin-bottom: 8px;
}
.blog-card .pub-info {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: left;
margin-top: auto;
margin-bottom: 30px;
}
.blog-card .pub-info .date {
font-weight: bold;
color: var(--text-shade-3);
}
.blog-card .pub-info>* {
margin-right: 0.5em;
margin-top: 0.2em;
}
.blog-card .profile {
display: inline-grid;
grid-template-columns: 30px auto;
grid-gap: 10px;
font-weight: bold;
color: var(--text-shade-3);
align-items: center;
height: 32px;
margin-right: 0.3em;
}
.blog-card .profile img {
margin: 0;
border-radius: 4px;
border: 1px solid var(--border);
max-width: 100%;
}
.blog-card p,
.post-info {
color: var(--text-shade-1);
}
.blog-card :deep(img) {
max-width: 100%;
max-height: 800px;
margin: 10px auto;
display: block;
border-radius: 4px;
border: 1px solid var(--border);
}
.blog-card img.emoji {
display: inline;
margin: 0;
border: none;
}
.blog-card :deep(video) {
width: 100%;
border-radius: 4px;
border: 1px solid var(--border);
}
.blog-card :deep(iframe) {
width: 100%;
height: auto;
aspect-ratio: 16/9;
border-radius: 4px;
border: 1px solid var(--border);
}
/* Some twitter iframe specific stuff */
.blog-card .twitter-tweet {
margin: auto;
}
.blog-card .twitter-tweet iframe {
border: none;
/* Fixes the double border */
}
.blog-card :deep(table) {
border-radius: 4px;
border-collapse: collapse;
background: var(--bg-shade-3);
margin-bottom: 30px;
overflow: hidden;
}
.blog-card :deep(table) th {
padding: 8px 12px;
background: var(--bg-shade-4);
color: var(--text-shade-3);
}
.blog-card :deep(table) td {
padding: 8px 12px;
vertical-align: top;
border-radius: inherit;
}
.blog-card :deep(table) tr:nth-child(even) {
background: var(--bg-shade-2);
}
.blog-card :deep(pre code) {
border-radius: 4px;
margin-bottom: 30px;
}
.blog-card :deep(input[type="checkbox"]) {
appearance: none;
-webkit-appearance: none;
display: inline-block;
background: var(--bg-shade-3);
padding: 12px;
margin: 4px;
border-radius: 4px;
vertical-align: -60%;
}
.blog-card :deep(input[type="checkbox"]):checked {
content: "checkboxtest";
background: no-repeat center/contain url(/assets/images/check.svg),
var(--accent-shade-0);
}
.blog-card :deep(hr) {
border: 1px solid var(--text-shade-1);
margin: 30px 0;
}
.blog-card :deep(blockquote) {
border-left: 2px solid var(--text-shade-1);
padding: 8px 24px;
margin: 0;
margin-bottom: 30px;
}
.blog-card :deep(del) {
text-decoration: line-through;
}
.blog-card :deep(a > del) {
text-decoration: line-through;
}
.blog-card :deep(a:hover > del) {
text-decoration: line-through underline;
}
</style>
<style lang="scss">
@media screen and (min-width: 901px) {
#root {
.blog-card :deep(h1),
.blog-card :deep(h2),
.blog-card :deep(h3),
.blog-card :deep(h4),
.blog-card :deep(h5),
.blog-card :deep(h6) {
scroll-margin-top: 110px;
}
}
}
@media screen and (max-width: 800px) {
#root {
.blog-card {
padding: 40px;
}
}
}
@media screen and (max-width: 600px) {
#root {
.wrapper {
width: 100%;
}
header {
width: 90%;
margin: 35px auto;
}
.blog-card {
padding: 40px 5vw;
border-radius: 0;
margin-top: 0;
}
footer {
width: 95%;
margin: auto auto 40px;
}
}
}
</style>

270
src/pages/blog/index.vue Normal file
View File

@ -0,0 +1,270 @@
<script setup lang="ts">
/* eslint-disable vue/no-v-html -- we might wanna avoid this by rewriting the locales to use variables */
const { data: allPosts } = await useAsyncData('blog', () => queryCollection('blog').all());
const posts = allPosts.value?.filter(p => !p.path.startsWith('/blog/_')).sort((a, b) => {
return new Date(b.date).getTime() - new Date(a.date).getTime();
});
</script>
<template>
<div class="blog">
<div class="progress-hero">
<div class="hero-meta reduced-margin">
<svg
xmlns="http://www.w3.org/2000/svg"
width="48.87"
height="71.093"
viewBox="0 0 48.87 71.093"
>
<g
id="XMLID_6_"
transform="translate(0)"
>
<path
id="XMLID_15_"
d="M69.581,29.593c-2.029,1.068-.249,4.129,1.78,3.061,5.162-2.67,11.463-2.6,16.981-1.1,4.735,1.282,9.5,3.845,12.246,8.045,1.246,1.922,4.307.142,3.061-1.78C96.921,27.386,80.3,24.04,69.581,29.593Z"
transform="translate(-60.112 -20.086)"
fill="#9d6ff3"
/>
<path
id="XMLID_14_"
d="M103.359,21.045c-3.951-6.159-10.751-10-17.657-11.89C77.763,6.948,68.721,7.019,61.281,10.9c-2.029,1.068-.249,4.129,1.78,3.061,6.586-3.453,14.667-3.311,21.644-1.388,5.981,1.638,12.1,4.913,15.521,10.252C101.507,24.783,104.569,23,103.359,21.045Z"
transform="translate(-54.766 -7.693)"
fill="#9d6ff3"
/>
<path
id="XMLID_9_"
d="M65.995,47.8a20.7,20.7,0,0,0-12.958,4.45H47.27a2.579,2.579,0,0,0-2.67,2.456v47.239a2.763,2.763,0,0,0,2.67,2.67h5.838a2.639,2.639,0,0,0,2.528-2.67V87.564A21.228,21.228,0,1,0,65.995,47.8Zm0,33.178a12,12,0,1,1,12-12A12,12,0,0,1,65.995,80.978Z"
transform="translate(-44.6 -33.522)"
fill="#9d6ff3"
/>
</g>
</svg>
<h1 class="title dot">
{{ $t('blogPage.title') }}
</h1>
<p
class="text"
v-html="$t('blogPage.description')"
/>
</div>
</div>
<a
v-for="post in posts"
:key="post.id"
:href="post.path"
class="purple-card blog-card"
>
<div class="post-info">
<h2 class="title">{{ post.title }}</h2>
<p class="caption">{{ post.caption }}</p>
<div class="pub-info">
<span>{{ $t('blogPage.published') }}</span>
<div class="profile">
<img
class="profile-picture"
:src="post.author_image"
:alt="post.author"
>
<span>{{ post.author }}</span>
</div>
<span>{{ $t('blogPage.publishedOn') }}
<span class="date">{{ post.date }}</span>
</span>
</div>
</div>
<div
class="cover"
:style="{ 'background': `no-repeat center/cover url(${post.cover_image})` }"
/>
</a>
<div class="buttons">
<!-- TODO: implement pagination -->
<a
href="/blog/feed.xml"
target="_blank"
title="RSS feed"
>
<button class="button secondary icon-btn">
<Icon
name="ph:rss"
size="36"
/>
</button>
</a>
</div>
</div>
</template>
<style scoped>
.progress-hero {
width: 100%;
display: flex;
justify-items: center;
align-items: center;
text-align: center;
}
.progress-hero svg {
width: 3rem;
height: 3rem;
}
.progress-hero .text {
max-width: 423px;
color: var(--text-shade-1);
line-height: 1.8;
}
.progress-hero .text :deep(a) {
color: var(--accent-shade-1);
text-decoration: none;
font-weight: bold;
}
.progress-hero .text :deep(a):hover {
text-decoration: underline;
}
.hero-meta.reduced-margin {
margin: 10vh 0;
width: 100%;
}
.hero-meta.reduced-margin h1 {
width: 100%;
}
.hero-meta.reduced-margin p {
margin: 0 auto;
}
.blog-card {
display: flex;
flex-flow: row nowrap;
padding: 0;
margin: 0 auto;
max-width: 1000px;
margin-bottom: 30px;
text-decoration: none;
position: relative;
border-radius: 10px;
overflow: hidden;
background: var(--bg-shade-0);
}
.blog-card .post-info {
flex: 50%;
padding: 40px;
display: flex;
flex-flow: column;
color: var(--text-shade-1);
}
.blog-card .post-info .title {
color: var(--text-shade-3);
margin: 0;
}
.blog-card .post-info .caption {
margin: 4px 0 32px 0;
}
.blog-card .pub-info {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: left;
margin-top: auto;
}
.blog-card .pub-info .date {
font-weight: bold;
color: var(--text-shade-3);
}
.blog-card .pub-info>* {
margin-right: 0.5em;
margin-top: 0.2em;
}
.blog-card .profile {
display: inline-grid;
grid-template-columns: 30px auto;
grid-gap: 10px;
font-weight: bold;
color: var(--text-shade-3);
align-items: center;
height: 32px;
margin-right: 0.3em;
}
.blog-card .profile img {
border-radius: 4px;
border: 1px solid var(--border);
max-width: 100%;
}
.blog-card .cover {
flex: 50%;
border: 3px solid var(--bg-shade-0);
border-radius: 0 10px 10px 0;
}
.progress-hero a,
.progress-hero a * {
color: var(--accent-shade-1);
text-decoration: none;
font-weight: bold;
}
.progress-hero a:hover,
.progress-hero a:hover {
text-decoration: underline;
}
.buttons {
margin: 10vh auto;
width: min-content;
}
.buttons button.secondary.icon-btn {
cursor: pointer;
width: 48px;
height: 48px;
padding: 0;
}
footer {
margin-top: 160px;
}
</style>
<style lang="scss">
@media screen and (max-width: 900px) {
#root {
.blog-card {
flex-flow: column;
}
.blog-card .post-info {
padding: 30px;
}
.blog-card .cover {
order: -1;
min-height: 250px;
border-radius: 10px 10px 0 0;
}
footer {
margin-top: 100px;
}
}
}
@media screen and (max-width: 450px) {
#root {
.blog-card .cover {
min-height: 200px;
}
}
}
</style>

View File

@ -411,20 +411,6 @@ function titleSuffixHandler(path: string) {
margin: 48px auto 0;
}
h1.dot:not([data-title-suffix]):after,
h2.dot:not([data-title-suffix]):after {
content: ".";
display: inline-block;
color: var(--accent-shade-1);
}
h1.dot[data-title-suffix]:after,
h2.dot[data-title-suffix]:after {
content: attr(data-title-suffix);
display: inline-block;
color: var(--accent-shade-1);
}
/* Misc */
.purple-circle {
position: absolute;

View File

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 78 KiB

View File

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

View File

Before

Width:  |  Height:  |  Size: 497 KiB

After

Width:  |  Height:  |  Size: 497 KiB

View File

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View File

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 90 KiB

View File

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 71 KiB

View File

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

View File

Before

Width:  |  Height:  |  Size: 9.7 KiB

After

Width:  |  Height:  |  Size: 9.7 KiB

View File

Before

Width:  |  Height:  |  Size: 285 KiB

After

Width:  |  Height:  |  Size: 285 KiB

View File

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 56 KiB

View File

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 77 KiB

View File

Before

Width:  |  Height:  |  Size: 9.2 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.8 MiB

After

Width:  |  Height:  |  Size: 1.8 MiB

View File

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 62 KiB

View File

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 114 KiB

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

Before

Width:  |  Height:  |  Size: 118 KiB

After

Width:  |  Height:  |  Size: 118 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 145 KiB

After

Width:  |  Height:  |  Size: 145 KiB

View File

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 46 KiB

View File

Before

Width:  |  Height:  |  Size: 434 KiB

After

Width:  |  Height:  |  Size: 434 KiB

View File

Before

Width:  |  Height:  |  Size: 407 KiB

After

Width:  |  Height:  |  Size: 407 KiB

View File

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 60 KiB

View File

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

View File

Before

Width:  |  Height:  |  Size: 118 KiB

After

Width:  |  Height:  |  Size: 118 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 2.1 MiB

After

Width:  |  Height:  |  Size: 2.1 MiB

View File

Before

Width:  |  Height:  |  Size: 106 KiB

After

Width:  |  Height:  |  Size: 106 KiB

View File

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

View File

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 101 KiB

View File

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 61 KiB

View File

Before

Width:  |  Height:  |  Size: 9.5 KiB

After

Width:  |  Height:  |  Size: 9.5 KiB

View File

Before

Width:  |  Height:  |  Size: 727 KiB

After

Width:  |  Height:  |  Size: 727 KiB

View File

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 67 KiB

View File

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 43 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 741 KiB

After

Width:  |  Height:  |  Size: 741 KiB

View File

Before

Width:  |  Height:  |  Size: 688 KiB

After

Width:  |  Height:  |  Size: 688 KiB

View File

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 56 KiB

View File

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 78 KiB

View File

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View File

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 86 KiB

View File

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

Before

Width:  |  Height:  |  Size: 135 KiB

After

Width:  |  Height:  |  Size: 135 KiB

View File

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

View File

Before

Width:  |  Height:  |  Size: 255 B

After

Width:  |  Height:  |  Size: 255 B