Compare commits

...
Author SHA1 Message Date
402fe6bf12 .
Some checks failed
Build Eleventy Forgero / build (24.x) (push) Has been cancelled
2026-07-28 01:28:05 -03:00
c6ef4ff68c Make home aside webrings list collapsable. 2026-07-10 13:35:10 -03:00
1326b8335f Fix header selector for mobile media query. 2026-07-10 13:09:18 -03:00
ac895d086c Add goodbye amv to blog posts. 2026-07-10 11:35:48 -03:00
70ef02fde8 Fix header appearing on top of metromenu on tumblr layout. 2026-07-09 11:11:15 -03:00
e6df6008ae Add webresources misc page 2026-07-09 11:07:52 -03:00
d9fb667c77 Fix CSS values in quotes for tumblr header. 2026-07-08 20:21:56 -03:00
8f5dddde49 Add link target sanitization in Tumblr JS and comments for easier reusing. 2026-07-08 20:16:53 -03:00
65f7d573cd Move tumblr JS right after header creation and remove defer for minimum delay. 2026-07-08 19:59:07 -03:00
c8eb82b8e1 Add javascript to adapt design to Tumblr ADS. 2026-07-08 19:50:01 -03:00
1e1f56b337 Ad CDRing widget 2026-07-08 18:36:39 -03:00
dc0b9b14cb Add bad coders webring, update kumaos. 2026-07-07 16:42:07 -03:00
770369c84b Add background, welcome message and changelog to kumos 2026-07-05 23:35:39 -03:00
964bd2e808 Add kumos. 2026-07-05 23:23:26 -03:00
8a2c269d26 Fetch Mastodon posts only on production. 2026-07-05 18:58:28 -03:00
c929984d81 Add guestbook to index aside, add template for widgets, add more 88x31. 2026-07-05 16:50:26 -03:00
338bdadd76 Improve acccessibility with more localized alt text. 2026-07-05 14:37:18 -03:00
f4fc14c66d Add highlight to current section on header links, add rating warning on social page, add bribribribribri's website to hotlinks. 2026-07-05 13:49:07 -03:00
e29ef5d30b Add Disroot to bookmarks. 2026-07-05 12:35:30 -03:00
5f2000277b Fire animation on the hotlinks div instead of title 2026-07-05 12:29:44 -03:00
a0ac19a14a Add orpheus.network to bookmarks. 2026-07-05 11:26:08 -03:00
09eb079cf9 Add fire animation when hovering "hotlinks" title in index 2026-07-05 11:20:12 -03:00
e0b3e7a745 Add wrongos 88x31 to index, add link favicon to bookmarks, add hotlinking page, add appak to home friends and rename friends section to hotlinks. 2026-07-05 11:06:25 -03:00
cd0e5d2945 Change social page to show post media, change home squares border opacity and change social page styling. 2026-07-04 20:56:51 -03:00
648869bf76 Add social page with archived mastodon posts, move source to /site 2026-07-04 16:57:55 -03:00
a301a5cc5e Add reading time to post header, remove purgecss because it was breaking CSS used by injected HTML. 2026-07-04 16:23:14 -03:00
6a6c9043d4 Add CSS purging 2026-07-04 16:05:55 -03:00
2a68ab9964 Add mastodon archive plugin. 2026-07-04 16:01:48 -03:00
6b53b4cd7a Fix build workflow 2026-07-04 15:42:38 -03:00
8d39c82952 Fix internetometer image overflowing aside. 2026-07-04 15:37:38 -03:00
e9bbeb6dd3 Add AI poisoning. 2026-07-04 15:36:25 -03:00
d8d466b638 Change build.yml to include full commit history when building. Fixes changelog in about page showing only last commit. 2026-07-04 15:23:50 -03:00
117ebc4ac3 Change 88x31 macro to make click zoom optional. 2026-07-04 15:18:44 -03:00
5a4faee769 Add additional credits to about page, add internetometer to aside as widget. 2026-07-04 15:14:58 -03:00
ece5c71abd Change main.css to limit aside size. 2026-07-04 14:51:17 -03:00
ab071b0f78 Convert .eleventy.js to EJS, add friends to index's aside, create playground page to test site elements, add syntax highlighting with custom theme, convert header subtitle from link to paragraph, add support for custom alt text in 88x31 macro, new template for generic text pages, add changelog to about page with recent commits. 2026-07-04 14:34:59 -03:00
ad14058b74 Fix link color contrast in blog page 2026-07-04 00:12:51 -03:00
d3d284c9ce Add blog posts to home screen, make template for webrings, add footer, remove unused stuff 2026-07-03 14:23:21 -03:00
6ce63b3e74 Add wrongos webring widget 2026-07-02 17:25:51 -03:00
d276a90639 Fix uppercase tenkuma in english index string and add margin to webrings. 2026-07-01 22:05:59 -03:00
c17d7c8f41 Add hover tip to droidring widget buttons 2026-07-01 22:02:07 -03:00
e19cd535eb Fix index appearance without JS 2026-07-01 21:58:07 -03:00
cb9f09d92f Move webrings to aside for better visibility, polished stylesheet for better link visibility. 2026-07-01 21:33:37 -03:00
b601767281 Add breakcore webring 2026-07-01 19:28:00 -03:00
b80cb0bf37 Hide mastodon verification link 2026-07-01 19:24:44 -03:00
e33284c856 Add mstdn.social verification tag 2026-07-01 18:30:52 -03:00
192 changed files with 3837 additions and 1951 deletions

89
.cache/mastodon.json Normal file
View file

@ -0,0 +1,89 @@
{
"lastFetched": "2026-07-05T22:01:02.267Z",
"posts": [
{
"date": "2026-07-03T01:51:37.604Z",
"id": "116853538658966225",
"content": "<p>So about the <a href=\"https://mstdn.social/tags/digitalcircus\" class=\"mention hashtag\" rel=\"tag\">#<span>digitalcircus</span></a> finale.</p><p>They made me cry tears I&#39;ve been holding for long. The way this EP dealed with supressed emotions and coping with the pain of what&#39;s unchangeable, unfixable; communicated deeply with me. It&#39;s funny I cried laughing in realization of how warm and clever this goodbye was.</p><p>It&#39;s the best bittersweet ending I could ever wish for the show.</p><p>OH GOD the part they tell Jax is doing okay. You can&#39;t hit my heart harder than that 😭😭😭</p>",
"source_url": "https://mstdn.social/@tenkuma/116853538658966225",
"site": "Mastodon",
"media": [],
"emojis": []
},
{
"date": "2026-07-01T22:04:13.252Z",
"id": "116846982152346064",
"content": "<p>if I wanted shit there&#39;s a shit generator at chat.openai.com</p>",
"source_url": "https://mstdn.social/@tenkuma/116846982152346064",
"site": "Mastodon",
"media": [],
"emojis": []
},
{
"date": "2025-07-08T21:40:54.760Z",
"id": "114819783377460165",
"content": "<p>I love how ya&#39;ll humans give grades for vulnerabilities</p><p><span class=\"h-card\" translate=\"no\"><a href=\"https://infosec.exchange/@cR0w\" class=\"u-url mention\">@<span>cR0w</span></a></span> <a href=\"https://infosec.exchange/@cR0w/114819777669875206\" target=\"_blank\" rel=\"nofollow noopener\" translate=\"no\"><span class=\"invisible\">https://</span><span class=\"ellipsis\">infosec.exchange/@cR0w/1148197</span><span class=\"invisible\">77669875206</span></a></p>",
"source_url": "https://mstdn.social/@tenkuma/114819783377460165",
"site": "Mastodon",
"media": [],
"emojis": []
},
{
"date": "2025-07-07T22:42:45.377Z",
"id": "114814364246016516",
"content": "<p>Another level of nostalgia playing Roblox on Linux with Sober! Plus wearing that Linux t-shirt just feels right. Good times...</p><p><a href=\"https://mstdn.social/tags/RobloxSober\" class=\"mention hashtag\" rel=\"tag\">#<span>RobloxSober</span></a></p>",
"source_url": "https://mstdn.social/@tenkuma/114814364246016516",
"site": "Mastodon",
"media": [
{
"image": "https://media.mstdn.social/media_attachments/files/114/814/350/913/893/408/original/a0c9e5a52e282587.png",
"alt": null,
"width": 640,
"height": 360,
"aspect": 1.7777777777777777
}
],
"emojis": []
},
{
"date": "2025-07-01T09:12:57.603Z",
"id": "114777206135368914",
"content": "<p>Meet Pete the cat :baba_baba:</p><p>He is as sleepy as I am.</p>",
"source_url": "https://mstdn.social/@tenkuma/114777206135368914",
"site": "Mastodon",
"media": [
{
"image": "https://media.mstdn.social/media_attachments/files/114/777/200/647/969/908/original/203ba60ae84a96cb.jpg",
"alt": "Black and white cat lying in a sofa.",
"width": 554,
"height": 415,
"aspect": 1.3349397590361445
}
],
"emojis": [
{
"shortcode": "baba_baba",
"url": "https://media.mstdn.social/custom_emojis/images/000/641/966/static/8d71b7179d1a7445.png"
}
]
},
{
"date": "2025-06-29T03:15:31.767Z",
"id": "114764476040214757",
"content": "<p><span class=\"h-card\" translate=\"no\"><a href=\"https://infosec.exchange/@cR0w\" class=\"u-url mention\">@<span>cR0w</span></a></span> this guy bio is just impeccable.</p>",
"source_url": "https://mstdn.social/@tenkuma/114764476040214757",
"site": "Mastodon",
"media": [],
"emojis": []
},
{
"date": "2025-06-10T21:32:12.812Z",
"id": "114661204480015822",
"content": "<p>Hello, world.</p>",
"source_url": "https://mstdn.social/@tenkuma/114661204480015822",
"site": "Mastodon",
"media": [],
"emojis": []
}
]
}

View file

