feat(site): initialise site web

This commit is contained in:
Kazhnuz Klappsthul 2024-02-09 15:02:12 +01:00
parent 172094787e
commit 5cd0d4bf4a
27 changed files with 1202 additions and 0 deletions

25
.gitignore vendored Normal file
View File

@ -0,0 +1,25 @@
# Generated files
package/generated*
# Ignore installed npm modules
node_modules/
# Ignore build tool output, e.g. code coverage
.nyc_output/
coverage/
# Ignore API documentation
api-docs/
# Ignore folders from source code editors
.vscode
.idea
# Ignore eleventy output when doing manual tests
_site/
package-lock.json
# Ignore test files
.cache
test/stubs-layout-cache/_includes/*.js

11
_data/metadata.js Normal file
View File

@ -0,0 +1,11 @@
module.exports = {
title: "Missing Number",
url: "https://missingnumber.fanstuff.garden/",
language: "fr",
description: "Découvrez les secrets des premières version de Pokémon",
author: {
name: "Kazhnuz",
email: "kazhnuz@kobold.cafe",
url: "https://kazhnuz.space/"
}
}

View File

@ -0,0 +1,34 @@
---
layout: layouts/parent.njk
---
<main id="skip">
<div>
{{ content | safe }}
</div>
</main>
<aside id="more-info">
<div class="card">
<ol>
{%- for post in collections.all | sort(false, true, "data.eleventySubNavigation.order") -%}
{%- if post.data.eleventyNavigation.key == eleventySubNavigation.parent -%}
<li><a href="{{ post.url }}" style="padding-left:3px;">← {{ post.data.eleventyNavigation.key }}</a></li>
{%- endif -%}
{%- endfor -%}
</ol>
</div>
<div class="card">
<h2>Sommaire</h2>
{{ content | toc | safe }}
</div>
<div class="card">
<h2>Pages sœurs</h2>
<ol>
{%- for post in collections.all | sort(false, true, "data.eleventySubNavigation.order") -%}
{%- if post.data.eleventySubNavigation.parent == eleventySubNavigation.parent -%}
<li><a href="{{ post.url }}">{{ post.data.eleventySubNavigation.key }}</a></li>
{%- endif -%}
{%- endfor -%}
</ol>
</div>
</aside>

View File

@ -0,0 +1,25 @@
---
layout: layouts/parent.njk
---
<main id="skip">
<div>
{{ content | safe }}
</div>
</main>
<aside id="more-info">
<div class="card">
<h2>Sommaire</h2>
{{ content | toc | safe }}
</div>
<div class="card">
<h2>Sous-pages</h2>
<ol>
{%- for post in collections.all | sort(false, true, "data.eleventySubNavigation.order") -%}
{%- if post.data.eleventySubNavigation.parent == eleventyNavigation.key -%}
<li><a href="{{ post.url }}">{{ post.data.eleventySubNavigation.key }}</a></li>
{%- endif -%}
{%- endfor -%}
</ol>
</div>
</aside>

View File

@ -0,0 +1,15 @@
---
layout: layouts/parent.njk
---
<main id="skip">
<div>
{{ content | safe }}
</div>
</main>
<aside id="more-info">
<div class="card">
<h2>Sommaire</h2>
{{ content | toc | safe }}
</div>
</aside>

View File

@ -0,0 +1,20 @@
---
layout: layouts/parent.njk
---
<main id="skip">
<div>
{{ content | safe }}
<h2 id="liste-des-pages">Liste des pages</h2>
{{ collections.all | eleventyNavigation: "Annuaire", navToHtmlOptions | eleventyNavigationToHtml | safe | json }}
</div>
</main>
<aside id="more-info">
<div class="card">
<h2 class="visually-hidden">Table of Content</h2>
{{ content | toc | safe }}
<ul>
<li><a href="#liste-des-pages">Liste des pages</a></li>
</ul>
</div>
</aside>

View File

@ -0,0 +1,8 @@
---
layout: layouts/parent.njk
---
<main id="skip">
<div>
{{ content | safe }}
</div>
</main>

View File

@ -0,0 +1,47 @@
<!doctype html>
<html lang="{{ metadata.language }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ title or metadata.title }}</title>
<meta name="description" content="{{ description or metadata.description }}">
{#- Atom and JSON feeds included by default #}
<link rel="alternate" href="/feed/feed.xml" type="application/atom+xml" title="{{ metadata.title }}">
<link rel="alternate" href="/feed/feed.json" type="application/json" title="{{ metadata.title }}">
<link rel="icon" type="image/x-icon" href="/favicon.png">
<script src="/js/datatables.js"></script>
{#- Uncomment this if youd like folks to know that you used Eleventy to build your site! #}
<meta name="generator" content="{{ eleventy.generator }}">
{%- css %}{% include "public/css/index.css" %}{% endcss %}
{%- css %}{% include "public/css/datatables.css" %}{% endcss %}
<style>{% getBundle "css" %}</style>
</head>
<body>
<a href="#skip" class="visually-hidden">Skip to main content</a>
<header>
<h1>
<a href="/" class="home-link"><img src="/img/logo.png" alt="{{ metadata.title }}"></a>
</h1>
<nav>
<h2 class="visually-hidden">Top level navigation menu</h2>
</nav>
</header>
<div class="wrapper">
<nav id="sidebar">
{{ collections.all | eleventyNavigation | eleventyNavigationToHtml({anchorClass: "itemLink",activeAnchorClass: "active",activeListItemClass: "active",activeKey: eleventyNavigation.key, listClass: "nav", listItemClass: "item"}) | safe }}
</nav>
{{ content | safe }}
</div>
<footer><a href="https://creativecommons.org/licenses/by-sa/4.0/"><img src="/img/cc-by-sa.png" /><span class="visually-hidden">Tout le contenu de cette page est sous licence Creatve Common Attribution - Partage à l'identique.</span></a></footer>
<!-- Current page: {{ page.url | htmlBaseUrl }} -->
</body>
</html>

View File

@ -0,0 +1,28 @@
---
layout: layouts/parent.njk
---
{# Only include the syntax highlighter CSS on blog posts #}
{%- css %}{% include "node_modules/prismjs/themes/prism-okaidia.css" %}{% endcss %}
{%- css %}{% include "public/css/prism-diff.css" %}{%- endcss %}
<h1>{{ title }}</h1>
<ul class="post-metadata">
<li><time datetime="{{ page.date | htmlDateString }}">{{ page.date | readableDate }}</time></li>
{%- for tag in tags | filterTagList %}
{%- set tagUrl %}/tags/{{ tag | slugify }}/{% endset %}
<li><a href="{{ tagUrl }}" class="post-tag">{{ tag }}</a>{%- if not loop.last %}, {% endif %}</li>
{%- endfor %}
</ul>
{{ content | safe }}
{%- if collections.posts %}
{%- set previousPost = collections.posts | getPreviousCollectionItem %}
{%- set nextPost = collections.posts | getNextCollectionItem %}
{%- if nextPost or previousPost %}
<ul class="links-nextprev">
{%- if previousPost %}<li>Previous: <a href="{{ previousPost.url }}">{{ previousPost.data.title }}</a></li>{% endif %}
{%- if nextPost %}<li>Next: <a href="{{ nextPost.url }}">{{ nextPost.data.title }}</a></li>{% endif %}
</ul>
{%- endif %}
{%- endif %}

9
_includes/postslist.njk Normal file
View File

@ -0,0 +1,9 @@
{%- css %}.postlist { counter-reset: start-from {{ (postslistCounter or postslist.length) + 1 }} }{% endcss %}
<ol reversed class="postlist">
{% for post in postslist | reverse %}
<li class="postlist-item{% if post.url == url %} postlist-item-active{% endif %}">
<a href="{{ post.url }}" class="postlist-link">{% if post.data.title %}{{ post.data.title }}{% else %}<code>{{ post.url }}</code>{% endif %}</a>
<time class="postlist-date" datetime="{{ post.date | htmlDateString }}">{{ post.date | readableDate("LLLL yyyy") }}</time>
</li>
{% endfor %}
</ol>

19
content/404.md Normal file
View File

@ -0,0 +1,19 @@
---
layout: layouts/home.njk
permalink: 404.html
eleventyExcludeFromCollections: true
---
# Contenu non trouvé.
Retournez à l'<a href="/">accueil</a> et essayer une autre page.
<!--
Read more: https://www.11ty.dev/docs/quicktips/not-found/
This will work for both GitHub pages and Netlify:
* https://help.github.com/articles/creating-a-custom-404-page-for-your-github-pages-site/
* https://www.netlify.com/docs/redirects/#custom-404
-->

31
content/apropos.md Normal file
View File

@ -0,0 +1,31 @@
---
layout: layouts/base.njk
eleventyNavigation:
key: À propos
parent: Accueil
order: 0
---
# À propos de Missing Number
Missing Number est un fansite pokémon orienté 1G / 2G, visant à parler des différents aspects de cette époque. Il a pour but à terme de devenir une sorte de mini "guide" de ces jeux, offrant un peu tout ce qu'il y a a savoir aussi. Il est utilise le générateur de site Eleventy pour former des pages HTML simple, et cherche à être légé et rapide à charger.
Ce site à un concept et un sujet similaire au site [Blue Moon Falls](https://bluemoonfalls.com/), mais une approche un peu différente (et Missing Number est en Français là ou BMF est en anglais). Blue Moon Fall offre une approche permettant de découvrir plus les jeux Pokémon 1G/2G et notamment certaines des mécaniques de customisations et "comment obtenir le plus de fun des jeux", là ou Missing Number vise à montrer un tas de chose qui existaient à cette époque, et tout l'aspect "méta-jeu". Si un jour peut-être qu'on aura quelques guides stratégiques pour les pokémons, pour l'instant nous n'en avons pas.
Cependant, je vous conseille de visiter aussi Blue Moon Falls si vous lisez l'anglais, le site à une approche complémentaire très intéressante, et fournis plusieurs outils dont on reparlera dans les pages adéquates.
Nous avons aussi quelques informations en commun avec le site [PRAMA Initiative](https://www.prama-initiative.com/), un fanwiki de glitchologie Pokémon, mais ceux-ci sont bieeeen plus complet sur ce sujet (même s'ils n'ont pas encore de glitchdex).
## Pourquoi ce site ?
Le but de ce site est de fournir un petit site sur un sujet très spécifique (les pokémons des générations 1 et 2) regroupant des liens vers de nombreux autres endroits ou vous aurez plus d'informations. L'idée est d'être moins complet qu'un wiki, mais un peu plus abordable, et traitant de sujets plus divers (mais centré sur la thématique commune), n'hésitant pas à aller dans les domaines moins "officiels", voir moins encyclopédique.
Il se pose en complément des gros sites Pokémon, tout en étant un petit espace ou je peux parler de la partie qui me plaît de ces sujets. L'idée est aussi de fournir un feeling un peu de cette époque, en abordant de nombreux sujets qui revenaient dans la période (ou plus tard) autour de ces jeux.
## Pourquoi la 1G/2G ?
J'ai fait ce site parce que j'ai passé d'excellent moment sur ces générations, et que je voulais aider à les rendre plus accessible aux gens voulant s'y lancer maintenant. Par rapport aux pokémon moderne, les premières générations ont pas mal d'archaïsme, mais elles ont aussi un scope plus petit qui les rends plus accessible sur certains points. N'ayant pas des centaines et centaines de pokémon avec lesquels jongler, cela en fait des jeux plus "abordable" sur certains points, ayant un peu moins de complexité.
Cela ne veut pas dire qu'elles sont toujours facile, ou n'offrent pas de richesse, mais elles ont un caractère plus simple. Mais à côté, il y a tout un univers moins connus, fondée non pas sur les jeux en eux-même mais tout les discours et les phénomènes émergeant qui ont eut lieu.
D'autres "blocs" de générations pourraient être fait avec d'autres sites similaires, tel qu'un site 3-5G, un site 6G/7G, etc.

View File

@ -0,0 +1,3 @@
module.exports = {
eleventyExcludeFromCollections: true
}

27
content/feed/feed.njk Executable file
View File

@ -0,0 +1,27 @@
---
# Metadata comes from _data/metadata.js
permalink: /feed/feed.xml
---
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="{{ metadata.language }}">
<title>{{ metadata.title }}</title>
<subtitle>{{ metadata.description }}</subtitle>
<link href="{{ permalink | htmlBaseUrl(metadata.url) }}" rel="self"/>
<link href="{{ metadata.url | addPathPrefixToFullUrl }}"/>
<updated>{{ collections.posts | getNewestCollectionItemDate | dateToRfc3339 }}</updated>
<id>{{ metadata.url }}</id>
<author>
<name>{{ metadata.author.name }}</name>
<email>{{ metadata.author.email }}</email>
</author>
{%- for post in collections.posts | reverse %}
{% set absolutePostUrl %}{{ post.url | htmlBaseUrl(metadata.url) }}{% endset %}
<entry>
<title>{{ post.data.title }}</title>
<link href="{{ absolutePostUrl }}"/>
<updated>{{ post.date | dateToRfc3339 }}</updated>
<id>{{ absolutePostUrl }}</id>
<content type="html">{{ post.templateContent | transformWithHtmlBase(absolutePostUrl, post.url) }}</content>
</entry>
{%- endfor %}
</feed>

29
content/feed/json.njk Normal file
View File

@ -0,0 +1,29 @@
---
# Metadata comes from _data/metadata.js
permalink: /feed/feed.json
---
{
"version": "https://jsonfeed.org/version/1.1",
"title": "{{ metadata.title }}",
"language": "{{ metadata.language }}",
"home_page_url": "{{ metadata.url | addPathPrefixToFullUrl }}",
"feed_url": "{{ permalink | htmlBaseUrl(metadata.url) }}",
"description": "{{ metadata.description }}",
"author": {
"name": "{{ metadata.author.name }}",
"url": "{{ metadata.author.url }}"
},
"items": [
{%- for post in collections.posts | reverse %}
{%- set absolutePostUrl = post.url | htmlBaseUrl(metadata.url) %}
{
"id": "{{ absolutePostUrl }}",
"url": "{{ absolutePostUrl }}",
"title": "{{ post.data.title }}",
"content_html": {% if post.templateContent %}{{ post.templateContent | transformWithHtmlBase(absolutePostUrl, post.url) | dump | safe }}{% else %}""{% endif %},
"date_published": "{{ post.date | dateToRfc3339 }}"
}
{% if not loop.last %},{% endif %}
{%- endfor %}
]
}

35
content/index.md Normal file
View File

@ -0,0 +1,35 @@
---
layout: layouts/base.njk
eleventyNavigation:
key: Accueil
order: 0
---
# Bienvenue sur Missing-Number
Missing-Number est un petit site Pokémon orienté 1G / 2G, qui explore les différents aspects de la série à cette époque, et parle aussi bien des jeux que des rumeurs et légendes urbaines autour. Vous pouvez y trouver quelques sujets niches, ainsi que des pokédex pour les version 1G/2G. Il est proche dans l'esprit de [Blue Moon Falls](https://bluemoonfalls.com/), un autre site parlant du sujet (en anglais).
L'idée de Missing Number est du coup d'être un peu un espace de découverte, où vous pourrez en découvrir plus sur ces deux jeux rétro à votre guise. [En savoir plus](/about).
## Updates
- **2024/02/28** - Ouverture du site
## Todo
- Ajouter les jeux secondaires de ces générations
- Pokédex G2 béta (va compléter la page existante)
- Creepypasta et légendes urbaines du genre
- Infos sur le TGC à l'époque 1G/2G
- Ajouter une section sur les glitchs
- Créer "l'AU" Indigo Foundation, qui mélange pleins de ces éléments présentés ici sous forme d'un univers alternatif
- Ajouter un annuaire des sites web
## Sources et crédits
Ce site faisant en grande partie du regroupement et de la traduction d'informations, de nombreuses informations sont reprise de divers wiki pokémon anglophones et traduits. Les sources sont disponibles également de manière plus précise (ainsi que les artistes quand des artworks de fans sont utilisés) dans chaque page du site quand c'est pertinent.
- Les décompilations du [projet pret](https://github.com/pret/) - Les informations internes des jeux, ainsi que de nombreux sprites
- [The Cutting Room Floor]() - Toutes les informations à propos des béta et éléments de développements des jeux
- [Bulbapedia]() (en) et [Pokepedia]() (fr) - Wiki pokémon de références, où j'ai récupéré de nombreuses informations plus génériques
- [Tyradex](https://tyradex.vercel.app/) - API pokedex francophone, j'y ai récupéré quelques informations qui me manquait des décompilations (genre des tailles/poids)

View File

@ -0,0 +1,14 @@
---
permalink: /sitemap.xml
eleventyExcludeFromCollections: true
---
<?xml version="1.0" encoding="utf-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">
{%- for page in collections.all %}
{% set absoluteUrl %}{{ page.url | htmlBaseUrl(metadata.url) }}{% endset %}
<url>
<loc>{{ absoluteUrl }}</loc>
<lastmod>{{ page.date | htmlDateString }}</lastmod>
</url>
{%- endfor %}
</urlset>

50
eleventy.config.drafts.js Normal file
View File

@ -0,0 +1,50 @@
function eleventyComputedPermalink() {
// When using `addGlobalData` and you *want* to return a function, you must nest functions like this.
// `addGlobalData` acts like a global data file and runs the top level function it receives.
return (data) => {
// Always skip during non-watch/serve builds
if(data.draft && !process.env.BUILD_DRAFTS) {
return false;
}
return data.permalink;
}
};
function eleventyComputedExcludeFromCollections() {
// When using `addGlobalData` and you *want* to return a function, you must nest functions like this.
// `addGlobalData` acts like a global data file and runs the top level function it receives.
return (data) => {
// Always exclude from non-watch/serve builds
if(data.draft && !process.env.BUILD_DRAFTS) {
return true;
}
return data.eleventyExcludeFromCollections;
}
};
module.exports.eleventyComputedPermalink = eleventyComputedPermalink;
module.exports.eleventyComputedExcludeFromCollections = eleventyComputedExcludeFromCollections;
module.exports = eleventyConfig => {
eleventyConfig.addGlobalData("eleventyComputed.permalink", eleventyComputedPermalink);
eleventyConfig.addGlobalData("eleventyComputed.eleventyExcludeFromCollections", eleventyComputedExcludeFromCollections);
let logged = false;
eleventyConfig.on("eleventy.before", ({runMode}) => {
let text = "Excluding";
// Only show drafts in serve/watch modes
if(runMode === "serve" || runMode === "watch") {
process.env.BUILD_DRAFTS = true;
text = "Including";
}
// Only log once.
if(!logged) {
console.log( `[11ty/eleventy-base-blog] ${text} drafts.` );
}
logged = true;
});
}

34
eleventy.config.images.js Normal file
View File

@ -0,0 +1,34 @@
const path = require("path");
const eleventyImage = require("@11ty/eleventy-img");
module.exports = eleventyConfig => {
function relativeToInputPath(inputPath, relativeFilePath) {
let split = inputPath.split("/");
split.pop();
return path.resolve(split.join(path.sep), relativeFilePath);
}
// Eleventy Image shortcode
// https://www.11ty.dev/docs/plugins/image/
eleventyConfig.addAsyncShortcode("image", async function imageShortcode(src, alt, widths, sizes) {
// Full list of formats here: https://www.11ty.dev/docs/plugins/image/#output-formats
// Warning: Avif can be resource-intensive so take care!
let formats = ["avif", "webp", "auto"];
let file = relativeToInputPath(this.page.inputPath, src);
let metadata = await eleventyImage(file, {
widths: widths || ["auto"],
formats,
outputDir: path.join(eleventyConfig.dir.output, "img"), // Advanced usage note: `eleventyConfig.dir` works here because were using addPlugin.
});
// TODO loading=eager and fetchpriority=high
let imageAttributes = {
alt,
sizes,
loading: "lazy",
decoding: "async",
};
return eleventyImage.generateHTML(metadata, imageAttributes);
});
};

144
eleventy.config.js Normal file
View File

@ -0,0 +1,144 @@
const { DateTime } = require("luxon");
const markdownItAnchor = require("markdown-it-anchor");
const pluginRss = require("@11ty/eleventy-plugin-rss");
const pluginSyntaxHighlight = require("@11ty/eleventy-plugin-syntaxhighlight");
const pluginBundle = require("@11ty/eleventy-plugin-bundle");
const pluginNavigation = require("@11ty/eleventy-navigation");
const { EleventyHtmlBasePlugin } = require("@11ty/eleventy");
const pluginDrafts = require("./eleventy.config.drafts.js");
const pluginImages = require("./eleventy.config.images.js");
const pluginTOC = require('eleventy-plugin-toc');
module.exports = function(eleventyConfig) {
// Copy the contents of the `public` folder to the output folder
// For example, `./public/css/` ends up in `_site/css/`
eleventyConfig.addPassthroughCopy({
"./public/": "/",
"./node_modules/prismjs/themes/prism-okaidia.css": "/css/prism-okaidia.css"
});
// Run Eleventy when these files change:
// https://www.11ty.dev/docs/watch-serve/#add-your-own-watch-targets
// Watch content images for the image pipeline.
eleventyConfig.addWatchTarget("content/**/*.{svg,webp,png,jpeg}");
// App plugins
eleventyConfig.addPlugin(pluginDrafts);
eleventyConfig.addPlugin(pluginImages);
// Official plugins
eleventyConfig.addPlugin(pluginRss);
eleventyConfig.addPlugin(pluginSyntaxHighlight, {
preAttributes: { tabindex: 0 }
});
eleventyConfig.addPlugin(pluginNavigation);
eleventyConfig.addPlugin(EleventyHtmlBasePlugin);
eleventyConfig.addPlugin(pluginBundle);
eleventyConfig.addPlugin(pluginTOC, {
tags: ['h2'],
wrapper: 'div'
});
// Filters
eleventyConfig.addFilter("readableDate", (dateObj, format, zone) => {
// Formatting tokens for Luxon: https://moment.github.io/luxon/#/formatting?id=table-of-tokens
return DateTime.fromJSDate(dateObj, { zone: zone || "utc" }).toFormat(format || "dd LLLL yyyy");
});
eleventyConfig.addFilter('htmlDateString', (dateObj) => {
// dateObj input: https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#valid-date-string
return DateTime.fromJSDate(dateObj, {zone: 'utc'}).toFormat('yyyy-LL-dd');
});
// Get the first `n` elements of a collection.
eleventyConfig.addFilter("head", (array, n) => {
if(!Array.isArray(array) || array.length === 0) {
return [];
}
if( n < 0 ) {
return array.slice(n);
}
return array.slice(0, n);
});
// Return the smallest number argument
eleventyConfig.addFilter("min", (...numbers) => {
return Math.min.apply(null, numbers);
});
// Return all the tags used in a collection
eleventyConfig.addFilter("getAllTags", collection => {
let tagSet = new Set();
for(let item of collection) {
(item.data.tags || []).forEach(tag => tagSet.add(tag));
}
return Array.from(tagSet);
});
eleventyConfig.addFilter("filterTagList", function filterTagList(tags) {
return (tags || []).filter(tag => ["all", "nav", "post", "posts"].indexOf(tag) === -1);
});
// Customize Markdown library settings:
eleventyConfig.amendLibrary("md", mdLib => {
mdLib.use(markdownItAnchor, {
permalink: markdownItAnchor.permalink.ariaHidden({
placement: "after",
class: "header-anchor",
symbol: "#",
ariaHidden: false,
}),
level: [1,2,3,4],
slugify: eleventyConfig.getFilter("slugify")
});
});
// Features to make your build faster (when you need them)
// If your passthrough copy gets heavy and cumbersome, add this line
// to emulate the file copy on the dev server. Learn more:
// https://www.11ty.dev/docs/copy/#emulate-passthrough-copy-during-serve
// eleventyConfig.setServerPassthroughCopyBehavior("passthrough");
return {
// Control which files Eleventy will process
// e.g.: *.md, *.njk, *.html, *.liquid
templateFormats: [
"md",
"njk",
"html",
"liquid",
],
// Pre-process *.md files with: (default: `liquid`)
markdownTemplateEngine: "njk",
// Pre-process *.html files with: (default: `liquid`)
htmlTemplateEngine: "njk",
// These are all optional:
dir: {
input: "content", // default: "."
includes: "../_includes", // default: "_includes"
data: "../_data", // default: "_data"
output: "_site"
},
// -----------------------------------------------------------------
// Optional items:
// -----------------------------------------------------------------
// If your site deploys to a subdirectory, change `pathPrefix`.
// Read more: https://www.11ty.dev/docs/config/#deploy-to-a-subdirectory-with-a-path-prefix
// When paired with the HTML <base> plugin https://www.11ty.dev/docs/plugins/html-base/
// it will transform any absolute URLs in your HTML to include this
// folder name and does **not** affect where things go in the output folder.
pathPrefix: "/",
};
};

