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 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>
@@ -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>&copy; {{ 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>
@@ -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>
@@ -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>
@@ -0,0 +1,5 @@
1
+ $content-width: 800px !default;
2
+
3
+ $on-palm: 600px !default;
4
+ $on-laptop: 1200px !default;
5
+
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: []