Configuration initiale du projet et première version du site.

This commit is contained in:
Madeorsk 2024-09-07 10:32:18 +02:00
commit 0ffe77ed47
20 changed files with 2158 additions and 0 deletions

10
.editorconfig Normal file
View file

@ -0,0 +1,10 @@
root = true
[*]
end_of_line = lf
insert_final_newline = true
[*.{js,json,yml}]
charset = utf-8
indent_style = tab
indent_size = 2

4
.gitattributes vendored Normal file
View file

@ -0,0 +1,4 @@
/.yarn/** linguist-vendored
/.yarn/releases/* binary
/.yarn/plugins/**/* binary
/.pnp.* binary linguist-generated

9
.gitignore vendored Normal file
View file

@ -0,0 +1,9 @@
# IDEA
*.iml
# Javascript
.yarn/
node_modules/
# Website
public/

1
.yarnrc.yml Normal file
View file

@ -0,0 +1 @@
nodeLinker: node-modules

1
README.md Normal file
View file

@ -0,0 +1 @@
# madeorsk.com

122
index.html Normal file
View file

@ -0,0 +1,122 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Madeorsk</title>
<link rel="stylesheet" type="text/css" href="./less/madeorsk.less" />
<script type="module" src="./src/website.ts"></script>
</head>
<body>
<header class="fakeart">
<h1>madeorsk</h1>
</header>
<main>
<section id="intro">
<h2 class="faketerm">welcome</h2>
<p>
Bienvenue sur le terminal d'accès de l'espace personnel de <strong>madeorsk</strong>. Pas besoin d'enlever tes chaussures, tu es déjà dans le monde numérique. Je suis ravi que tu sois là, j'ai quelques petites choses à te montrer.
</p>
<noscript>
<p>
Je remarque que tu as désactivé Javascript. Tu as raison, mais tu te prives ici de quelques animations
sympathiques. Je t'invite donc à autoriser Javascript sur cette page. Pas de pisteurs ni de requêtes à des
sites bizarres, juste ce terminal.
</p>
</noscript>
</section>
<section id="whoami">
<h2 class="faketerm">whoami</h2>
<p>
Je suis développeur de logiciels et passionné d'informatique, particulièrement intéressé par les logiciels libres.
J'aime dire que je suis <em>forgeron numérique</em> : je souhaite construire des outils qui te servent dans tes tâches
du quotidien.
</p>
<p>
<strong>Être</strong>, c'est beaucoup, je n'ai jamais su si j'en étais vraiment capable. Au minimum
je peux te décrire ce que j'aime et n'aime pas, et ce que je souhaite profondément.
Ce sont les ingrédients de mon être. Pour le saisir avec plus de précision,
tu seras obligé de me parler (désolé...).
</p>
<p>
<strong>J'aime</strong> les ordinateurs, les fourmis, la musique qui donne de l'énergie, être seul, la pizza.
</p>
<p>
<strong>Je n'aime pas</strong> l'intolérance, le vent trop fort, me faire imposer quelque chose.
</p>
<p>
<strong>Je pense que</strong> la pleine liberté ne s'obtient qu'en étant tous égaux et bienveillants envers les autres.
</p>
<p>
<strong>Je ne pense pas que</strong> l'humain est bon par nature et que la société le dérègle, un
cadre est toujours nécessaire pour le maitriser.
</p>
<p>
<strong>Je rêve</strong> d'un monde ouvert et libre. <strong>Je rêve</strong> que chacun puisse disposer de quoi vivre dignement
et accomplir ses projets. <strong>Je rêve</strong> que la connaissance scientifique croisse et soit accessible à toutes et tous.
</p>
<p><strong>On me trouve</strong> sur <a href="https://aleph.land/@Madeorsk">le fédivers</a>, <a href="https://codeberg.org/Madeorsk">Codeberg</a>, <a href="https://github.com/Madeorsk">Github</a>.</p>
</section>
<section id="projects">
<h2 class="faketerm">projects</h2>
<p>
J'ai le malheur d'avoir beaucoup trop de choses dans la tête qui m'amène à un nombre impossible de choses
à gérer et faire. J'ai essayé de rassembler dans une liste de toutes les choses que je peux te montrer.
</p>
<ul>
<li>
<span class="encrypted">encrypted</span>, un système de cloud privé performant, simple, chiffré et sécurisé. L'objectif
principal est de permettre une synchronisation entre plusieurs appareils, et la simplification des sauvegardes.
</li>
<li>
<span class="encrypted">encrypted</span>, un réseau de blogs décentralisés basés sur <a href="https://activitypub.rocks" target="_blank">ActivityPub</a> et les <a href="https://indieweb.org/Webmention" target="_blank">Webmentions</a>.
Je souhaite mettre l'accent sur l'utilisabilité, la lisibilité, et la simplicité de partage et de citation
d'un article. Je suis convaincu que l'avenir du web au format texte se joue de cette manière.
</li>
<li><strong>KernelUI</strong> : une bibliothèque de composants avancés pour React. <a href="https://code.zeptotech.net/UIKernel">Voir KernelUI</a></li>
<li><strong>Nest</strong> : un framework PHP nouvelle génération qui vise la production de bon code clair, simple et maintenable. <s><a>Voir Nest</a></s></li>
<li><strong>aleph.land</strong>, <strong>rudeshark.net</strong> : j'héberge ces nœuds de réseaux sociaux libres et décentralisés.</li>
<li>Je participe à <strong>fedi.monster</strong>, la plate-forme d'hébergement collective du fédivers. <a href="https://fedi.monster">Voir fedi.monster</a></li>
<li><strong>PollVerlaine</strong> : un logiciel auto-hébergé pour faire des sondages tout simples. <a href="https://git.madeorsk.com/Madeorsk/PollVerlaine">Voir PollVerlaine</a></li>
<li><strong>Sharkitek</strong> : un ensemble de bibliothèques pour simplifier les échanges de modèles entre un back-end quelconque et un front-end TypeScript. <a href="https://git.madeorsk.com/Sharkitek">Voir Sharkitek</a></li>
<li>Il y a longtemps, j'ai fait <a href="https://github.com/Madeorsk/EmojisFX">EmojisFX</a>, une bibliothèque pour gérer les emojis avec JavaFX.</li>
</ul>
</section>
<section id="social">
<h2 class="faketerm">contact</h2>
<p>Par email, <a href="mailto:m@deor.sk">m@deor.sk</a>.</p>
<p>Par message privé (matrix), @Madeorsk:aleph.land.</p>
<p>Sur le fédivers, <a href="https://aleph.land/@Madeorsk">@Madeorsk@aleph.land</a> (ou <a href="https://rudeshark.net/@madeorsk">@madeorsk@rudeshark.net</a>).</p>
<p>
Je ne suis jamais fermé à la discussion. N'hésite pas.
</p>
</section>
</main>
<footer>
🄯 Madeorsk
</footer>
</body>
</html>

