track src/, fonts/ as project source, replace Hugo with static website
- commit keylayouts, icons, lproj, Iosevka fonts - remove Hugo, build static site (HTML + CSS + vanilla JS) - CI workflow generates layout PDFs, deploys to GitHub Pages
82
.github/workflows/hugo.yml
vendored
@@ -1,82 +0,0 @@
|
||||
# Sample workflow for building and deploying a Hugo site to GitHub Pages
|
||||
name: Deploy Hugo site to GitHub Pages
|
||||
|
||||
on:
|
||||
# Runs on pushes targeting the default branch
|
||||
push:
|
||||
branches: ["master"]
|
||||
|
||||
# Allows you to run this workflow manually from the Actions tab
|
||||
workflow_dispatch:
|
||||
|
||||
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
|
||||
permissions:
|
||||
contents: read
|
||||
pages: write
|
||||
id-token: write
|
||||
|
||||
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
|
||||
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
|
||||
concurrency:
|
||||
group: "pages"
|
||||
cancel-in-progress: false
|
||||
|
||||
# Default to bash
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
jobs:
|
||||
# Build job
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
HUGO_VERSION: 0.120.4
|
||||
steps:
|
||||
- name: Install Hugo CLI
|
||||
run: |
|
||||
wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \
|
||||
&& sudo dpkg -i ${{ runner.temp }}/hugo.deb
|
||||
|
||||
- name: Install Dart Sass
|
||||
run: sudo snap install dart-sass
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Setup Pages
|
||||
id: pages
|
||||
uses: actions/configure-pages@v4
|
||||
|
||||
- name: Install Node.js dependencies
|
||||
run: "[[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true"
|
||||
|
||||
- name: Build with Hugo
|
||||
env:
|
||||
# For maximum backward compatibility with Hugo modules
|
||||
HUGO_ENVIRONMENT: production
|
||||
HUGO_ENV: production
|
||||
run: |
|
||||
hugo \
|
||||
--source /home/runner/work/EurKEY-macOS/EurKEY-macOS/eurkey-macos.eu/ \
|
||||
--minify \
|
||||
--baseURL "${{ steps.pages.outputs.base_url }}" # Adjust baseURL according to your directory structure
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-pages-artifact@v3
|
||||
with:
|
||||
path: eurkey-macos.eu/public
|
||||
|
||||
# Deployment job
|
||||
deploy:
|
||||
environment:
|
||||
name: github-pages
|
||||
url: ${{ steps.deployment.outputs.page_url }}
|
||||
runs-on: ubuntu-latest
|
||||
needs: build
|
||||
steps:
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@v4
|
||||
42
.github/workflows/website.yml
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
name: Deploy website
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
paths:
|
||||
- 'eurkey-macos.eu/**'
|
||||
- 'src/keylayouts/**'
|
||||
- 'fonts/**'
|
||||
- 'scripts/generate_layout_pdf.py'
|
||||
- 'scripts/parse_keylayout.py'
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
pages: write
|
||||
id-token: write
|
||||
|
||||
concurrency:
|
||||
group: pages
|
||||
cancel-in-progress: false
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
environment:
|
||||
name: github-pages
|
||||
url: ${{ steps.deployment.outputs.page_url }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.12'
|
||||
- name: Generate layout PDFs
|
||||
run: |
|
||||
pip install fpdf2
|
||||
python3 scripts/generate_layout_pdf.py -o eurkey-macos.eu/pdf/
|
||||
- uses: actions/configure-pages@v5
|
||||
- uses: actions/upload-pages-artifact@v3
|
||||
with:
|
||||
path: eurkey-macos.eu
|
||||
- id: deployment
|
||||
uses: actions/deploy-pages@v4
|
||||
1
eurkey-macos.eu/CNAME
Normal file
@@ -0,0 +1 @@
|
||||
eurkey-macos.eu
|
||||
@@ -1,5 +0,0 @@
|
||||
+++
|
||||
title = '{{ replace .File.ContentBaseName "-" " " | title }}'
|
||||
date = {{ .Date }}
|
||||
draft = true
|
||||
+++
|
||||
@@ -1,58 +0,0 @@
|
||||
# EurKEY-macOS
|
||||
|
||||
The Keyboard Layout for Europeans, Coders and Translators. This repo is a fork and contains a **modified verison** of the EurKEY base layout.
|
||||
|
||||
I start versioning my customized edition from 2, since the layout is based on my modified EurKEY v1.4 that I have been using the last few years. The version with slight fixes is now available is called v1.5.
|
||||
|
||||
EurKEY-macOS is a rework targeted at MacBooks with the with pyhiscal English International keyboard (ISO). Since it is an ISO layout, it has one additional key (`) and the big Enter key.
|
||||
|
||||
The keyboard layout should be compatible with the other ISO layouts typically available in Europe (e.g. German ISO). I tested the layout on the current tenkeyless MacBook keyboard (MacBook Air 2024). Working numpad keys are therefore not guaranteed.
|
||||
|
||||
## Installation
|
||||
|
||||
- Download the `EurKEY.bundle` file.
|
||||
- Copy the `EurKEY.bundle` file to `/Library/Keyboard Layouts/` (for global installation) or `~/Library/Keyboard Layouts/` (for user installation).
|
||||
- Open System Settings > Keyboard > Input Sources <br><img src="eurkey-macos.eu/static/img/1-input-sources.png" width="300">
|
||||
- Click the `+` button <br><img src="eurkey-macos.eu/static/img/2-add-layout.png" width="300">
|
||||
- Add `EurKEY` from the list of available input sources <br><img src="eurkey-macos.eu/static/img/3-select-eurkey.png" width="300">
|
||||
- Select `EurKEY` as the input method <br><img src="eurkey-macos.eu/static/img/4-select-input-method.png" width="300">
|
||||
|
||||
## Changelog
|
||||
|
||||
### v2.0 (WIP)
|
||||
|
||||
| Key Combinations | Dead Key Symbol |
|
||||
| ---------------- | --------------- |
|
||||
| ⌥` | ` |
|
||||
| ⌥⇧` | ~ |
|
||||
| ⌥' | ´ |
|
||||
| ⌥⇧' | ¨ |
|
||||
| ⌥6 | ^ |
|
||||
| ⌥⇧6 | ˇ |
|
||||
| ⌥7 | ˚ |
|
||||
| ⌥⇧7 | ¯ |
|
||||
| ⌥m | Ω |
|
||||
| ⌥⇧m | √ |
|
||||
| ⌥\ | ¬ |
|
||||
|
||||
### v1.5
|
||||
|
||||
- Configures every key exactly as it is printed on the keyboard (English - International).
|
||||
- Fixes §-Key.
|
||||
- Fixes German ẞ-Character ("Großes scharfes S"). Now correctly available via ⌥⇧s.
|
||||
- Removes distiction between left/right modifier keys.
|
||||
- Uses the `*.bundle` format to group the layout versions.
|
||||
- Adds new nicer flag icon from upstream.
|
||||
|
||||
### v1.4
|
||||
|
||||
- Switches behaviour of superscript and subscript numbers: The subscript numbers are the default; the superscript numbers are available via `⌥⇧<number>`.
|
||||
|
||||
## Attribution
|
||||
|
||||
You can find the original EurKEY layout on [Steffen Brüntjens Website](https://eurkey.steffen.bruentjen.eu/start.html). My modified versions are originally based on the work of [Leonardo Brondani Schenkel](https://github.com/lbschenkel/EurKEY-Mac).
|
||||
|
||||
## License
|
||||
|
||||
- The EurKEY Layout is licensed under [GPLv3](http://www.gnu.org/licenses/gpl-3.0.html). See: [https://eurkey.steffen.bruentjen.eu/license.html](https://eurkey.steffen.bruentjen.eu/license.html).
|
||||
- The EU flag icon is taken from [Iconspedia](http://www.iconspedia.com/pack/european-flags-1631/), created by [Alpak](http://alpak.deviantart.com/) and licensed under [CC](http://creativecommons.org/licenses/by-nc-nd/3.0).
|
||||
@@ -1,4 +0,0 @@
|
||||
baseURL = 'https://eurkey-macos.eu'
|
||||
languageCode = 'en'
|
||||
title = 'EurKEY-macOS'
|
||||
theme = 'blank'
|
||||
|
Before Width: | Height: | Size: 356 KiB After Width: | Height: | Size: 356 KiB |
|
Before Width: | Height: | Size: 111 KiB After Width: | Height: | Size: 111 KiB |
|
Before Width: | Height: | Size: 192 KiB After Width: | Height: | Size: 192 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB |
28
eurkey-macos.eu/img/icon.svg
Normal file
@@ -0,0 +1,28 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" fill="none">
|
||||
<rect width="128" height="128" rx="28" fill="#003399"/>
|
||||
<g fill="#FFCC00">
|
||||
<circle cx="64" cy="34" r="3"/>
|
||||
<circle cx="71.5" cy="35.5" r="3"/>
|
||||
<circle cx="77.5" cy="40" r="3"/>
|
||||
<circle cx="80" cy="47" r="3"/>
|
||||
<circle cx="77.5" cy="54" r="3"/>
|
||||
<circle cx="71.5" cy="58.5" r="3"/>
|
||||
<circle cx="64" cy="60" r="3"/>
|
||||
<circle cx="56.5" cy="58.5" r="3"/>
|
||||
<circle cx="50.5" cy="54" r="3"/>
|
||||
<circle cx="48" cy="47" r="3"/>
|
||||
<circle cx="50.5" cy="40" r="3"/>
|
||||
<circle cx="56.5" cy="35.5" r="3"/>
|
||||
</g>
|
||||
<g fill="#fff" opacity=".9">
|
||||
<rect x="22" y="74" width="14" height="12" rx="3"/>
|
||||
<rect x="39" y="74" width="14" height="12" rx="3"/>
|
||||
<rect x="56" y="74" width="14" height="12" rx="3"/>
|
||||
<rect x="73" y="74" width="14" height="12" rx="3"/>
|
||||
<rect x="90" y="74" width="14" height="12" rx="3"/>
|
||||
<rect x="30" y="90" width="14" height="12" rx="3"/>
|
||||
<rect x="47" y="90" width="14" height="12" rx="3"/>
|
||||
<rect x="64" y="90" width="14" height="12" rx="3"/>
|
||||
<rect x="81" y="90" width="14" height="12" rx="3"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
147
eurkey-macos.eu/index.html
Normal file
@@ -0,0 +1,147 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>EurKEY — The European Keyboard Layout for macOS</title>
|
||||
<meta name="description" content="The keyboard layout for Europeans, coders, and translators. Dead keys for diacritics, ISO international layout, easy DMG install.">
|
||||
<link rel="icon" type="image/svg+xml" href="img/icon.svg">
|
||||
<link rel="stylesheet" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<!-- NAV -->
|
||||
<nav class="nav">
|
||||
<div class="nav-inner">
|
||||
<a href="#" class="nav-logo">
|
||||
<img src="img/icon.svg" alt="" width="32" height="32">
|
||||
<span>EurKEY</span>
|
||||
</a>
|
||||
<div class="nav-links">
|
||||
<a href="#features">Features</a>
|
||||
<a href="#layout">Layout</a>
|
||||
<a href="#install">Install</a>
|
||||
<a href="https://github.com/felixfoertsch/EurKEY-macOS" class="nav-github" aria-label="GitHub">
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor">
|
||||
<path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z"/>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- HERO -->
|
||||
<section class="hero">
|
||||
<img src="img/icon.svg" alt="EurKEY icon" class="hero-icon" width="96" height="96">
|
||||
<h1>The European Keyboard Layout for macOS</h1>
|
||||
<p class="hero-sub">Dead keys for diacritics. ISO international layout. Designed for MacBook keyboards.</p>
|
||||
<a href="https://github.com/felixfoertsch/EurKEY-macOS/releases" class="btn">Download on GitHub</a>
|
||||
</section>
|
||||
|
||||
<!-- FEATURES -->
|
||||
<section id="features" class="features">
|
||||
<div class="container">
|
||||
<h2>Features</h2>
|
||||
<div class="feature-grid">
|
||||
<div class="feature-card">
|
||||
<div class="feature-icon">⌥</div>
|
||||
<h3>Dead Keys for Diacritics</h3>
|
||||
<p>Type accented characters (ä, é, ñ, č, …) using intuitive Option-key combinations. No character palette needed.</p>
|
||||
</div>
|
||||
<div class="feature-card">
|
||||
<div class="feature-icon">⌨</div>
|
||||
<h3>ISO International Layout</h3>
|
||||
<p>Built for the physical English International keyboard found on European MacBooks — with the extra § key and big Enter.</p>
|
||||
</div>
|
||||
<div class="feature-card">
|
||||
<div class="feature-icon">◇</div>
|
||||
<h3>Multiple Versions</h3>
|
||||
<p>Ships v1.2, v1.3, v1.4, and v2.0 in a single bundle. Pick the one that fits your workflow.</p>
|
||||
</div>
|
||||
<div class="feature-card">
|
||||
<div class="feature-icon">↓</div>
|
||||
<h3>Easy Install</h3>
|
||||
<p>Download the DMG, drag the bundle to Keyboard Layouts, log out. Done in under a minute.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- LAYOUT PREVIEW -->
|
||||
<section id="layout" class="layout-preview">
|
||||
<div class="container">
|
||||
<h2>Layout Preview</h2>
|
||||
<p class="section-sub">The complete key map for each version, showing all modifier layers and dead key compositions.</p>
|
||||
<div class="layout-tabs">
|
||||
<button class="tab active" data-version="v1.3">v1.3</button>
|
||||
<button class="tab" data-version="v1.2">v1.2</button>
|
||||
<button class="tab" data-version="v1.4">v1.4</button>
|
||||
<button class="tab" data-version="v2.0">v2.0</button>
|
||||
</div>
|
||||
<div class="layout-viewer">
|
||||
<iframe id="pdf-viewer" src="pdf/eurkey-v1.3-layout.pdf" title="EurKEY layout PDF"></iframe>
|
||||
<p class="layout-fallback">
|
||||
<a id="pdf-download" href="pdf/eurkey-v1.3-layout.pdf">Download layout PDF</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- INSTALLATION -->
|
||||
<section id="install" class="install">
|
||||
<div class="container">
|
||||
<h2>Installation</h2>
|
||||
<div class="install-steps">
|
||||
<div class="step">
|
||||
<div class="step-number">1</div>
|
||||
<div class="step-content">
|
||||
<h3>Download</h3>
|
||||
<p>Get the latest <code>.dmg</code> from <a href="https://github.com/felixfoertsch/EurKEY-macOS/releases">GitHub Releases</a>. Open it and drag <code>EurKey-macOS.bundle</code> to the <em>Keyboard Layouts</em> folder.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="step">
|
||||
<div class="step-number">2</div>
|
||||
<div class="step-content">
|
||||
<h3>Log out</h3>
|
||||
<p>Log out and back in (or restart) so macOS picks up the new layout.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="step">
|
||||
<div class="step-number">3</div>
|
||||
<div class="step-content">
|
||||
<h3>Add the layout</h3>
|
||||
<p>Open <strong>System Settings → Keyboard → Input Sources</strong>. Click <strong>Edit…</strong>, then <strong>+</strong> to add a new input source. Search for "EurKEY" and select the version you want.</p>
|
||||
<div class="install-screenshots">
|
||||
<img src="img/1-input-sources.png" alt="System Settings showing the Edit button for input sources" loading="lazy">
|
||||
<img src="img/2-add-layout.png" alt="Dialog to add a new input source" loading="lazy">
|
||||
<img src="img/3-select-eurkey.png" alt="EurKEY in the input sources list" loading="lazy">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="step">
|
||||
<div class="step-number">4</div>
|
||||
<div class="step-content">
|
||||
<h3>Select it</h3>
|
||||
<p>Click the input source icon in the menu bar and switch to EurKEY.</p>
|
||||
<div class="install-screenshots">
|
||||
<img src="img/4-select-input-method.png" alt="Selecting EurKEY from the menu bar dropdown" loading="lazy">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- FOOTER -->
|
||||
<footer class="footer">
|
||||
<div class="container">
|
||||
<p>
|
||||
Based on <a href="https://eurkey.steffen.bruentjen.eu/start.html">EurKEY</a> by Steffen Brüntjen
|
||||
· macOS port originally by <a href="https://github.com/lbschenkel/EurKEY-Mac">Leonardo Brondani Schenkel</a>
|
||||
</p>
|
||||
<p>Licensed under <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3</a></p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
16
eurkey-macos.eu/main.js
Normal file
@@ -0,0 +1,16 @@
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const tabs = document.querySelectorAll(".tab");
|
||||
const viewer = document.getElementById("pdf-viewer");
|
||||
const download = document.getElementById("pdf-download");
|
||||
|
||||
tabs.forEach(tab => {
|
||||
tab.addEventListener("click", () => {
|
||||
tabs.forEach(t => t.classList.remove("active"));
|
||||
tab.classList.add("active");
|
||||
const version = tab.dataset.version;
|
||||
const url = `pdf/eurkey-${version}-layout.pdf`;
|
||||
viewer.src = url;
|
||||
download.href = url;
|
||||
});
|
||||
});
|
||||
});
|
||||
404
eurkey-macos.eu/style.css
Normal file
@@ -0,0 +1,404 @@
|
||||
/* Reset & base */
|
||||
*,
|
||||
*::before,
|
||||
*::after {
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
html {
|
||||
scroll-behavior: smooth;
|
||||
scroll-padding-top: 5rem;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
||||
color: #1a1a2e;
|
||||
line-height: 1.6;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #003399;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.container {
|
||||
max-width: 960px;
|
||||
margin: 0 auto;
|
||||
padding: 0 1.5rem;
|
||||
}
|
||||
|
||||
/* Nav */
|
||||
.nav {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 100;
|
||||
background: rgba(255, 255, 255, 0.85);
|
||||
backdrop-filter: blur(12px);
|
||||
-webkit-backdrop-filter: blur(12px);
|
||||
border-bottom: 1px solid rgba(0, 0, 0, 0.08);
|
||||
}
|
||||
|
||||
.nav-inner {
|
||||
max-width: 960px;
|
||||
margin: 0 auto;
|
||||
padding: 0 1.5rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
height: 3.5rem;
|
||||
}
|
||||
|
||||
.nav-logo {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
font-weight: 700;
|
||||
font-size: 1.125rem;
|
||||
color: #1a1a2e;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.nav-logo img {
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
.nav-links {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 1.5rem;
|
||||
}
|
||||
|
||||
.nav-links a {
|
||||
color: #5a6178;
|
||||
font-size: 0.9rem;
|
||||
font-weight: 500;
|
||||
text-decoration: none;
|
||||
transition: color 0.15s;
|
||||
}
|
||||
|
||||
.nav-links a:hover {
|
||||
color: #003399;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.nav-github {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
/* Hero */
|
||||
.hero {
|
||||
text-align: center;
|
||||
padding: 5rem 1.5rem 4rem;
|
||||
background: linear-gradient(180deg, #f0f4ff 0%, #fff 100%);
|
||||
}
|
||||
|
||||
.hero-icon {
|
||||
border-radius: 20px;
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
|
||||
.hero h1 {
|
||||
font-size: 2.5rem;
|
||||
font-weight: 800;
|
||||
letter-spacing: -0.02em;
|
||||
line-height: 1.15;
|
||||
margin-bottom: 1rem;
|
||||
max-width: 600px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.hero-sub {
|
||||
font-size: 1.15rem;
|
||||
color: #5a6178;
|
||||
max-width: 480px;
|
||||
margin: 0 auto 2rem;
|
||||
}
|
||||
|
||||
.btn {
|
||||
display: inline-block;
|
||||
background: #003399;
|
||||
color: #fff;
|
||||
padding: 0.75rem 2rem;
|
||||
border-radius: 8px;
|
||||
font-size: 1rem;
|
||||
font-weight: 600;
|
||||
text-decoration: none;
|
||||
transition: background 0.15s;
|
||||
}
|
||||
|
||||
.btn:hover {
|
||||
background: #002266;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* Features */
|
||||
.features {
|
||||
padding: 4rem 0;
|
||||
}
|
||||
|
||||
.features h2 {
|
||||
text-align: center;
|
||||
font-size: 1.75rem;
|
||||
font-weight: 700;
|
||||
margin-bottom: 2.5rem;
|
||||
}
|
||||
|
||||
.feature-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
gap: 1.5rem;
|
||||
}
|
||||
|
||||
.feature-card {
|
||||
background: #f5f7fa;
|
||||
border: 1px solid rgba(0, 0, 0, 0.06);
|
||||
border-radius: 12px;
|
||||
padding: 1.5rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.feature-icon {
|
||||
font-size: 2rem;
|
||||
margin-bottom: 0.75rem;
|
||||
}
|
||||
|
||||
.feature-card h3 {
|
||||
font-size: 1rem;
|
||||
font-weight: 600;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.feature-card p {
|
||||
font-size: 0.875rem;
|
||||
color: #5a6178;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
/* Layout preview */
|
||||
.layout-preview {
|
||||
padding: 4rem 0;
|
||||
background: #f5f7fa;
|
||||
}
|
||||
|
||||
.layout-preview h2 {
|
||||
text-align: center;
|
||||
font-size: 1.75rem;
|
||||
font-weight: 700;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.section-sub {
|
||||
text-align: center;
|
||||
color: #5a6178;
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
|
||||
.layout-tabs {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 0.5rem;
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
|
||||
.tab {
|
||||
background: #fff;
|
||||
border: 1px solid rgba(0, 0, 0, 0.1);
|
||||
border-radius: 8px;
|
||||
padding: 0.5rem 1.25rem;
|
||||
font-size: 0.9rem;
|
||||
font-weight: 500;
|
||||
cursor: pointer;
|
||||
transition: all 0.15s;
|
||||
color: #5a6178;
|
||||
}
|
||||
|
||||
.tab:hover {
|
||||
border-color: #003399;
|
||||
color: #003399;
|
||||
}
|
||||
|
||||
.tab.active {
|
||||
background: #003399;
|
||||
border-color: #003399;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.layout-viewer {
|
||||
background: #fff;
|
||||
border: 1px solid rgba(0, 0, 0, 0.08);
|
||||
border-radius: 12px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.layout-viewer iframe {
|
||||
width: 100%;
|
||||
height: 600px;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.layout-fallback {
|
||||
text-align: center;
|
||||
padding: 0.75rem;
|
||||
font-size: 0.875rem;
|
||||
color: #5a6178;
|
||||
border-top: 1px solid rgba(0, 0, 0, 0.06);
|
||||
}
|
||||
|
||||
/* Installation */
|
||||
.install {
|
||||
padding: 4rem 0;
|
||||
}
|
||||
|
||||
.install h2 {
|
||||
text-align: center;
|
||||
font-size: 1.75rem;
|
||||
font-weight: 700;
|
||||
margin-bottom: 2.5rem;
|
||||
}
|
||||
|
||||
.install-steps {
|
||||
max-width: 640px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.step {
|
||||
display: flex;
|
||||
gap: 1.25rem;
|
||||
margin-bottom: 2.5rem;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.step:not(:last-child)::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: 1.25rem;
|
||||
top: 3rem;
|
||||
bottom: -1.25rem;
|
||||
width: 2px;
|
||||
background: #e0e4ed;
|
||||
}
|
||||
|
||||
.step-number {
|
||||
flex-shrink: 0;
|
||||
width: 2.5rem;
|
||||
height: 2.5rem;
|
||||
background: #003399;
|
||||
color: #fff;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-weight: 700;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
.step-content h3 {
|
||||
font-size: 1.125rem;
|
||||
font-weight: 600;
|
||||
margin-bottom: 0.375rem;
|
||||
}
|
||||
|
||||
.step-content p {
|
||||
color: #5a6178;
|
||||
font-size: 0.95rem;
|
||||
}
|
||||
|
||||
.step-content code {
|
||||
background: #f0f4ff;
|
||||
padding: 0.125rem 0.375rem;
|
||||
border-radius: 4px;
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
|
||||
.install-screenshots {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
|
||||
gap: 0.75rem;
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
.install-screenshots img {
|
||||
border-radius: 8px;
|
||||
border: 1px solid rgba(0, 0, 0, 0.08);
|
||||
}
|
||||
|
||||
/* Footer */
|
||||
.footer {
|
||||
border-top: 1px solid rgba(0, 0, 0, 0.08);
|
||||
padding: 2rem 0;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.footer p {
|
||||
font-size: 0.85rem;
|
||||
color: #5a6178;
|
||||
margin-bottom: 0.25rem;
|
||||
}
|
||||
|
||||
.footer a {
|
||||
color: #5a6178;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.footer a:hover {
|
||||
color: #003399;
|
||||
}
|
||||
|
||||
/* Responsive */
|
||||
@media (max-width: 768px) {
|
||||
.hero h1 {
|
||||
font-size: 1.75rem;
|
||||
}
|
||||
|
||||
.hero-sub {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
.feature-grid {
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
}
|
||||
|
||||
.layout-viewer iframe {
|
||||
height: 400px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 480px) {
|
||||
.nav-links a:not(.nav-github) {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.hero {
|
||||
padding: 3rem 1.5rem 2.5rem;
|
||||
}
|
||||
|
||||
.hero h1 {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
|
||||
.feature-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.layout-viewer iframe {
|
||||
height: 300px;
|
||||
}
|
||||
|
||||
.install-screenshots {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016 Vimux
|
||||
|
||||
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.
|
||||
@@ -1,31 +0,0 @@
|
||||
# Blank
|
||||
|
||||
Blank — starter [Hugo](https://gohugo.io/) theme for developers. Use it to make your own theme.
|
||||
|
||||
**[Demo](https://blank-demo.netlify.app/)**
|
||||
|
||||

|
||||
|
||||
## Installation
|
||||
|
||||
In your Hugo site `themes` directory, run:
|
||||
|
||||
```
|
||||
git clone https://github.com/vimux/blank
|
||||
```
|
||||
|
||||
Next, open `config.toml` in the base of the Hugo site and ensure the theme option is set to `blank`.
|
||||
|
||||
```
|
||||
theme = "blank"
|
||||
```
|
||||
|
||||
For more information read the official [quick start guide](https://gohugo.io/getting-started/quick-start/) of Hugo.
|
||||
|
||||
## Contributing
|
||||
|
||||
Have you found a bug or got an idea for a new feature? Feel free to use the [issue tracker](https://github.com/Vimux/blank/issues) to let me know. Or make directly a [pull request](https://github.com/Vimux/blank/pulls).
|
||||
|
||||
## License
|
||||
|
||||
This theme is released under the [MIT license](https://github.com/Vimux/blank/blob/master/LICENSE).
|
||||
@@ -1,4 +0,0 @@
|
||||
+++
|
||||
title = "{{ replace .Name "-" " " | title }}"
|
||||
date = {{ .Date }}
|
||||
+++
|
||||
|
Before Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 136 KiB |
@@ -1,19 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="{{ .Site.LanguageCode | default "en-us" }}">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>{{ .Title }}</title>
|
||||
{{ with .Site.Params.description }}<meta name="description" content="{{ . }}">{{ end }}
|
||||
{{ with .Site.Params.author }}<meta name="author" content="{{ . }}">{{ end }}
|
||||
<link rel="stylesheet" href="{{ "css/style.css" | relURL }}">
|
||||
{{ with .OutputFormats.Get "RSS" -}}
|
||||
{{ printf `<link rel="%s" type="%s" href="%s" title="%s">` .Rel .MediaType.Type .RelPermalink $.Site.Title | safeHTML }}
|
||||
{{- end }}
|
||||
</head>
|
||||
<body>
|
||||
{{ partial "header" . }}
|
||||
{{ block "main" . }}{{ end }}
|
||||
{{ partial "footer" . }}
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,16 +0,0 @@
|
||||
{{ define "main" }}
|
||||
<main>
|
||||
{{ if or .Title .Content }}
|
||||
<div>
|
||||
{{ with .Title }}<h1>{{ . }}</h1>{{ end }}
|
||||
{{ with .Content }}<div>{{ . }}</div>{{ end }}
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
{{ range .Paginator.Pages }}
|
||||
{{ .Render "summary" }}
|
||||
{{ end }}
|
||||
{{ partial "pagination.html" . }}
|
||||
</main>
|
||||
{{ partial "sidebar.html" . }}
|
||||
{{ end }}
|
||||
@@ -1,26 +0,0 @@
|
||||
{{ define "main" }}
|
||||
<main>
|
||||
<article>
|
||||
<h1>{{ .Title }}</h1>
|
||||
<time datetime="{{ .Date.Format "2006-01-02T15:04:05" }}">{{ .Date.Format "02.01.2006 15:04" }}</time>
|
||||
<div>
|
||||
{{ .Content }}
|
||||
</div>
|
||||
{{ with .Params.tags }}
|
||||
<div>
|
||||
<ul id="tags">
|
||||
{{ range . }}
|
||||
<li><a href="{{ "/tags/" | relLangURL }}{{ . | urlize }}">{{ . }}</a></li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
</div>
|
||||
{{ end }}
|
||||
{{ with .Site.DisqusShortname }}
|
||||
<div>
|
||||
{{ template "_internal/disqus.html" . }}
|
||||
</div>
|
||||
{{ end }}
|
||||
</article>
|
||||
</main>
|
||||
{{ partial "sidebar.html" . }}
|
||||
{{ end }}
|
||||
@@ -1,13 +0,0 @@
|
||||
<article>
|
||||
<h1><a href="{{ .Permalink }}">{{ .Title }}</a></h1>
|
||||
<time datetime="{{ .Date.Format "2006-01-02T15:04:05" }}">{{ .Date.Format "02.01.2006 15:04" }}</time>
|
||||
{{ range .Params.tags }}
|
||||
<a href="{{ "/tags/" | relLangURL }}{{ . | urlize }}">{{ . }}</a>
|
||||
{{ end }}
|
||||
<div>
|
||||
{{ .Summary }}
|
||||
{{ if .Truncated }}
|
||||
<a href="{{ .Permalink }}">Read more...</a>
|
||||
{{ end }}
|
||||
</div>
|
||||
</article>
|
||||
@@ -1,7 +0,0 @@
|
||||
{{ define "main" }} {{ readFile "content/README.md" | markdownify }}
|
||||
<main>
|
||||
{{ $paginator := .Paginate (where .Site.RegularPages "Type" "in"
|
||||
.Site.Params.mainSections) }} {{ range $paginator.Pages }} {{ .Render
|
||||
"summary" }} {{ end }} {{ partial "pagination.html" . }}
|
||||
</main>
|
||||
{{ partial "sidebar.html" . }} {{ end }}
|
||||
@@ -1,3 +0,0 @@
|
||||
<footer>
|
||||
<p>Last Update: {{ now.Format "2006-01-02" }}</p>
|
||||
</footer>
|
||||
@@ -1,12 +0,0 @@
|
||||
<header>
|
||||
<h1><a href="{{ .Site.BaseURL }}">{{ .Site.Title }}</a></h1>
|
||||
{{ with .Site.Menus.main }}
|
||||
<nav>
|
||||
<ul>
|
||||
{{ range . }}
|
||||
<li><a href="{{ .URL | relURL }}">{{ .Name }}</a></li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
</nav>
|
||||
{{ end }}
|
||||
</header>
|
||||
@@ -1,9 +0,0 @@
|
||||
<div>
|
||||
{{ if .Paginator.HasPrev }}
|
||||
<a href="{{ .Paginator.Prev.URL }}">Previous Page</a>
|
||||
{{ end }}
|
||||
{{ .Paginator.PageNumber }} of {{ .Paginator.TotalPages }}
|
||||
{{ if .Paginator.HasNext }}
|
||||
<a href="{{ .Paginator.Next.URL }}">Next Page</a>
|
||||
{{ end }}
|
||||
</div>
|
||||
@@ -1,14 +0,0 @@
|
||||
<aside>
|
||||
<div>
|
||||
<div>
|
||||
<h3>LATEST POSTS</h3>
|
||||
</div>
|
||||
<div>
|
||||
<ul>
|
||||
{{ range first 5 (where .Site.RegularPages "Type" "in" .Site.Params.mainSections) }}
|
||||
<li><a href="{{ .RelPermalink }}">{{ .Title }}</a></li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</aside>
|
||||
@@ -1,13 +0,0 @@
|
||||
name = "Blank"
|
||||
license = "MIT"
|
||||
licenselink = "https://github.com/vimux/blank/blob/master/LICENSE"
|
||||
description = "Starter Hugo theme for developers."
|
||||
homepage = "https://github.com/vimux/blank/"
|
||||
demosite = "https://blank-demo.netlify.app/"
|
||||
tags = ["blog", "plain", "blank", "starter", "development"]
|
||||
features = ["blog"]
|
||||
min_version = "0.20"
|
||||
|
||||
[author]
|
||||
name = "Vimux"
|
||||
homepage = "https://github.com/vimux"
|
||||
12
fonts/README.md
Normal file
@@ -0,0 +1,12 @@
|
||||
# Fonts
|
||||
|
||||
Bundled fonts used for PDF generation and the project website.
|
||||
|
||||
## Iosevka Fixed
|
||||
|
||||
- **Version:** 34.2.1
|
||||
- **Variant:** Iosevka Fixed (monospace, no ligatures)
|
||||
- **Weights:** Regular, Bold
|
||||
- **License:** SIL Open Font License 1.1 (see `iosevka/LICENSE.md`)
|
||||
- **Source:** <https://github.com/be5invis/Iosevka/releases/tag/v34.2.1>
|
||||
- **Glyphs:** 7500+ — covers all EurKEY characters including Greek, Latin Extended, math symbols, and combining diacriticals
|
||||
BIN
fonts/iosevka/IosevkaFixed-Bold.ttf
Normal file
BIN
fonts/iosevka/IosevkaFixed-Regular.ttf
Normal file
99
fonts/iosevka/LICENSE.md
Normal file
@@ -0,0 +1,99 @@
|
||||
# SIL Open Font License 1.1
|
||||
|
||||
Copyright 2015-2024 Renzhi Li (aka. Belleve Invis, belleve@typeof.net)
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
<https://openfontlicense.org>
|
||||
|
||||
---
|
||||
|
||||
## SIL OPEN FONT LICENSE Version 1.1 — 26 February 2007
|
||||
|
||||
### PREAMBLE
|
||||
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
### DEFINITIONS
|
||||
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting — in part or in whole — any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
### PERMISSION & CONDITIONS
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1. Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2. Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3. No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4. The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5. The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
### TERMINATION
|
||||
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
### DISCLAIMER
|
||||
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||