24
netlify.toml Normal file
View File

@ -0,0 +1,24 @@
[build]
publish = "_site"
command = "npm run build"
[[plugins]]
# Opt-in to the Netlify Lighthouse plugin (choose one):
# 1. Go to your site on https://app.netlify.com and navigate to the Integrations tab, search for the `Lighthouse` plugin
# 2. Or via `npm install -D @netlify/plugin-lighthouse`
# Read more: https://github.com/netlify/netlify-plugin-lighthouse
package = "@netlify/plugin-lighthouse"
# optional, fails build when a category is below a threshold
[plugins.inputs.thresholds]
performance = 1.0
accessibility = 1.0
best-practices = 1.0
seo = 1.0
[plugins.inputs]
output_path = "reports/lighthouse/index.html"

47
package.json Normal file
View File

@ -0,0 +1,47 @@
{
"name": "eleventy-base-blog",
"version": "8.0.0",
"description": "A starter repository for a blog web site using the Eleventy site generator.",
"scripts": {
"build": "npx @11ty/eleventy",
"build-ghpages": "npx @11ty/eleventy --pathprefix=/eleventy-base-blog/",
"start": "npx @11ty/eleventy --serve --quiet",
"debug": "DEBUG=Eleventy* npx @11ty/eleventy",
"debugstart": "DEBUG=Eleventy* npx @11ty/eleventy --serve --quiet",
"benchmark": "DEBUG=Eleventy:Benchmark* npx @11ty/eleventy"
},
"repository": {
"type": "git",
"url": "git://github.com/11ty/eleventy-base-blog.git"
},
"author": {
"name": "Zach Leatherman",
"email": "zachleatherman@gmail.com",
"url": "https://zachleat.com/"
},
"license": "MIT",
"engines": {
"node": ">=14"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/11ty"
},
"bugs": {
"url": "https://github.com/11ty/eleventy-base-blog/issues"
},
"homepage": "https://github.com/11ty/eleventy-base-blog#readme",
"devDependencies": {
"@11ty/eleventy": "^2.0.1",
"@11ty/eleventy-img": "^3.1.0",
"@11ty/eleventy-navigation": "^0.3.5",
"@11ty/eleventy-plugin-bundle": "^1.0.4",
"@11ty/eleventy-plugin-rss": "^1.2.0",
"@11ty/eleventy-plugin-syntaxhighlight": "^5.0.0",
"luxon": "^3.3.0",
"markdown-it-anchor": "^8.6.7"
},
"dependencies": {
"eleventy-plugin-toc": "^1.1.5"
}
}