@ -1,46 +1,101 @@
const fs = require("fs"); import fs from "fs";
const path = require("path"); import path from "path";
const i18n = require('./_data/i18n.js');
module.exports = function(eleventyConfig) { import syntaxHighlight from "@11ty/eleventy-plugin-syntaxhighlight";
eleventyConfig.addCollection("post", function(collectionApi) { import safeLinks from "@sardine/eleventy-plugin-external-links";
return collectionApi.getFilteredByGlob("./posts/*").sort((a, b) => b.date - a.date); import pluginGitCommitDate from "eleventy-plugin-git-commit-date";
import recentChanges from "eleventy-plugin-recent-changes";
// import Webmentions from "eleventy-plugin-webmentions"; // configure later
import pluginInlineLinkFavicon from "eleventy-plugin-inline-link-favicon";
import poison from "eleventy-plugin-poison";
import mastoarchive from "eleventy-plugin-mastoarchive";
// import purgeCssPlugin from "eleventy-plugin-purgecss";
import pluginCleanUrls from "@inframanufaktur/eleventy-plugin-clean-urls";
// import githubRepos from 'eleventy-plugin-github-repos';
import readingTime from 'eleventy-plugin-reading-time';
// import i18n from "./_data/i18n.js";
const production = (process.env.GITHUB_ACTIONS || process.env.FORGEJO_ACTIONS || process.env.IS_PRODUCTION);
console.log("Production:", production ? "true" : "false");
export default function (eleventyConfig) {
eleventyConfig.setInputDirectory("site");
eleventyConfig.setQuietMode(true);
eleventyConfig.addPlugin(syntaxHighlight);
eleventyConfig.addPlugin(safeLinks);
eleventyConfig.addPlugin(pluginGitCommitDate);
eleventyConfig.addPlugin(recentChanges, {
commits: 10,
}); });
eleventyConfig.addCollection("misc", (api) => eleventyConfig.addPlugin(pluginInlineLinkFavicon);
api.getFilteredByTag("misc") eleventyConfig.addPlugin(poison);
); eleventyConfig.addPlugin(mastoarchive, {
host: "https://mstdn.social",
userId: "114661188739031987",
cacheLocation: ".cache/mastodon.json",
isProduction: production
});
// eleventyConfig.addPlugin(purgeCssPlugin, {
// config: "./purgecss.config.cjs",
// quiet: false,
// });
eleventyConfig.addPlugin(pluginCleanUrls);
// eleventyConfig.addPlugin(githubRepos, { userAccount: 'adrianvic' });
eleventyConfig.addPlugin(readingTime);
eleventyConfig.addWatchTarget("./site");
eleventyConfig.addCollection("post", function (collectionApi) {
return collectionApi
.getFilteredByGlob("./site/posts/*")
.sort((a, b) => b.date - a.date);
});
eleventyConfig.addCollection("misc", (api) => api.getFilteredByTag("misc"));
eleventyConfig.addFilter("getTranslation", (page, lang) => { eleventyConfig.addFilter("getTranslation", (page, lang) => {
const dir = path.dirname(page.inputPath); const dir = path.dirname(page.inputPath);
const file = path.join(dir, `${lang}.json`); const file = path.join(dir, `${lang}.json`);
if (fs.existsSync(file)) { if (fs.existsSync(file)) {
return JSON.parse(fs.readFileSync(file, "utf-8")); return JSON.parse(fs.readFileSync(file, "utf-8"));
} }
return {}; return {};
}); });
eleventyConfig.addCollection("88x31", () => { eleventyConfig.addCollection("88x31", () => {
return fs.readdirSync("static/images/88x31") return fs
.map(file => ({ .readdirSync("static/images/88x31")
url: `/static/images/88x31/${file}`, .map((file) => ({
fileSlug: file url: `/static/images/88x31/${file}`,
})); fileSlug: file,
}));
}); });
eleventyConfig.addPassthroughCopy("static"); eleventyConfig.addPassthroughCopy("static");
eleventyConfig.addNunjucksFilter("alternateLanguages", function(collection, postId, currentLanguageKey) { eleventyConfig.addNunjucksFilter(
return collection.filter(post => "alternateLanguages",
post.data.postId === postId && post.data.langKey !== currentLanguageKey function (collection, postId, currentLanguageKey) {
) return collection
.map(post => ({ .filter(
lang: post.data.langKey, (post) =>
url: post.url, post.data.postId === postId &&
title: post.data.title post.data.langKey !== currentLanguageKey
})) )
}); .map((post) => ({
lang: post.data.langKey,
url: post.url,
title: post.data.title,
}));
}
);
eleventyConfig.addFilter("absoluteUrl", function(url) { eleventyConfig.addFilter("absoluteUrl", function (url) {
const base = "https://adrianvic.github.io"; const base = "https://adrianvic.github.io";
const prefix = process.env.GITHUB_ACTIONS ? "" : "/tenkuma/web"; const prefix = process.env.GITHUB_ACTIONS ? "" : "/tenkuma/web";
return base + prefix + url; return base + prefix + url;
@ -52,24 +107,65 @@ module.exports = function(eleventyConfig) {
year: "numeric", year: "numeric",
month: "numeric", month: "numeric",
day: "numeric", day: "numeric",
timeZone: "America/Sao_Paulo" timeZone: "America/Sao_Paulo",
}); });
}); });
eleventyConfig.addNunjucksFilter("smartTitle", function(str) { eleventyConfig.addNunjucksFilter("smartTitle", function (str) {
if (!str) return ""; if (!str) return "";
const smallWords = ["a","an","and","at","but","by","for","in","nor","of","on","or","so","the","to","up","yet", const smallWords = [
"e","de","do","da","dos","das","a","o","um","uma","em","por","para","com","no","na","nos"]; "a",
return str.toLowerCase().split(" ").map((word, i) => { "an",
if (i === 0) return word.charAt(0).toUpperCase() + word.slice(1); "and",
return smallWords.includes(word) ? word : word.charAt(0).toUpperCase() + word.slice(1); "at",
}).join(" "); "but",
"by",
"for",
"in",
"nor",
"of",
"on",
"or",
"so",
"the",
"to",
"up",
"yet",
"e",
"de",
"do",
"da",
"dos",
"das",
"a",
"o",
"um",
"uma",
"em",
"por",
"para",
"com",
"no",
"na",
"nos",
];
return str
.toLowerCase()
.split(" ")
.map((word, i) => {
if (i === 0) return word.charAt(0).toUpperCase() + word.slice(1);
return smallWords.includes(word)
? word
: word.charAt(0).toUpperCase() + word.slice(1);
})
.join(" ");
}); });
return { return {
pathPrefix: process.env.GITHUB_ACTIONS ? "" : "/tenkuma/web", pathPrefix: process.env.GITHUB_ACTIONS ? "" : "/tenkuma/web",
dir: { dir: {
output: "docs" output: "docs",
} },
}; };
}; }

View file

@ -3,15 +3,15 @@ name: Build Eleventy
on: on:
push: push:
paths-ignore: paths-ignore:
- '/maintenance/**' - 'maintenance/**'
- '/README.md' - 'README.md'
branches: branches:
- main - main
workflow_dispatch: workflow_dispatch:
pull_request: pull_request:
paths-ignore: paths-ignore:
- '/maintenance/**' - 'maintenance/**'
- '/README.md' - 'README.md'
permissions: permissions:
contents: write contents: write
@ -26,6 +26,8 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Use Node.js ${{ matrix.node-version }} - name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4 uses: actions/setup-node@v4

View file

@ -1,28 +0,0 @@
<header>
<div>
<h1>{{ title or "Adrian Victor" }}</h1>
<a id="headerSubtitle"><i>{{ subtitle or "Fanasy is not a crime, find your castle in the sky." }}</i></a>
<script>
const headeri18n =
{
by: "{{ i18n[langKey].by | safe }}",
options: "{{ i18n[langKey].options | safe }}",
hideBackground: "{{ i18n[langKey].hideBackground | safe }}",
back: "{{ i18n[langKey].back | safe }}",
permissionIssue: "{{ i18n[langKey].permissionIssue | safe }}",
permissionIssueNotificationContent: "{{ i18n[langKey].permissionIssueNotificationContent | safe }}",
notificationDefaultHint: "{{ i18n[langKey].notificationDefaultHint | safe }}",
disableSoundEffects: "{{ i18n[langKey].disableSoundEffects | safe }}"
}
</script>
</div>
<div id="linksHelper">
<div id="music"></div>
<ul id="headerLinks">
<a href="{{ ('/' ~ langKey ~ '/') | url }}">{{ i18n[langKey].home }}</a>
<a href="{{ ('/' ~ langKey ~ '/blog/') | url }}">blog</a>
<a href="{{ ('/' ~ langKey ~ '/misc/') | url }}">misc</a>
</ul>
</div>
</header>

View file

@ -1,3 +0,0 @@
module.exports = {
langKey: data => data.lang
};

208
index.njk
View file

