Configuration initiale du projet et première version du site.
This commit is contained in:
commit
0ffe77ed47
20 changed files with 2158 additions and 0 deletions
10
.editorconfig
Normal file
10
.editorconfig
Normal 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
4
.gitattributes
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
/.yarn/** linguist-vendored
|
||||||
|
/.yarn/releases/* binary
|
||||||
|
/.yarn/plugins/**/* binary
|
||||||
|
/.pnp.* binary linguist-generated
|
9
.gitignore
vendored
Normal file
9
.gitignore
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# IDEA
|
||||||
|
*.iml
|
||||||
|
|
||||||
|
# Javascript
|
||||||
|
.yarn/
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
# Website
|
||||||
|
public/
|
1
.yarnrc.yml
Normal file
1
.yarnrc.yml
Normal file
|
@ -0,0 +1 @@
|
||||||
|
nodeLinker: node-modules
|
1
README.md
Normal file
1
README.md
Normal file
|
@ -0,0 +1 @@
|
||||||
|
# madeorsk.com
|
122
index.html
Normal file
122
index.html
Normal 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
6
less/_colors.less
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
|
||||||
|
@background: #141414;
|
||||||
|
@background-darker: #0C0C0C;
|
||||||
|
@background-darkest: #040404;
|
||||||
|
|
||||||
|
@foreground: #F9F9F9;
|
42
less/_common.less
Normal file
42
less/_common.less
Normal 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
7
less/_encrypted.less
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
.encrypted
|
||||||
|
{
|
||||||
|
display: inline-block;
|
||||||
|
width: 7em;
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: center;
|
||||||
|
}
|
35
less/_fakeart.less
Normal file
35
less/_fakeart.less
Normal 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
21
less/_faketerm.less
Normal 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
10
less/_fonts.less
Normal 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
9
less/_footer.less
Normal 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
10
less/_header.less
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
|
||||||
|
header
|
||||||
|
{
|
||||||
|
h1
|
||||||
|
{
|
||||||
|
margin: 1em auto;
|
||||||
|
font-size: 2.5em;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
21
less/_main.less
Normal file
21
less/_main.less
Normal 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
10
less/madeorsk.less
Normal 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
19
package.json
Normal 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
83
src/website.ts
Normal 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
10
vite.config.ts
Normal 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,
|
||||||
|
},
|
||||||
|
}));
|
Loading…
Add table
Reference in a new issue