223
public/css/datatables.css Normal file
View File

@ -0,0 +1,223 @@
.datatable-wrapper {
font-size:0.9rem;
}
.datatable-top,
.datatable-bottom {
padding: 8px 0px;
}
.datatable-top>nav:first-child,
.datatable-top>div:first-child,
.datatable-bottom>nav:first-child,
.datatable-bottom>div:first-child {
float: left;
}
.datatable-top>nav:last-child,
.datatable-top>div:last-child,
.datatable-bottom>nav:last-child,
.datatable-bottom>div:last-child {
float: right;
}
.datatable-selector {
padding: 5px;
border-radius: 5px;
border:1px solid rgba(0,0,0,0.1);
background-color: rgba(0,0,0,0.05);
color:var(--text-color)
}
.datatable-input {
padding: 5px 10px;
background-color:rgba(0,0,0, 0.05);
color: var(--text-color);
border: 1px solid rgba(0, 0, 0, 0.1);
border-radius:5px;
}
.datatable-info {
margin: 7px 0;
}
/* PAGER */
.datatable-pagination ul {
margin: 0;
padding-left: 0;
}
.datatable-pagination li {
list-style: none;
float: left;
}
.datatable-pagination li.datatable-hidden {
visibility: hidden;
}
.datatable-pagination a {
border: 1px solid rgba(0, 0, 0, 0.2);
float: left;
margin-left: 2px;
padding: 5px 10px;
position: relative;
text-decoration: none;
cursor: pointer;
border-radius: 5px;
}
.datatable-pagination a:hover {
background-color: rgba(0,0,0, 0.1);
}
.datatable-pagination .datatable-active a,
.datatable-pagination .datatable-active a:focus,
.datatable-pagination .datatable-active a:hover {
background-color: var(--text-color-link);
border-color: var(--text-color-link);
color: white;
cursor: default;
}
.datatable-pagination .datatable-ellipsis a,
.datatable-pagination .datatable-disabled a,
.datatable-pagination .datatable-disabled a:focus,
.datatable-pagination .datatable-disabled a:hover {
pointer-events: none;
cursor: default;
}
.datatable-pagination .datatable-disabled a,
.datatable-pagination .datatable-disabled a:focus,
.datatable-pagination .datatable-disabled a:hover {
cursor: not-allowed;
opacity: 0.4;
}
.datatable-pagination .datatable-pagination a {
font-weight: bold;
}
/* TABLE */
.datatable-table {
max-width: 100%;
width: 100%;
border-spacing: 0;
border-collapse: separate;
}
.datatable-table>tbody>tr>td,
.datatable-table>tbody>tr>th,
.datatable-table>tfoot>tr>td,
.datatable-table>tfoot>tr>th,
.datatable-table>thead>tr>td,
.datatable-table>thead>tr>th {
vertical-align: top;
padding: 8px 10px;;
}
.datatable-table>thead>tr>th {
vertical-align: bottom;
text-align: left;
background-color: var(--text-color-link);
color: white;
border-bottom: 3px solid black;
}
.datatable-table>tfoot>tr>th {
vertical-align: bottom;
text-align: left;
}
.datatable-table th {
vertical-align: bottom;
text-align: left;
}
.datatable-table th a {
text-decoration: none;
color: inherit;
}
.datatable-sorter,
.datatable-filter {
display: inline-block;
height: 100%;
position: relative;
width: 100%;
}
.datatable-sorter::before,
.datatable-sorter::after {
content: "";
height: 0;
width: 0;
position: absolute;
right: -6px;
border-left: 4px solid transparent;
border-right: 4px solid transparent;
opacity: 0.3;
}
.datatable-sorter::before {
border-top: 4px solid white;
bottom: 0px;
}
.datatable-sorter::after {
border-bottom: 4px solid white;
border-top: 4px solid transparent;
top: 0px;
}
.datatable-ascending .datatable-sorter::after,
.datatable-descending .datatable-sorter::before,
.datatable-ascending .datatable-filter::after,
.datatable-descending .datatable-filter::before {
opacity: 1;
}
a.datatable-sorter:hover {
color:var(--link-color-hover);
border:0;
background-color: transparent;
}
.datatable-filter::before {
content: "";
position: absolute;
right: 4px;
opacity: 0.2;
width: 0;
height: 0;
border-left: 7px solid transparent;
border-right: 7px solid transparent;
border-radius: 50%;
border-top: 10px solid white;
top: 25%;
}
.datatable-filter-active .datatable-filter::before {
opacity: 0.6;
}
.datatable-empty {
text-align: center;
}
.datatable-top::after,
.datatable-bottom::after {
clear: both;
content: " ";
display: table;
}
table.datatable-table:focus tr.datatable-cursor>td:first-child {
border-left: 3px var(--text-color) solid;
}
table.datatable-table:focus {
outline: solid 1px black;
outline-offset: -1px;
}

