jekyll-theme-zhum-clean 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +88 -0
- data/_config.yml +21 -0
- data/_includes/anime_resume.html +23 -0
- data/_includes/head.html +40 -0
- data/_includes/table_sorter.js +17 -0
- data/_includes/tag_cloud.html +19 -0
- data/_includes/tag_index.html +23 -0
- data/_layouts/default.html +115 -0
- data/_layouts/home.html +33 -0
- data/_layouts/post.html +23 -0
- data/_sass/minima/initialize.scss +5 -0
- data/_sass/my.sass +61 -0
- data/assets/css/style.scss +491 -0
- metadata +149 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: b0e3e991e80daa4f45b41f23c77003600680505a583da5829f4ef688d43871ef
|
|
4
|
+
data.tar.gz: 0053ec25c9323483fdc6413de342373e2c5f64c5f7f1ab2db35a5f9699e92f9f
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 5f9a9e7edefcb35e426c8faaf6726ee485e52a9630922a6d3fc30fdadfab2a7450b541cf393556a3e27461abfdc5199e940d4a438fe0eb530e3a2616428a75c0
|
|
7
|
+
data.tar.gz: cb1261b7ccdc6587b067be75121b3e737d5e9fa57bec9d6f5b3e3b9c5c287b19af37945050fa6234c6cab4c3c1a4a343884e7d1967f81397b44528e5e667ed44
|
data/LICENSE.txt
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Sergey Zhumatiy
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
|
13
|
+
all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# jekyll-theme-zhum-clean
|
|
2
|
+
|
|
3
|
+
A clean, self-contained technical-blog Jekyll theme — light/dark color modes, an
|
|
4
|
+
emerald accent, [Inter](https://rsms.me/inter/) typography, a sticky header with
|
|
5
|
+
language switcher, a tag-cloud sidebar, and sortable-table support. The theme
|
|
6
|
+
does **not** depend on minima; everything is provided by the gem.
|
|
7
|
+
|
|
8
|
+
## Installation
|
|
9
|
+
|
|
10
|
+
Add to your site's `Gemfile`:
|
|
11
|
+
|
|
12
|
+
```ruby
|
|
13
|
+
gem "jekyll-theme-zhum-clean"
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
And in `_config.yml`:
|
|
17
|
+
|
|
18
|
+
```yaml
|
|
19
|
+
theme: jekyll-theme-zhum-clean
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Then `bundle`.
|
|
23
|
+
|
|
24
|
+
### Required plugins
|
|
25
|
+
|
|
26
|
+
The theme's templates use a few Liquid tags, so enable these plugins in
|
|
27
|
+
`_config.yml` (they're declared as gem runtime dependencies, so `bundle` pulls
|
|
28
|
+
them in):
|
|
29
|
+
|
|
30
|
+
```yaml
|
|
31
|
+
plugins:
|
|
32
|
+
- jekyll-seo-tag # {% seo %} meta in the <head>
|
|
33
|
+
- jekyll-feed # {% feed_meta %}
|
|
34
|
+
- jekyll-multiple-languages-plugin # {% t %} translation tags
|
|
35
|
+
|
|
36
|
+
languages:
|
|
37
|
+
- en
|
|
38
|
+
- ru
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Layouts
|
|
42
|
+
|
|
43
|
+
| Layout | Use |
|
|
44
|
+
|-----------|------------------------------------------------------------|
|
|
45
|
+
| `default` | Base chrome: header (brand, nav, language switcher, dark-mode toggle), tag-cloud sidebar, footer. |
|
|
46
|
+
| `home` | Extends `default`; adds the page heading and an optional post list. |
|
|
47
|
+
|
|
48
|
+
## Includes
|
|
49
|
+
|
|
50
|
+
| Include | Purpose |
|
|
51
|
+
|----------------------|---------------------------------------------------------------|
|
|
52
|
+
| `head.html` | `<head>`: theme-color, fonts, Font Awesome, no-flash dark-mode bootstrap, stylesheet link. |
|
|
53
|
+
| `tag_cloud.html` | Tag chips with counts, built from page front-matter `tags`. |
|
|
54
|
+
| `tag_index.html` | Full tag index (for a Tags page). |
|
|
55
|
+
| `table_sorter.js` | Loads jQuery + [tablesorter](https://mottie.github.io/tablesorter/) and initializes `$("table")`. Include it on any page with a sortable table. |
|
|
56
|
+
| `anime_resume.html` | Renders the `anime_resume` collection (site-specific helper). |
|
|
57
|
+
|
|
58
|
+
## Styling
|
|
59
|
+
|
|
60
|
+
`assets/css/style.scss` holds the full theme. Design tokens live in `:root`
|
|
61
|
+
(and `:root[data-theme="dark"]`) as CSS custom properties — override them in
|
|
62
|
+
your own stylesheet to re-skin without forking:
|
|
63
|
+
|
|
64
|
+
```css
|
|
65
|
+
:root { --accent: #2563eb; --content-width: 1100px; }
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Sortable-table sort indicators (▲ / ▼ / faint ↕) and a dark-mode toggle are
|
|
69
|
+
included.
|
|
70
|
+
|
|
71
|
+
## Dark mode
|
|
72
|
+
|
|
73
|
+
The toggle button (`#theme-toggle`) flips `data-theme` on `<html>` and persists
|
|
74
|
+
the choice to `localStorage`; the initial value respects
|
|
75
|
+
`prefers-color-scheme`. No configuration needed.
|
|
76
|
+
|
|
77
|
+
## Development
|
|
78
|
+
|
|
79
|
+
This directory is set up like a Jekyll site. Run `bundle install`, then
|
|
80
|
+
`bundle exec jekyll serve` and open <http://localhost:4000>.
|
|
81
|
+
|
|
82
|
+
When released, only the Git-tracked files in `_layouts`, `_includes`, `_sass`
|
|
83
|
+
and `assets` (plus `LICENSE`/`README`/`_config.yml`) are bundled into the gem —
|
|
84
|
+
see the regexp in `jekyll-theme-zhum-clean.gemspec`.
|
|
85
|
+
|
|
86
|
+
## License
|
|
87
|
+
|
|
88
|
+
[MIT](https://opensource.org/licenses/MIT).
|
data/_config.yml
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Demo config for previewing jekyll-theme-zhum-clean locally
|
|
2
|
+
# (`bundle exec jekyll serve`). Consuming sites supply their own _config.yml.
|
|
3
|
+
title: jekyll-theme-zhum-clean
|
|
4
|
+
email: sergzhum@gmail.com
|
|
5
|
+
description: A clean technical-blog Jekyll theme — light/dark, emerald accent, Inter.
|
|
6
|
+
|
|
7
|
+
theme: jekyll-theme-zhum-clean
|
|
8
|
+
|
|
9
|
+
languages:
|
|
10
|
+
- en
|
|
11
|
+
- ru
|
|
12
|
+
lang: en
|
|
13
|
+
|
|
14
|
+
sass:
|
|
15
|
+
sass_dir: _sass
|
|
16
|
+
style: compact
|
|
17
|
+
|
|
18
|
+
plugins:
|
|
19
|
+
- jekyll-seo-tag
|
|
20
|
+
- jekyll-feed
|
|
21
|
+
- jekyll-multiple-languages-plugin
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{%- comment -%}
|
|
2
|
+
Renders the anime_resume collection as a table.
|
|
3
|
+
Picks the language-specific fields (title_<lang>/desc_<lang>) based on the
|
|
4
|
+
current rendering language (site.lang), so the same source files produce the
|
|
5
|
+
correct EN/RU output. See _anime_resume/*.md for the source format.
|
|
6
|
+
{%- endcomment -%}
|
|
7
|
+
{%- assign title_key = 'title_' | append: site.lang -%}
|
|
8
|
+
{%- assign desc_key = 'desc_' | append: site.lang -%}
|
|
9
|
+
<table>
|
|
10
|
+
<thead>
|
|
11
|
+
<tr><th>{% t anime.col_title %}</th><th>{% t anime.col_action %}</th><th>{% t anime.col_humor %}</th><th>{% t anime.col_culture %}</th></tr>
|
|
12
|
+
</thead>
|
|
13
|
+
<tbody>
|
|
14
|
+
{% for art in site.anime_resume %}
|
|
15
|
+
<tr><td>
|
|
16
|
+
<div class="title">{{ art[title_key] }}</div>{{ art[desc_key] | markdownify }}
|
|
17
|
+
</td><td><i class="fas fa-running ll{{art.action}}">{{art.action}}</i>
|
|
18
|
+
</td><td><i class="fas fa-laugh-squint ll{{art.humor}}">{{art.humor}}</i>
|
|
19
|
+
</td><td><i class="fas fa-torii-gate ll{{art.culture}}">{{art.culture}}</i>
|
|
20
|
+
</td></tr>
|
|
21
|
+
{% endfor %}
|
|
22
|
+
</tbody>
|
|
23
|
+
</table>
|
data/_includes/head.html
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<head>
|
|
2
|
+
<meta charset="utf-8">
|
|
3
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
4
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
5
|
+
|
|
6
|
+
<!-- Set the colour theme before paint to avoid a flash of the wrong theme -->
|
|
7
|
+
<script>
|
|
8
|
+
(function () {
|
|
9
|
+
try {
|
|
10
|
+
var t = localStorage.getItem('theme');
|
|
11
|
+
if (!t) {
|
|
12
|
+
t = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
|
|
13
|
+
}
|
|
14
|
+
document.documentElement.setAttribute('data-theme', t);
|
|
15
|
+
} catch (e) {}
|
|
16
|
+
})();
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<title>{{ t site.translations[site.lang].page.title }}</title>
|
|
20
|
+
{% seo title=false %}
|
|
21
|
+
<meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)">
|
|
22
|
+
<meta name="theme-color" content="#0d1117" media="(prefers-color-scheme: dark)">
|
|
23
|
+
|
|
24
|
+
<!-- Fonts -->
|
|
25
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
26
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
27
|
+
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap">
|
|
28
|
+
|
|
29
|
+
<!-- Icons -->
|
|
30
|
+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/fontawesome.min.css" integrity="sha512-OdEXQYCOldjqUEsuMKsZRj93Ht23QRlhIb8E/X0sbwZhme8eUw6g8q7AdxGJKakcBbv7+/PX0Gc2btf7Ru8cZA==" crossorigin="anonymous" referrerpolicy="no-referrer" />
|
|
31
|
+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/solid.min.css" integrity="sha512-jQqzj2vHVxA/yCojT8pVZjKGOe9UmoYvnOuM/2sQ110vxiajBU+4WkyRs1ODMmd4AfntwUEV4J+VfM6DkfjLRg==" crossorigin="anonymous" referrerpolicy="no-referrer" />
|
|
32
|
+
|
|
33
|
+
<!-- Theme stylesheet -->
|
|
34
|
+
<link rel="stylesheet" href="{{ "assets/css/style.css" | prepend: site.baseurl_root }}">
|
|
35
|
+
|
|
36
|
+
{%- feed_meta -%}
|
|
37
|
+
{%- if jekyll.environment == 'production' and site.google_analytics -%}
|
|
38
|
+
{%- include google-analytics.html -%}
|
|
39
|
+
{%- endif -%}
|
|
40
|
+
</head>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<!-- tablesorter scripts -->
|
|
2
|
+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.6/css/materialize.min.css">
|
|
3
|
+
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
|
|
4
|
+
<!--link rel="stylesheet" href="https://mottie.github.io/tablesorter/css/theme.default.css"-->
|
|
5
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"
|
|
6
|
+
integrity="sha512-bLT0Qm9VnAYZDflyKcBaQ2gg0hSYNQrJ8RilYldYQ1FxQYoCLtUjuuRuZo+fjqhx/qtq/1itJ0C2ejDxltZVFg=="
|
|
7
|
+
crossorigin="anonymous"></script>
|
|
8
|
+
|
|
9
|
+
<script type="text/javascript" src="https://mottie.github.io/tablesorter/dist/js/jquery.tablesorter.min.js"> </script>
|
|
10
|
+
<script type="text/javascript" >
|
|
11
|
+
$(function() {
|
|
12
|
+
console.log("sorting table");
|
|
13
|
+
$("table").tablesorter();
|
|
14
|
+
});
|
|
15
|
+
</script>
|
|
16
|
+
<!-- tablesorter-->
|
|
17
|
+
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{%- comment -%}
|
|
2
|
+
Tag cloud (all tags + counts), built from page front matter.
|
|
3
|
+
Each chip links to the matching section on the Tags page (language-aware).
|
|
4
|
+
{%- endcomment -%}
|
|
5
|
+
{%- assign lang_prefix = "" -%}
|
|
6
|
+
{%- unless site.lang == "en" -%}{%- assign lang_prefix = "/" | append: site.lang -%}{%- endunless -%}
|
|
7
|
+
{%- assign tags_url = "/tags.html" | prepend: lang_prefix -%}
|
|
8
|
+
|
|
9
|
+
{%- assign tagged = site.html_pages | where_exp: "p", "p.tags" -%}
|
|
10
|
+
{%- assign all_tags = "" | split: "|" -%}
|
|
11
|
+
{%- for p in tagged -%}{%- assign all_tags = all_tags | concat: p.tags -%}{%- endfor -%}
|
|
12
|
+
{%- assign all_tags = all_tags | uniq | sort_natural -%}
|
|
13
|
+
|
|
14
|
+
<div class="tag-cloud">
|
|
15
|
+
{%- for t in all_tags -%}
|
|
16
|
+
{%- assign n = tagged | where_exp: "p", "p.tags contains t" | size -%}
|
|
17
|
+
<a class="tag-chip" href="{{ tags_url }}#tag-{{ t | slugify }}">{{ t }}<span class="tag-chip__count">{{ n }}</span></a>
|
|
18
|
+
{%- endfor -%}
|
|
19
|
+
</div>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{%- comment -%}
|
|
2
|
+
Tags page body: one section per tag listing the pages that carry it.
|
|
3
|
+
(The clickable tag cloud itself lives in the sidebar, see _includes/tag_cloud.html.)
|
|
4
|
+
Links are language-aware via site.lang.
|
|
5
|
+
{%- endcomment -%}
|
|
6
|
+
|
|
7
|
+
{%- assign lang_prefix = "" -%}
|
|
8
|
+
{%- unless site.lang == "en" -%}{%- assign lang_prefix = "/" | append: site.lang -%}{%- endunless -%}
|
|
9
|
+
|
|
10
|
+
{%- assign tagged = site.html_pages | where_exp: "p", "p.tags" -%}
|
|
11
|
+
{%- assign all_tags = "" | split: "|" -%}
|
|
12
|
+
{%- for p in tagged -%}{%- assign all_tags = all_tags | concat: p.tags -%}{%- endfor -%}
|
|
13
|
+
{%- assign all_tags = all_tags | uniq | sort_natural -%}
|
|
14
|
+
|
|
15
|
+
{% for t in all_tags %}
|
|
16
|
+
{%- assign pages_with = tagged | where_exp: "p", "p.tags contains t" -%}
|
|
17
|
+
<h2 id="tag-{{ t | slugify }}" class="tag-section">#{{ t }}</h2>
|
|
18
|
+
<ul class="tag-list">
|
|
19
|
+
{%- for p in pages_with -%}
|
|
20
|
+
<li><a href="{{ p.url | prepend: lang_prefix }}">{% t p.title %}</a></li>
|
|
21
|
+
{%- endfor -%}
|
|
22
|
+
</ul>
|
|
23
|
+
{% endfor %}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="{{ page.lang | default: site.lang | default: "en" }}">
|
|
3
|
+
|
|
4
|
+
{%- include head.html -%}
|
|
5
|
+
<script>
|
|
6
|
+
if (window.netlifyIdentity) {
|
|
7
|
+
window.netlifyIdentity.on("init", (user) => {
|
|
8
|
+
if (!user) {
|
|
9
|
+
window.netlifyIdentity.on("login", () => {
|
|
10
|
+
document.location.href = "/admin/";
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
<body>
|
|
18
|
+
|
|
19
|
+
{%- assign home_url = "/" -%}
|
|
20
|
+
{%- assign lang_prefix = "" -%}
|
|
21
|
+
{%- unless site.lang == "en" -%}
|
|
22
|
+
{%- assign home_url = "/" | append: site.lang | append: "/" -%}
|
|
23
|
+
{%- assign lang_prefix = "/" | append: site.lang -%}
|
|
24
|
+
{%- endunless -%}
|
|
25
|
+
|
|
26
|
+
<header class="site-header">
|
|
27
|
+
<div class="site-header__inner">
|
|
28
|
+
<a class="site-brand" href="{{ home_url }}">
|
|
29
|
+
{%- if site.avatar -%}
|
|
30
|
+
<img class="site-brand__avatar" src="{{ site.avatar | prepend: site.baseurl_root }}" alt="{{ site.title }}">
|
|
31
|
+
{%- else -%}
|
|
32
|
+
<span class="site-brand__avatar site-brand__avatar--initial">{{ site.title | slice: 0, 1 | upcase }}</span>
|
|
33
|
+
{%- endif -%}
|
|
34
|
+
<span>{{ site.title }}</span>
|
|
35
|
+
</a>
|
|
36
|
+
|
|
37
|
+
<nav class="site-nav">
|
|
38
|
+
<a href="{{ home_url }}">{% t global.home %}</a>
|
|
39
|
+
<a href="{{ "/tags.html" | prepend: lang_prefix }}">{% t global.tags %}</a>
|
|
40
|
+
<a href="{{ "blog.html" | prepend: site.baseurl_root }}">{% t global.blog %}</a>
|
|
41
|
+
|
|
42
|
+
<span class="lang-switch">
|
|
43
|
+
{%- for lang in site.languages -%}
|
|
44
|
+
{%- assign lang_url = page.url -%}
|
|
45
|
+
{%- unless forloop.first -%}{%- assign lang_url = "/" | append: lang | append: page.url -%}{%- endunless -%}
|
|
46
|
+
{%- if lang == site.lang -%}
|
|
47
|
+
<a class="is-active" href="{{ lang_url }}">{{ lang }}</a>
|
|
48
|
+
{%- else -%}
|
|
49
|
+
<a href="{{ lang_url }}">{{ lang }}</a>
|
|
50
|
+
{%- endif -%}
|
|
51
|
+
{%- endfor -%}
|
|
52
|
+
</span>
|
|
53
|
+
|
|
54
|
+
<button id="theme-toggle" class="theme-toggle" type="button" aria-label="Toggle dark mode">
|
|
55
|
+
<i class="fas fa-moon"></i>
|
|
56
|
+
</button>
|
|
57
|
+
</nav>
|
|
58
|
+
</div>
|
|
59
|
+
</header>
|
|
60
|
+
|
|
61
|
+
<main class="page-content" aria-label="Content">
|
|
62
|
+
<div class="wrapper page-grid">
|
|
63
|
+
<article class="page-main">
|
|
64
|
+
{{ content }}
|
|
65
|
+
|
|
66
|
+
{%- if page.tags and page.tags.size > 0 -%}
|
|
67
|
+
<div class="post-tags">
|
|
68
|
+
{%- for t in page.tags -%}
|
|
69
|
+
<a class="tag-chip" href="{{ "/tags.html" | prepend: lang_prefix }}#tag-{{ t | slugify }}">#{{ t }}</a>
|
|
70
|
+
{%- endfor -%}
|
|
71
|
+
</div>
|
|
72
|
+
{%- endif -%}
|
|
73
|
+
</article>
|
|
74
|
+
|
|
75
|
+
<aside class="sidebar">
|
|
76
|
+
<div class="sidebar__widget">
|
|
77
|
+
<h2 class="sidebar__title">{% t global.tags %}</h2>
|
|
78
|
+
{% include tag_cloud.html %}
|
|
79
|
+
</div>
|
|
80
|
+
</aside>
|
|
81
|
+
</div>
|
|
82
|
+
</main>
|
|
83
|
+
|
|
84
|
+
<footer class="site-footer">
|
|
85
|
+
<div class="site-footer__inner">
|
|
86
|
+
<span>© {{ site.time | date: "%Y" }} {{ site.title }}</span>
|
|
87
|
+
<span class="spacer"></span>
|
|
88
|
+
<a class="footer__link" href="{{ home_url }}">{% t global.home %}</a>
|
|
89
|
+
<a class="footer__link" href="{{ "blog.html" | prepend: site.baseurl_root }}">{% t global.blog %}</a>
|
|
90
|
+
<a href="https://mynickname.com/sergzhum"><img src="https://mynickname.com/img.php?nick=sergzhum&sert=2&text=t8" alt="Nickname sergzhum is registered!" border="0" /></a>
|
|
91
|
+
</div>
|
|
92
|
+
</footer>
|
|
93
|
+
|
|
94
|
+
<script>
|
|
95
|
+
(function () {
|
|
96
|
+
var btn = document.getElementById('theme-toggle');
|
|
97
|
+
if (!btn) return;
|
|
98
|
+
function render() {
|
|
99
|
+
var dark = document.documentElement.getAttribute('data-theme') === 'dark';
|
|
100
|
+
btn.innerHTML = dark ? '<i class="fas fa-sun"></i>' : '<i class="fas fa-moon"></i>';
|
|
101
|
+
}
|
|
102
|
+
render();
|
|
103
|
+
btn.addEventListener('click', function () {
|
|
104
|
+
var dark = document.documentElement.getAttribute('data-theme') === 'dark';
|
|
105
|
+
var next = dark ? 'light' : 'dark';
|
|
106
|
+
document.documentElement.setAttribute('data-theme', next);
|
|
107
|
+
try { localStorage.setItem('theme', next); } catch (e) {}
|
|
108
|
+
render();
|
|
109
|
+
});
|
|
110
|
+
})();
|
|
111
|
+
</script>
|
|
112
|
+
|
|
113
|
+
</body>
|
|
114
|
+
|
|
115
|
+
</html>
|
data/_layouts/home.html
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: default
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
<div class="home">
|
|
6
|
+
{%- if page.title -%}
|
|
7
|
+
<h1 class="page-heading">{% t page.title %}</h1>
|
|
8
|
+
{%- endif -%}
|
|
9
|
+
|
|
10
|
+
{{ content }}
|
|
11
|
+
|
|
12
|
+
{%- if site.posts.size > 100 -%}
|
|
13
|
+
<h2 class="post-list-heading">Posts</h2>
|
|
14
|
+
<ul class="post-list">
|
|
15
|
+
{%- for post in site.posts -%}
|
|
16
|
+
<li>
|
|
17
|
+
{%- assign date_format = site.minima.date_format | default: "%b %-d, %Y" -%}
|
|
18
|
+
<span class="post-meta">{{ post.date | date: date_format }}</span>
|
|
19
|
+
<h3>
|
|
20
|
+
<a class="post-link" href="{{ post.url | relative_url }}">
|
|
21
|
+
{{ post.title | escape }}
|
|
22
|
+
</a>
|
|
23
|
+
</h3>
|
|
24
|
+
{%- if site.show_excerpts -%}
|
|
25
|
+
{{ post.excerpt }}
|
|
26
|
+
{%- endif -%}
|
|
27
|
+
</li>
|
|
28
|
+
{%- endfor -%}
|
|
29
|
+
</ul>
|
|
30
|
+
|
|
31
|
+
<!--p class="rss-subscribe">subscribe <a href="{{ "/feed.xml" | relative_url }}">via RSS</a></p-->
|
|
32
|
+
{%- endif -%}
|
|
33
|
+
</div>
|
data/_layouts/post.html
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: default
|
|
3
|
+
---
|
|
4
|
+
<article class="post h-entry" itemscope itemtype="http://schema.org/BlogPosting">
|
|
5
|
+
|
|
6
|
+
<header class="post-header">
|
|
7
|
+
<h1 class="page-heading post-title p-name" itemprop="name headline">{{ page.title | escape }}</h1>
|
|
8
|
+
<p class="post-meta">
|
|
9
|
+
<time class="dt-published" datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">
|
|
10
|
+
{%- assign date_format = site.minima.date_format | default: "%b %-d, %Y" -%}
|
|
11
|
+
{{ page.date | date: date_format }}
|
|
12
|
+
</time>
|
|
13
|
+
{%- if page.author -%}
|
|
14
|
+
• <span itemprop="author" itemscope itemtype="http://schema.org/Person"><span class="p-author h-card" itemprop="name">{{ page.author }}</span></span>
|
|
15
|
+
{%- endif -%}</p>
|
|
16
|
+
</header>
|
|
17
|
+
|
|
18
|
+
<div class="post-content e-content" itemprop="articleBody">
|
|
19
|
+
{{ content }}
|
|
20
|
+
</div>
|
|
21
|
+
|
|
22
|
+
<a class="u-url" href="{{ page.url | relative_url }}" hidden></a>
|
|
23
|
+
</article>
|
data/_sass/my.sass
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
span.count
|
|
2
|
+
color: #e5484d
|
|
3
|
+
font-weight: 700
|
|
4
|
+
|
|
5
|
+
span.path
|
|
6
|
+
color: var(--accent)
|
|
7
|
+
font-weight: 700
|
|
8
|
+
|
|
9
|
+
.title
|
|
10
|
+
font-size: 1.25em
|
|
11
|
+
font-weight: 700
|
|
12
|
+
color: var(--text)
|
|
13
|
+
|
|
14
|
+
.l1
|
|
15
|
+
color: #9aa0a6
|
|
16
|
+
&:after
|
|
17
|
+
font-size: 0.7em
|
|
18
|
+
content: '1'
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
.l2
|
|
22
|
+
color: #2da44e
|
|
23
|
+
&:after
|
|
24
|
+
font-size: 0.7em
|
|
25
|
+
content: '2'
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
.l3
|
|
29
|
+
color: #2563eb
|
|
30
|
+
&:after
|
|
31
|
+
font-size: 0.7em
|
|
32
|
+
content: '3'
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
.l4
|
|
36
|
+
color: #e8870b
|
|
37
|
+
&:after
|
|
38
|
+
font-size: 0.7em
|
|
39
|
+
content: '4'
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
.l5
|
|
43
|
+
color: #e5484d
|
|
44
|
+
&:after
|
|
45
|
+
font-size: 0.7em
|
|
46
|
+
content: '5'
|
|
47
|
+
|
|
48
|
+
.ll1
|
|
49
|
+
color: #9aa0a6
|
|
50
|
+
|
|
51
|
+
.ll2
|
|
52
|
+
color: #2da44e
|
|
53
|
+
|
|
54
|
+
.ll3
|
|
55
|
+
color: #2563eb
|
|
56
|
+
|
|
57
|
+
.ll4
|
|
58
|
+
color: #e8870b
|
|
59
|
+
|
|
60
|
+
.ll5
|
|
61
|
+
color: #e5484d
|
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
---
|
|
2
|
+
---
|
|
3
|
+
|
|
4
|
+
@charset "utf-8";
|
|
5
|
+
|
|
6
|
+
/* ==========================================================================
|
|
7
|
+
Theme: clean technical-blog look (light + dark), emerald accent, Inter.
|
|
8
|
+
Self-contained — does not depend on the minima theme.
|
|
9
|
+
========================================================================== */
|
|
10
|
+
|
|
11
|
+
/* ---- Design tokens ------------------------------------------------------- */
|
|
12
|
+
:root {
|
|
13
|
+
--bg: #ffffff;
|
|
14
|
+
--bg-alt: #f6f8fa;
|
|
15
|
+
--bg-code: #f6f8fa;
|
|
16
|
+
--text: #1f2328;
|
|
17
|
+
--text-muted: #656d76;
|
|
18
|
+
--border: #d0d7de;
|
|
19
|
+
--accent: #059669;
|
|
20
|
+
--accent-hover:#047857;
|
|
21
|
+
--accent-soft: rgba(5, 150, 105, 0.10);
|
|
22
|
+
--shadow: 0 1px 3px rgba(27, 31, 36, 0.08), 0 1px 2px rgba(27, 31, 36, 0.06);
|
|
23
|
+
|
|
24
|
+
--font-body: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
25
|
+
--font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
|
|
26
|
+
--content-width: 1040px;
|
|
27
|
+
--sidebar-width: 220px;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
:root[data-theme="dark"] {
|
|
31
|
+
--bg: #0d1117;
|
|
32
|
+
--bg-alt: #161b22;
|
|
33
|
+
--bg-code: #161b22;
|
|
34
|
+
--text: #e6edf3;
|
|
35
|
+
--text-muted: #9198a1;
|
|
36
|
+
--border: #30363d;
|
|
37
|
+
--accent: #34d399;
|
|
38
|
+
--accent-hover:#6ee7b7;
|
|
39
|
+
--accent-soft: rgba(52, 211, 153, 0.12);
|
|
40
|
+
--shadow: 0 1px 3px rgba(1, 4, 9, 0.5);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/* ---- Base ---------------------------------------------------------------- */
|
|
44
|
+
*, *::before, *::after { box-sizing: border-box; }
|
|
45
|
+
|
|
46
|
+
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
|
|
47
|
+
|
|
48
|
+
body {
|
|
49
|
+
margin: 0;
|
|
50
|
+
font-family: var(--font-body);
|
|
51
|
+
font-size: 17px;
|
|
52
|
+
line-height: 1.65;
|
|
53
|
+
color: var(--text);
|
|
54
|
+
background: var(--bg);
|
|
55
|
+
-webkit-font-smoothing: antialiased;
|
|
56
|
+
text-rendering: optimizeLegibility;
|
|
57
|
+
font-feature-settings: "cv02", "cv03", "cv04", "cv11";
|
|
58
|
+
transition: background-color 0.2s ease, color 0.2s ease;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
img { max-width: 100%; height: auto; }
|
|
62
|
+
|
|
63
|
+
hr {
|
|
64
|
+
border: 0;
|
|
65
|
+
border-top: 1px solid var(--border);
|
|
66
|
+
margin: 2.5rem 0;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/* ---- Typography ---------------------------------------------------------- */
|
|
70
|
+
h1, h2, h3, h4, h5, h6 {
|
|
71
|
+
line-height: 1.25;
|
|
72
|
+
font-weight: 700;
|
|
73
|
+
margin: 2rem 0 1rem;
|
|
74
|
+
scroll-margin-top: 5rem;
|
|
75
|
+
}
|
|
76
|
+
h1 { font-size: 2rem; letter-spacing: -0.02em; }
|
|
77
|
+
h2 { font-size: 1.5rem; letter-spacing: -0.01em; padding-bottom: 0.3em; border-bottom: 1px solid var(--border); }
|
|
78
|
+
h3 { font-size: 1.25rem; }
|
|
79
|
+
h4 { font-size: 1.05rem; }
|
|
80
|
+
h5, h6 { font-size: 1rem; color: var(--text-muted); }
|
|
81
|
+
|
|
82
|
+
p, ul, ol { margin: 0 0 1.1rem; }
|
|
83
|
+
li { margin: 0.25rem 0; }
|
|
84
|
+
ul ul, ol ol, ul ol, ol ul { margin-bottom: 0; }
|
|
85
|
+
|
|
86
|
+
strong, b { font-weight: 700; }
|
|
87
|
+
|
|
88
|
+
a {
|
|
89
|
+
color: var(--accent);
|
|
90
|
+
text-decoration: none;
|
|
91
|
+
transition: color 0.15s ease;
|
|
92
|
+
}
|
|
93
|
+
a:hover { color: var(--accent-hover); text-decoration: underline; }
|
|
94
|
+
|
|
95
|
+
blockquote {
|
|
96
|
+
margin: 1.5rem 0;
|
|
97
|
+
padding: 0.4rem 1.1rem;
|
|
98
|
+
color: var(--text-muted);
|
|
99
|
+
border-left: 4px solid var(--accent);
|
|
100
|
+
background: var(--accent-soft);
|
|
101
|
+
border-radius: 0 6px 6px 0;
|
|
102
|
+
}
|
|
103
|
+
blockquote > :last-child { margin-bottom: 0; }
|
|
104
|
+
|
|
105
|
+
/* ---- Code --------------------------------------------------------------- */
|
|
106
|
+
code, pre, kbd {
|
|
107
|
+
font-family: var(--font-mono);
|
|
108
|
+
font-size: 0.88em;
|
|
109
|
+
}
|
|
110
|
+
code {
|
|
111
|
+
background: var(--bg-code);
|
|
112
|
+
padding: 0.15em 0.4em;
|
|
113
|
+
border-radius: 5px;
|
|
114
|
+
border: 1px solid var(--border);
|
|
115
|
+
}
|
|
116
|
+
pre {
|
|
117
|
+
background: var(--bg-code);
|
|
118
|
+
border: 1px solid var(--border);
|
|
119
|
+
border-radius: 8px;
|
|
120
|
+
padding: 1rem 1.1rem;
|
|
121
|
+
overflow-x: auto;
|
|
122
|
+
line-height: 1.5;
|
|
123
|
+
}
|
|
124
|
+
pre code {
|
|
125
|
+
background: none;
|
|
126
|
+
border: 0;
|
|
127
|
+
padding: 0;
|
|
128
|
+
font-size: 0.85rem;
|
|
129
|
+
}
|
|
130
|
+
.highlight { background: transparent; }
|
|
131
|
+
|
|
132
|
+
/* ---- Tables ------------------------------------------------------------- */
|
|
133
|
+
table {
|
|
134
|
+
width: 100%;
|
|
135
|
+
border-collapse: collapse;
|
|
136
|
+
margin: 1.5rem 0;
|
|
137
|
+
font-size: 0.95rem;
|
|
138
|
+
border-radius: 8px;
|
|
139
|
+
border: 1px solid var(--border);
|
|
140
|
+
}
|
|
141
|
+
th, td {
|
|
142
|
+
padding: 0.5rem 0.75rem;
|
|
143
|
+
border: 1px solid var(--border);
|
|
144
|
+
text-align: left;
|
|
145
|
+
vertical-align: top;
|
|
146
|
+
}
|
|
147
|
+
thead th {
|
|
148
|
+
background: var(--bg-alt);
|
|
149
|
+
font-weight: 600;
|
|
150
|
+
}
|
|
151
|
+
tbody tr:nth-child(even) { background: var(--bg-alt); }
|
|
152
|
+
|
|
153
|
+
/* ---- Sortable tables (jquery.tablesorter) ------------------------------- */
|
|
154
|
+
th.tablesorter-header {
|
|
155
|
+
cursor: pointer;
|
|
156
|
+
padding-right: 1.5rem;
|
|
157
|
+
position: relative;
|
|
158
|
+
white-space: nowrap;
|
|
159
|
+
-webkit-user-select: none;
|
|
160
|
+
user-select: none;
|
|
161
|
+
}
|
|
162
|
+
th.tablesorter-header::after {
|
|
163
|
+
position: absolute;
|
|
164
|
+
right: 0.55rem;
|
|
165
|
+
top: 50%;
|
|
166
|
+
transform: translateY(-50%);
|
|
167
|
+
font-size: 0.7em;
|
|
168
|
+
line-height: 1;
|
|
169
|
+
}
|
|
170
|
+
/* Unsorted: faint up/down hint. Active direction: accent-colored arrow. */
|
|
171
|
+
th.tablesorter-headerUnsorted::after { content: "\2195"; color: var(--text-muted); opacity: 0.45; }
|
|
172
|
+
th.tablesorter-headerAsc::after { content: "\25B2"; color: var(--accent); }
|
|
173
|
+
th.tablesorter-headerDesc::after { content: "\25BC"; color: var(--accent); }
|
|
174
|
+
th.tablesorter-header:hover { color: var(--accent); }
|
|
175
|
+
|
|
176
|
+
/* ---- Layout ------------------------------------------------------------- */
|
|
177
|
+
.wrapper {
|
|
178
|
+
max-width: var(--content-width);
|
|
179
|
+
margin: 0 auto;
|
|
180
|
+
padding: 0 1.25rem;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
.page-content { padding: 2.5rem 0 3rem; }
|
|
184
|
+
|
|
185
|
+
/* Content + sidebar grid */
|
|
186
|
+
.page-grid {
|
|
187
|
+
display: grid;
|
|
188
|
+
grid-template-columns: minmax(0, 1fr) var(--sidebar-width);
|
|
189
|
+
gap: 3rem;
|
|
190
|
+
align-items: start;
|
|
191
|
+
}
|
|
192
|
+
.page-main { min-width: 0; }
|
|
193
|
+
|
|
194
|
+
.sidebar { position: sticky; top: 4.5rem; }
|
|
195
|
+
.sidebar__widget {
|
|
196
|
+
border: 1px solid var(--border);
|
|
197
|
+
border-radius: 10px;
|
|
198
|
+
background: var(--bg-alt);
|
|
199
|
+
padding: 1rem 1.1rem 1.2rem;
|
|
200
|
+
}
|
|
201
|
+
.sidebar__title {
|
|
202
|
+
margin: 0 0 0.75rem;
|
|
203
|
+
font-size: 0.8rem;
|
|
204
|
+
font-weight: 700;
|
|
205
|
+
text-transform: uppercase;
|
|
206
|
+
letter-spacing: 0.06em;
|
|
207
|
+
color: var(--text-muted);
|
|
208
|
+
border-bottom: none;
|
|
209
|
+
padding-bottom: 0;
|
|
210
|
+
}
|
|
211
|
+
.sidebar .tag-cloud {
|
|
212
|
+
margin: 0;
|
|
213
|
+
flex-direction: column;
|
|
214
|
+
align-items: flex-start;
|
|
215
|
+
gap: 0.4rem;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
@media (max-width: 860px) {
|
|
219
|
+
.page-grid { grid-template-columns: 1fr; gap: 2rem; }
|
|
220
|
+
.sidebar { position: static; order: -1; }
|
|
221
|
+
.page-main { order: 0; }
|
|
222
|
+
.sidebar .tag-cloud { flex-direction: row; flex-wrap: wrap; gap: 0.5rem; }
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/* ---- Site header -------------------------------------------------------- */
|
|
226
|
+
.site-header {
|
|
227
|
+
position: sticky;
|
|
228
|
+
top: 0;
|
|
229
|
+
z-index: 50;
|
|
230
|
+
background: color-mix(in srgb, var(--bg) 88%, transparent);
|
|
231
|
+
backdrop-filter: saturate(180%) blur(8px);
|
|
232
|
+
-webkit-backdrop-filter: saturate(180%) blur(8px);
|
|
233
|
+
border-bottom: 1px solid var(--border);
|
|
234
|
+
}
|
|
235
|
+
.site-header__inner {
|
|
236
|
+
max-width: var(--content-width);
|
|
237
|
+
margin: 0 auto;
|
|
238
|
+
padding: 0.6rem 1.25rem;
|
|
239
|
+
display: flex;
|
|
240
|
+
align-items: center;
|
|
241
|
+
gap: 1rem;
|
|
242
|
+
}
|
|
243
|
+
.site-brand {
|
|
244
|
+
display: flex;
|
|
245
|
+
align-items: center;
|
|
246
|
+
gap: 0.6rem;
|
|
247
|
+
font-weight: 700;
|
|
248
|
+
font-size: 1.05rem;
|
|
249
|
+
color: var(--text);
|
|
250
|
+
}
|
|
251
|
+
.site-brand:hover { color: var(--text); text-decoration: none; }
|
|
252
|
+
.site-brand__avatar {
|
|
253
|
+
width: 36px;
|
|
254
|
+
height: 36px;
|
|
255
|
+
border-radius: 50%;
|
|
256
|
+
object-fit: cover;
|
|
257
|
+
border: 2px solid var(--border);
|
|
258
|
+
}
|
|
259
|
+
.site-brand__avatar--initial {
|
|
260
|
+
display: inline-flex;
|
|
261
|
+
align-items: center;
|
|
262
|
+
justify-content: center;
|
|
263
|
+
background: var(--accent);
|
|
264
|
+
color: #fff;
|
|
265
|
+
font-weight: 700;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
.site-nav {
|
|
269
|
+
margin-left: auto;
|
|
270
|
+
display: flex;
|
|
271
|
+
align-items: center;
|
|
272
|
+
gap: 0.25rem;
|
|
273
|
+
}
|
|
274
|
+
.site-nav a {
|
|
275
|
+
color: var(--text-muted);
|
|
276
|
+
padding: 0.35rem 0.6rem;
|
|
277
|
+
border-radius: 6px;
|
|
278
|
+
font-size: 0.95rem;
|
|
279
|
+
font-weight: 500;
|
|
280
|
+
}
|
|
281
|
+
.site-nav a:hover { color: var(--accent); background: var(--accent-soft); text-decoration: none; }
|
|
282
|
+
|
|
283
|
+
/* Neutralize Materialize CSS — it's loaded on pages with sortable tables
|
|
284
|
+
(e.g. anime-notes) and its default `nav { background:#ee6e73 }` + white
|
|
285
|
+
links paint the header red. These header-scoped selectors out-specify the
|
|
286
|
+
bare `nav` rules, keeping the themed look uniform across every page. */
|
|
287
|
+
.site-header .site-nav,
|
|
288
|
+
.site-header .site-nav a {
|
|
289
|
+
height: auto;
|
|
290
|
+
line-height: 1.65;
|
|
291
|
+
background: transparent;
|
|
292
|
+
box-shadow: none;
|
|
293
|
+
}
|
|
294
|
+
/* Materialize's `nav { width:100% }` defeats the nav's margin-left:auto
|
|
295
|
+
right-alignment — restore auto width so it floats to the right. */
|
|
296
|
+
.site-header .site-nav { width: auto; }
|
|
297
|
+
.site-header .site-nav a { color: var(--text-muted); }
|
|
298
|
+
.site-header .site-nav a:hover { color: var(--accent); background: var(--accent-soft); }
|
|
299
|
+
|
|
300
|
+
.lang-switch {
|
|
301
|
+
display: inline-flex;
|
|
302
|
+
align-items: center;
|
|
303
|
+
gap: 0.35rem;
|
|
304
|
+
margin-left: 0.5rem;
|
|
305
|
+
padding-left: 0.75rem;
|
|
306
|
+
border-left: 1px solid var(--border);
|
|
307
|
+
font-size: 0.85rem;
|
|
308
|
+
}
|
|
309
|
+
.lang-switch a { color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.03em; }
|
|
310
|
+
.lang-switch a:hover { color: var(--accent); text-decoration: none; }
|
|
311
|
+
.lang-switch a.is-active { color: var(--accent); font-weight: 700; }
|
|
312
|
+
|
|
313
|
+
/* ---- Theme toggle ------------------------------------------------------- */
|
|
314
|
+
.theme-toggle {
|
|
315
|
+
margin-left: 0.5rem;
|
|
316
|
+
display: inline-flex;
|
|
317
|
+
align-items: center;
|
|
318
|
+
justify-content: center;
|
|
319
|
+
width: 34px;
|
|
320
|
+
height: 34px;
|
|
321
|
+
border: 1px solid var(--border);
|
|
322
|
+
border-radius: 8px;
|
|
323
|
+
background: var(--bg-alt);
|
|
324
|
+
color: var(--text-muted);
|
|
325
|
+
cursor: pointer;
|
|
326
|
+
transition: color 0.15s ease, border-color 0.15s ease;
|
|
327
|
+
}
|
|
328
|
+
.theme-toggle:hover { color: var(--accent); border-color: var(--accent); }
|
|
329
|
+
/* Materialize (loaded on table pages) inherits nav line-height/metrics onto the
|
|
330
|
+
toggle's icon, pushing the glyph up. Make the <i> a centering flex box so the
|
|
331
|
+
FontAwesome ::before glyph sits dead-center regardless of inherited metrics. */
|
|
332
|
+
.site-header .theme-toggle i {
|
|
333
|
+
display: flex;
|
|
334
|
+
align-items: center;
|
|
335
|
+
justify-content: center;
|
|
336
|
+
width: 100%;
|
|
337
|
+
height: 100%;
|
|
338
|
+
line-height: 1;
|
|
339
|
+
font-size: 1rem;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/* ---- Home / page heading ------------------------------------------------ */
|
|
343
|
+
.page-heading { margin-top: 0; }
|
|
344
|
+
.home > p:first-of-type { color: var(--text-muted); font-size: 1.1rem; }
|
|
345
|
+
|
|
346
|
+
/* ---- Posts -------------------------------------------------------------- */
|
|
347
|
+
.post-list { list-style: none; padding: 0; }
|
|
348
|
+
.post-list > li { margin-bottom: 1.5rem; }
|
|
349
|
+
.post-meta { color: var(--text-muted); font-size: 0.85rem; }
|
|
350
|
+
.post-link { font-size: 1.2rem; font-weight: 600; }
|
|
351
|
+
|
|
352
|
+
/* ---- Tags --------------------------------------------------------------- */
|
|
353
|
+
.tag-cloud {
|
|
354
|
+
display: flex;
|
|
355
|
+
flex-wrap: wrap;
|
|
356
|
+
gap: 0.5rem;
|
|
357
|
+
margin: 1.5rem 0 2rem;
|
|
358
|
+
}
|
|
359
|
+
.tag-chip {
|
|
360
|
+
display: inline-flex;
|
|
361
|
+
align-items: center;
|
|
362
|
+
gap: 0.4rem;
|
|
363
|
+
padding: 0.25rem 0.7rem;
|
|
364
|
+
font-size: 0.85rem;
|
|
365
|
+
font-weight: 500;
|
|
366
|
+
color: var(--accent);
|
|
367
|
+
background: var(--accent-soft);
|
|
368
|
+
border: 1px solid transparent;
|
|
369
|
+
border-radius: 999px;
|
|
370
|
+
line-height: 1.4;
|
|
371
|
+
}
|
|
372
|
+
.tag-chip:hover {
|
|
373
|
+
text-decoration: none;
|
|
374
|
+
border-color: var(--accent);
|
|
375
|
+
color: var(--accent-hover);
|
|
376
|
+
}
|
|
377
|
+
.tag-chip__count {
|
|
378
|
+
font-size: 0.72rem;
|
|
379
|
+
font-weight: 700;
|
|
380
|
+
color: var(--text-muted);
|
|
381
|
+
background: var(--bg);
|
|
382
|
+
border-radius: 999px;
|
|
383
|
+
padding: 0 0.4rem;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
.tag-section {
|
|
387
|
+
border-bottom: none;
|
|
388
|
+
padding-bottom: 0;
|
|
389
|
+
margin-bottom: 0.5rem;
|
|
390
|
+
color: var(--accent);
|
|
391
|
+
}
|
|
392
|
+
.tag-list { list-style: none; padding: 0; margin: 0 0 2rem; }
|
|
393
|
+
.tag-list > li { margin: 0.2rem 0; }
|
|
394
|
+
|
|
395
|
+
.post-tags {
|
|
396
|
+
display: flex;
|
|
397
|
+
flex-wrap: wrap;
|
|
398
|
+
gap: 0.5rem;
|
|
399
|
+
margin-top: 2.5rem;
|
|
400
|
+
padding-top: 1.25rem;
|
|
401
|
+
border-top: 1px solid var(--border);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/* ---- Footer ------------------------------------------------------------- */
|
|
405
|
+
.site-footer {
|
|
406
|
+
border-top: 1px solid var(--border);
|
|
407
|
+
margin-top: 3rem;
|
|
408
|
+
padding: 2rem 0;
|
|
409
|
+
color: var(--text-muted);
|
|
410
|
+
font-size: 0.9rem;
|
|
411
|
+
}
|
|
412
|
+
.site-footer__inner {
|
|
413
|
+
max-width: var(--content-width);
|
|
414
|
+
margin: 0 auto;
|
|
415
|
+
padding: 0 1.25rem;
|
|
416
|
+
display: flex;
|
|
417
|
+
flex-wrap: wrap;
|
|
418
|
+
align-items: center;
|
|
419
|
+
gap: 1rem;
|
|
420
|
+
}
|
|
421
|
+
.site-footer__inner .spacer { margin-left: auto; }
|
|
422
|
+
.footer__link { color: var(--text-muted); }
|
|
423
|
+
.footer__link:hover { color: var(--accent); }
|
|
424
|
+
|
|
425
|
+
/* ---- Responsive --------------------------------------------------------- */
|
|
426
|
+
@media (max-width: 600px) {
|
|
427
|
+
body { font-size: 16px; }
|
|
428
|
+
h1 { font-size: 1.6rem; }
|
|
429
|
+
h2 { font-size: 1.3rem; }
|
|
430
|
+
.site-brand span { display: none; }
|
|
431
|
+
.site-nav a { padding: 0.35rem 0.45rem; }
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/* ---- Syntax highlighting (Rouge) — light -------------------------------- */
|
|
435
|
+
.highlight .c, .highlight .cm, .highlight .c1, .highlight .cs { color: #6e7781; font-style: italic; }
|
|
436
|
+
.highlight .k, .highlight .kd, .highlight .kn, .highlight .kp, .highlight .kr, .highlight .kt { color: #cf222e; }
|
|
437
|
+
.highlight .o, .highlight .ow { color: #0550ae; }
|
|
438
|
+
.highlight .p { color: var(--text); }
|
|
439
|
+
.highlight .s, .highlight .s1, .highlight .s2, .highlight .se, .highlight .sb, .highlight .sd { color: #0a3069; }
|
|
440
|
+
.highlight .m, .highlight .mi, .highlight .mf, .highlight .mh, .highlight .mo, .highlight .il { color: #0550ae; }
|
|
441
|
+
.highlight .na, .highlight .nv, .highlight .vg, .highlight .vi { color: #0550ae; }
|
|
442
|
+
.highlight .nb, .highlight .bp { color: #6639ba; }
|
|
443
|
+
.highlight .nf, .highlight .fm { color: #8250df; }
|
|
444
|
+
.highlight .nc, .highlight .nn, .highlight .no { color: #953800; }
|
|
445
|
+
.highlight .nt { color: #116329; }
|
|
446
|
+
.highlight .gd { color: #82071e; background: #ffebe9; }
|
|
447
|
+
.highlight .gi { color: #116329; background: #dafbe1; }
|
|
448
|
+
.highlight .err { color: #f6f8fa; background: #82071e; }
|
|
449
|
+
|
|
450
|
+
/* ---- Syntax highlighting (Rouge) — dark --------------------------------- */
|
|
451
|
+
:root[data-theme="dark"] .highlight .c,
|
|
452
|
+
:root[data-theme="dark"] .highlight .cm,
|
|
453
|
+
:root[data-theme="dark"] .highlight .c1,
|
|
454
|
+
:root[data-theme="dark"] .highlight .cs { color: #8b949e; }
|
|
455
|
+
:root[data-theme="dark"] .highlight .k,
|
|
456
|
+
:root[data-theme="dark"] .highlight .kd,
|
|
457
|
+
:root[data-theme="dark"] .highlight .kn,
|
|
458
|
+
:root[data-theme="dark"] .highlight .kp,
|
|
459
|
+
:root[data-theme="dark"] .highlight .kr,
|
|
460
|
+
:root[data-theme="dark"] .highlight .kt { color: #ff7b72; }
|
|
461
|
+
:root[data-theme="dark"] .highlight .o,
|
|
462
|
+
:root[data-theme="dark"] .highlight .ow { color: #79c0ff; }
|
|
463
|
+
:root[data-theme="dark"] .highlight .s,
|
|
464
|
+
:root[data-theme="dark"] .highlight .s1,
|
|
465
|
+
:root[data-theme="dark"] .highlight .s2,
|
|
466
|
+
:root[data-theme="dark"] .highlight .se,
|
|
467
|
+
:root[data-theme="dark"] .highlight .sb,
|
|
468
|
+
:root[data-theme="dark"] .highlight .sd { color: #a5d6ff; }
|
|
469
|
+
:root[data-theme="dark"] .highlight .m,
|
|
470
|
+
:root[data-theme="dark"] .highlight .mi,
|
|
471
|
+
:root[data-theme="dark"] .highlight .mf,
|
|
472
|
+
:root[data-theme="dark"] .highlight .mh,
|
|
473
|
+
:root[data-theme="dark"] .highlight .mo,
|
|
474
|
+
:root[data-theme="dark"] .highlight .il { color: #79c0ff; }
|
|
475
|
+
:root[data-theme="dark"] .highlight .na,
|
|
476
|
+
:root[data-theme="dark"] .highlight .nv,
|
|
477
|
+
:root[data-theme="dark"] .highlight .vg,
|
|
478
|
+
:root[data-theme="dark"] .highlight .vi { color: #79c0ff; }
|
|
479
|
+
:root[data-theme="dark"] .highlight .nb,
|
|
480
|
+
:root[data-theme="dark"] .highlight .bp { color: #ffa657; }
|
|
481
|
+
:root[data-theme="dark"] .highlight .nf,
|
|
482
|
+
:root[data-theme="dark"] .highlight .fm { color: #d2a8ff; }
|
|
483
|
+
:root[data-theme="dark"] .highlight .nc,
|
|
484
|
+
:root[data-theme="dark"] .highlight .nn,
|
|
485
|
+
:root[data-theme="dark"] .highlight .no { color: #ffa657; }
|
|
486
|
+
:root[data-theme="dark"] .highlight .nt { color: #7ee787; }
|
|
487
|
+
:root[data-theme="dark"] .highlight .gd { color: #ffdcd7; background: #67060c; }
|
|
488
|
+
:root[data-theme="dark"] .highlight .gi { color: #aff5b4; background: #033a16; }
|
|
489
|
+
:root[data-theme="dark"] .highlight .err { color: #f0f6fc; background: #8e1519; }
|
|
490
|
+
|
|
491
|
+
@import "my";
|
metadata
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: jekyll-theme-zhum-clean
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Sergey Zhumatiy
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2026-06-20 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: jekyll
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '3.9'
|
|
20
|
+
- - "<"
|
|
21
|
+
- !ruby/object:Gem::Version
|
|
22
|
+
version: '5.0'
|
|
23
|
+
type: :runtime
|
|
24
|
+
prerelease: false
|
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
26
|
+
requirements:
|
|
27
|
+
- - ">="
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
version: '3.9'
|
|
30
|
+
- - "<"
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '5.0'
|
|
33
|
+
- !ruby/object:Gem::Dependency
|
|
34
|
+
name: jekyll-seo-tag
|
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - "~>"
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '2.0'
|
|
40
|
+
type: :runtime
|
|
41
|
+
prerelease: false
|
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - "~>"
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '2.0'
|
|
47
|
+
- !ruby/object:Gem::Dependency
|
|
48
|
+
name: jekyll-feed
|
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - "~>"
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: '0.9'
|
|
54
|
+
type: :runtime
|
|
55
|
+
prerelease: false
|
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
57
|
+
requirements:
|
|
58
|
+
- - "~>"
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: '0.9'
|
|
61
|
+
- !ruby/object:Gem::Dependency
|
|
62
|
+
name: jekyll-multiple-languages-plugin
|
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - "~>"
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: '1.7'
|
|
68
|
+
type: :runtime
|
|
69
|
+
prerelease: false
|
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
71
|
+
requirements:
|
|
72
|
+
- - "~>"
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
version: '1.7'
|
|
75
|
+
- !ruby/object:Gem::Dependency
|
|
76
|
+
name: bundler
|
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - ">="
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: '1.16'
|
|
82
|
+
type: :development
|
|
83
|
+
prerelease: false
|
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
85
|
+
requirements:
|
|
86
|
+
- - ">="
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: '1.16'
|
|
89
|
+
- !ruby/object:Gem::Dependency
|
|
90
|
+
name: rake
|
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
|
92
|
+
requirements:
|
|
93
|
+
- - ">="
|
|
94
|
+
- !ruby/object:Gem::Version
|
|
95
|
+
version: '12.0'
|
|
96
|
+
type: :development
|
|
97
|
+
prerelease: false
|
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
99
|
+
requirements:
|
|
100
|
+
- - ">="
|
|
101
|
+
- !ruby/object:Gem::Version
|
|
102
|
+
version: '12.0'
|
|
103
|
+
description:
|
|
104
|
+
email:
|
|
105
|
+
- sergzhum@gmail.com
|
|
106
|
+
executables: []
|
|
107
|
+
extensions: []
|
|
108
|
+
extra_rdoc_files: []
|
|
109
|
+
files:
|
|
110
|
+
- LICENSE.txt
|
|
111
|
+
- README.md
|
|
112
|
+
- _config.yml
|
|
113
|
+
- _includes/anime_resume.html
|
|
114
|
+
- _includes/head.html
|
|
115
|
+
- _includes/table_sorter.js
|
|
116
|
+
- _includes/tag_cloud.html
|
|
117
|
+
- _includes/tag_index.html
|
|
118
|
+
- _layouts/default.html
|
|
119
|
+
- _layouts/home.html
|
|
120
|
+
- _layouts/post.html
|
|
121
|
+
- _sass/minima/initialize.scss
|
|
122
|
+
- _sass/my.sass
|
|
123
|
+
- assets/css/style.scss
|
|
124
|
+
homepage: https://github.com/zhum/jekyll-theme-zhum-clean
|
|
125
|
+
licenses:
|
|
126
|
+
- MIT
|
|
127
|
+
metadata:
|
|
128
|
+
plugin_type: theme
|
|
129
|
+
post_install_message:
|
|
130
|
+
rdoc_options: []
|
|
131
|
+
require_paths:
|
|
132
|
+
- lib
|
|
133
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
134
|
+
requirements:
|
|
135
|
+
- - ">="
|
|
136
|
+
- !ruby/object:Gem::Version
|
|
137
|
+
version: 2.5.0
|
|
138
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
139
|
+
requirements:
|
|
140
|
+
- - ">="
|
|
141
|
+
- !ruby/object:Gem::Version
|
|
142
|
+
version: '0'
|
|
143
|
+
requirements: []
|
|
144
|
+
rubygems_version: 3.4.20
|
|
145
|
+
signing_key:
|
|
146
|
+
specification_version: 4
|
|
147
|
+
summary: A clean, self-contained technical-blog Jekyll theme with light/dark modes,
|
|
148
|
+
an emerald accent, Inter typography, a tag cloud sidebar and bilingual (i18n) chrome.
|
|
149
|
+
test_files: []
|