6
less/_colors.less Normal file
View file

@ -0,0 +1,6 @@
@background: #141414;
@background-darker: #0C0C0C;
@background-darkest: #040404;
@foreground: #F9F9F9;

42
less/_common.less Normal file
View file

@ -0,0 +1,42 @@
html, body
{
margin: 0;
padding: 0;
font-family: @font;
font-size: 1.075em;
}
body
{
background: @background;
color: @foreground;
line-height: 1.6em;
}
a
{
transition: opacity 0.2s ease;
border-bottom: solid @foreground thin;
color: @foreground;
text-decoration: none;
&:hover
{
opacity: 0.75;
}
}
ul
{
margin: 0;
padding: 0;
list-style: " ";
> li
{
margin: 1em 0;
}
}

7
less/_encrypted.less Normal file
View file

@ -0,0 +1,7 @@
.encrypted
{
display: inline-block;
width: 7em;
font-weight: bold;
text-align: center;
}

35
less/_fakeart.less Normal file
View file

@ -0,0 +1,35 @@
.fakeart
{
position: relative;
display: block;
width: 95%;
min-height: 15em;
height: 50vh;
overflow: hidden;
.char
{
position: absolute;
animation: down-the-matrix linear infinite;
}
}
@keyframes down-the-matrix
{
0%
{
opacity: 0;
transform: translateY(-10em);
}
50%
{
opacity: 1;
transform: translateY(0);
}
100%
{
opacity: 0;
transform: translateY(10em);
}
}

21
less/_faketerm.less Normal file
View file

@ -0,0 +1,21 @@
.faketerm
{
&::before
{
content: "$ ";
}
&::after
{
content: "_";
animation: blink 1.5s step-end infinite;
}
}
@keyframes blink
{
50%
{
opacity: 0;
}
}

10
less/_fonts.less Normal file
View file

@ -0,0 +1,10 @@
@import "@fontsource/iosevka-aile/400.css";
@import "@fontsource/iosevka-aile/400-italic.css";
@import "@fontsource/iosevka-aile/500.css";
@import "@fontsource/iosevka-aile/500-italic.css";
@import "@fontsource/iosevka-aile/600.css";
@import "@fontsource/iosevka-aile/600-italic.css";
@import "@fontsource/iosevka-aile/800.css";
@import "@fontsource/iosevka-aile/800-italic.css";
@font: "Iosevka Aile", ui-monospace, "Cascadia Code", "Source Code Pro", Menlo, Consolas, "DejaVu Sans Mono", monospace;

9
less/_footer.less Normal file
View file

@ -0,0 +1,9 @@
footer
{
margin: 3em auto auto auto;
padding: 3em 0;
font-size: 0.9em;
font-weight: 500;
text-align: center;
}

10
less/_header.less Normal file
View file

@ -0,0 +1,10 @@
header
{
h1
{
margin: 1em auto;
font-size: 2.5em;
text-align: center;
}
}