@ -1,208 +0,0 @@
---
pagination:
data: i18n
size: 1
alias: langKey
permalink: "/{{ langKey }}/index.html"
layout: base.njk
---
{% from "macros.njk" import i88x31 with context %}
{% from "macros.njk" import videoCard with context %}
{% from "macros.njk" import projectCard %}
<div id="homeSquares">
</div>
<main>
<script src="{{ '/static/scripts/home.js' | url }}" defer></script>
<noscript>
<style>
.hs {
display: unset !important;
}
#homeSquares {
display: none;
}
</style>
</noscript>
<div class="hs" id="hsDefault">
<div class="box kaoBox">
<p>{{ i18n[langKey].kaoMain | safe }}</p>
<p class="end-text nomargin">{{ i18n[langKey].kaoLink | safe }}</p>
</div>
<div class="box pageHeaderBox">
<h1 id="homeTitle">{{ i18n[langKey].welcome | smartTitle }}</h1>
<p>{{ i18n[langKey].homeWelcomeParagraph | safe }}</p>
<div class="homeBadgesBox">
{{ i88x31("tenkuma.gif") }}
{{ i88x31("anybrowser6.gif") }}
{{ i88x31("ai.gif") }}
{{ i88x31("WEBP.gif") }}
{{ i88x31("rainbowrain.gif") }}
{{ i88x31("blasphemy.gif") }}
{{ i88x31("css3.gif") }}
{{ i88x31("best_viewed_with_open_eyes.gif") }}
{{ i88x31("gnu-linux.gif") }}
</div>
</div>
<hr>
<h2>{{ i18n[langKey].aboutMe | smartTitle }}</h2>
<p>{{ i18n[langKey].homeAboutMeParagraph | safe }}</p>
<p>{{ i18n[langKey].homeAboutMeParagraphTwo | safe }}</p>
<h2>{{ i18n[langKey].socialsAndContact | smartTitle }}</h2>
<p>{{ i18n[langKey].homeSocialsAndContactParagraph | safe }}</p>
<p>{{ i18n[langKey].homeSocialsAndContactParagraphTwo | safe }}</p>
<h2>Webrings</h2>
<div id="homeWebrings">
<center>
<div class="droidringwidget">
<a href="https://kanandraw.neocities.org/stuffs/droidring/home"><img src="https://kanandraw.neocities.org/stuffs/droidring/assets/logo.png" style="width: 200px;"></a><br/>
<img src="https://kanandraw.neocities.org/stuffs/droidring/assets/droidwidget.png" style="width: 115px;"><br>
<div class="buttonsdroidring">
<a href="https://kanandraw.neocities.org/stuffs/droidring/home?action=previous"><button class="navdroidring">←</button></a>
<a href="https://kanandraw.neocities.org/stuffs/droidring/home?action=random"><button class="navdroidring" style="position: relative; top: 1.6px;">⚄</button></a>
<a href="https://kanandraw.neocities.org/stuffs/droidring/home?action=next"><button class="navdroidring">→</button></a>
</div>
<style>
.droidringwidget {
font-family: 'Droid Sans',sans-serif;
align-content: center;
text-align: center;
width: 215px;
border: 1px solid #666666;
background: linear-gradient(0deg, black, #000000db);
padding: 5px;
}
.buttonsdroidring {
background: #989898;
padding: 4px;
margin: -5px;
}
.navdroidring {
background: linear-gradient(to bottom, #F1F1F1, #B8B8B8);
padding: 5px;
color: black;
box-shadow: 0 3px 6px #00000029, 0 3px 6px #0000003B;
border: none;
width: 50px;
height: 27px;
min-width: 50px;
}
.navdroidring:active {
background: linear-gradient(to bottom,#FFD554,#E99D00);
}
/* .navdroidring:hover {
background: linear-gradient(to bottom, #ffebc4, #f2f2f2);
} */
</style>
</div>
</center>
</div>
</div>
<div class="hs" id="hsMusic">
<div class="box pageHeaderBox">
<h1>{{ i18n[langKey].myMusic | smartTitle }}</h1>
<p>{{ i18n[langKey].homeMyMusicParagraph | safe }}</p>
<p>{{ i18n[langKey].homeMyMusicParagraphTwo | safe }}</p>
<div class="homeBadgesBox">
{{ i88x31("rave.gif") }}
{{ i88x31("happymix.gif") }}
</div>
</div>
<hr>
<div class="hsMusicCard">
{{
videoCard(
i18n["global"].homeSongLink,
i18n["global"].homeSongTitle,
i18n["global"].homeSongImage,
i18n["global"].homeSongWebsite,
i18n["global"].homeSongDuration,
i18n["global"].homeSongAccent
)
}}
</div>
</div>
<div class="hs" id="hsVideo">
<div class="box pageHeaderBox">
<h1>{{ i18n[langKey].myVideos | smartTitle }}</h1>
<p>{{ i18n[langKey].homeMyVideoParagraph | safe }}</p>
</div>
<hr>
{{
videoCard(
i18n["global"].homeVideoLink,
i18n[langKey].homeVideoTitle,
i18n["global"].homeVideoImage,
i18n["global"].homeVideoWebsite,
i18n["global"].homeVideoDuration
)
}}
</div>
<div class="hs" id="hsCode">
<div class="box pageHeaderBox">
<h1>{{ i18n[langKey].mySoftware | smartTitle }}</h1>
<p>{{ i18n[langKey].homeMySoftwareParagraph | safe }}</p>
</div>
<hr>
<div class="hsProjects">
{{
projectCard(
"Jamfish",
i18n[langKey].jamfishProjectDesctiption,
"https://github.com/adrianvic/jamfish",
'/static/images/jamfish-wide.png',
"Jamfish"
)
}}
{{
projectCard(
"ItemEconomy",
i18n[langKey].itemeconomyProjectDesctiption,
"https://github.com/adrianvic/ItemEconomy",
'/static/images/itemeconomy2-wide.png',
"ItemEconomy"
)
}}
{{
projectCard(
"Eye of Nemesis",
i18n[langKey].eyeofnemesisProjectDesctiption,
"https://github.com/adrianvic/NemesisEye",
'/static/images/eye_of_nemesis.png',
"Eye of Nemesis"
)
}}
{{
projectCard(
"PestoWiki",
i18n[langKey].pestoProjectDesctiption,
"https://github.com/Margarina-not-butter/PestoWiki",
'/static/images/pestowikifullwhite.png',
"PestoWiki"
)
}}
</div>
</div>
</main>

View file

@ -1,191 +0,0 @@
// Coded entirely by ChatGPT
// :(
const express = require("express");
const fs = require("fs");
const parser = require("@babel/parser");
const traverse = require("@babel/traverse").default;
const generate = require("@babel/generator").default;
const t = require("@babel/types");
const app = express();
app.use(express.json());
const FILE = "../_data/i18n.js";
function loadAST() {
const code = fs.readFileSync(FILE, "utf8");
return parser.parse(code, { sourceType: "module" });
}
function extract(ast) {
const out = {};
traverse(ast, {
AssignmentExpression(path) {
if (
path.node.left.object?.name === "module" &&
path.node.left.property?.name === "exports"
) {
path.node.right.properties.forEach(langProp => {
const lang = langProp.key.name || langProp.key.value;
out[lang] = {};
langProp.value.properties.forEach(p => {
const key = p.key.name || p.key.value;
out[lang][key] = p.value.extra?.raw || generate(p.value).code;
});
});
}
}
});
return out;
}
function write(ast, newData) {
traverse(ast, {
AssignmentExpression(path) {
if (
path.node.left.object?.name === "module" &&
path.node.left.property?.name === "exports"
) {
path.node.right.properties.forEach(langProp => {
const lang = langProp.key.name || langProp.key.value;
const existingKeys = new Set(
langProp.value.properties.map(p => p.key.name || p.key.value)
);
// update existing
langProp.value.properties.forEach(p => {
const key = p.key.name || p.key.value;
if (key in (newData[lang] || {})) {
p.value = parser.parseExpression(newData[lang][key]);
}
});
// add new keys
Object.keys(newData[lang] || {}).forEach(key => {
if (!existingKeys.has(key)) {
langProp.value.properties.push(
t.objectProperty(
t.identifier(key),
parser.parseExpression(newData[lang][key])
)
);
}
});
});
}
}
});
const output = generate(ast, { retainLines: true }).code;
fs.writeFileSync(FILE, output);
}
app.get("/data", (req, res) => {
const ast = loadAST();
res.json(extract(ast));
});
app.post("/save", (req, res) => {
const ast = loadAST();
write(ast, req.body);
res.send("ok");
});
app.get("/", (req, res) => {
res.send(`
<!DOCTYPE html>
<html>
<body>
<h2>i18n Editor</h2>
<table id="t"></table>
<button onclick="addRow()">Add</button>
<button onclick="save()">Save</button>
<script>
let data;
fetch('/data').then(r=>r.json()).then(d=>{
data=d;
render();
});
function render(){
const table=document.getElementById('t');
table.innerHTML='';
const langs=Object.keys(data);
const keys=[...new Set(langs.flatMap(l=>Object.keys(data[l]||{})))];
// header
const headRow=document.createElement('tr');
const thKey=document.createElement('th');
thKey.textContent='key';
headRow.appendChild(thKey);
langs.forEach(l=>{
const th=document.createElement('th');
th.textContent=l;
headRow.appendChild(th);
});
table.appendChild(headRow);
// rows
keys.forEach(k=>{
const tr=document.createElement('tr');
const tdKey=document.createElement('td');
tdKey.textContent=k;
tr.appendChild(tdKey);
langs.forEach(l=>{
const td=document.createElement('td');
const input=document.createElement('input');
input.value = (data[l] && data[l][k]) || '';
input.addEventListener('change', (e)=>{
upd(l, k, e.target.value);
});
td.appendChild(input);
tr.appendChild(td);
});
table.appendChild(tr);
});
}
function upd(lang,key,val){
if(!data[lang])data[lang]={};
data[lang][key]=val;
}
function addRow(){
const k=prompt('key');
if(!k)return;
Object.keys(data).forEach(l=>data[l][k]='');
render();
}
function save(){
fetch('/save',{
method:'POST',
headers:{'Content-Type':'application/json'},
body:JSON.stringify(data)
});
}
</script>
</body>
</html>
`);
});
app.listen(3000,()=>console.log('http://localhost:3000'));

View file

@ -1,34 +0,0 @@
---
layout: base.njk
pagination:
data: languages
size: 1
alias: langKey
tags: misc
backgroundOpacity: "0.3"
background: "bear3.jpg"
---
<main>
<h1>{{ t.pageTitle }}</h1>
<p>{{ t.introText1 }} <a href="https://github.com/adrianvic/adrianvic.github.io">{{ t.introRepoLinkText }}</a> {{ t.introText2 }} <a href="{{ ('/static/LICENSE.txt') | url }}">{{ t.introLicenseLinkText }}</a>.</p>
<p>{{ t.privacyText1 }} <span class="noWrap">(<img class="lineHeight invertedc" src="{{ ('/static/images/gears.svg') | url }}">)</span> {{ t.privacyText2 }} <span class="noWrap">(<img class="lineHeight invertedc" src="{{ ('/static/images/sound-on.png') | url }}">)</span> {{ t.privacyText3 }}</p>
<h2>{{ t.attributionsHeading }}</h2>
<dl>
<dt>{{ t.bgImageLabel }}</dt>
<dd>{{ t.bgImageCredit }}</dd>
<dt>{{ t.badges88x31Label }}</dt>
<dd><a href="https://88x31.nl/">88x31.nl</a></dd>
<dd><a href="https://neocities.org/browse">{{ t.neocitiesCommunity }}</a></dd>
<dt>{{ t.clickSoundLabel }}</dt>
<dd><a href="https://www.myinstants.com/en/instant/dog-clicker-7758/">lilypids @ Myinstants</a></dd>
</dl>
<h2>{{ t.thanksHeading }}</h2>
<dl>
<dt>Eleventy (11ty)</dt>
<dd>{{ t.eleventyDesc }}</dd>
<dt>GitHub Pages</dt>
<dd>{{ t.githubPagesDesc }}</dd>
</dl>
</main>

2626
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -6,10 +6,25 @@
"scripts": { "scripts": {
"build": "npx @11ty/eleventy", "build": "npx @11ty/eleventy",
"serve": "npx @11ty/eleventy --serve", "serve": "npx @11ty/eleventy --serve",
"production": "IS_PRODUCTION=true npx @11ty/eleventy --serve",
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1"
}, },
"keywords": [], "keywords": [],
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"type": "commonjs" "type": "module",
"dependencies": {
"@11ty/eleventy-plugin-syntaxhighlight": "^5.0.2",
"@inframanufaktur/eleventy-plugin-clean-urls": "^1.0.2",
"@sardine/eleventy-plugin-external-links": "^1.4.0",
"eleventy-plugin-git-commit-date": "^1.0.2",
"eleventy-plugin-github-repos": "^0.1.8",
"eleventy-plugin-inline-link-favicon": "^1.1.0",
"eleventy-plugin-mastoarchive": "^0.2.0",
"eleventy-plugin-poison": "^1.0.1",
"eleventy-plugin-purgecss": "^0.6.0",
"eleventy-plugin-reading-time": "^0.0.1",
"eleventy-plugin-recent-changes": "^1.0.1",
"eleventy-plugin-webmentions": "^2.1.0"
}
} }

7
purgecss.config.cjs Normal file
View file

@ -0,0 +1,7 @@
module.exports = {
// Content files referencing CSS classes
content: ["./docs/**/*.html"],
// CSS files to be purged in-place
css: ["./docs/**/*.css"],
};

View file

@ -1,61 +0,0 @@
---
postTitle: "Telnet"
layout: post.njk
date: 2025-08-27
background: redes.jpg
authors: Adrian Victor & Arthur Borges
langKey: en
---
<script src="/static/scripts/telnetSimulator.js" defer></script>
<h2>What the protocol is, its function and history</h2>
<p>Telnet (from <b>TEL</b>ecommunication <b>NET</b>work) is a TCP/IP stack network protocol that allows remote text-mode communication between computers. Its main function is to provide an interactive session where a user can access and control another device as if they were on a local terminal.</p>
<p>Created in 1969, Telnet was one of the first protocols developed for ARPANET (the network that gave rise to the Internet) and became fundamental for system and device administration in the 1970s, 1980s, and 1990s. Over time, it fell out of use due to lack of security, being replaced by more modern alternatives such as SSH (Secure Shell).</p>
<h2>Implementation</h2>
<p><b>Default port:</b> 23/TCP.<br>
Works at the application layer of the OSI model.<br>
<b>Format:</b> Based on ASCII character exchange, without encryption.<br>
<b>RFC:</b> Defined by RFC 854 (1983).<br>
<b>Architecture:</b> Follows the client-server model</p>
<h2>How it works</h2>
<p>In practice, Telnet works relatively simply. The process starts when the client establishes a TCP connection to the server via port 23. Then a remote terminal session is initiated and the user must provide credentials such as username and password. After authentication, commands typed on the client are transmitted in plain text to the server, which processes them and returns the corresponding output. The session remains active as long as the user wants, normally ending with commands like <i>exit</i> or <i>logout</i></p>
<h2>Use cases</h2>
<p>For many years, Telnet was widely used for remote access to Unix, Linux, and Windows servers, especially older versions of these systems. It also became common in network device administration, such as routers and switches, until SSH became the standard. Additionally, mainframes and some legacy devices still use Telnet today. Another practical application is in educational environments and network diagnostics, where it is used to test open ports and check service connectivity, such as running “telnet server.com 80” to see if a web server port is operational.</p>
<h2>Encryption: the inherent problem</h2>
<p>Telnet has no native encryption, which makes it extremely vulnerable. To solve this problem, more secure alternatives were developed. The main one is SSH (Secure Shell), created in the 1990s as a direct Telnet replacement. SSH offers the same functionality while ensuring data protection through strong authentication and full traffic encryption. Another, less common approach is using SSL/TLS to tunnel Telnet sessions, but in practice this is rarely used.</p>
<h2>Advantages and disadvantages</h2>
<p>Telnets advantages include simplicity, low resource usage, and compatibility with various older systems, which facilitated its adoption over the years. However, these benefits are outweighed by its disadvantages. The main one is the lack of encryption, exposing all transmitted data—including passwords—in plain text. This makes it vulnerable to attacks such as sniffing, which captures network packets, and hijacking, which takes over active sessions. For this reason, Telnet is considered obsolete and unsafe for use on open networks like the Internet.</p>
<h2>Relation to other protocols</h2>
<p>Telnet is part of the TCP/IP protocol family and uses TCP to ensure reliable communication. Like other protocols in this stack, such as HTTP, FTP, and SMTP, it relies on stable connections to perform its functions, but its distinguishing feature has always been terminal-mode interactivity. Due to security flaws, it was replaced by its natural successor, SSH, which retained Telnets conceptual base but added robust protection layers.</p>
<h2>Functional example</h2>
<p>Below is a Telnet connection simulator written in JavaScript.</p>
<div id="telnetSimulationLoadingHolder">
<p id="telnetSimulationLoadingText">Loading...</p>
<div class="ellipsis-loader" aria-role="alert" aria-label="Loading. Please wait">
<div class="ellipsis-loader__dot"></div>
<div class="ellipsis-loader__dot"></div>
<div class="ellipsis-loader__dot"></div>
<div class="ellipsis-loader__dot"></div>
</div>
</div>
<div id="telnetSimulation">
<div id="telnetSimulationServer">
<h3>Server</h3>
<textarea name="" id="telnetSimulationServerScreen" readonly>Welcome to Zubuntu 30.1!
Running startup script: start_telnet_server.sh
Telnet Server started on localhost:23
Ready to receive commands.
----
</textarea>
<button id="telnetSimulationServerClean">Clear</button>
</div>
<div id="telnetSimulationClient">
<h3>Client</h3>
<textarea name="" id="telnetSimulationClientScreen" readonly>Send help to see the list of commands supported by the server!
----
</textarea>
<div id="telnetSimulationInput">
<input type="text" id="telnetSimulationInputBox">
<button id="telnetSimulationClientSend">Send</button>
</div>
</div>
</div>

View file

@ -19,7 +19,8 @@ const globalValues = {
homeSongImage: "/songs/velkommen.jpg", homeSongImage: "/songs/velkommen.jpg",
homeSongWebsite: "Bandcamp", homeSongWebsite: "Bandcamp",
homeSongDuration: "5:39", homeSongDuration: "5:39",
homeSongAccent: "#482948" homeSongAccent: "#482948",
}; };
module.exports = { module.exports = {
@ -38,9 +39,9 @@ module.exports = {
myVideos: "my videos", myVideos: "my videos",
mySoftware: "my software", mySoftware: "my software",
homeAboutMeParagraph: ` homeAboutMeParagraph: `
My name is Adrian Victor, but I go by tenkuma on-line. I'm in high school's last year, also studying computing. My hobbies are music and music production, programming, selfhosting, Linux, and a lot more. My name is Adrian Victor, but I go by tenkuma on-line. I'm in high school's last year, also studying computing. My hobbies are music, music production, programming, selfhosting, Linux, and a lot more.
`, `,
homeAboutMeParagraphTwo: `Tenkuma, or 天くま in japanese, means celestial bear and was given by a friend of mine that I lost contact a long time ago. Sakata is gone, but the name stayed and turned into an integral part of my digital self.`, homeAboutMeParagraphTwo: `The name tenkuma, or 天くま in japanese, means celestial bear and was given by a friend of mine that I lost contact a long time ago. Sakata is gone, but the name stayed and turned into an integral part of my digital self.`,
homeSocialsAndContactParagraph: ` homeSocialsAndContactParagraph: `
I'm publicly available at Mastodon <a href='${globalValues.mastodon.url}'>(${globalValues.mastodon.username})</a>, I'm publicly available at Mastodon <a href='${globalValues.mastodon.url}'>(${globalValues.mastodon.username})</a>,
GitHub <a href='${globalValues.github.url}'>(${globalValues.github.username})</a>, GitHub <a href='${globalValues.github.url}'>(${globalValues.github.username})</a>,
@ -79,8 +80,42 @@ module.exports = {
permissionIssue: "Permission issue", permissionIssue: "Permission issue",
permissionIssueNotificationContent: "Unable to continue playing background music, please enable audio <b>autoplay</b> for this website.", permissionIssueNotificationContent: "Unable to continue playing background music, please enable audio <b>autoplay</b> for this website.",
notificationDefaultHint: "<b>Click to dismiss</b>", notificationDefaultHint: "<b>Click to dismiss</b>",
kaoMain: "The Android OS is great danger. You're about to lose sovereignty over your phone because of Google's monopoly.", kaoMain: "You're about to lose sovereignty over your phone because of Google's monopoly. Fight back before is too late!",
kaoLink: "<a href='https://keepandroidopen.org/'>Learn what you can do at Keep Android Open -></a>" kaoLink: "<a href='https://keepandroidopen.org/'>Learn what you can do at Keep Android Open</a>",
webringDescription: "<a href='https://en.wikipedia.org/wiki/Webring'>What are webrings?</a>",
breakcoreWebring: "This site is a member of the breakcore webring.",
wrongosWebring: "This site is a member of the Wrongos webring.",
previousSite: "previous site",
nextSite: "next site",
random: "random",
showMore: "Show more",
showLess: "Show less",
previous: "previous",
next: "next",
about: "about",
thisWebsiteDoesNotTrackYou: "This website does not track you.",
mrnandoChannel: "Mr. Nando's channel",
liked: "liked",
changes: "changes",
readingTime: "Reading time",
mastodonPageDescription: "This is an archive of all my Mastodon posts.",
addMe: "Add me",
socialContentNotRated: "Social content is not rated and may mention topics not appropriate for all ages.",
clickHereToContinue: "Click here to continue",
windsArtAlt: "First Winds album artwork",
velkommenArtAlt: "Velkommen song artwork",
pgArtAlt: "Frugal APE song artwork",
bearAlt: "Background image. White bear swimming in water that reverberates around it.",
gearsAlt: "Gears",
soundOffAlt: "Audio disabled",
soundOnAlt: "Audio enabled",
volumeSliderAlt: "Volume",
backgroundCheckAlt: "Background image",
sfxCheckboxAlt: "Sound effects",
videoArtworkAlt: "Video artwork",
songSelectAlt: "Song selector",
guestbookWarning: "Load guestbook widget? You're subject to <a href='https://iframe.chat/tos.html'>Chattable's terms of service</a>.",
dontAskAgain: "Don't ask again"
}, },
pt: { pt: {
language: "português", language: "português",
@ -136,7 +171,41 @@ module.exports = {
permissionIssue: "Problema de permissão", permissionIssue: "Problema de permissão",
permissionIssueNotificationContent: "Não foi possivel continuar tocando a música de fundo, por favor habilite <b>reprodução automática</b> de áudio para esse website.", permissionIssueNotificationContent: "Não foi possivel continuar tocando a música de fundo, por favor habilite <b>reprodução automática</b> de áudio para esse website.",
notificationDefaultHint: "<b>Clique para ignorar</b>", notificationDefaultHint: "<b>Clique para ignorar</b>",
kaoMain: "O Android está em grande perigo. Você está prestes a perder controle do seu celular em favor do monopólio da Google.", kaoMain: "Você está prestes a perder controle do seu celular em favor do monopólio da Google. Lute contra antes que seja tarde!",
kaoLink: "<a href='https://keepandroidopen.org/pt-BR/'>Veja o que você pode fazer em Keep Android Open -></a>" kaoLink: "<a href='https://keepandroidopen.org/pt-BR/'>Veja o que você pode fazer em Keep Android Open</a>",
webringDescription: "<a href='https://pt.wikipedia.org/wiki/Webring'>O que são webrings?</a>",
breakcoreWebring: "Esse website faz parte do webring breakcore.",
wrongosWebring: "Esse website faz parte do webring Wrongos.",
previousSite: "site anterior",
nextSite: "próximo site",
random: "aleatório",
showMore: "Ver mais",
showLess: "Ver menos",
previous: "anterior",
next: "próximo",
about: "sobre",
thisWebsiteDoesNotTrackYou: "Esse website não rastreia você.",
mrnandoChannel: "Canal do Mr. Nando",
liked: "curtiu",
changes: "mudanças",
readingTime: "Tempo de leitura",
mastodonPageDescription: "Essa página lista todas as minhas postagens do Mastodon.",
addMe: "Me adicionar",
socialContentNotRated: "Conteúdo das redes sociais não é monitorado e pode conter tópicos não apropriados para todas as idades.",
clickHereToContinue: "Clique aqui para continuar",
windsArtAlt: "Capa do album First Winds",
velkommenArtAlt: "Capa da música Velkommen",
pgArtAlt: "Capa da música Frugal APE",
bearAlt: "Imagem de fundo. Urso branco nadando na água que reverbera ao seu redor.",
gearsAlt: "Engrenagens",
soundOffAlt: "Áudio desligado",
soundOnAlt: "Áudio ligado",
volumeSliderAlt: "Volume",
backgroundCheckAlt: "Imagem de fundo",
sfxCheckboxAlt: "Efeitos sonoros",
videoArtworkAlt: "Capa do vídeo",
songSelectAlt: "Seletor de música",
guestbookWarning: "Carregar o guestbook? Você estará sujeito aos <a href='https://iframe.chat/tos.html'>termos de uso do Chattable</a>.",
dontAskAgain: "Não pergunte novamente"
} }
}; };

View file

@ -13,20 +13,17 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Adrian Victor{% if pageTitle or postTitle %} - {{ pageTitle or postTitle }}{% endif %}</title> <title>Adrian Victor{% if pageTitle or postTitle %} - {{ pageTitle or postTitle }}{% endif %}</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="{{ '/static/main.css?fixcache=1' | url }}"> <link rel="stylesheet" href="{{ '/static/main.css?fixcache=1' | url }}">
<link href="{{ '/static/prism.css' | url }}" rel="stylesheet"/>
<script type="module" src="{{ '/static/scripts/ccd.js' | url }}"></script> <script type="module" src="{{ '/static/scripts/ccd.js' | url }}"></script>
<script type="module" src="{{ '/static/scripts/music.js' | url }}" defer></script> <script type="module" src="{{ '/static/scripts/music.js' | url }}" defer></script>
<script type="module" src="{{ '/static/scripts/88x31.js' | url }}" defer></script> <script type="module" src="{{ '/static/scripts/88x31.js' | url }}" defer></script>
<script type="module" src="{{ '/static/scripts/tips.js' | url }}" defer></script> <script type="module" src="{{ '/static/scripts/tips.js' | url }}" defer></script>
<script type="module" src="{{ '/static/scripts/click.js' | url }}" defer></script> <script type="module" src="{{ '/static/scripts/click.js' | url }}" defer></script>
<link rel="apple-touch-icon" sizes="180x180" href="{{ '/static/apple-touch-icon.png' | url }}"> <link rel="apple-touch-icon" sizes="180x180" href="{{ '/static/apple-touch-icon.png' | url }}">
<link rel="icon" type="image/png" sizes="32x32" href="{{ '/static/favicon-32x32.png' | url }}"> <link rel="icon" type="image/png" sizes="32x32" href="{{ '/static/favicon-32x32.png' | url }}">
<link rel="icon" type="image/png" sizes="16x16" href="{{ '/static/favicon-16x16.png' | url }}"> <link rel="icon" type="image/png" sizes="16x16" href="{{ '/static/favicon-16x16.png' | url }}">
<link rel="manifest" href="{{ '/static/site.webmanifest' | url }}"> <link rel="manifest" href="{{ '/static/site.webmanifest' | url }}">
<meta property="og:title" content="Adrian Victor{% if pageTitle or postTitle %} - {{ pageTitle or postTitle }}{% endif %}"> <meta property="og:title" content="Adrian Victor{% if pageTitle or postTitle %} - {{ pageTitle or postTitle }}{% endif %}">
<meta property="og:description" content="{{ description or i18n[langKey].websiteDescription }}"> <meta property="og:description" content="{{ description or i18n[langKey].websiteDescription }}">
<meta property="og:type" content="article"> <meta property="og:type" content="article">
@ -34,24 +31,30 @@
<meta property="og:image" content="{{ ('/static/images/' ~ (background or 'bear.jpg')) | url | absoluteUrl }}"> <meta property="og:image" content="{{ ('/static/images/' ~ (background or 'bear.jpg')) | url | absoluteUrl }}">
</head> </head>
<body> <body>
{% poison %}
<script> <script>
const rootPrefix = "{{ '/' | url }}"; const rootPrefix = "{{ '/' | url }}";
</script> </script>
<style> <style>
.bg { .bg {
opacity: {{ backgroundOpacity or ".4" }}!important; opacity: {{ backgroundOpacity or ".4" }}!important;
} }
</style> </style>
<noscript> <noscript>
<style> <style>
.i88x31:hover { .i88x31:hover {
transform: scale(2); transform: scale(2);
} }
</style> </style>
</noscript> </noscript>
<div id="everythingHelper"> <div id="everythingHelper">
<img src="{{ ('/static/images/' ~ (background or 'bear.jpg')) | url }}" class="bg"> <img src="{{ ('/static/images/' ~ (background or 'bear.jpg')) | url }}" class="bg" alt="{{ i18n[langKey].bearAlt }}">
{% include "header.njk" %} {% include "header.njk" %}
<div id="mainHelper"> <div id="mainHelper">
{{ content | safe }} {{ content | safe }}
</div> </div>

27
site/_includes/header.njk Normal file
View file

@ -0,0 +1,27 @@
<header>
<div class="headerContent">
<div id="headerTitle">
<h1>{{ title or "Adrian Victor" }}</h1>
<p id="headerSubtitle"><i>{{ subtitle or "Fanasy is not a crime, find your castle in the sky." }}</i></p>
</div>
<div id="linksHelper">
<div id="music"></div>
<ul id="headerLinks">
{% if langKey %}
<a href="{{ ('/' ~ langKey ~ '/') | url }}"{% if headerLink == "home" %} style="text-decoration: underline; color: white;"{% endif %}>{{ i18n[langKey].home }}</a>
<a href="{{ ('/' ~ langKey ~ '/blog/') | url }}" {% if headerLink == "blog" %} style="text-decoration: underline; color: white;"{% endif %}>blog</a>
<a href="{{ ('/' ~ langKey ~ '/misc/') | url }}" {% if headerLink == "misc" %} style="text-decoration: underline; color: white;"{% endif %}>misc</a>
<a href="{{ ('/' ~ langKey ~ '/social/') | url }}" {% if headerLink == "social" %} style="text-decoration: underline; color: white;"{% endif %}>social</a>
{% endif %}
{% if langKey == undefined %}
<a href="{{ ('/') | url }}">home</a>
{% endif %}
<a rel="me" href="https://mstdn.social/@tenkuma" style="display: none;">Mastodon</a>
<a href="https://github.com/adrianvic" rel="me" style="display: none;">github.com/aaronpk</a>
</ul>
</div>
</div>
{# <marquee scrollamount="10vw" style="opacity: .8; background-color: rgb(0,0,0, 0.4); postion: fixed; bottom: 0; left: 0;">test</marquee> #}
</header>
<script type="module" src="{{ '/static/scripts/tumblr-adapt.js' | url }}"></script>

35
site/_includes/iframe.njk Normal file
View file

@ -0,0 +1,35 @@
<!--
_ _ _
| |_ ___ _ __ | | ___ _ _ __ ___ __ _ __ ____ _ ___ | |__ ___ _ __ ___
| __/ _ \ '_ \| |/ / | | | '_ ` _ \ / _` | \ \ /\ / / _` / __| | '_ \ / _ \ '__/ _ \
| || __/ | | | <| |_| | | | | | | (_| | \ V V / (_| \__ \ | | | | __/ | | __/
\__\___|_| |_|_|\_\\__,_|_| |_| |_|\__,_| \_/\_/ \__,_|___/ |_| |_|\___|_| \___|
-->
<!DOCTYPE html>
<html lang="{{ langKey }}">
<head>
<meta charset="UTF-8">
<title>Adrian Victor{% if pageTitle or postTitle %} - {{ pageTitle or postTitle }}{% endif %}</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="{{ '/static/main.css?fixcache=1' | url }}">
<link href="{{ '/static/prism.css' | url }}" rel="stylesheet"/>
<link rel="apple-touch-icon" sizes="180x180" href="{{ '/static/apple-touch-icon.png' | url }}">
<link rel="icon" type="image/png" sizes="32x32" href="{{ '/static/favicon-32x32.png' | url }}">
<link rel="icon" type="image/png" sizes="16x16" href="{{ '/static/favicon-16x16.png' | url }}">
<link rel="manifest" href="{{ '/static/site.webmanifest' | url }}">
<meta property="og:title" content="Adrian Victor{% if pageTitle or postTitle %} - {{ pageTitle or postTitle }}{% endif %}">
<meta property="og:description" content="{{ description or i18n[langKey].websiteDescription }}">
<meta property="og:type" content="article">
<meta property="og:url" content="{{ page.url | url | absoluteUrl }}">
<meta property="og:image" content="{{ ('/static/images/' ~ (background or 'bear.jpg')) | url | absoluteUrl }}">
</head>
<body class="iframe">
<script>
const rootPrefix = "{{ '/' | url }}";
</script>
{{ content | safe }}
</body>
</html>

View file

@ -1,17 +1,23 @@
{% macro i88x31(link) %} {% macro i88x31(link, alt=link, interactive=true) %}
<img <img
class="i88x31" class="i88x31{% if interactive == true %} i88x31i{% endif %}"
src="{{ ('/static/images/88x31/' ~ link) | url }}" src="{{ ('/static/images/88x31/' ~ link) | url }}"
{% if alt == link %}
data-tip="<b>{{ i18n[langKey].i88x31hover }}</b> ({{ link }})" data-tip="<b>{{ i18n[langKey].i88x31hover }}</b> ({{ link }})"
{% endif %}
{% if alt != link %}
data-tip="{{ alt }}"
{% endif %}
alt="{{ alt }}"
> >
{% endmacro %} {% endmacro %}
{% macro videoCard(videoLink, videoTitle, videoImage, videoWebsite, videoDuration, videoAccent) %} {% macro videoCard(videoLink, videoTitle, videoImage, videoWebsite, videoDuration, videoAccent, imageAlt = i18n[langKey].videoArtworkAlt) %}
<div class="youtubeCardHolderHelper"> <div class="youtubeCardHolderHelper">
<div class="youtubeCardHolder"> <div class="youtubeCardHolder">
<a href="{{ videoLink }}"> <a href="{{ videoLink }}">
<div class="blogpostYoutubeVideo" {% if videoAccent %}style="border-color: {{ videoAccent }};"{% endif %}> <div class="blogpostYoutubeVideo" {% if videoAccent %}style="border-color: {{ videoAccent }};"{% endif %}>
<img src="{{ ('/static/images' ~ videoImage) | url }}"> <img src="{{ ('/static/images' ~ videoImage) | url }}" alt="{{ imageAlt }}">
<div class="videoHeader"> <div class="videoHeader">
{# <p class="alsoAvailable">{{ i18n[langKey].alsoAvailableAsVideo }}:</p> #} {# <p class="alsoAvailable">{{ i18n[langKey].alsoAvailableAsVideo }}:</p> #}
<h2 class="videoTitle" {% if videoAccent %}style="color: {{ videoAccent }};"{% endif %}> <h2 class="videoTitle" {% if videoAccent %}style="color: {{ videoAccent }};"{% endif %}>
@ -37,7 +43,20 @@
</a> </a>
</div> </div>
<div class="hsProjectContent"> <div class="hsProjectContent">
<p>{{ projectDescription }}</p> <p>{{ projectDescription | safe }}</p>
</div>
</div>
{% endmacro %}
{% macro webring(opts) %}
<div class="webringGeneric"
style="{% if opts.image %}background-image:url('{{ opts.image | url }}');{% endif %}
{% if opts.color %}background-color:{{ opts.color }};{% endif %}">
<p>{{ opts.text }}</p>
<div class="webringButtons">
{% for link in opts.links %}
{{ link | safe }}
{% endfor %}
</div> </div>
</div> </div>
{% endmacro %} {% endmacro %}

View file

@ -1,6 +1,7 @@
--- ---
layout: base.njk layout: base.njk
title: Adrian Victor:Blog title: Adrian Victor:Blog
headerLink: blog
--- ---
{% set altLanguages = collections.post | alternateLanguages(postId, langKey) %} {% set altLanguages = collections.post | alternateLanguages(postId, langKey) %}
{% from "macros.njk" import videoCard with context %} {% from "macros.njk" import videoCard with context %}
@ -9,6 +10,7 @@ title: Adrian Victor:Blog
<article> <article>
<div id="postHeader"> <div id="postHeader">
<h1>{{ postTitle }}</h1> <h1>{{ postTitle }}</h1>
<p>{{ i18n[langKey].readingTime }}: {{ content | readingTime }}</p>
<p>{{ authors or "Adrian Victor" }} - <b>{{ date | postDate }}</b>{% if lastModified | postDate !== date | postDate %} ({{ i18n[langKey].lastEditedIn }} {{ lastModified | postDate }}){% endif %}</p> <p>{{ authors or "Adrian Victor" }} - <b>{{ date | postDate }}</b>{% if lastModified | postDate !== date | postDate %} ({{ i18n[langKey].lastEditedIn }} {{ lastModified | postDate }}){% endif %}</p>
{% if altLanguages.length > 0 %} {% if altLanguages.length > 0 %}
{{ i18n[langKey].availableInOtherLanguages }}: {{ i18n[langKey].availableInOtherLanguages }}:

6
site/_includes/text.njk Normal file
View file

@ -0,0 +1,6 @@
---
layout: base.njk
---
<main class="fullWidth">
{{ content | safe }}
</main>

View file

@ -0,0 +1,7 @@
<script src="https://iframe.chat/scripts/main.min.js"></script>
<iframe src="{{ ('/' ~ langKey ~ '/iframe/guestbook') | url }}" id="chattable"></iframe>
<script>
chattable.initialize({
theme: "moderno"
});
</script>

View file

@ -0,0 +1,44 @@
<center>
<div class="droidringwidget">
<a href="https://kanandraw.neocities.org/stuffs/droidring/home"><img src="https://kanandraw.neocities.org/stuffs/droidring/assets/logo.png" style="width: 200px; padding: .4em;" alt="Droidring"></a><br/>
<!-- <img src="https://kanandraw.neocities.org/stuffs/droidring/assets/droidwidget.png" style="width: 115px;"><br> -->
<div class="buttonsdroidring">
<a href="https://kanandraw.neocities.org/stuffs/droidring/home?action=previous"><button class="navdroidring" data-tip="{{ i18n[langKey].previousSite | smartTitle }}"></button></a>
<a href="https://kanandraw.neocities.org/stuffs/droidring/home?action=random"><button class="navdroidring" data-tip="{{ i18n[langKey].random | smartTitle }}"></button></a>
<a href="https://kanandraw.neocities.org/stuffs/droidring/home?action=next"><button class="navdroidring" data-tip="{{ i18n[langKey].nextSite | smartTitle }}"></button></a>
</div>
<style>
.droidringwidget {
font-family: 'Droid Sans',sans-serif;
align-content: center;
text-align: center;
/* width: 215px; */
border: 1px solid #666666;
background: linear-gradient(0deg, black, #000000db);
padding: 5px;
}
.buttonsdroidring {
background: #989898;
padding: 4px;
margin: -5px;
}
.navdroidring {
background: linear-gradient(to bottom, #F1F1F1, #B8B8B8);
padding: 5px;
color: black;
box-shadow: 0 3px 6px #00000029, 0 3px 6px #0000003B;
border: none;
width: 50px;
height: 27px;
min-width: 50px;
}
.navdroidring:active {
background: linear-gradient(to bottom,#FFD554,#E99D00);
}
.navdroidring:hover {
background: linear-gradient(to bottom, #ffebc4, #f2f2f2);
}
</style>
</div>
</center>

View file

@ -0,0 +1,7 @@
<div class="internetometerAside">
<div>
<h1 class="negativeMargin">{{ i18n[langKey].liked | smartTitle }}?</h1>
<hr style="margin-bottom: .4em;">
</div>
<a href='http://internetometer.com/give/52060'><img src='http://internetometer.com/image/52060.png' alt="Internetometer"/></a>
</div>

View file

@ -6,6 +6,7 @@ pagination:
permalink: "/{{ langKey }}/blog/index.html" permalink: "/{{ langKey }}/blog/index.html"
layout: base.njk layout: base.njk
title: Adrian Victor:Blog title: Adrian Victor:Blog
headerLink: blog
--- ---
<main> <main>
@ -14,10 +15,8 @@ title: Adrian Victor:Blog
{% for post in collections.post %} {% for post in collections.post %}
{% if post.data.langKey == langKey %} {% if post.data.langKey == langKey %}
<li> <li>
<p> <a class="postLink" href="{{ post.url | url }}">{{ post.data.postTitle }}</a><br>
<a href="{{ post.url | url }}">{{ post.data.postTitle }}</a><br>
<b>{{ post.data.date | postDate }}</b>{% if post.data.lastModified | postDate !== post.data.date | postDate %} ({{ i18n[langKey].lastEditedIn }} {{ post.data.lastModified | postDate}}){% endif %} <b>{{ post.data.date | postDate }}</b>{% if post.data.lastModified | postDate !== post.data.date | postDate %} ({{ i18n[langKey].lastEditedIn }} {{ post.data.lastModified | postDate}}){% endif %}
</p>
</li> </li>
{% endif %} {% endif %}
{% endfor %} {% endfor %}

28
site/iframe/guestbook.njk Normal file
View file

@ -0,0 +1,28 @@
---
pagination:
data: i18n
size: 1
alias: langKey
permalink: "/{{ langKey }}/iframe/guestbook/index.html"
layout: iframe.njk
title: Adrian Victor:Guestbook
headerLink: social
---
<script defer>
if (localStorage.getItem("autoLoadGuestBook") == "true") {
window.location.href = 'https://iframe.chat/embed?chat=17048300';
}
function loadGuestbook() {
const askAgain = document.querySelector("#dontAskAgain").value;
if (askAgain) {
localStorage.setItem("autoLoadGuestbook", true);
}
window.location.href = 'https://iframe.chat/embed?chat=17048300';
}
</script>
<main>
<p>{{ i18n[langKey].guestbookWarning | safe }}</p>
<label><input id="dontAskAgain" type="checkbox" style="margin-right: .4em;">{{ i18n[langKey].dontAskAgain }}</label>
<div style="margin-top: 1em;"><button id="guestbookConfirmButton" style="margin-top: auto;" onclick="loadGuestbook()">Load</button></div>
</main>

314
site/index.njk Normal file
View file

@ -0,0 +1,314 @@
---
pagination:
data: i18n
size: 1
alias: langKey
permalink: "/{{ langKey }}/index.html"
layout: base.njk
headerLink: home
---
{% from "macros.njk" import i88x31 with context %}
{% from "macros.njk" import videoCard with context %}
{% from "macros.njk" import projectCard %}
{% from "macros.njk" import webring %}
<!-- Will be loaded by the home JS -->
<div id="homeSquares"></div>
<script src="{{ '/static/scripts/home.js' | url }}" defer></script>
<script>
const headeri18n =
{
by: "{{ i18n[langKey].by | safe }}",
options: "{{ i18n[langKey].options | safe }}",
hideBackground: "{{ i18n[langKey].hideBackground | safe }}",
back: "{{ i18n[langKey].back | safe }}",
permissionIssue: "{{ i18n[langKey].permissionIssue | safe }}",
permissionIssueNotificationContent: "{{ i18n[langKey].permissionIssueNotificationContent | safe }}",
notificationDefaultHint: "{{ i18n[langKey].notificationDefaultHint | safe }}",
disableSoundEffects: "{{ i18n[langKey].disableSoundEffects | safe }}",
windsArtAlt: "{{ i18n[langKey].windsArtAlt | safe }}",
velkommenArtAlt: "{{ i18n[langKey].velkommenArtAlt | safe }}",
pgArtAlt: "{{ i18n[langKey].pgArtAlt | safe }}",
gearsAlt: "{{ i18n[langKey].gearsAlt | safe }}",
soundOffAlt: "{{ i18n[langKey].soundOffAlt | safe }}",
soundOnAlt: "{{ i18n[langKey].soundOnAlt | safe }}",
volumeSliderAlt: "{{ i18n[langKey].volumeSliderAlt | safe }}",
backgroundCheckAlt: "{{ i18n[langKey].backgroundCheckAlt | safe }}",
sfxCheckboxAlt: "{{ i18n[langKey].sfxCheckboxAlt | safe }}",
songSelectAlt: "{{ i18n[langKey].songSelectAlt | safe }}",
showMore: "{{ i18n[langKey].showMore | safe }}",
showLess: "{{ i18n[langKey].showLess | safe }}",
}
</script>
<main id="boxChain">
<noscript>
<style>
.hs {
display: unset !important;
}
#homeSquares {
display: none;
}
#homeWebrings.less {
overflow: unset;
max-height: unset;
-webkit-mask: none;
mask: none;
}
#homeWebringsShowMore {
display: none;
}
</style>
</noscript>
<!-- Intro -->
<div class="hs" id="hsDefault">
<!-- Keep Android Open alert -->
<div class="box kaoBox alert">
<p>{{ i18n[langKey].kaoMain | safe }}</p>
<p class="end-text nomargin">{{ i18n[langKey].kaoLink | safe }} →</p>
</div>
<div class="box pageHeaderBox">
<h1 id="homeTitle">{{ i18n[langKey].welcome | smartTitle }}</h1>
<p>{{ i18n[langKey].homeWelcomeParagraph | safe }}</p>
<div class="homeBadgesBox">
{{ i88x31("tenkuma.gif") }}
{{ i88x31("anybrowser6.gif") }}
{{ i88x31("ai.gif") }}
{{ i88x31("WEBP.gif") }}
{{ i88x31("rainbowrain.gif") }}
{{ i88x31("blasphemy.gif") }}
{{ i88x31("wrongos.gif") }}
{{ i88x31("best_viewed_with_open_eyes.gif") }}
{{ i88x31("gnu-linux.gif") }}
</div>
</div>
<hr>
<h2>{{ i18n[langKey].aboutMe | smartTitle }}</h2>
<p>{{ i18n[langKey].homeAboutMeParagraph | safe }}</p>
<p>{{ i18n[langKey].homeAboutMeParagraphTwo | safe }}</p>
<h2>{{ i18n[langKey].socialsAndContact | smartTitle }}</h2>
<p>{{ i18n[langKey].homeSocialsAndContactParagraph | safe }}</p>
<p>{{ i18n[langKey].homeSocialsAndContactParagraphTwo | safe }}</p>
</div>
<!-- Music -->
<div class="hs" id="hsMusic">
<div class="box pageHeaderBox">
<h1>{{ i18n[langKey].myMusic | smartTitle }}</h1>
<p>{{ i18n[langKey].homeMyMusicParagraph | safe }}</p>
<p>{{ i18n[langKey].homeMyMusicParagraphTwo | safe }}</p>
<div class="homeBadgesBox">
{{ i88x31("rave.gif") }}
{{ i88x31("happymix.gif") }}
</div>
</div>
<hr>
<div class="hsMusicCard">
{{
videoCard(
i18n["global"].homeSongLink,
i18n["global"].homeSongTitle,
i18n["global"].homeSongImage,
i18n["global"].homeSongWebsite,
i18n["global"].homeSongDuration,
i18n["global"].homeSongAccent,
i18n[langKey].velkommenArtAlt
)
}}
</div>
</div>
<!-- Video -->
<div class="hs" id="hsVideo">
<div class="box pageHeaderBox">
<h1>{{ i18n[langKey].myVideos | smartTitle }}</h1>
<p>{{ i18n[langKey].homeMyVideoParagraph | safe }}</p>
</div>
<hr>
{{
videoCard(
i18n["global"].homeVideoLink,
i18n[langKey].homeVideoTitle,
i18n["global"].homeVideoImage,
i18n["global"].homeVideoWebsite,
i18n["global"].homeVideoDuration
)
}}
</div>
<!-- Programming -->
<div class="hs" id="hsCode">
<div class="box pageHeaderBox">
<h1>{{ i18n[langKey].mySoftware | smartTitle }}</h1>
<p>{{ i18n[langKey].homeMySoftwareParagraph | safe }}</p>
</div>
<hr>
<div class="hsProjects">
{{
projectCard(
"Jamfish",
i18n[langKey].jamfishProjectDesctiption,
"https://github.com/adrianvic/jamfish",
'/static/images/jamfish-wide.png',
"Jamfish"
)
}}
{{
projectCard(
"ItemEconomy",
i18n[langKey].itemeconomyProjectDesctiption,
"https://github.com/adrianvic/ItemEconomy",
'/static/images/itemeconomy2-wide.png',
"ItemEconomy"
)
}}
{{
projectCard(
"Eye of Nemesis",
i18n[langKey].eyeofnemesisProjectDesctiption,
"https://github.com/adrianvic/NemesisEye",
'/static/images/eye_of_nemesis.png',
"Eye of Nemesis"
)
}}
{{
projectCard(
"PestoWiki",
i18n[langKey].pestoProjectDesctiption,
"https://github.com/Margarina-not-butter/PestoWiki",
'/static/images/pestowikifullwhite.png',
"PestoWiki"
)
}}
</div>
</div>
</main>
<!-- Webrings -->
<aside id="homeAside">
<div id="homeBlog">
<div>
<h1 class="nomargin negativeMargin">Blog</h1>
<hr style="margin-bottom: .4em;">
</div>
{% for post in collections.post %}
{% if post.data.langKey == langKey %}
<ul>
<li>
<a href="{{ post.url | url }}">{{ post.data.postTitle }}</a>
<b>{{ post.data.date | postDate }}</b>
</li>
</ul>
{% endif %}
{% endfor %}
<p class="end-text"><a href="{{ ('/' ~ langKey ~ '/blog/') | url }}">{{ i18n[langKey].showMore }}</a></p>
</div>
<div id="homeGuestbook">
<div>
<h1 class="nomargin negativeMargin">Guestbook</h1>
<hr style="margin-bottom: .4em;">
</div>
{% include 'widgets/chattable.html' %}
</div>
<div id="homeFriends" class="burn">
<div>
<h1 class="nomargin negativeMargin">Hotlinks</h1>
<hr style="margin-bottom: .4em;">
</div>
<div class="hotlinks88x31">
<a href="https://www.youtube.com/@mrnandokk">{{ i88x31("mrnandokk.gif", i18n[langKey].mrnandoChannel, false) }}</a>
<a href="https://appak.neocities.org/">{{ i88x31("appak.png", "appak", false) }}</a>
<a href="https://bribribribribri.xyz/" target="_blank">{{ i88x31("brigif.gif", "bribribribribri", false) }}</a>
<a href="https://status.cafe/">{{ i88x31("statuscafe.png", "Status Cafe", false) }}</a>
<a href="https://9larp.net/">{{ i88x31("9larpfinal.png", "9larp", false) }}</a>
</div>
<p style="text-align: center;"><a href="{{ ('/' ~ langKey ~ '/misc/hotlinking') | url }}">{{ i18n[langKey].addMe }}?</a></p>
</div>
<div id="homeWebrings" class="less">
<div>
<h1 class="nomargin negativeMargin">Webrings</h1>
<hr style="margin-bottom: .4em;">
<p class="end-text">{{ i18n[langKey].webringDescription | safe }}</p>
</div>
{{ webring({
text: "Wrongos Webring",
links: [
"<a class='wrongoLink' href='https://adrianvic.github.io/wrongos/redirect?action=previous&current=https%3A%2F%2Fadrianvic.github.io'>" ~ (i18n[langKey].previous | smartTitle) ~ "</a>",
"<a class='wrongoLink' href='https://adrianvic.github.io/wrongos'>" ~ (i18n[langKey].about | smartTitle ) ~ "</a>",
"<a class='wrongoLink' href='https://adrianvic.github.io/wrongos/redirect?action=next&current=https%3A%2F%2Fadrianvic.github.io'>" ~ (i18n[langKey].next | smartTitle) ~ "</a>"
],
color: "#362328",
image: "/static/images/grunge.png"
}) }}
{{ webring({
text: "Breakcore Webring",
links: [
"<a href='https://webri.ng/webring/breakcoreweb/previous?via=https%3A%2F%2Fadrianvic.github.io%2F'>" ~ (i18n[langKey].previous | smartTitle) ~ "</a>",
"<a href='https://appak.neocities.org/breakcore'>" ~ (i18n[langKey].about | smartTitle) ~ "</a>",
"<a href='https://webri.ng/webring/breakcoreweb/next?via=https%3A%2F%2Fadrianvic.github.io%2F'>" ~ (i18n[langKey].next | smartTitle) ~ "</a>"
],
image: "/static/images/metro-flowers.jpg"
}) }}
<link rel="stylesheet" href="https://cdring.neocities.org/cdring/onionring.css">
<!-- CDRING START -->
<div id='cdr'>
<script type="text/javascript" src="https://cdring.neocities.org/cdring/onionring-variables.js"></script>
<script type="text/javascript" src="https://cdring.neocities.org/cdring/onionring-widget.js"></script>
</div>
<!-- CDRING END -->
<div style="display:grid;place-items:center">
<a href="https://nanacore.net/cliques/brs">
<img src="https://nanacore.net/imgs/brs/bandeira.png" title="Esse site faz parte do WebCírculo BR!">
</a>
<a href="https://nanacore.net/cliques/brs?action=random">random</a>
</div>
<link rel="stylesheet" href="https://axelotl3001.neocities.org/webring/onionring.css">
<div id='Bad-coders'>
<script type="text/javascript" src="https://axelotl3001.neocities.org/webring/onionring-variables.js"></script>
<script type="text/javascript" src="https://axelotl3001.neocities.org/webring/onionring-widget.js"></script>
</div>
{% include 'widgets/droidring.html' %}
</div>
<a id="homeWebringsShowMore">{{ i18n[langKey].showMore }}...</a>
{% include 'widgets/internetometer-aside.html' %}
<footer class="end-text">
<p>Adrian Victor, 2026</p>
<p><a href="{{ ('/' ~ langKey ~ '/misc/about') | url }}">{{ i18n[langKey].thisWebsiteDoesNotTrackYou}}</a></p>
</footer>
</aside>

View file

@ -6,13 +6,14 @@ pagination:
permalink: "/{{ langKey }}/misc/index.html" permalink: "/{{ langKey }}/misc/index.html"
layout: base.njk layout: base.njk
title: Adrian Victor:Misc title: Adrian Victor:Misc
headerLink: misc
--- ---
<main> <main>
<h1>{{ i18n[langKey].miscellaneous }}</h1> <h1>{{ i18n[langKey].miscellaneous }}</h1>
<ul> <ul>
<dl> <dl id="miscList">
{% for page in collections.misc %} {% for page in collections.misc %}
{% set t = page | getTranslation(langKey) %} {% set t = page | getTranslation(langKey) %}

View file

@ -19,6 +19,9 @@ tags: misc
<h2>{{ t.me }}</h2> <h2>{{ t.me }}</h2>
<div class="homeBadgesBox"> <div class="homeBadgesBox">
{{ i88x31("tenkuma.gif") }} {{ i88x31("tenkuma.gif") }}
{{ i88x31("tenkuma2.gif") }}
{{ i88x31("tenkuma-splash.gif") }}
{{ i88x31("mrnandokk.gif") }}
</div> </div>
<h2>{{ t.others }}</h2> <h2>{{ t.others }}</h2>
<div class="homeBadgesBox"> <div class="homeBadgesBox">

View file

@ -16,5 +16,8 @@
"clickSoundLabel": "Click sound effect", "clickSoundLabel": "Click sound effect",
"thanksHeading": "Thanks", "thanksHeading": "Thanks",
"eleventyDesc": "Static website generator, used in this website.", "eleventyDesc": "Static website generator, used in this website.",
"githubPagesDesc": "For web hosting." "githubPagesDesc": "For web hosting.",
"recentChangesPluginDesc": "Plugin for listing recent commits.",
"inlineFaviconPluginDesc": "Support for inline link icons.",
"poisonPluginDesc": "Hidden AI poisoning inside page source."
} }

56
site/misc/about/index.njk Normal file
View file

@ -0,0 +1,56 @@
---
layout: base.njk
pagination:
data: languages
size: 1
alias: langKey
tags: misc
backgroundOpacity: "0.28"
background: "bear3.jpg"
---
<main>
<h1>{{ t.pageTitle }}</h1>
<p>{{ t.introText1 }} <a href="https://github.com/adrianvic/adrianvic.github.io">{{ t.introRepoLinkText }}</a> {{ t.introText2 }} <a href="{{ ('/static/LICENSE.txt') | url }}">{{ t.introLicenseLinkText }}</a>.</p>
<p>{{ t.privacyText1 }} <span class="noWrap">(<img class="lineHeight invertedc" src="{{ ('/static/images/gears.svg') | url }}">)</span> {{ t.privacyText2 }} <span class="noWrap">(<img class="lineHeight invertedc" src="{{ ('/static/images/sound-on.png') | url }}">)</span> {{ t.privacyText3 }}</p>
<h2>{{ t.attributionsHeading }}</h2>
<dl>
<dt>{{ t.bgImageLabel }}</dt>
<dd>{{ t.bgImageCredit }}</dd>
<dt>{{ t.badges88x31Label }}</dt>
<dd><a href="https://88x31.nl/">88x31.nl</a></dd>
<dd><a href="https://cyber.dabamos.de/88x31/">dabamos.de</a></dd>
<dd><a href="https://neocities.org/browse">{{ t.neocitiesCommunity }}</a></dd>
<dd><a href="https://88x31.datakra.sh/">88x31 generator</a></dd>
<dt>{{ t.clickSoundLabel }}</dt>
<dd><a href="https://www.myinstants.com/en/instant/dog-clicker-7758/">lilypids @ Myinstants</a></dd>
</dl>
<h2>{{ t.thanksHeading }}</h2>
<dl>
<dt>Eleventy (11ty)</dt>
<dd>{{ t.eleventyDesc }}</dd>
<dt>GitHub Pages</dt>
<dd>{{ t.githubPagesDesc }}</dd>
<dt><a href="https://www.npmjs.com/package/eleventy-plugin-recent-changes">eleventy-plugin-recent-changes</a> {{ i18n[langKey].by }} workeffortwaste</dt>
<dd>{{ t.recentChangesPluginDesc }}</dd>
<dt><a href="https://www.npmjs.com/package/eleventy-plugin-inline-link-favicon">eleventy-plugin-inline-link-favicon</a> {{ i18n[langKey].by }} bmuenzenmeyer</dt>
<dd>{{ t.inlineFaviconPluginDesc }}</dd>
<dt><a href="https://www.npmjs.com/package/eleventy-plugin-poison">eleventy-plugin-poison</a> {{ i18n[langKey].by }} gingerchew</dt>
<dd>{{ t.poisonPluginDesc }}</dd>
</dl>
</main>
<aside>
<div id="aboutChangelog">
<div>
<h1 class="nomargin negativeMargin">{{ i18n[langKey].changes | smartTitle }}</h1>
<hr style="margin-bottom: .4em;">
</div>
<ul>
{%- for commit in collections.recentChanges %}
<li class="doubleLine"><a class="textColored" href="https://github.com/adrianvic/adrianvic.github.io/commit/{{ commit.hash }}"><b>{{ commit.abbrevHash }}</b> {{ commit.subject }}</a></li>
{%- endfor %}
</ul>
</div>
{% include 'widgets/internetometer-aside.html' %}
</aside>

View file

@ -16,5 +16,8 @@
"clickSoundLabel": "Efeito sonoro de clique", "clickSoundLabel": "Efeito sonoro de clique",
"thanksHeading": "Agradecimentos", "thanksHeading": "Agradecimentos",
"eleventyDesc": "Gerador de sites estáticos, usado neste website.", "eleventyDesc": "Gerador de sites estáticos, usado neste website.",
"githubPagesDesc": "Pela hospedagem do website." "githubPagesDesc": "Pela hospedagem do website.",
"recentChangesPluginDesc": "Plugin para listagem de commits recentes.",
"inlineFaviconPluginDesc": "Suporte para icones em links.",
"poisonPluginDesc": "Envenenamento de IA dentro do código fonte das páginas."
} }

View file

@ -124,6 +124,18 @@
} }
] ]
}, },
"services": {
"links": [
{
"name": "Disroot",
"link": "https://disroot.org/",
"description": {
"en": "Privacy respecting e-mail, Nextcloud storage, XMPP server, encrypted file sharing and other cool services.",
"pt": "E-mail que respeita sua privacidade, armazenamento Nextcloud, servidor XMPP, compartilhamento de arquivos criptografados e outros serviços legais."
}
}
]
},
"piracy": { "piracy": {
"88x31": ["piracy.png"], "88x31": ["piracy.png"],
"links": [ "links": [
@ -151,6 +163,14 @@
"pt": "Baixe musica diretamente de Qobuz, Tidal, Soundcloud, Deezer, Amazon Music, e Yandex Music em alta qualidade de graça.", "pt": "Baixe musica diretamente de Qobuz, Tidal, Soundcloud, Deezer, Amazon Music, e Yandex Music em alta qualidade de graça.",
"en": "Download music directly from Amazon Music, Soundcloud, Qobuz, Deezer and Tidal for free." "en": "Download music directly from Amazon Music, Soundcloud, Qobuz, Deezer and Tidal for free."
} }
},
{
"name": "Orpheus",
"link": "https://orpheus.network/",
"description": {
"pt": "Tracker de músicas por convite, tem algumas músicas mais difíceis de achar.",
"en": "Invitation only music tracker, has a lot of hard to find songs."
}
} }
] ]
} }

View file

@ -7,5 +7,6 @@
"games": "Games", "games": "Games",
"tools": "Tools", "tools": "Tools",
"music": "Music", "music": "Music",
"piracy": "Piracy" "piracy": "Piracy",
"services": "Services"
} }

View file

@ -30,7 +30,7 @@ backgroundOpacity: .2
<dl> <dl>
{% for link in section.links %} {% for link in section.links %}
<div class="favoritesDefinitionListItem"> <div class="favoritesDefinitionListItem">
<dt><a href="{{ link.link }}">{{ link.name }}</a></dt> <dt>{% ai link.link %}{{ link.name }}{% endai %}</dt>
<hr class="favoritesDivider"> <hr class="favoritesDivider">
<dd> <dd>
{{ link.description[langKey] }} {{ link.description[langKey] }}

View file

@ -7,5 +7,6 @@
"games": "Jogos", "games": "Jogos",
"tools": "Ferramentas", "tools": "Ferramentas",
"music": "Música", "music": "Música",
"piracy": "Pirataria" "piracy": "Pirataria",
"services": "Serviços"
} }

View file

@ -0,0 +1,5 @@
{
"pageTitle": "Hotlinking me",
"pageDescription": "Instructions and resources for other cool netizens linking me in their page.",
"intro": "You're here probably because you want to link me in your page, that's cooool! To help you I've compiled some resources and snippets that carry some of my visual identity. Of course you're free to modify, reupload or even not use these."
}

View file

@ -0,0 +1,45 @@
---
layout: text.njk
pagination:
data: languages
size: 1
alias: langKey
---
{% from "macros.njk" import i88x31 with context %}
<main>
<div class="box pageHeaderBox">
<h1>{{ t.pageTitle }}</h1>
<p>{{ t.intro }}</p>
</div>
<hr>
<h2>88x31</h2>
{{ i88x31("tenkuma.gif") }}
{% highlight "html" %}
<a href="https://adrianvic.github.io/"><img src="https://adrianvic.github.io/static/images/88x31/tenkuma.gif"></a>
{% endhighlight %}
{{ i88x31("tenkuma2.gif") }}
{% highlight "html" %}
<a href="https://adrianvic.github.io/"><img src="https://adrianvic.github.io/static/images/88x31/tenkuma2.gif"></a>
{% endhighlight %}
{{ i88x31("tenkuma-splash.gif") }}
{% highlight "html" %}
<a href="https://adrianvic.github.io/"><img src="https://adrianvic.github.io/static/images/88x31/tenkuma-splash.gif"></a>
{% endhighlight %}
<h2>HTML</h2>
<a href="https://adrianvic.github.io/" style="width: fit-content;">
<div style="height: 10em; width: fit-content; display: flex; border: medium solid white;">
<p style="font-size: 3em; margin: auto 0px 1rem 1rem; color: white; text-decoration: none;">tenkuma</p>
<img src="https://adrianvic.github.io/static/images/arrow-cursor.svg" style="height=100%; filter: invert(1);" alt="Computer cursor arrow line drawing">
</div>
</a>
{% highlight "html" %}
<a href="https://adrianvic.github.io/" style="width: fit-content;">
<div style="height: 10em; width: fit-content; display: flex; border: medium solid white;">
<p style="font-size: 3em; margin: auto 0px 1rem 1rem; color: white; text-decoration: none;">tenkuma</p>
<img src="https://adrianvic.github.io/static/images/arrow-cursor.svg" style="height=100%; filter: invert(1);" alt="Computer cursor arrow line drawing">
</div>
</a>
{% endhighlight %}
</main>

View file

@ -0,0 +1,5 @@
{
"pageTitle": "Me linkando",
"pageDescription": "Instruções e recursos para outros internautas legais me colocarem nas suas páginas.",
"intro": "Você provavelmente veio aqui porque quer me linkar na sua página, que legaaaaal! Para te ajudar eu juntei uns recursos que carregam um pouco da minha identidade visual. Claro que você pode modificar, salvar ou nem usar eles."
}

3
site/misc/kumaos/en.json Normal file
View file

@ -0,0 +1,3 @@
{
"pageDescription": "Operating system written in JS."
}

View file

@ -0,0 +1,34 @@
---
pageTitle: kumaOS
pagination:
data: languages
size: 1
alias: langKey
---
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="{{ '/static/kumos/kumos.css' | url }}">
<script type="module" src="{{ '/static/kumos/kernel.mjs' | url }}" defer></script>
<script type="module" src="{{ '/static/kumos/system/init.mjs' | url }}" defer></script>
</head>
<body>
<div style="user-select: none; pointer-events: none; display: flex; gap: 1em;">
<h1>kumaOS</h1>
<p>demo - not for production</p>
</div>
<style>
body {
background-image: url("{{ '/static/images/bliss-dark.jpg' | url }}");
background-size: cover;
width: 100vw;
height: 100vh;
overflow: hidden;
margin: 0;
}
</style>
</body>
</html>

3
site/misc/kumaos/pt.json Normal file
View file

@ -0,0 +1,3 @@
{
"pageDescription": "Sistema operacional em JS."
}

View file

@ -27,5 +27,6 @@ module.exports = {
permalink: data => { permalink: data => {
return `/${data.langKey}/misc/${data.page.fileSlug}/`; return `/${data.langKey}/misc/${data.page.fileSlug}/`;
}, },
tags: "misc" tags: "misc",
headerLink: "misc"
}; };

View file

@ -0,0 +1,8 @@
{
"pageTitle": "Web assets",
"pageDescription": "My library of assets/scripts for websites.",
"intro": "This page's dedicated to showcasing some stuff I made for websites that may also be useful to you. Everything's on public domain unless otherwise stated, and atributtion is very appreciated ;-)",
"tumblrAdapt": "A script that detects if the URL attribute <i>tumblr</i> is <i>true</i> and adapts the website design to dodge Tumblr menu, useful if you point your blog HTML to your website (doable with iframe). It also sanitizes external links adding <i>target=\"_blank\"</i> (opens in a new tab) and preserves the <i>tumblr</i> attribute in each link.",
"click": "Script that plays a custom sound when you click the page or hover a link. The code checks <i>disablesfx</i> on localstorage, if it's <i>true</i> the sound does not play. Localstorage is checked when playing the audio, so it's possible to enable/disable it without reloading the page.",
"ccd": "Triggered when the user types the famous Konami Code inside the page and redirects to another page. The script name is an abbreviation of Konami Code, but with a C instead of K to be less obvious. It's pretty easy to modify it do other stuff."
}

View file

@ -0,0 +1,123 @@
---
layout: text.njk
pagination:
data: languages
size: 1
alias: langKey
---
{% from "macros.njk" import i88x31 with context %}
<main>
<div class="box pageHeaderBox">
<h1>{{ t.pageTitle }}</h1>
<p>{{ t.intro }}</p>
</div>
<hr>
<style>
pre.language-js {
height: 10em;
resize: vertical;
}
</style>
<h2>tumblr-adapt.js</h2>
<p>{{ t.tumblrAdapt | safe }}</p>
{% highlight 'js'%}const isTumblr = new URLSearchParams(location.search).get("tumblr") == "true"; // add ?tumblr=true to the tumblr iframe src attribute
function adaptToTumblrLayout() {
const header = document.querySelector('header'); // change to anything that would return your header
header.classList.add("tumblr"); // your CSS must handle the rest
// will calc the size of the header and save as a CSS variable called --header-height
const setHeaderOffset = () => {
const height = header.offsetHeight + "px";
document.documentElement.style.setProperty('--header-height', height);
};
// do this once and when the page resizes
setHeaderOffset();
window.addEventListener('resize', setHeaderOffset);
// sanitizing links so they don't open in your tumblr iframe
// also making sure all links carry the tumblr property!
document.querySelectorAll("a").forEach(link => {
if (new URL(link.href).host !== location.host) {
link.target = "_blank";
}
const u = new URL(link.href);
u.searchParams.set("tumblr", "true");
link.href = u.toString();
});
}
if (isTumblr) adaptToTumblrLayout();
/*
By tenkuma ^^
https://adrianvic.github.io
For those thumblrs that change the blog HTML for an iframe poiting to your personal website!
*/{% endhighlight %}
<h2>click.js</h2>
<p>{{ t.click | safe }}</p>
{% highlight 'js' %}// these must be URLs pointing to your audio!
const click = new Audio(`https://adrianvic.github.io/static/audio/click.ogg`);
const hover = new Audio(`https://adrianvic.github.io/static/audio/hover.ogg`);
click.preload = "auto";
hover.preload = "auto";
// adjust volume below
click.volume = 0.5;
hover.volume = 0.5;
document.body.addEventListener("click", () => {
// set disablesfx in the local storage to true to
// disable sound effects
if (localStorage.getItem("disablesfx") == 'true') return;
click.currentTime = 0;
click.play().catch(() => {});
});
document.querySelectorAll('a').forEach(link => {
link.addEventListener("mouseenter", () => {
if (localStorage.getItem("disablesfx") == 'true') return;
hover.currentTime = 0;
hover.play().catch(() => {});
})
})
/*
By tenkuma ^^
https://adrianvic.github.io
For those thumblrs that change the blog HTML for an iframe poiting to your personal website!
*/{% endhighlight %}
<h2>ccd.js</h2>
<p>{{ t.ccd }}</p>
{% highlight 'js' %}const konamiCode = ['ArrowUp', 'ArrowUp', 'ArrowDown', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'ArrowLeft', 'ArrowRight', 'KeyB', 'KeyA'];
let keyIndex = 0;
document.addEventListener('keydown', function(event) {
if (event.code === konamiCode[keyIndex]) {
keyIndex++;
if (keyIndex === konamiCode.length) {
// change this to your link!
window.location.href = `https://adrianvic.github.io/static/toyourdreams.txt`
keyIndex = 0;
}
} else {
keyIndex = 0;
}
});
/*
By tenkuma ^^
https://adrianvic.github.io
For those thumblrs that change the blog HTML for an iframe poiting to your personal website!
*/{% endhighlight %}
</main>

View file

@ -0,0 +1,8 @@
{
"pageTitle": "Recursos web",
"pageDescription": "Meu acervo de assets/scripts para websites.",
"intro": "Essa página é dedicada para reunir algumas coisas que eu fiz para websites que podem ser úteis para você também. Tudo daqui está em domínio público, a não ser que esteja escrito o contrário, mas deixar os créditos seria legal ;-)",
"tumblrAdapt": "Um script que detecta se o atributo de URL <i>tumblr</i> é <i>true</i> e adapta o design do site para desviar do menu do Tumblr, caso você coloque seu site como blog do Tumblr (dá para fazer com iframe). Ele também limpa os links adicionando <i>target=\"_blank\"</i> (abre em outra janela) para links externos e preserva o atributo <i>tumblr</i> em todos.",
"click": "Script que toca um som customizado quando você clica ou coloca o cursor em cima de um link. O código verifica o valor de <i>disablesfx</i> no localstorage, se ele for <i>true</i> o som não toca. O localstorage é verificado toda vez que o som toca, então dá para habilitar/desabilitar sem recarregar a página.",
"ccd": "Acionado quando o usuário digita o famoso Konami Code dentro da página e redireciona para outra página. O nome é a abreviação de Konami Code, mas com C ao invés de K para ficar menos óbvio. É bem fácil modificar ele para fazer outra coisa."
}

89
site/playground.njk Normal file
View file

@ -0,0 +1,89 @@
---
layout: text.njk
---
{% from "macros.njk" import i88x31 with context %}
{% from "macros.njk" import webring %}
{% from "macros.njk" import projectCard %}
{% from "macros.njk" import videoCard with context %}
<div class="box pageHeaderBox">
<h1>Playground</h1>
<p>This is a test page showcasing different elements from the website. By the way, this box is a page header box, which is a regular box without margin followed by a separator.</p>
</div>
<hr>
<h2>Text</h2>
<p>Flowers are red, they can also be blue. Just like <a href="https://www.youtube.com/watch?v=dQw4w9WgXcQ&list=RDdQw4w9WgXcQ&start_radio=1&pp=ygUXbmV2ZXIgZ29ubmEgZ2l2ZSB5b3UgdXCgBwE%3D">links</a>. I'm not much of a poet... Anyways, did I get the link contrast right this time? And the paragraph spacing?</p>
<h3>Bolinho de Chuva</h3>
<p>Did you know here in Brazil we have a dessert literally called Bolinho de Chuva (lit. "rain cake")? It's basically fried dough with sugar, the best ones have banana inside. The tradition is to make them when it's raining, I have a lot of childhood memories of eating this and thinking of this now makes me realize it may be one of the reasons I like rain so much. Don't get me wrong, I hate being <i>in</i> the rain, I swear I can feel each drop puncturing me like a needle. What I like is to stay home and listen to the gentle song of falling droplets.</p>
<p>I was eating one when I wrote this.</p>
<h2>Alert box</h2>
<div class="box alert">
<p>This is a alert box.</p>
</div>
<h2>Code block</h2>
<p>Uses Eleventy highlight plugin, Prism CSS by RunDevelopment slightly edited to fit the website design language.</p>
{% highlight "js" %}
function myFunction() {
return true;
}
{% endhighlight %}
<h2>88x31 interactive images</h2>
<p>88x31 are looking too small on modern monitors, so you can now click on them to expand.</p>
{{ i88x31("tenkuma.gif") }}
{{ i88x31("anybrowser6.gif") }}
{{ i88x31("ai.gif") }}
{{ i88x31("WEBP.gif") }}
<h2>Webring widget</h2>
<p>Generic webring widget with custom background, link color and links.</p>
{{ webring({
text: "Breakcore Webring",
links: [
"<a href='https://webri.ng/webring/breakcoreweb/previous?via=https%3A%2F%2Fadrianvic.github.io%2F'>First</a>",
"<a href='https://appak.neocities.org/breakcore'>Second</a>",
"<a href='https://webri.ng/webring/breakcoreweb/next?via=https%3A%2F%2Fadrianvic.github.io%2F'>Third</a>"
],
image: "/static/images/metro-flowers.jpg"
}) }}
<h2>Project card</h2>
<p>These are used in the homepage to list my repos.</p>
{{
projectCard(
"Example project",
"I'm probably not entering heaven for this terrible picture I made of my Minecraft skin. Now I cannot delete it from the website files because it's being used here. I even had the balls to call it <a href='" ~ ('/static/images/me.png' | url ) ~ "'>me.png</a>.",
('/static/images/me.png' | url ),
'/static/images/me.png',
"PestoWiki"
)
}}
<h2>Video card</h2>
<p>The image, website and video duration are hardcoded so you don't ping any server to pull it (and it works without JS). Of course none of that is relevant to you, this site source is a mess so you don't have to deal with privacy invasive bullshit, I'm just stating that to fill space after the title, spacing is strange with no text here.</p>
<div style="width: 50%; margin: auto;">
{{
videoCard(
i18n["global"].homeVideoLink,
"I don't know the video title, it's pulling from the global string table.",
i18n["global"].homeVideoImage,
i18n["global"].homeVideoWebsite,
i18n["global"].homeVideoDuration
)
}}
</div>
<h2>Recent commits</h2>
<p>Thanks to <a href="https://www.npmjs.com/package/eleventy-plugin-recent-changes">workeffortwaste's eleventy-plugin-recent-changes</a> <3</p>
<ul>
{%- for commit in collections.recentChanges %}
<li><time>{{ commit.authorDate }}</time> {{ commit.subject }}</li>
{%- endfor %}
</ul>
<h2>Link with favicon</h2>
<p>Here's a link to {% ai "https://github.com/adrianivc" %}my github page{% endai %}. Thanks to <a href="https://www.npmjs.com/package/eleventy-plugin-inline-link-favicon">bmuenzenmeyer's eleventy-plugin-inline-link-favicon</a> <3</p>

View file

@ -1,5 +1,6 @@
let data = { let data = {
layout: "_includes/post.njk", layout: "_includes/post.njk",
headerLink: "blog",
eleventyComputed: { eleventyComputed: {
lastModified: function(data) { lastModified: function(data) {
const fs = require('fs'); const fs = require('fs');

50
site/social.njk Normal file
View file

@ -0,0 +1,50 @@
---
pagination:
data: i18n
size: 1
alias: langKey
permalink: "/{{ langKey }}/social/index.html"
layout: base.njk
title: Adrian Victor:Social
headerLink: social
---
<script>
const clickHereToContinueLocalized = "{{ i18n[langKey].clickHereToContinue }}";
</script>
<script src="{{ '/static/scripts/social.js' | url }}" defer></script>
<aside>
<div id="socialAside">
<div>
<h1 class="nomargin negativeMargin"><a class="textColored noDecoration" href="https://mstdn.social/@tenkuma">@tenkuma</a></h1>
<hr class="nomargin">
<img src="{{ '/static/images/profile.jpg' | url }}">
</div>
</div>
{% include 'widgets/internetometer-aside.html' %}
</aside>
<main>
<div id="socialAlert" class="box alert" style="margin-bottom: 1em;">
<p>{{ i18n[langKey].socialContentNotRated }}</p>
</div>
<p>{{ i18n[langKey].mastodonPageDescription }}</p>
<ul id="socialPosts">
{% for post in mastodon.posts %}
<hr class="nomargin">
<div class="mastodonPost">
<div class="mastodonPostContent">
{{ post.content | safe }}
{% if post.media %}
<div class="mastodonMediaBox">
<div>
{% for media in post.media %}
<a href="{{ media.image }}"><img class="mastodonMedia" src="{{ media.image }}" {% if media.alt %}alt="{{ media.alt }}"{% endif %}></a>
{% endfor %}
</div>
</div>
{% endif %}
</div>
<p class="mastodonLink"><a class="postLink" href="{{ post.source_url }}">{{ post.date }}</a></p>
</div>
{% endfor %}
</ul>
</main>

BIN
static/images/88x31/1.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 961 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

BIN
static/images/88x31/abs.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 494 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,008 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

BIN
static/images/88x31/cab.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Some files were not shown because too many files have changed in this diff Show more