forked from otomatalabs/ol_site
Replace svelte template with 11ty blog template
This commit is contained in:
parent
bb57273c03
commit
5a3f47dee1
9
.editorconfig
Normal file
9
.editorconfig
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 2
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
charset = utf-8
|
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
content/feed/pretty-atom-feed.xsl linguist-vendored
|
26
.gitignore
vendored
26
.gitignore
vendored
|
@ -1,23 +1,3 @@
|
||||||
node_modules
|
_site/
|
||||||
|
node_modules/
|
||||||
# Output
|
.cache
|
||||||
.output
|
|
||||||
.vercel
|
|
||||||
.netlify
|
|
||||||
.wrangler
|
|
||||||
/.svelte-kit
|
|
||||||
/build
|
|
||||||
|
|
||||||
# OS
|
|
||||||
.DS_Store
|
|
||||||
Thumbs.db
|
|
||||||
|
|
||||||
# Env
|
|
||||||
.env
|
|
||||||
.env.*
|
|
||||||
!.env.example
|
|
||||||
!.env.test
|
|
||||||
|
|
||||||
# Vite
|
|
||||||
vite.config.js.timestamp-*
|
|
||||||
vite.config.ts.timestamp-*
|
|
|
@ -1,9 +0,0 @@
|
||||||
# Package Managers
|
|
||||||
package-lock.json
|
|
||||||
pnpm-lock.yaml
|
|
||||||
yarn.lock
|
|
||||||
bun.lock
|
|
||||||
bun.lockb
|
|
||||||
|
|
||||||
# Miscellaneous
|
|
||||||
/static/
|
|
15
.prettierrc
15
.prettierrc
|
@ -1,15 +0,0 @@
|
||||||
{
|
|
||||||
"useTabs": true,
|
|
||||||
"singleQuote": true,
|
|
||||||
"trailingComma": "none",
|
|
||||||
"printWidth": 100,
|
|
||||||
"plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"],
|
|
||||||
"overrides": [
|
|
||||||
{
|
|
||||||
"files": "*.svelte",
|
|
||||||
"options": {
|
|
||||||
"parser": "svelte"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
21
LICENSE
Normal file
21
LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2017–2024 Zach Leatherman @zachleat
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
119
README.md
119
README.md
|
@ -1,8 +1,117 @@
|
||||||
Otomata Labs' site.
|
# eleventy-base-blog v9
|
||||||
|
|
||||||
Use pnpm to install dependencies and run the project locally.
|
A starter repository showing how to build a blog with the [Eleventy](https://www.11ty.dev/) site generator (using the [v3.0 release](https://github.com/11ty/eleventy/releases/tag/v3.0.0)).
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
* [Want a more generic/detailed getting started guide?](https://www.11ty.dev/docs/getting-started/)
|
||||||
|
|
||||||
|
1. Make a directory and navigate to it:
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm install
|
|
||||||
pnpm run dev
|
|
||||||
```
|
```
|
||||||
|
mkdir my-blog-name
|
||||||
|
cd my-blog-name
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Clone this Repository
|
||||||
|
|
||||||
|
```
|
||||||
|
git clone https://github.com/11ty/eleventy-base-blog.git .
|
||||||
|
```
|
||||||
|
|
||||||
|
_Optional:_ Review `eleventy.config.js` and `_data/metadata.js` to configure the site’s options and data.
|
||||||
|
|
||||||
|
3. Install dependencies
|
||||||
|
|
||||||
|
```
|
||||||
|
npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Run Eleventy
|
||||||
|
|
||||||
|
Generate a production-ready build to the `_site` folder:
|
||||||
|
|
||||||
|
```
|
||||||
|
npx @11ty/eleventy
|
||||||
|
```
|
||||||
|
|
||||||
|
Or build and host on a local development server:
|
||||||
|
|
||||||
|
```
|
||||||
|
npx @11ty/eleventy --serve
|
||||||
|
```
|
||||||
|
|
||||||
|
Or you can run [debug mode](https://www.11ty.dev/docs/debugging/) to see all the internals.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Using [Eleventy v3](https://github.com/11ty/eleventy/releases/tag/v3.0.0) with zero-JavaScript output.
|
||||||
|
- Content is exclusively pre-rendered (this is a static site).
|
||||||
|
- Can easily [deploy to a subfolder without changing any content](https://www.11ty.dev/docs/plugins/html-base/)
|
||||||
|
- All URLs are decoupled from the content’s location on the file system.
|
||||||
|
- Configure templates via the [Eleventy Data Cascade](https://www.11ty.dev/docs/data-cascade/)
|
||||||
|
- **Performance focused**: four-hundos Lighthouse score out of the box!
|
||||||
|
- _0 Cumulative Layout Shift_
|
||||||
|
- _0ms Total Blocking Time_
|
||||||
|
- Local development live reload provided by [Eleventy Dev Server](https://www.11ty.dev/docs/dev-server/).
|
||||||
|
- Content-driven [navigation menu](https://www.11ty.dev/docs/plugins/navigation/)
|
||||||
|
- Fully automated [Image optimization](https://www.11ty.dev/docs/plugins/image/)
|
||||||
|
- Zero-JavaScript output.
|
||||||
|
- Support for modern image formats automatically (e.g. AVIF and WebP)
|
||||||
|
- Processes images on-request during `--serve` for speedy local builds.
|
||||||
|
- Prefers `<img>` markup if possible (single image format) but switches automatically to `<picture>` for multiple image formats.
|
||||||
|
- Automated `<picture>` syntax markup with `srcset` and optional `sizes`
|
||||||
|
- Includes `width`/`height` attributes to avoid [content layout shift](https://web.dev/cls/).
|
||||||
|
- Includes `loading="lazy"` for native lazy loading without JavaScript.
|
||||||
|
- Includes [`decoding="async"`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/decoding)
|
||||||
|
- Images can be co-located with blog post files.
|
||||||
|
- Per page CSS bundles [via `eleventy-plugin-bundle`](https://github.com/11ty/eleventy-plugin-bundle).
|
||||||
|
- Built-in [syntax highlighter](https://www.11ty.dev/docs/plugins/syntaxhighlight/) (zero-JavaScript output).
|
||||||
|
- Draft content: use `draft: true` to mark any template as a draft. Drafts are **only** included during `--serve`/`--watch` and are excluded from full builds. This is driven by the `addPreprocessor` configuration API in `eleventy.config.js`. Schema validator will show an error if non-boolean value is set in data cascade.
|
||||||
|
- Blog Posts
|
||||||
|
- Automated next/previous links
|
||||||
|
- Accessible deep links to headings
|
||||||
|
- Generated Pages
|
||||||
|
- Home, Archive, and About pages.
|
||||||
|
- [Atom feed included (with easy one-line swap to use RSS or JSON)](https://www.11ty.dev/docs/plugins/rss/)
|
||||||
|
- `sitemap.xml`
|
||||||
|
- Zero-maintenance tag pages ([View on the Demo](https://eleventy-base-blog.netlify.app/tags/))
|
||||||
|
- Content not found (404) page
|
||||||
|
|
||||||
|
## Demos
|
||||||
|
|
||||||
|
- [Netlify](https://eleventy-base-blog.netlify.app/)
|
||||||
|
- [Vercel](https://demo-base-blog.11ty.dev/)
|
||||||
|
- [Cloudflare Pages](https://eleventy-base-blog-d2a.pages.dev/)
|
||||||
|
- [Remix on Glitch](https://glitch.com/~11ty-eleventy-base-blog)
|
||||||
|
- [GitHub Pages](https://11ty.github.io/eleventy-base-blog/)
|
||||||
|
|
||||||
|
## Deploy this to your own site
|
||||||
|
|
||||||
|
Deploy this Eleventy site in just a few clicks on these services:
|
||||||
|
|
||||||
|
- Read more about [Deploying an Eleventy project](https://www.11ty.dev/docs/deployment/) to the web.
|
||||||
|
- [Deploy this to **Netlify**](https://app.netlify.com/start/deploy?repository=https://github.com/11ty/eleventy-base-blog)
|
||||||
|
- [Deploy this to **Vercel**](https://vercel.com/import/project?template=11ty%2Feleventy-base-blog)
|
||||||
|
- Look in `.github/workflows/gh-pages.yml.sample` for information on [Deploying to **GitHub Pages**](https://www.11ty.dev/docs/deployment/#deploy-an-eleventy-project-to-git-hub-pages).
|
||||||
|
- [Try it out on **Stackblitz**](https://stackblitz.com/github/11ty/eleventy-base-blog)
|
||||||
|
|
||||||
|
### Implementation Notes
|
||||||
|
|
||||||
|
- `content/about/index.md` is an example of a content page.
|
||||||
|
- `content/blog/` has the blog posts but really they can live in any directory. They need only the `posts` tag to be included in the blog posts [collection](https://www.11ty.dev/docs/collections/).
|
||||||
|
- Use the `eleventyNavigation` key (via the [Eleventy Navigation plugin](https://www.11ty.dev/docs/plugins/navigation/)) in your front matter to add a template to the top level site navigation. This is in use on `content/index.njk` and `content/about/index.md`.
|
||||||
|
- Content can be in _any template format_ (blog posts needn’t exclusively be markdown, for example). Configure your project’s supported templates in `eleventy.config.js` -> `templateFormats`.
|
||||||
|
- The `public` folder in your input directory will be copied to the output folder (via `addPassthroughCopy` in the `eleventy.config.js` file). This means `./public/css/*` will live at `./_site/css/*` after your build completes.
|
||||||
|
- This project uses three [Eleventy Layouts](https://www.11ty.dev/docs/layouts/):
|
||||||
|
- `_includes/layouts/base.njk`: the top level HTML structure
|
||||||
|
- `_includes/layouts/home.njk`: the home page template (wrapped into `base.njk`)
|
||||||
|
- `_includes/layouts/post.njk`: the blog post template (wrapped into `base.njk`)
|
||||||
|
- `_includes/postslist.njk` is a Nunjucks include and is a reusable component used to display a list of all the posts. `content/index.njk` has an example of how to use it.
|
||||||
|
|
||||||
|
#### Content Security Policy
|
||||||
|
|
||||||
|
If your site enforces a [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) (as public-facing sites should), you have a few choices (pick one):
|
||||||
|
|
||||||
|
1. In `base.njk`, remove `<style>{% getBundle "css" %}</style>` and uncomment `<link rel="stylesheet" href="{% getBundleFileUrl "css" %}">`
|
||||||
|
2. Configure the server with the CSP directive `style-src: 'unsafe-inline'` (less secure).
|
||||||
|
|
43
_config/filters.js
Normal file
43
_config/filters.js
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
import { DateTime } from "luxon";
|
||||||
|
|
||||||
|
export default function(eleventyConfig) {
|
||||||
|
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 the keys used in an object
|
||||||
|
eleventyConfig.addFilter("getKeys", target => {
|
||||||
|
return Object.keys(target);
|
||||||
|
});
|
||||||
|
|
||||||
|
eleventyConfig.addFilter("filterTagList", function filterTagList(tags) {
|
||||||
|
return (tags || []).filter(tag => ["all", "posts"].indexOf(tag) === -1);
|
||||||
|
});
|
||||||
|
|
||||||
|
eleventyConfig.addFilter("sortAlphabetically", strings =>
|
||||||
|
(strings || []).sort((b, a) => b.localeCompare(a))
|
||||||
|
);
|
||||||
|
};
|
13
_data/eleventyDataSchema.js
Normal file
13
_data/eleventyDataSchema.js
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
import { z } from "zod";
|
||||||
|
import { fromZodError } from 'zod-validation-error';
|
||||||
|
|
||||||
|
export default function(data) {
|
||||||
|
// Draft content, validate `draft` front matter
|
||||||
|
let result = z.object({
|
||||||
|
draft: z.boolean().or(z.undefined()),
|
||||||
|
}).safeParse(data);
|
||||||
|
|
||||||
|
if(result.error) {
|
||||||
|
throw fromZodError(result.error);
|
||||||
|
}
|
||||||
|
}
|
6
_data/metadata.js
Normal file
6
_data/metadata.js
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
export default {
|
||||||
|
title: "Otomata Labs",
|
||||||
|
url: "https://otomatalabs.net/",
|
||||||
|
language: "en",
|
||||||
|
description: "Pushing old computers to their limits.",
|
||||||
|
}
|
75
_includes/layouts/base.njk
Normal file
75
_includes/layouts/base.njk
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="{{ metadata.language }}">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<link rel="icon" type="image/png" sizes="32x32" href="{{ path }}/favicon.png">
|
||||||
|
<title>{{ title or metadata.title }}</title>
|
||||||
|
<meta name="description" content="{{ description or metadata.description }}">
|
||||||
|
<link rel="alternate" href="/feed/feed.xml" type="application/atom+xml" title="{{ metadata.title }}">
|
||||||
|
|
||||||
|
{#- Uncomment this if you’d like folks to know that you used Eleventy to build your site! #}
|
||||||
|
{#- <meta name="generator" content="{{ eleventy.generator }}"> #}
|
||||||
|
|
||||||
|
{#-
|
||||||
|
Plain-text bundles are provided via the `eleventy-plugin-bundle` plugin:
|
||||||
|
1. CSS:
|
||||||
|
* Add to a per-page bundle using `{% css %}{% endcss %}`
|
||||||
|
* Retrieve bundle content using `{% getBundle "css" %}` or `{% getBundleFileUrl "css" %}`
|
||||||
|
2. Or for JavaScript:
|
||||||
|
* Add to a per-page bundle using `{% js %}{% endjs %}`
|
||||||
|
* Retrieve via `{% getBundle "js" %}` or `{% getBundleFileUrl "js" %}`
|
||||||
|
3. Learn more: https://github.com/11ty/eleventy-plugin-bundle
|
||||||
|
#}
|
||||||
|
|
||||||
|
{#- Add CSS to the bundle #}
|
||||||
|
<style>/* This is an arbitrary CSS string added to the bundle */</style>
|
||||||
|
|
||||||
|
{#- Add the contents of a file to the bundle #}
|
||||||
|
<style>{% include "css/index.css" %}</style>
|
||||||
|
|
||||||
|
{#- Or you can add from node_modules #}
|
||||||
|
{# <style>{% include "node_modules/something.css" %}</style> #}
|
||||||
|
|
||||||
|
{#- Render the CSS bundle using inlined CSS (for the fastest site performance in production) #}
|
||||||
|
<style>{% getBundle "css" %}</style>
|
||||||
|
|
||||||
|
{#- Renders the CSS bundle using a separate file, if you can't set CSP directive style-src: 'unsafe-inline' #}
|
||||||
|
{#- <link rel="stylesheet" href="{% getBundleFileUrl "css" %}"> #}
|
||||||
|
|
||||||
|
{#- Add the heading-anchors web component to the JavaScript bundle #}
|
||||||
|
<script type="module">{% include "node_modules/@zachleat/heading-anchors/heading-anchors.js" %}</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<a href="#main" id="skip-link" class="visually-hidden">Skip to main content</a>
|
||||||
|
|
||||||
|
<header>
|
||||||
|
<a href="/" class="home-link"><img class="logo" src="{{ path }}/res/otomata_labs.svg" alt="{{ metadata.title }}"></a>
|
||||||
|
|
||||||
|
{#- Read more about `eleventy-navigation` at https://www.11ty.dev/docs/plugins/navigation/ #}
|
||||||
|
<nav>
|
||||||
|
<h2 class="visually-hidden">Top level navigation menu</h2>
|
||||||
|
<ul class="nav">
|
||||||
|
{%- for entry in collections.all | eleventyNavigation %}
|
||||||
|
<li class="nav-item"><a href="{{ entry.url }}"{% if entry.url == page.url %} aria-current="page"{% endif %}>{{ entry.title }}</a></li>
|
||||||
|
{%- endfor %}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<main id="main">
|
||||||
|
<heading-anchors>
|
||||||
|
{{ content | safe }}
|
||||||
|
</heading-anchors>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<footer>
|
||||||
|
<p>
|
||||||
|
<em>Built with <a href="https://www.11ty.dev/">{{ eleventy.generator }}</a></em>
|
||||||
|
</p>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<!-- This page `{{ page.url }}` was built on {% currentBuildDate %} -->
|
||||||
|
<script type="module" src="{% getBundleFileUrl "js" %}"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
5
_includes/layouts/home.njk
Normal file
5
_includes/layouts/home.njk
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
layout: layouts/base.njk
|
||||||
|
---
|
||||||
|
|
||||||
|
{{ content | safe }}
|
28
_includes/layouts/post.njk
Normal file
28
_includes/layouts/post.njk
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
---
|
||||||
|
layout: layouts/base.njk
|
||||||
|
---
|
||||||
|
{# Only include the syntax highlighter CSS on blog posts, included with the CSS per-page bundle #}
|
||||||
|
<style>{% include "node_modules/prismjs/themes/prism-okaidia.css" %}</style>
|
||||||
|
<style>{% include "css/prism-diff.css" %}</style>
|
||||||
|
<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 class="links-nextprev-prev">← Previous<br> <a href="{{ previousPost.url }}">{{ previousPost.data.title }}</a></li>{% endif %}
|
||||||
|
{%- if nextPost %}<li class="links-nextprev-next">Next →<br><a href="{{ nextPost.url }}">{{ nextPost.data.title }}</a></li>{% endif %}
|
||||||
|
</ul>
|
||||||
|
{%- endif %}
|
||||||
|
{%- endif %}
|
8
_includes/postslist.njk
Normal file
8
_includes/postslist.njk
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
<ol reversed class="postlist" style="--postlist-index: {{ (postslistCounter or postslist.length) + 1 }}">
|
||||||
|
{%- 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>
|
20
content/404.md
Normal file
20
content/404.md
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
---
|
||||||
|
permalink: 404.html
|
||||||
|
eleventyExcludeFromCollections: true
|
||||||
|
---
|
||||||
|
# Content not found.
|
||||||
|
|
||||||
|
Go <a href="index.njk">home</a>.
|
||||||
|
|
||||||
|
<!--
|
||||||
|
|
||||||
|
Read more: https://www.11ty.dev/docs/quicktips/not-found/
|
||||||
|
|
||||||
|
This is compatible with:
|
||||||
|
|
||||||
|
- GitHub Pages: https://help.github.com/articles/creating-a-custom-404-page-for-your-github-pages-site/
|
||||||
|
- GitLab Pages: https://docs.gitlab.com/ee/user/project/pages/introduction.html#custom-error-codes-pages
|
||||||
|
- Netlify: https://www.netlify.com/docs/redirects/#custom-404
|
||||||
|
- Cloudflare Pages: https://developers.cloudflare.com/pages/platform/serving-pages/#not-found-behavior
|
||||||
|
- Vercel: https://vercel.com/guides/custom-404-page#static-site-generator-ssg
|
||||||
|
-->
|
9
content/about.md
Normal file
9
content/about.md
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
---js
|
||||||
|
const eleventyNavigation = {
|
||||||
|
key: "ABOUT",
|
||||||
|
order: 3
|
||||||
|
};
|
||||||
|
---
|
||||||
|
# About
|
||||||
|
|
||||||
|
TODO: Write a description about Otomata Labs
|
10
content/blog.njk
Normal file
10
content/blog.njk
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
---js
|
||||||
|
const eleventyNavigation = {
|
||||||
|
key: "ARCHIVE",
|
||||||
|
order: 2
|
||||||
|
};
|
||||||
|
---
|
||||||
|
<h1>Archive</h1>
|
||||||
|
|
||||||
|
{% set postslist = collections.posts %}
|
||||||
|
{% include "postslist.njk" %}
|
18
content/blog/blog-example.md
Normal file
18
content/blog/blog-example.md
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
---js
|
||||||
|
const title = "Example blog";
|
||||||
|
const description = "Example description";
|
||||||
|
const date = "2025-08-27";
|
||||||
|
const tags = ["example tag", "another example tag", "demoscene"];
|
||||||
|
const draft = true;
|
||||||
|
---
|
||||||
|
|
||||||
|
# Example header
|
||||||
|
This post is a draft. You shouldn't see this post in the final build of the website.
|
||||||
|
## Header 2
|
||||||
|
Lorem ipsum. This is an example of a blog post. What more can I say?
|
||||||
|
Well, here is a [link to MOVE 10 STEPS](https://www.pouet.net/prod.php?which=104866).
|
||||||
|
It takes you to pouet. Wooooahh.
|
||||||
|
|
||||||
|
Here is a picture!
|
||||||
|
|
||||||
|
<img alt="A screenshot of MOVE 10 STEPS" src="https://content.pouet.net/files/screenshots/00104/00104866.png">
|
6
content/blog/blog.11tydata.js
Normal file
6
content/blog/blog.11tydata.js
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
export default {
|
||||||
|
tags: [
|
||||||
|
"posts"
|
||||||
|
],
|
||||||
|
"layout": "layouts/post.njk",
|
||||||
|
};
|
3
content/content.11tydata.js
Normal file
3
content/content.11tydata.js
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
export default {
|
||||||
|
layout: "layouts/home.njk",
|
||||||
|
};
|
89
content/feed/pretty-atom-feed.xsl
vendored
Normal file
89
content/feed/pretty-atom-feed.xsl
vendored
Normal file
File diff suppressed because one or more lines are too long
29
content/index.njk
Normal file
29
content/index.njk
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
---js
|
||||||
|
const eleventyNavigation = {
|
||||||
|
key: "HOME",
|
||||||
|
order: 1
|
||||||
|
};
|
||||||
|
|
||||||
|
const numberOfLatestPostsToShow = 10;
|
||||||
|
---
|
||||||
|
{% set postsCount = collections.posts | length %}
|
||||||
|
{% set latestPostsCount = postsCount | min(numberOfLatestPostsToShow) %}
|
||||||
|
<h1>Latest {{ latestPostsCount }} Post{% if latestPostsCount != 1 %}s{% endif %}</h1>
|
||||||
|
|
||||||
|
{% set postslist = collections.posts | head(-1 * numberOfLatestPostsToShow) %}
|
||||||
|
{% set postslistCounter = postsCount %}
|
||||||
|
{% include "postslist.njk" %}
|
||||||
|
|
||||||
|
{% set morePosts = postsCount - numberOfLatestPostsToShow %}
|
||||||
|
{% if morePosts > 0 %}
|
||||||
|
<p>{{ morePosts }} more post{% if morePosts != 1 %}s{% endif %} can be found in <a href="blog.njk">the archive</a>.</p>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{# List every content page in the project #}
|
||||||
|
{#
|
||||||
|
<ul>
|
||||||
|
{%- for entry in collections.all %}
|
||||||
|
<li><a href="{{ entry.url }}"><code>{{ entry.url }}</code></a></li>
|
||||||
|
{%- endfor %}
|
||||||
|
</ul>
|
||||||
|
#}
|
52
content/res/otomata_labs.svg
Normal file
52
content/res/otomata_labs.svg
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="505"
|
||||||
|
height="94"
|
||||||
|
viewBox="0 0 505.00001 94.000002"
|
||||||
|
version="1.1"
|
||||||
|
id="svg5"
|
||||||
|
xml:space="preserve"
|
||||||
|
sodipodi:docname="otomata_labs.svg"
|
||||||
|
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
|
||||||
|
id="namedview1"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#999999"
|
||||||
|
borderopacity="1"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="1.4142136"
|
||||||
|
inkscape:cx="243.95184"
|
||||||
|
inkscape:cy="-9.5459415"
|
||||||
|
inkscape:window-width="1366"
|
||||||
|
inkscape:window-height="736"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg5"><inkscape:grid
|
||||||
|
id="grid1"
|
||||||
|
units="px"
|
||||||
|
originx="10"
|
||||||
|
originy="10"
|
||||||
|
spacingx="1"
|
||||||
|
spacingy="1"
|
||||||
|
empcolor="#0099e5"
|
||||||
|
empopacity="0.30196078"
|
||||||
|
color="#0099e5"
|
||||||
|
opacity="0.14901961"
|
||||||
|
empspacing="5"
|
||||||
|
enabled="true"
|
||||||
|
visible="false" /></sodipodi:namedview><defs
|
||||||
|
id="defs2" /><path
|
||||||
|
id="rect1"
|
||||||
|
style="fill:#000000;fill-opacity:1;stroke-width:7.48968;stroke-linecap:round;stroke-linejoin:round"
|
||||||
|
d="M 0,2.9999999 4.0594023e-8,90.999998 2.9999999,93.999998 315,94 v -4 h 5 v -5 h 15 v -5 h -5 v -5 h 5 v -5 h 15 v -5 h -5 v -5 h 15 v -5 h -5 v -5 h 5 v -5 h 15 v -5 h -5 v -5 h 5 v -5 h 5 v -5 h 15 v -5 h -5 v -5 h 15 v -5 h -5 V 5 h 5 V 0 H 2.9999999 Z M 13.996094,11.003906 H 26 L 28.996094,14 V 80.011718 L 26,83.007812 H 13.996094 L 11,80.011718 V 14 Z m 21.011718,0 h 17.996094 v 5.992188 H 47.011719 V 83.007812 H 41 V 16.996094 h -5.992188 z m 27.003907,0 H 73.996094 L 77.011719,14 v 66.011718 l -3.015625,2.996094 H 62.011719 L 58.996094,80.011718 V 14 Z m 23.988281,0 h 17.99609 L 107.01172,14 v 66.011718 2.996094 H 101 V 80.011718 16.996094 h -2.996094 v 30 h -5.992187 v -30 h -3.015625 v 63.015624 2.996094 H 83.003906 V 80.011718 14 Z m 30,0 h 12.00391 L 131,14 v 66.011718 2.996094 h -5.99219 V 80.011718 46.996094 h -6.01172 v 33.015624 2.996094 h -5.99218 V 80.011718 14 Z m 21.01172,0 h 17.99609 v 5.992188 h -6.01172 v 63.015624 2.996094 h -5.99218 V 80.011718 16.996094 h -5.99219 z m 26.98437,0 H 176 L 178.99609,14 v 69.007812 h -5.99218 V 46.996094 h -5.99219 V 83.007812 H 161 V 14 Z m 45,0 h 6.01172 v 65.992188 h 12.00391 v 6.011718 h -15 l -3.01563,-2.996094 z m 27.00391,0 h 12.00391 L 251,14 v 69.007812 h -5.99219 V 46.996094 h -6.01172 v 36.011718 h -5.99218 V 14 Z m 21.01172,0 h 15 L 275.00781,14 l -0.004,27.003906 -3,3 3,2.996094 0.004,33.011718 -2.99609,2.996094 h -15 z m 26.98437,0 h 15 v 5.992188 H 287.01172 V 41.003906 H 296 L 298.99609,44 V 80.011718 L 296,83.007812 h -15 v -6.011718 h 12.00391 v -30 h -9.00782 L 281,44 V 14 Z M 415,10 v 5 h 5 v -5 z m 40,0 v 5 h 5 v -5 z m 25,5 v 5 h 5 V 15 Z M 17.011719,16.996094 v 60 h 5.992187 v -60 z m 47.996093,0 v 60 H 71 v -60 z m 53.988278,0 v 24.007812 h 6.01172 V 16.996094 Z m 48.01563,0 v 24.007812 h 5.99219 V 16.996094 Z m 71.98437,0 v 24.007812 h 6.01172 V 16.996094 Z m 24.00782,0 v 24.007812 h 5.99218 V 16.996094 Z M 400,20 v 10 h 10 V 20 Z m 40,0 v 5 h 5 v -5 z m 60,5 v 5 h 5 v -5 z m -70,5 v 5 h 5 v -5 z m 20,0 v 10 h 10 V 30 Z m -70,5 v 5 h 5 v -5 z m 25,0 v 5 h 5 v -5 z m 70,0 v 5 h 5 v -5 z m -85,5 v 5 h 5 v -5 z m 100,0 v 5 h 5 v -5 z m -60,5 v 10 h 10 V 45 Z m 15,0 v 5 h 5 v -5 z m -181.99609,1.996094 v 30 h 5.99218 v -30 z M 375,50 v 5 h 5 v -5 z m 40,0 v 5 h 5 v -5 z m 35,5 v 5 h 5 v -5 z m -60,5 v 5 h 5 v -5 z m 30,0 v 5 h 5 v -5 z m -65,5 v 5 h 5 v -5 z m 10,0 v 10 h 10 V 65 Z m 70,0 v 5 h 5 v -5 z m 20,0 v 5 h 5 v -5 z m 15,0 v 5 h 5 v -5 z m -65,5 v 5 h -5 v 19 h 20 V 75 70 h -5 v 5 h -5 v -5 z m -65,5 v 15 h 15 V 75 Z m 50,0 v 5 h 5 v -5 z m 50,0 v 5 h 5 v -5 z m -60,10 v 9 h 10 v -9 z m 65,0 v 5 h 5 v -5 z m -115,5 v 4 h 5 v -4 z m 100,0 v 4 h 5 v -4 z m 30,0 v 4 h 5 v -4 z"
|
||||||
|
sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" /></svg>
|
After Width: | Height: | Size: 4.6 KiB |
17
content/sitemap.xml.njk
Normal file
17
content/sitemap.xml.njk
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
---
|
||||||
|
permalink: /sitemap.xml
|
||||||
|
layout: false
|
||||||
|
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 %}
|
||||||
|
{% if page.data.permalink != false %}
|
||||||
|
{% set absoluteUrl %}{{ page.url | htmlBaseUrl(metadata.url) }}{% endset %}
|
||||||
|
<url>
|
||||||
|
<loc>{{ absoluteUrl }}</loc>
|
||||||
|
<lastmod>{{ page.date | htmlDateString }}</lastmod>
|
||||||
|
</url>
|
||||||
|
{% endif %}
|
||||||
|
{%- endfor %}
|
||||||
|
</urlset>
|
27
content/tag-pages.njk
Normal file
27
content/tag-pages.njk
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
---js
|
||||||
|
// <script>
|
||||||
|
const pagination = {
|
||||||
|
data: "collections",
|
||||||
|
size: 1,
|
||||||
|
alias: "tag",
|
||||||
|
filter: ["all", "posts"],
|
||||||
|
// addAllPagesToCollections: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
const eleventyExcludeFromCollections = true;
|
||||||
|
|
||||||
|
const eleventyComputed = {
|
||||||
|
title: "Tagged '{{ tag }}'",
|
||||||
|
permalink: function(data) {
|
||||||
|
// If DuplicatePermalinkOutputError occurs, check that no tag occurs
|
||||||
|
// with differing case, e.g. "RSS" and "rss".
|
||||||
|
return `/tags/${this.slugify(data.tag)}/`;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
---
|
||||||
|
<h1>Tagged “{{ tag }}”</h1>
|
||||||
|
|
||||||
|
{% set postslist = collections[ tag ] %}
|
||||||
|
{% include "postslist.njk" %}
|
||||||
|
|
||||||
|
<p>See <a href="tags.njk">all tags</a>.</p>
|
8
content/tags.njk
Normal file
8
content/tags.njk
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
<h1>Tags</h1>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
{% for tag in collections | getKeys | filterTagList | sortAlphabetically %}
|
||||||
|
{% set tagUrl %}/tags/{{ tag | slugify }}/{% endset %}
|
||||||
|
<li><a href="{{ tagUrl }}" class="post-tag">{{ tag }}</a></li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
314
css/index.css
Normal file
314
css/index.css
Normal file
|
@ -0,0 +1,314 @@
|
||||||
|
@font-face{
|
||||||
|
font-family: "Mister Twiggs W01 Heavy";
|
||||||
|
src: url("{{ path }}/MisterTwiggsHeavy.woff2")format("woff2");
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
font-display: swap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Defaults */
|
||||||
|
:root {
|
||||||
|
--font-family: sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Theme colors */
|
||||||
|
:root {
|
||||||
|
--color-gray-20: #eee;
|
||||||
|
--color-gray-50: #ccc;
|
||||||
|
--color-gray-90: #333;
|
||||||
|
|
||||||
|
--background-color: #eee;
|
||||||
|
--body-color: #fff;
|
||||||
|
|
||||||
|
--text-color: var(--color-gray-90);
|
||||||
|
--text-color-link: #ff2121;
|
||||||
|
--text-color-link-active: #ff5959;
|
||||||
|
--text-color-link-visited: #000;
|
||||||
|
|
||||||
|
--syntax-tab-size: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
:root {
|
||||||
|
--color-gray-20: #eee;
|
||||||
|
--color-gray-50: #ccc;
|
||||||
|
--color-gray-90: #dad8d8;
|
||||||
|
|
||||||
|
/* --text-color is assigned to --color-gray-_ above */
|
||||||
|
--text-color-link: #ff3939;
|
||||||
|
--text-color-link-active: #ff7979;
|
||||||
|
--text-color-link-visited: #fff;
|
||||||
|
|
||||||
|
--background-color: #222;
|
||||||
|
--body-color: #111;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
filter: invert(100%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Global stylesheet */
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
html,
|
||||||
|
body {
|
||||||
|
padding: 15px;
|
||||||
|
margin: 0 auto;
|
||||||
|
font-family: var(--font-family);
|
||||||
|
color: var(--text-color);
|
||||||
|
|
||||||
|
background-color: var(--background-color);
|
||||||
|
}
|
||||||
|
html {
|
||||||
|
overflow-y: scroll;
|
||||||
|
background-image: url("{{ path }}/otomata_labs_tile.svg");
|
||||||
|
background-blend-mode: difference;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
max-width: 75%;
|
||||||
|
background-color: var(--body-color);
|
||||||
|
border: 2px dashed var(--color-gray-90);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* https://www.a11yproject.com/posts/how-to-hide-content/ */
|
||||||
|
.visually-hidden:not(:focus):not(:active) {
|
||||||
|
clip: rect(0 0 0 0);
|
||||||
|
clip-path: inset(50%);
|
||||||
|
height: 1px;
|
||||||
|
overflow: hidden;
|
||||||
|
position: absolute;
|
||||||
|
white-space: nowrap;
|
||||||
|
width: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fluid images via https://www.zachleat.com/web/fluid-images/ */
|
||||||
|
img{
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
img[width][height] {
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
img[src$=".svg"] {
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
max-width: none;
|
||||||
|
}
|
||||||
|
video,
|
||||||
|
iframe {
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
iframe {
|
||||||
|
aspect-ratio: 16/9;
|
||||||
|
}
|
||||||
|
|
||||||
|
p:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
p {
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
a[href] {
|
||||||
|
color: var(--text-color-link);
|
||||||
|
}
|
||||||
|
a[href]:visited {
|
||||||
|
color: var(--text-color-link-visited);
|
||||||
|
}
|
||||||
|
a[href]:hover,
|
||||||
|
a[href]:active {
|
||||||
|
color: var(--text-color-link-active);
|
||||||
|
}
|
||||||
|
|
||||||
|
main,
|
||||||
|
footer {
|
||||||
|
padding: 1rem;
|
||||||
|
}
|
||||||
|
main :first-child {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
border-bottom: 2px dashed var(--color-gray-20);
|
||||||
|
}
|
||||||
|
|
||||||
|
#skip-link {
|
||||||
|
text-decoration: none;
|
||||||
|
background: var(--background-color);
|
||||||
|
color: var(--text-color);
|
||||||
|
padding: 0.5rem 1rem;
|
||||||
|
border: 1px solid var(--color-gray-90);
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Prevent visually-hidden skip link fom pushing content around when focused */
|
||||||
|
#skip-link.visually-hidden:focus {
|
||||||
|
position: absolute;
|
||||||
|
top: 1rem;
|
||||||
|
left: 1rem;
|
||||||
|
/* Ensure it is positioned on top of everything else when it is shown */
|
||||||
|
z-index: 999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.links-nextprev {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: .5em 1em;
|
||||||
|
list-style: "";
|
||||||
|
border-top: 1px dashed var(--color-gray-20);
|
||||||
|
padding: 1em 0;
|
||||||
|
}
|
||||||
|
.links-nextprev > * {
|
||||||
|
flex-grow: 1;
|
||||||
|
}
|
||||||
|
.links-nextprev-next {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
margin: 1em 0;
|
||||||
|
}
|
||||||
|
table td,
|
||||||
|
table th {
|
||||||
|
padding-right: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre,
|
||||||
|
code {
|
||||||
|
font-family: monospace;
|
||||||
|
}
|
||||||
|
pre:not([class*="language-"]) {
|
||||||
|
margin: .5em 0;
|
||||||
|
line-height: 1.375; /* 22px /16 */
|
||||||
|
-moz-tab-size: var(--syntax-tab-size);
|
||||||
|
-o-tab-size: var(--syntax-tab-size);
|
||||||
|
tab-size: var(--syntax-tab-size);
|
||||||
|
-webkit-hyphens: none;
|
||||||
|
-ms-hyphens: none;
|
||||||
|
hyphens: none;
|
||||||
|
direction: ltr;
|
||||||
|
text-align: left;
|
||||||
|
white-space: pre;
|
||||||
|
word-spacing: normal;
|
||||||
|
word-break: normal;
|
||||||
|
overflow-x: auto;
|
||||||
|
}
|
||||||
|
code {
|
||||||
|
word-break: break-all;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Header */
|
||||||
|
header {
|
||||||
|
font-size: 32pt;
|
||||||
|
font-family: "Mister Twiggs W01 Heavy";
|
||||||
|
display: flex;
|
||||||
|
gap: 5px;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
.home-link {
|
||||||
|
flex-grow: 1;
|
||||||
|
font-size: 1em; /* 16px /16 */
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.home-link:link:not(:hover) {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Nav */
|
||||||
|
.nav {
|
||||||
|
display: flex;
|
||||||
|
gap: .5em 1em;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
.nav-item {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.nav-item a[href]:not(:hover) {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.nav a[href][aria-current="page"] {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Posts list */
|
||||||
|
.postlist {
|
||||||
|
counter-reset: start-from var(--postlist-index);
|
||||||
|
list-style: none;
|
||||||
|
padding: 0;
|
||||||
|
padding-left: 1.5rem;
|
||||||
|
}
|
||||||
|
.postlist-item {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-items: baseline;
|
||||||
|
counter-increment: start-from -1;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
}
|
||||||
|
.postlist-item:before {
|
||||||
|
display: inline-block;
|
||||||
|
pointer-events: none;
|
||||||
|
content: "" counter(start-from, decimal-leading-zero) ". ";
|
||||||
|
line-height: 100%;
|
||||||
|
text-align: right;
|
||||||
|
margin-left: -1.5rem;
|
||||||
|
}
|
||||||
|
.postlist-date,
|
||||||
|
.postlist-item:before {
|
||||||
|
font-size: 0.8125em; /* 13px /16 */
|
||||||
|
color: var(--color-gray-90);
|
||||||
|
}
|
||||||
|
.postlist-date {
|
||||||
|
word-spacing: -0.5px;
|
||||||
|
}
|
||||||
|
.postlist-link {
|
||||||
|
font-size: 1.1875em; /* 19px /16 */
|
||||||
|
font-weight: 700;
|
||||||
|
flex-basis: calc(100% - 1.5rem);
|
||||||
|
padding-left: .25em;
|
||||||
|
padding-right: .5em;
|
||||||
|
text-underline-position: from-font;
|
||||||
|
text-underline-offset: 0;
|
||||||
|
text-decoration-thickness: 1px;
|
||||||
|
}
|
||||||
|
.postlist-item-active .postlist-link {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tags */
|
||||||
|
.post-tag {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
text-transform: capitalize;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
.postlist-item > .post-tag {
|
||||||
|
align-self: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tags list */
|
||||||
|
.post-metadata {
|
||||||
|
display: inline-flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: .5em;
|
||||||
|
list-style: none;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
.post-metadata time {
|
||||||
|
margin-right: 1em;
|
||||||
|
}
|
||||||
|
|
18
css/message-box.css
Normal file
18
css/message-box.css
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
/* Message Box */
|
||||||
|
.message-box {
|
||||||
|
--color-message-box: #ffc;
|
||||||
|
|
||||||
|
display: block;
|
||||||
|
background-color: var(--color-message-box);
|
||||||
|
color: var(--color-gray-90);
|
||||||
|
padding: 1em 0.625em; /* 16px 10px /16 */
|
||||||
|
}
|
||||||
|
.message-box ol {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
.message-box {
|
||||||
|
--color-message-box: #082840;
|
||||||
|
}
|
||||||
|
}
|
45
css/prism-diff.css
Normal file
45
css/prism-diff.css
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* New diff- syntax
|
||||||
|
*/
|
||||||
|
|
||||||
|
pre[class*="language-diff-"] {
|
||||||
|
--eleventy-code-padding: 1.25em;
|
||||||
|
padding-left: var(--eleventy-code-padding);
|
||||||
|
padding-right: var(--eleventy-code-padding);
|
||||||
|
}
|
||||||
|
.token.deleted {
|
||||||
|
background-color: hsl(0, 51%, 37%);
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
.token.inserted {
|
||||||
|
background-color: hsl(126, 31%, 39%);
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make the + and - characters unselectable for copy/paste */
|
||||||
|
.token.prefix.unchanged,
|
||||||
|
.token.prefix.inserted,
|
||||||
|
.token.prefix.deleted {
|
||||||
|
-webkit-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding-top: 2px;
|
||||||
|
padding-bottom: 2px;
|
||||||
|
}
|
||||||
|
.token.prefix.inserted,
|
||||||
|
.token.prefix.deleted {
|
||||||
|
width: var(--eleventy-code-padding);
|
||||||
|
background-color: rgba(0,0,0,.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Optional: full-width background color */
|
||||||
|
.token.inserted:not(.prefix),
|
||||||
|
.token.deleted:not(.prefix) {
|
||||||
|
display: block;
|
||||||
|
margin-left: calc(-1 * var(--eleventy-code-padding));
|
||||||
|
margin-right: calc(-1 * var(--eleventy-code-padding));
|
||||||
|
text-decoration: none; /* override del, ins, mark defaults */
|
||||||
|
color: inherit; /* override del, ins, mark defaults */
|
||||||
|
}
|
165
eleventy.config.js
Normal file
165
eleventy.config.js
Normal file
|
@ -0,0 +1,165 @@
|
||||||
|
import { IdAttributePlugin, InputPathToUrlTransformPlugin, HtmlBasePlugin } from "@11ty/eleventy";
|
||||||
|
import { feedPlugin } from "@11ty/eleventy-plugin-rss";
|
||||||
|
import pluginSyntaxHighlight from "@11ty/eleventy-plugin-syntaxhighlight";
|
||||||
|
import pluginNavigation from "@11ty/eleventy-navigation";
|
||||||
|
import { eleventyImageTransformPlugin } from "@11ty/eleventy-img";
|
||||||
|
|
||||||
|
import pluginFilters from "./_config/filters.js";
|
||||||
|
|
||||||
|
/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */
|
||||||
|
export default async function(eleventyConfig) {
|
||||||
|
// Drafts, see also _data/eleventyDataSchema.js
|
||||||
|
eleventyConfig.addPreprocessor("drafts", "*", (data, content) => {
|
||||||
|
if (data.draft) {
|
||||||
|
data.title = `${data.title} (draft)`;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(data.draft && process.env.ELEVENTY_RUN_MODE === "build") {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Copy the contents of the `public` folder to the output folder
|
||||||
|
// For example, `./public/css/` ends up in `_site/css/`
|
||||||
|
eleventyConfig
|
||||||
|
.addPassthroughCopy({
|
||||||
|
"./public/": "/"
|
||||||
|
})
|
||||||
|
.addPassthroughCopy("./content/feed/pretty-atom-feed.xsl");
|
||||||
|
|
||||||
|
// Run Eleventy when these files change:
|
||||||
|
// https://www.11ty.dev/docs/watch-serve/#add-your-own-watch-targets
|
||||||
|
|
||||||
|
// Watch CSS files
|
||||||
|
eleventyConfig.addWatchTarget("css/**/*.css");
|
||||||
|
// Watch images for the image pipeline.
|
||||||
|
eleventyConfig.addWatchTarget("content/**/*.{svg,webp,png,jpg,jpeg,gif}");
|
||||||
|
|
||||||
|
// Per-page bundles, see https://github.com/11ty/eleventy-plugin-bundle
|
||||||
|
// Bundle <style> content and adds a {% css %} paired shortcode
|
||||||
|
eleventyConfig.addBundle("css", {
|
||||||
|
toFileDirectory: "dist",
|
||||||
|
// Add all <style> content to `css` bundle (use <style eleventy:ignore> to opt-out)
|
||||||
|
// Supported selectors: https://www.npmjs.com/package/posthtml-match-helper
|
||||||
|
bundleHtmlContentFromSelector: "style",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Bundle <script> content and adds a {% js %} paired shortcode
|
||||||
|
eleventyConfig.addBundle("js", {
|
||||||
|
toFileDirectory: "dist",
|
||||||
|
// Add all <script> content to the `js` bundle (use <script eleventy:ignore> to opt-out)
|
||||||
|
// Supported selectors: https://www.npmjs.com/package/posthtml-match-helper
|
||||||
|
bundleHtmlContentFromSelector: "script",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Official plugins
|
||||||
|
eleventyConfig.addPlugin(pluginSyntaxHighlight, {
|
||||||
|
preAttributes: { tabindex: 0 }
|
||||||
|
});
|
||||||
|
eleventyConfig.addPlugin(pluginNavigation);
|
||||||
|
eleventyConfig.addPlugin(HtmlBasePlugin);
|
||||||
|
eleventyConfig.addPlugin(InputPathToUrlTransformPlugin);
|
||||||
|
|
||||||
|
eleventyConfig.addPlugin(feedPlugin, {
|
||||||
|
type: "atom", // or "rss", "json"
|
||||||
|
outputPath: "/feed/feed.xml",
|
||||||
|
stylesheet: "pretty-atom-feed.xsl",
|
||||||
|
templateData: {
|
||||||
|
eleventyNavigation: {
|
||||||
|
key: "FEED",
|
||||||
|
order: 4
|
||||||
|
}
|
||||||
|
},
|
||||||
|
collection: {
|
||||||
|
name: "posts",
|
||||||
|
limit: 10,
|
||||||
|
},
|
||||||
|
metadata: {
|
||||||
|
language: "en",
|
||||||
|
title: "Otomata Labs",
|
||||||
|
subtitle: "Pushing retro computers to their limits.",
|
||||||
|
base: "https://otomatalabs.net/",
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Image optimization: https://www.11ty.dev/docs/plugins/image/#eleventy-transform
|
||||||
|
eleventyConfig.addPlugin(eleventyImageTransformPlugin, {
|
||||||
|
// Output formats for each image.
|
||||||
|
formats: ["avif", "webp", "auto"],
|
||||||
|
|
||||||
|
// widths: ["auto"],
|
||||||
|
|
||||||
|
failOnError: false,
|
||||||
|
htmlOptions: {
|
||||||
|
imgAttributes: {
|
||||||
|
// e.g. <img loading decoding> assigned on the HTML tag will override these values.
|
||||||
|
loading: "lazy",
|
||||||
|
decoding: "async",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
sharpOptions: {
|
||||||
|
animated: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
// Filters
|
||||||
|
eleventyConfig.addPlugin(pluginFilters);
|
||||||
|
|
||||||
|
eleventyConfig.addPlugin(IdAttributePlugin, {
|
||||||
|
// by default we use Eleventy’s built-in `slugify` filter:
|
||||||
|
// slugify: eleventyConfig.getFilter("slugify"),
|
||||||
|
// selector: "h1,h2,h3,h4,h5,h6", // default
|
||||||
|
});
|
||||||
|
|
||||||
|
eleventyConfig.addShortcode("currentBuildDate", () => {
|
||||||
|
return (new Date()).toISOString();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 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");
|
||||||
|
};
|
||||||
|
|
||||||
|
export const config = {
|
||||||
|
// Control which files Eleventy will process
|
||||||
|
// e.g.: *.md, *.njk, *.html, *.liquid
|
||||||
|
templateFormats: [
|
||||||
|
"md",
|
||||||
|
"njk",
|
||||||
|
"html",
|
||||||
|
"liquid",
|
||||||
|
"11ty.js",
|
||||||
|
],
|
||||||
|
|
||||||
|
// 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" (`input` relative)
|
||||||
|
data: "../_data", // default: "_data" (`input` relative)
|
||||||
|
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: "/",
|
||||||
|
};
|
|
@ -1,40 +0,0 @@
|
||||||
import prettier from 'eslint-config-prettier';
|
|
||||||
import { includeIgnoreFile } from '@eslint/compat';
|
|
||||||
import js from '@eslint/js';
|
|
||||||
import svelte from 'eslint-plugin-svelte';
|
|
||||||
import globals from 'globals';
|
|
||||||
import { fileURLToPath } from 'node:url';
|
|
||||||
import ts from 'typescript-eslint';
|
|
||||||
import svelteConfig from './svelte.config.js';
|
|
||||||
|
|
||||||
const gitignorePath = fileURLToPath(new URL('./.gitignore', import.meta.url));
|
|
||||||
|
|
||||||
export default ts.config(
|
|
||||||
includeIgnoreFile(gitignorePath),
|
|
||||||
js.configs.recommended,
|
|
||||||
...ts.configs.recommended,
|
|
||||||
...svelte.configs.recommended,
|
|
||||||
prettier,
|
|
||||||
...svelte.configs.prettier,
|
|
||||||
{
|
|
||||||
languageOptions: {
|
|
||||||
globals: { ...globals.browser, ...globals.node }
|
|
||||||
},
|
|
||||||
rules: {
|
|
||||||
// typescript-eslint strongly recommend that you do not use the no-undef lint rule on TypeScript projects.
|
|
||||||
// see: https://typescript-eslint.io/troubleshooting/faqs/eslint/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors
|
|
||||||
'no-undef': 'off'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'],
|
|
||||||
languageOptions: {
|
|
||||||
parserOptions: {
|
|
||||||
projectService: true,
|
|
||||||
extraFileExtensions: ['.svelte'],
|
|
||||||
parser: ts.parser,
|
|
||||||
svelteConfig
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
2555
package-lock.json
generated
Normal file
2555
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
80
package.json
80
package.json
|
@ -1,44 +1,52 @@
|
||||||
{
|
{
|
||||||
"name": "ol-site",
|
"name": "eleventy-base-blog",
|
||||||
"private": true,
|
"version": "9.0.0",
|
||||||
"version": "0.0.1",
|
"description": "A starter repository for a blog web site using the Eleventy site generator.",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite dev",
|
"build": "npx @11ty/eleventy",
|
||||||
"build": "vite build",
|
"build-nocolor": "cross-env NODE_DISABLE_COLORS=1 npx @11ty/eleventy",
|
||||||
"preview": "vite preview",
|
"build-ghpages": "npx @11ty/eleventy --pathprefix=/eleventy-base-blog/",
|
||||||
"prepare": "svelte-kit sync || echo ''",
|
"start": "npx @11ty/eleventy --serve --quiet",
|
||||||
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
|
"start-ghpages": "npx @11ty/eleventy --pathprefix=/eleventy-base-blog/ --serve --quiet",
|
||||||
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
|
"debug": "cross-env DEBUG=Eleventy* npx @11ty/eleventy",
|
||||||
"format": "prettier --write .",
|
"debugstart": "cross-env DEBUG=Eleventy* npx @11ty/eleventy --serve --quiet",
|
||||||
"lint": "prettier --check . && eslint ."
|
"benchmark": "cross-env 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": ">=18"
|
||||||
|
},
|
||||||
|
"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": {
|
"devDependencies": {
|
||||||
"@eslint/compat": "^1.2.5",
|
"@11ty/eleventy": "^3.1.2",
|
||||||
"@eslint/js": "^9.18.0",
|
"@11ty/eleventy-img": "^6.0.4",
|
||||||
"@sveltejs/adapter-auto": "^6.0.0",
|
"@11ty/eleventy-navigation": "^1.0.4",
|
||||||
"@sveltejs/kit": "^2.16.0",
|
"@11ty/eleventy-plugin-rss": "^2.0.4",
|
||||||
"@sveltejs/vite-plugin-svelte": "^5.0.0",
|
"@11ty/eleventy-plugin-syntaxhighlight": "^5.0.1",
|
||||||
"@tailwindcss/typography": "^0.5.15",
|
"cross-env": "^7.0.3",
|
||||||
"@tailwindcss/vite": "^4.0.0",
|
"luxon": "^3.6.1",
|
||||||
"eslint": "^9.18.0",
|
"prismjs": "^1.30.0",
|
||||||
"eslint-config-prettier": "^10.0.1",
|
"zod": "^3.25.67",
|
||||||
"eslint-plugin-svelte": "^3.0.0",
|
"zod-validation-error": "^3.5.2"
|
||||||
"globals": "^16.0.0",
|
|
||||||
"mdsvex": "^0.12.3",
|
|
||||||
"prettier": "^3.4.2",
|
|
||||||
"prettier-plugin-svelte": "^3.3.3",
|
|
||||||
"prettier-plugin-tailwindcss": "^0.6.11",
|
|
||||||
"svelte": "^5.0.0",
|
|
||||||
"svelte-check": "^4.0.0",
|
|
||||||
"tailwindcss": "^4.0.0",
|
|
||||||
"typescript": "^5.0.0",
|
|
||||||
"typescript-eslint": "^8.20.0",
|
|
||||||
"vite": "^6.2.6"
|
|
||||||
},
|
},
|
||||||
"pnpm": {
|
"dependencies": {
|
||||||
"onlyBuiltDependencies": [
|
"@zachleat/heading-anchors": "^1.0.3"
|
||||||
"esbuild"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
2679
pnpm-lock.yaml
2679
pnpm-lock.yaml
File diff suppressed because it is too large
Load diff
BIN
public/MisterTwiggsHeavy.woff2
Normal file
BIN
public/MisterTwiggsHeavy.woff2
Normal file
Binary file not shown.
BIN
public/favicon.png
Normal file
BIN
public/favicon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 141 B |
25
public/otomata_labs_tile.svg
Normal file
25
public/otomata_labs_tile.svg
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="256"
|
||||||
|
height="256"
|
||||||
|
viewBox="0 0 256 256"
|
||||||
|
version="1.1"
|
||||||
|
id="svg5"
|
||||||
|
xml:space="preserve"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
||||||
|
id="defs2" /><path
|
||||||
|
d="m 32.001491,24.003531 c -2.20489,0.0029 -3.99159,1.789553 -3.99444,3.994438 -0.004,2.209967 1.78446,4.0046 3.99444,4.007459 h 9.19449 l -19.79252,16.956841 c -2.81947,2.418988 -1.10581,7.040044 2.60915,7.035832 h 3.99444 v 36.002038 c 0.003,2.20479 1.78964,3.99136 3.99444,3.99444 h 16.00379 c 2.20479,-0.003 3.99137,-1.78965 3.99444,-3.99444 V 52.003665 c 0.004,-2.209876 -1.78456,-4.004376 -3.99444,-4.00746 h -13.18634 l 19.78992,-16.956837 c 2.81948,-2.418992 1.10582,-7.040052 -2.60914,-7.035837 z m 32.00759,0 c -2.20997,-0.0045 -4.00461,1.784469 -4.00747,3.994438 -0.005,2.21506 1.79241,4.011807 4.00747,4.007459 h 3.99444 v 31.994574 h -3.99444 c -2.20997,-0.0045 -4.0046,1.784467 -4.00747,3.99444 -0.005,2.215056 1.79241,4.011809 4.00747,4.00746 h 3.99444 v 23.992677 h -3.99444 c -2.21506,-0.005 -4.01181,1.7924 -4.00747,4.007461 0.003,2.20997 1.7975,3.99877 4.00747,3.99443 h 7.98888 c 2.20987,0.004 4.00438,-1.78456 4.00745,-3.99443 V 72.001902 h 15.99078 v 28.000138 c 0.003,2.20997 1.797501,3.99877 4.007461,3.99443 2.20488,-0.003 3.99159,-1.78955 3.99444,-3.99443 V 72.001902 h 4.007468 c 2.20997,-0.0029 3.99877,-1.797496 3.99443,-4.00746 -0.003,-2.204884 -1.78955,-3.991585 -3.99443,-3.99444 H 99.998092 V 32.005428 h 4.007468 c 2.20997,-0.0029 3.99877,-1.797492 3.99443,-4.007459 -0.003,-2.204882 -1.78955,-3.991581 -3.99443,-3.994438 z m 11.99633,8.001897 h 15.99078 v 31.994574 h -15.99078 z m -39.99647,23.992673 h 8.00191 v 31.994578 h -8.00191 z"
|
||||||
|
style="color:#000000;fill:#333333;stroke-width:5.03891;stroke-linecap:square;stroke-linejoin:bevel;stroke-dashoffset:0.00000001;-inkscape-stroke:none;paint-order:stroke fill markers;fill-opacity:1"
|
||||||
|
id="path1-6" /><path
|
||||||
|
id="path1238"
|
||||||
|
style="color:#000000;fill:#333333;stroke-width:5.03912;stroke-linecap:square;stroke-linejoin:round;stroke-dashoffset:0.00000001;-inkscape-stroke:none;paint-order:stroke fill markers;fill-opacity:1"
|
||||||
|
d="M 155.99805 152.00195 C 152.44596 152.01265 150.66792 156.30283 153.17188 158.82227 L 186.33984 192 L 153.17188 225.16797 C 151.60852 226.73021 151.60852 229.26393 153.17188 230.82617 C 154.73323 232.38433 157.26287 232.38433 158.82422 230.82617 L 192.00195 197.64844 L 225.16797 230.82617 C 226.73021 232.38954 229.26588 232.38954 230.82812 230.82617 C 232.39148 229.26393 232.39148 226.73021 230.82812 225.16797 L 197.65039 192 L 230.82812 158.82227 C 233.33559 156.29925 231.5493 152.00327 227.99219 152.00195 L 155.99805 152.00195 z M 165.64258 159.99023 L 187.99414 159.99023 L 187.99609 182.33398 L 165.64258 159.99023 z M 195.99609 159.99023 L 218.3457 159.99023 L 195.99609 182.34375 L 195.99609 159.99023 z " /><path
|
||||||
|
d="m 192.00651,12.008884 c -2.2101,-0.0044 -4.00484,1.784574 -4.0077,3.994673 v 8.002368 h -31.99644 c -2.20501,0.0029 -3.99182,1.789661 -3.99468,3.994673 -0.004,2.210094 1.78459,4.004832 3.99468,4.007691 h 11.99704 V 48 h -11.99704 c -2.2101,0.0029 -3.99901,1.797601 -3.99468,4.007699 0.003,2.205011 1.78967,3.991813 3.99468,3.994669 h 71.99526 c 2.21009,0.0045 4.00483,-1.784567 4.00768,-3.994669 C 232.00931,49.792513 230.2128,47.995653 227.99763,48 H 216.00059 V 32.008289 h 11.99703 c 2.21518,0.0045 4.01203,-1.792505 4.00769,-4.007691 -0.003,-2.210104 -1.7976,-3.999009 -4.00769,-3.994673 h -31.99644 v -8.002368 c -0.003,-2.205012 -1.78966,-3.991817 -3.99467,-3.994673 z m -16.00473,19.999405 h 31.99643 V 48 h -31.99643 z m -3.99467,31.996446 c -2.21001,-0.004 -4.00462,1.784663 -4.0077,3.994669 v 32.009476 c 0.003,2.21 1.79769,3.99878 4.0077,3.99467 h 39.99881 c 2.20492,-0.003 3.99159,-1.78975 3.99467,-3.99467 V 67.999404 c -0.003,-2.204919 -1.78975,-3.991597 -3.99467,-3.994669 z m 3.99467,8.002368 h 31.99643 v 7.994077 h -32 z m -0.004,15.994073 h 32 v 8 h -31.99643 z"
|
||||||
|
style="color:#000000;fill:#333333;stroke-width:5.0392;stroke-linecap:square;stroke-linejoin:bevel;stroke-dashoffset:0.00000001;-inkscape-stroke:none;paint-order:stroke fill markers;fill-opacity:1"
|
||||||
|
id="path1" /><path
|
||||||
|
d="m 64.00335,140.00527 c -2.20991,0.003 -3.99866,1.79744 -3.99433,4.00735 v 8.00168 h -32.0067 c -2.20473,0.003 -3.99125,1.78959 -3.99433,3.99432 v 8.00168 c 0.003,2.20482 1.7895,3.99147 3.99433,3.99433 2.2099,0.004 4.00449,-1.78442 4.00734,-3.99433 v -4.00736 h 8.00168 v 24.00504 h -4.00735 c -2.20482,0.003 -3.99147,1.78951 -3.99433,3.99432 -0.005,2.20991 1.78443,4.0045 3.99433,4.00736 h 8.00168 c 2.20981,-0.003 3.99844,-1.79753 3.99433,-4.00736 v -27.99936 h 24.00503 v 27.99936 c -0.004,2.20983 1.78451,4.00428 3.99433,4.00736 h 16.003361 c 2.20981,-0.003 3.99843,-1.79753 3.99432,-4.00736 v -8.00167 c -0.003,-2.20483 -1.7895,-3.99147 -3.99432,-3.99433 -2.20991,-0.004 -4.004501,1.78442 -4.007361,3.99433 v 4.00735 h -7.98865 v -24.00504 h 15.990331 v 4.00736 c 0.003,2.20991 1.79744,3.99867 4.007349,3.99433 2.20483,-0.003 3.99146,-1.78951 3.99433,-3.99433 v -8.00168 c -0.003,-2.20473 -1.7896,-3.99126 -3.99433,-3.99432 H 67.99767 v -8.00168 c 0.005,-2.20991 -1.78441,-4.00449 -3.99432,-4.00735 z m -19.99768,54.00155 c -2.20482,0.003 -3.99147,1.7895 -3.99433,3.99433 v 1.99717 H 28.00232 c -2.20992,0.003 -3.99867,1.79744 -3.99433,4.00734 0.003,2.20483 1.7895,3.99147 3.99433,3.99434 h 12.00902 v 16.00335 h -4.00735 c -2.20482,0.003 -3.99147,1.7895 -3.99433,3.99433 -0.005,2.2099 1.78443,4.00448 3.99433,4.00735 h 8.00168 c 2.20981,-0.003 3.99844,-1.79754 3.99433,-4.00735 V 208 h 32.00671 v 19.99768 c -0.004,2.20981 1.78451,4.00427 3.99433,4.00735 h 16.00335 c 2.20982,-0.003 3.99844,-1.79754 3.99433,-4.00735 V 219.996 c -0.003,-2.20482 -1.7895,-3.99147 -3.99433,-3.99433 -2.209909,-0.004 -4.004489,1.78442 -4.007349,3.99433 v 4.00735 H 87.99536 v -19.99769 c 0.004,-2.20981 -1.78451,-4.00426 -3.99432,-4.00734 H 48 v -1.99717 c -0.0032,-2.20483 -1.78951,-3.99147 -3.99433,-3.99433 z"
|
||||||
|
style="color:#000000;fill:#333333;stroke-width:5.03878;stroke-linecap:square;stroke-linejoin:bevel;stroke-dashoffset:0.00000001;-inkscape-stroke:none;paint-order:stroke fill markers;fill-opacity:1"
|
||||||
|
id="path1-1" /></svg>
|
After Width: | Height: | Size: 6.2 KiB |
|
@ -1,2 +0,0 @@
|
||||||
@import 'tailwindcss';
|
|
||||||
@plugin '@tailwindcss/typography';
|
|
13
src/app.d.ts
vendored
13
src/app.d.ts
vendored
|
@ -1,13 +0,0 @@
|
||||||
// See https://svelte.dev/docs/kit/types#app.d.ts
|
|
||||||
// for information about these interfaces
|
|
||||||
declare global {
|
|
||||||
namespace App {
|
|
||||||
// interface Error {}
|
|
||||||
// interface Locals {}
|
|
||||||
// interface PageData {}
|
|
||||||
// interface PageState {}
|
|
||||||
// interface Platform {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export {};
|
|
12
src/app.html
12
src/app.html
|
@ -1,12 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<link rel="icon" href="%sveltekit.assets%/favicon.svg" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
||||||
%sveltekit.head%
|
|
||||||
</head>
|
|
||||||
<body data-sveltekit-preload-data="hover">
|
|
||||||
<div style="display: contents">%sveltekit.body%</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1 +0,0 @@
|
||||||
// place files you want to import through the `$lib` alias in this folder.
|
|
|
@ -1,7 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import '../app.css';
|
|
||||||
|
|
||||||
let { children } = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
{@render children()}
|
|
|
@ -1,2 +0,0 @@
|
||||||
<h1>Welcome to SvelteKit</h1>
|
|
||||||
<p>Visit <a href="https://svelte.dev/docs/kit">svelte.dev/docs/kit</a> to read the documentation</p>
|
|
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="107" height="128" viewBox="0 0 107 128"><title>svelte-logo</title><path d="M94.157 22.819c-10.4-14.885-30.94-19.297-45.792-9.835L22.282 29.608A29.92 29.92 0 0 0 8.764 49.65a31.5 31.5 0 0 0 3.108 20.231 30 30 0 0 0-4.477 11.183 31.9 31.9 0 0 0 5.448 24.116c10.402 14.887 30.942 19.297 45.791 9.835l26.083-16.624A29.92 29.92 0 0 0 98.235 78.35a31.53 31.53 0 0 0-3.105-20.232 30 30 0 0 0 4.474-11.182 31.88 31.88 0 0 0-5.447-24.116" style="fill:#ff3e00"/><path d="M45.817 106.582a20.72 20.72 0 0 1-22.237-8.243 19.17 19.17 0 0 1-3.277-14.503 18 18 0 0 1 .624-2.435l.49-1.498 1.337.981a33.6 33.6 0 0 0 10.203 5.098l.97.294-.09.968a5.85 5.85 0 0 0 1.052 3.878 6.24 6.24 0 0 0 6.695 2.485 5.8 5.8 0 0 0 1.603-.704L69.27 76.28a5.43 5.43 0 0 0 2.45-3.631 5.8 5.8 0 0 0-.987-4.371 6.24 6.24 0 0 0-6.698-2.487 5.7 5.7 0 0 0-1.6.704l-9.953 6.345a19 19 0 0 1-5.296 2.326 20.72 20.72 0 0 1-22.237-8.243 19.17 19.17 0 0 1-3.277-14.502 17.99 17.99 0 0 1 8.13-12.052l26.081-16.623a19 19 0 0 1 5.3-2.329 20.72 20.72 0 0 1 22.237 8.243 19.17 19.17 0 0 1 3.277 14.503 18 18 0 0 1-.624 2.435l-.49 1.498-1.337-.98a33.6 33.6 0 0 0-10.203-5.1l-.97-.294.09-.968a5.86 5.86 0 0 0-1.052-3.878 6.24 6.24 0 0 0-6.696-2.485 5.8 5.8 0 0 0-1.602.704L37.73 51.72a5.42 5.42 0 0 0-2.449 3.63 5.79 5.79 0 0 0 .986 4.372 6.24 6.24 0 0 0 6.698 2.486 5.8 5.8 0 0 0 1.602-.704l9.952-6.342a19 19 0 0 1 5.295-2.328 20.72 20.72 0 0 1 22.237 8.242 19.17 19.17 0 0 1 3.277 14.503 18 18 0 0 1-8.13 12.053l-26.081 16.622a19 19 0 0 1-5.3 2.328" style="fill:#fff"/></svg>
|
|
Before Width: | Height: | Size: 1.5 KiB |
|
@ -1,19 +0,0 @@
|
||||||
import { mdsvex } from 'mdsvex';
|
|
||||||
import adapter from '@sveltejs/adapter-auto';
|
|
||||||
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
|
|
||||||
|
|
||||||
/** @type {import('@sveltejs/kit').Config} */
|
|
||||||
const config = {
|
|
||||||
// Consult https://svelte.dev/docs/kit/integrations
|
|
||||||
// for more information about preprocessors
|
|
||||||
preprocess: [vitePreprocess(), mdsvex()],
|
|
||||||
kit: {
|
|
||||||
// adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list.
|
|
||||||
// If your environment is not supported, or you settled on a specific environment, switch out the adapter.
|
|
||||||
// See https://svelte.dev/docs/kit/adapters for more information about adapters.
|
|
||||||
adapter: adapter()
|
|
||||||
},
|
|
||||||
extensions: ['.svelte', '.svx']
|
|
||||||
};
|
|
||||||
|
|
||||||
export default config;
|
|
|
@ -1,19 +0,0 @@
|
||||||
{
|
|
||||||
"extends": "./.svelte-kit/tsconfig.json",
|
|
||||||
"compilerOptions": {
|
|
||||||
"allowJs": true,
|
|
||||||
"checkJs": true,
|
|
||||||
"esModuleInterop": true,
|
|
||||||
"forceConsistentCasingInFileNames": true,
|
|
||||||
"resolveJsonModule": true,
|
|
||||||
"skipLibCheck": true,
|
|
||||||
"sourceMap": true,
|
|
||||||
"strict": true,
|
|
||||||
"moduleResolution": "bundler"
|
|
||||||
}
|
|
||||||
// Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias
|
|
||||||
// except $lib which is handled by https://svelte.dev/docs/kit/configuration#files
|
|
||||||
//
|
|
||||||
// If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes
|
|
||||||
// from the referenced tsconfig.json - TypeScript does not merge them in
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
import tailwindcss from '@tailwindcss/vite';
|
|
||||||
import { sveltekit } from '@sveltejs/kit/vite';
|
|
||||||
import { defineConfig } from 'vite';
|
|
||||||
|
|
||||||
export default defineConfig({
|
|
||||||
plugins: [tailwindcss(), sveltekit()]
|
|
||||||
});
|
|
Loading…
Reference in a new issue