21
less/_main.less Normal file
View file

@ -0,0 +1,21 @@
main
{
h2
{
margin: 1em auto;
font-size: 1.85em;
}
section
{
margin: auto;
width: 40em;
max-width: 95%;
box-sizing: border-box;
p
{
margin: 1em auto;
}
}
}

10
less/madeorsk.less Normal file
View file

@ -0,0 +1,10 @@
@import "_fonts";
@import "_colors";
@import "_common";
@import "_header";
@import "_faketerm";
@import "_fakeart";
@import "_encrypted";
@import "_main";
@import "_footer";

19
package.json Normal file
View file

@ -0,0 +1,19 @@
{
"name": "madeorsk",
"scripts": {
"build": "vite build",
"dev": "vite"
},
"devDependencies": {
"@types/node": "^22.5.4",
"less": "^4.2.0",
"ts-node": "^10.9.2",
"typescript": "^5.5.4",
"vite": "^5.4.3"
},
"type": "module",
"packageManager": "yarn@4.4.1",
"dependencies": {
"@fontsource/iosevka-aile": "^5.0.11"
}
}

83
src/website.ts Normal file
View file

@ -0,0 +1,83 @@
// Caractères.
const characters = "ʣʤʥʦʧʨʩʪʫʬʮʯɯɰɲɴɷ¿ÆÐÔÜĞĢĻŊŨŻŽƂƆƌΨΩΞΛϺϢϢϣϨϾЖѹѼ҉҈ҐҖӜӚߐߊ߈ߒݾߋك߉אڶےFA௵";
/**
* Obtient un caractère aléatoire.
*/
function getRandomCharacter(): string
{
return characters.charAt(Math.ceil(Math.random() * characters.length));
}
/**
* Simulation de portion chiffrée.
* @param element L'élément pour lequel générer du texte chiffré.
* @param charsCount Le nombre de caractères du texte chiffré.
*/
function fakeEncrypted(element: Element, charsCount: number): void
{
// Génération de caractères.
const chars = [...Array(charsCount)].map(getRandomCharacter);
element.textContent = "".concat(...chars);
// Génération de rotation : trouble entre -4° et +4° + on retourne parfois complètement le texte.
const randomRotation = (Math.round(Math.random()) * 180) + Math.ceil(Math.random() * 8) - 4;
element.setAttribute("style", "transform: rotate(" + randomRotation + "deg);");
}
/**
* Fait apparaitre un caractère dans la matrice de simulation d'art numérique.
*/
function spawnChar(): HTMLDivElement
{
// Création d'un nouvel élément de caractère aléatoire.
const charEl = document.createElement("div");
// Caractère animé.
charEl.className = "char";
// Initialisation de la position et de l'animation.
charEl.style.top = (10 + Math.round(Math.random() * 80)) + "%";
charEl.style.left = Math.round(Math.random() * 100) + "%";
charEl.style.animationDuration = (1333 + Math.round(Math.random() * 800)) + "ms";
charEl.textContent = getRandomCharacter();
// Changement de caractère régulier, aléatoirement.
const changeChar = () => {
charEl.textContent = getRandomCharacter();
window.setTimeout(changeChar, (500 + Math.round(Math.random() * 1000)));
};
// Lancement initial du changement de caractères.
window.setTimeout(changeChar, (500 + Math.round(Math.random() * 1000)));
return charEl;
}
/**
* Simulation d'art numérique.
* @param element L'élément dans lequel générer l'art numérique.
*/
function fakeArt(element: Element): void
{
// On ajoute 150 caractères animés.
[...Array(150)].forEach(() => {
element.appendChild(spawnChar());
});
}
document.addEventListener("DOMContentLoaded", () => {
console.log("Bienvenue sur le terminal d'accès de l'espace personnel de madeorsk.");
console.log("Oh ?");
console.log("Tiens, tu es là. Je ne m'attendais pas à te trouver ici.");
console.log("Tu souhaites visiter l'arrière-boutique ? Pas de problème, tu es libre.");
console.log("Si tu veux voir le code source original, tu peux aller sur https://git.madeorsk.com/Madeorsk/madeorsk.com.");
// Activation du faux chiffrement des éléments chiffrés.
document.querySelectorAll(".encrypted").forEach((element) => {
const charsCount = element.textContent.length;
fakeEncrypted(element, charsCount);
window.setInterval(() => fakeEncrypted(element, charsCount), 100);
});
document.querySelectorAll(".fakeart").forEach(fakeArt);
});

10
vite.config.ts Normal file
View file

@ -0,0 +1,10 @@
import {defineConfig} from "vite";
import {resolve} from "path";
// https://vitejs.dev/config/
export default defineConfig(() => ({
build: {
outDir: resolve(__dirname, "public"),
emptyOutDir: true,
},
}));

1728
yarn.lock Normal file

File diff suppressed because it is too large Load diff