292
public/css/index.css Normal file
View File

@ -0,0 +1,292 @@
@font-face {
font-family: "NiseSegaSonic";
src: local("NiseSegaSonic"),
url("/fonts/NiseSegaSonic.ttf") format("truetype");
}
:root {
--color-gray-20: #e0e0e0;
--color-gray-50: #C0C0C0;
--color-gray-90: #333;
/* --text-color is assigned to --color-gray-_ above */
--text-color-link: #c92a2a;
--text-color-link-active: #c92a2a;
--text-color-link-visited: #c92a2a;
--link-color-hover: #ffe8cc;
--background-color: #fff;
--background-menu: #001d6b;
--text-color: var(--color-gray-90);
--font-family: -apple-system, system-ui, sans-serif;
--font-family-monospace: Consolas, Menlo, Monaco, Andale Mono WT, Andale Mono, Lucida Console, Lucida Sans Typewriter, DejaVu Sans Mono, Bitstream Vera Sans Mono, Liberation Mono, Nimbus Mono L, Courier New, Courier, monospace;
--font-family-logo:"NiseSegaSonic", system-ui, sans-serif;
--font-family-title:vipnagorgialla, system-ui, sans-serif;
}
* {
box-sizing: border-box;
}
html,
body {
padding: 0;
margin: 0 auto;
min-height:100%;
font-family: var(--font-family);
color: var(--text-color);
width:1280px;
}
html {
overflow-y: scroll;
background: center top fixed url("/img/dark-b10.png"), center top fixed url("/img/erratu18.png");
background-repeat: repeat-y, repeat;
background-color:#63ce08;
}
/* https://www.a11yproject.com/posts/how-to-hide-content/ */
.visually-hidden {
clip: rect(0 0 0 0);
clip-path: inset(50%);
height: 1px;
overflow: hidden;
position: absolute;
white-space: nowrap;
width: 1px;
}
a[href] {
color: var(--text-color-link);
padding: 0.05rem;
border-radius: 0.1rem;
text-decoration: underline dashed 1px;
text-underline-offset: 0.1rem;
}
a[href]:visited {
color: var(--text-color-link-visited);
}
a[href]:hover,
a[href]:active {
color: var(--text-color-link-active);
background-color: var(--link-color-hover);
text-decoration: none;
}
blockquote {
opacity: 75%;
border-left: 3px solid currentColor;
padding-left: 12px;
}
img {
max-width: 100%;
}
summary {
font-style: italic;
border-radius:3px;
padding:0px 6px;
}
summary:hover {
background-color: rgba(0,0,0,0.2);
}
/* Direct Links / Markdown Headers */
.header-anchor {
text-decoration: none;
font-style: normal;
font-size: 1em;
margin-left: .1em;
}
a[href].header-anchor,
a[href].header-anchor:visited {
color: transparent;
}
a[href].header-anchor:focus,
a[href].header-anchor:hover {
text-decoration: underline;
}
a[href].header-anchor:focus,
:hover > a[href].header-anchor {
color: #aaa;
}
.wrapper {
display:flex;
}
header {
background:center center url("/img/back2.png");
background-size: 110%;
height:240px;
box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.8);
margin:12px 12px 3px;
display:flex;
align-items: center;
justify-content: center;
border: 16px solid transparent;
border-image: url('/img/bgcard.png') 16 round;
border-image-outset: 4px;
}
header h1 {
text-align: center;
}
header h1 a {
font-size:5rem;
text-shadow:-2px -2px 0 #000,
0 -2px 0 #000,
2px -2px 0 #000,
2px 0 0 #000,
2px 2px 0 #000,
0 2px 0 #000,
-2px 2px 0 #000,
-2px 0 0 #000,
.05em .1em 0 #000;
color:white!important;
text-decoration: none;
text-transform: uppercase;
display: block;
font-family: var(--font-family-logo);
line-height: 1;
margin: 0;
padding: 0;
}
main,
.card,
#sidebar ul > li {
padding:0px;
margin:12px;
background-color: var(--background-color);
border: 16px solid transparent;
border-image: url('/img/bgcard.png') 16 round;
border-image-outset: 4px;
line-height:1.5rem;
flex-grow:1;
}
table {
width: 100%;
border-collapse: collapse;
}
.pokepage .grid :first-child {
margin-right: 4px;
}
.pokepage .grid :last-child {
margin-left: 4px;
}
table td,
table th {
text-align: center;
border: 1px solid rgba(0, 0, 0, 0.2);
height: 1.5rem;
}
table thead th {
background-color: var(--text-color-link);
color: white;
border-bottom: 2px solid black;
height: 1.5rem;
}
table:not(.pokedex) {
table-layout: fixed;
}
.pokedex table:not(.pokedex) {
table-layout: auto;
}
#sidebar ul > li {
list-style: none;
font-weight: bold;
}
#more-info ol > li,
#more-info ul > li {
list-style: none;
}
#sidebar ul > li li,
#more-info li {
border-radius:0px;
padding:0px;
margin:0px;
font-weight: normal;
border:0;
box-shadow: none;
}
ul.nav,
#sidebar ul li ul,
#more-info ol,
.maininfo ul {
padding:0;
margin:0;
list-style: none;
}
#sidebar ul li a,
#more-info ol li a,
#more-info .maininfo ul li {
display:block;
width:100%;
text-decoration:none;
color:var(--text-color)!important;
border-radius:3px;
padding:3px;
}
#more-info h2 {
padding: 3px;
margin: 0;
font-size: 1rem;
}
#sidebar ul li li a,
#more-info ul li a,
#more-info ol li a {
padding-left:18px;
}
#sidebar ul li a.active,
#more-info ol li a.active {
background-color:rgba(0,0,0,0.1);
}
#sidebar ul li a:hover,
#more-info ol li a:hover {
background-color:rgba(0,0,0,0.2);
}
#more-info,
#sidebar {
min-width:240px;
width:240px;
}
figcaption {
font-size: 0.8rem;
line-height: 1.1rem;
font-style: italic;
}
.maininfo {
font-size: 0.9rem;
line-height: 1.2rem;
}
footer {
text-align:right;
margin:auto;
padding:12px;
width:800px;
}

BIN
public/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 747 B

0
public/img/.gitkeep Normal file
View File

8
public/js/datatables.js Normal file

File diff suppressed because one or more lines are too long