monoholic 0.3.1 → 0.3.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e9324c869e432f71540eb58af95625b3d5e513a4df8c5f28ac47f90e7cc92e82
4
- data.tar.gz: c33bc694b685c92db02a3b8ebced5eebf76800d97cfad37d12a2686fb8983e6d
3
+ metadata.gz: d32ca029c01d3daf2a3a5b84963743da741082e38bbcfaa017eb0d1abdd51c8a
4
+ data.tar.gz: 74e0b961dc404e54b16d2b0de034d80518ab7aed38bca7707cd216ec64b67604
5
5
  SHA512:
6
- metadata.gz: 6410c930b032cc541a5436c2fd34a4eec0314d0f401a299bddea8d5358859abfb7f786f59d24cffbb58b1db39091a8ae42709d4d04af9276032969b2e72fc9e2
7
- data.tar.gz: 347a19557964fd8b571fb4542c2b33433c623638c0cdd7bde61b8ef032c6d6668962dbb535c9568bc92130defab41f1d717ec50a57dc064048555b7c715e620a
6
+ metadata.gz: 94abdf33dcfcef03cacfe59a66cc25e73cf9a7b8a8545dd0932871b9b22ea934c40123150a058032036f481c3a8b40e3e641ee670cd711732362ae918fd8ad64
7
+ data.tar.gz: 838e482ced8c32bf3023000e18af54532a6463077d9575f68ecaadab9c0a8f2741edfc6ad971741f139719720cd11a2d842a9eb9ad39fe923c51409d5aebf258
data/README.md CHANGED
@@ -69,6 +69,16 @@ theme_config:
69
69
  footer: true # Show/hide site footer (default: true)
70
70
  ```
71
71
 
72
+ ### Analytics
73
+
74
+ Monoholic has built-in support for [GoatCounter](https://www.goatcounter.com/), a privacy-friendly analytics platform. Add your GoatCounter subdomain to `_config.yml`:
75
+
76
+ ```yaml
77
+ goatcounter: your-subdomain
78
+ ```
79
+
80
+ This injects the GoatCounter tracking script on every page. Remove the key entirely to disable analytics.
81
+
72
82
  ### Menu Configuration
73
83
 
74
84
  Monoholic uses a data-driven approach to its menu. Create or edit `_data/menu.yml` to define your site's navigation structure.
@@ -90,6 +100,23 @@ entries:
90
100
  - `content_file`: Path to an external markdown file (e.g., `about.md`) to load content from your root directory.
91
101
  - `post_list`: Set to `true` to auto-generate a list of your Jekyll posts under this section.
92
102
 
103
+ #### Nested Menu Sections
104
+
105
+ Menu entries can contain nested `entries` to create recursive sub-sections:
106
+
107
+ ```yaml
108
+ entries:
109
+ - title: projects
110
+ entries:
111
+ - title: web
112
+ content: |
113
+ <p>Web projects here.</p>
114
+ - title: archive
115
+ post_list: true
116
+ ```
117
+
118
+ Nesting can go as deep as needed — `menu.html` includes itself recursively for each `entries` array it encounters.
119
+
93
120
  #### Using External Content Files
94
121
 
95
122
  You can reference external markdown files instead of inline content:
@@ -102,6 +129,21 @@ entries:
102
129
 
103
130
  This will load and render the content from `about.md` in your site's root directory.
104
131
 
132
+ ### Per-Page JavaScript
133
+
134
+ To load custom JavaScript files on a specific page, add a `custom_js` list to the page's front matter:
135
+
136
+ ```yaml
137
+ ---
138
+ layout: post
139
+ custom_js:
140
+ - my-script
141
+ - chart
142
+ ---
143
+ ```
144
+
145
+ Each entry is a filename (without `.js`) relative to `assets/js/`. The example above loads `assets/js/my-script.js` and `assets/js/chart.js` at the bottom of the page body.
146
+
105
147
  ## Contributing
106
148
 
107
149
  Bug reports and pull requests are welcome on GitHub at [https://github.com/stiermid/monoholic](https://github.com/stiermid/monoholic). This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](https://www.contributor-covenant.org/) code of conduct.
@@ -1,16 +1,11 @@
1
1
  <footer class="site-footer h-card">
2
2
  <data class="u-url" href="{{ "/" | relative_url }}"></data>
3
3
  <div class="wrapper">
4
- <div class="footer-col-wrapper">
5
- <div
6
- class="footer-col"
7
- style="display: flex; justify-content: space-between; align-items: center; width: 100%;"
8
- >
9
- <p>
10
- &copy; {{ 'now' | date: '%Y' }}
11
- {{ site.title | upcase }}
12
- </p>
13
- </div>
4
+ <div class="footer-col">
5
+ <p>
6
+ &copy; {{ 'now' | date: '%Y' }}
7
+ {{ site.title | upcase }}
8
+ </p>
14
9
  </div>
15
10
  </div>
16
11
  </footer>
@@ -4,7 +4,7 @@
4
4
  <span class="post-meta">
5
5
  * {{ post.date | date: site.theme_config.date_format }}
6
6
  </span>
7
- <a class="post-link" href="{{ post.url | relative_url }}">
7
+ <a href="{{ post.url | relative_url }}">
8
8
  {{ post.title | escape }}
9
9
  </a>
10
10
  </li>
@@ -1,7 +1,7 @@
1
1
  <!doctype html>
2
2
  <html lang="{{ page.lang | default: "en" }}">
3
3
  {%- include head.html -%}
4
- <body class="{% if site.theme_config.monochrome_images != false %}m-img{% endif %}">
4
+ <body class="{% if site.theme_config.monochrome_images != false %}images-monochrome{% endif %}">
5
5
  <main class="page-content" aria-label="Content">
6
6
  <div class="wrapper">
7
7
  {{ content }}
data/_layouts/post.html CHANGED
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  layout: default
3
3
  ---
4
- {%- include back_link.html -%}
4
+ <a href="{{ '/' | relative_url }}">{{ site.theme_config.back }}</a>
5
5
 
6
6
  <article>
7
- <span class="post-meta" style="text-align: right">
7
+ <span class="post-meta">
8
8
  {{ page.date | date: site.theme_config.date_format }}
9
9
  </span>
10
10
  <h1>{{ page.title }}</h1>
data/_sass/_base.scss ADDED
@@ -0,0 +1,43 @@
1
+ * {
2
+ box-sizing: border-box;
3
+ }
4
+
5
+ body {
6
+ background-color: var(--bg-color);
7
+ color: var(--text-color);
8
+ font-family: var(--font-family);
9
+ font-size: var(--font-size-base);
10
+ line-height: 1.4;
11
+ margin: 0;
12
+ padding: 0;
13
+ -webkit-font-smoothing: antialiased;
14
+ }
15
+
16
+ h1,
17
+ h2,
18
+ h3,
19
+ h4,
20
+ h5,
21
+ h6 {
22
+ font-weight: 700;
23
+ margin-top: 0;
24
+ }
25
+
26
+ p {
27
+ margin-top: 0;
28
+ }
29
+
30
+ a {
31
+ color: var(--text-color);
32
+ text-decoration: underline;
33
+ }
34
+
35
+ img {
36
+ max-width: 100%;
37
+ display: block;
38
+ margin: 0 auto;
39
+ }
40
+
41
+ .images-monochrome img {
42
+ filter: grayscale(1);
43
+ }
@@ -0,0 +1,42 @@
1
+ .post-list {
2
+ list-style: none;
3
+ padding: 0;
4
+ margin: 0;
5
+
6
+ li {
7
+ margin-bottom: 0.75rem;
8
+ display: flex;
9
+ align-items: baseline;
10
+ gap: var(--space-md);
11
+ flex-wrap: wrap; // Mobile safety
12
+ }
13
+ }
14
+
15
+ .post-meta {
16
+ color: var(--meta-color);
17
+ }
18
+
19
+ .site-footer {
20
+ padding-top: var(--space-xl);
21
+ font-size: var(--font-size-sm);
22
+ color: var(--meta-color);
23
+
24
+ .footer-col {
25
+ display: flex;
26
+ justify-content: space-between;
27
+ align-items: center;
28
+ width: 100%;
29
+ }
30
+
31
+ p {
32
+ margin: 0;
33
+ }
34
+ }
35
+
36
+ .page-content {
37
+ .post-meta {
38
+ color: var(--meta-color);
39
+ display: block;
40
+ text-align: right;
41
+ }
42
+ }
@@ -0,0 +1,40 @@
1
+ .highlighter-rouge,
2
+ highlight {
3
+ background-color: var(--text-color);
4
+ color: var(--bg-color);
5
+ }
6
+
7
+ div.highlighter-rouge {
8
+ code {
9
+ display: block;
10
+ overflow-x: auto;
11
+ white-space: pre-wrap;
12
+ }
13
+
14
+ pre.highlight {
15
+ padding: var(--space-md);
16
+ }
17
+ }
18
+
19
+ table {
20
+ width: 100%;
21
+ margin-bottom: var(--space-md);
22
+
23
+ &,
24
+ th,
25
+ td {
26
+ border: thin solid var(--meta-color);
27
+ border-collapse: collapse;
28
+ padding: var(--space-xs);
29
+ }
30
+ }
31
+
32
+ blockquote {
33
+ font-style: italic;
34
+ border: thin solid var(--border-color);
35
+ padding: var(--space-md);
36
+
37
+ p {
38
+ margin: 0;
39
+ }
40
+ }
@@ -0,0 +1,25 @@
1
+ .wrapper {
2
+ max-width: var(--content-width);
3
+ margin: 0 auto;
4
+ padding: var(--space-3xl) var(--space-xl);
5
+ }
6
+
7
+ .site-header {
8
+ margin: var(--space-2xl) 0;
9
+
10
+ .site-title {
11
+ font-size: var(--font-size-site-title);
12
+ font-weight: 700;
13
+ letter-spacing: 0.5px;
14
+ }
15
+ }
16
+
17
+ .section-title {
18
+ font-size: var(--font-size-section);
19
+ font-weight: 700;
20
+ margin-bottom: var(--space-lg);
21
+ }
22
+
23
+ section {
24
+ margin-bottom: var(--space-xl);
25
+ }
@@ -0,0 +1,26 @@
1
+ :root {
2
+ // Colors
3
+ --bg-color: #030303;
4
+ --text-color: #e0e0e0;
5
+ --meta-color: #888888;
6
+ --border-color: #222222;
7
+
8
+ // Typography
9
+ --font-family: "JetBrains Mono", monospace;
10
+ --font-size-base: 16px;
11
+ --font-size-sm: 0.85rem;
12
+ --font-size-section: 1.1rem;
13
+ --font-size-site-title: 2rem;
14
+
15
+ // Spacing scale
16
+ --space-xs: 0.4rem;
17
+ --space-sm: 0.5rem;
18
+ --space-md: 1rem;
19
+ --space-lg: 1.5rem;
20
+ --space-xl: 2rem;
21
+ --space-2xl: 3rem;
22
+ --space-3xl: 4rem;
23
+
24
+ // Layout
25
+ --content-width: 680px;
26
+ }
data/_sass/monoholic.scss CHANGED
@@ -1,171 +1,6 @@
1
1
  // monoholic.scss
2
-
3
- :root {
4
- --bg-color: #030303;
5
- --text-color: #e0e0e0;
6
- --meta-color: #888888;
7
- --border-color: #222222;
8
- --font-family: "JetBrains Mono", monospace;
9
- --base-size: 16px;
10
- }
11
-
12
- * {
13
- box-sizing: border-box;
14
- }
15
-
16
- body {
17
- background-color: var(--bg-color);
18
- color: var(--text-color);
19
- font-family: var(--font-family);
20
- font-size: var(--base-size);
21
- line-height: 1.4;
22
- margin: 0;
23
- padding: 0;
24
- -webkit-font-smoothing: antialiased;
25
- }
26
-
27
- h1,
28
- h2,
29
- h3,
30
- h4,
31
- h5,
32
- h6 {
33
- font-weight: 700;
34
- margin-top: 0;
35
- }
36
-
37
- p {
38
- margin-top: 0;
39
- }
40
-
41
- a {
42
- color: var(--text-color);
43
- text-decoration: underline;
44
- }
45
-
46
- img {
47
- max-width: 100%;
48
- display: block;
49
- margin: 0 auto;
50
- }
51
-
52
- .m-img img {
53
- filter: grayscale(1);
54
- }
55
-
56
- .highlighter-rouge,
57
- highlight {
58
- background-color: var(--text-color);
59
- color: var(--bg-color);
60
- }
61
-
62
- div.highlighter-rouge code {
63
- display: block;
64
- overflow-x: auto;
65
- white-space: pre-wrap;
66
- }
67
-
68
- pre.highlight {
69
- padding: 1rem;
70
- }
71
-
72
- table {
73
- width: 100%;
74
- margin-bottom: 1rem;
75
- }
76
-
77
- table,
78
- th,
79
- td {
80
- border: thin solid var(--meta-color);
81
- border-collapse: collapse;
82
- padding: 0.4rem;
83
- }
84
-
85
- blockquote {
86
- font-style: italic;
87
- border: thin solid var(--border-color);
88
- padding: 1rem;
89
-
90
- p {
91
- margin: 0;
92
- }
93
- }
94
-
95
- .wrapper {
96
- max-width: 680px;
97
- margin: 0 auto;
98
- padding: 4rem 2rem;
99
- }
100
-
101
- // Header
102
- .site-header {
103
- margin: 3rem 0;
104
-
105
- .site-title {
106
- font-size: 2rem;
107
- font-weight: 700;
108
- letter-spacing: 0.5px;
109
- }
110
- }
111
-
112
- // Typography / Sections
113
- .section-title {
114
- font-size: 1.1rem;
115
- font-weight: 700;
116
- margin-bottom: 1.5rem;
117
- }
118
-
119
- // Section
120
- section {
121
- margin-bottom: 2rem;
122
- }
123
-
124
- // Posts Section
125
- .post-list {
126
- list-style: none;
127
- padding: 0;
128
- margin: 0;
129
-
130
- li {
131
- margin-bottom: 0.75rem;
132
- display: flex;
133
- align-items: baseline;
134
- gap: 1rem;
135
- flex-wrap: wrap; // Mobile safety
136
- }
137
- }
138
-
139
- .post-meta {
140
- color: var(--meta-color);
141
- }
142
-
143
- // Footer
144
- .site-footer {
145
- padding-top: 2rem;
146
- font-size: 0.85rem;
147
- color: var(--meta-color);
148
-
149
- .footer-col {
150
- display: flex;
151
- justify-content: space-between;
152
- width: 100%;
153
- }
154
-
155
- p {
156
- margin: 0;
157
- }
158
- }
159
-
160
- // Page Layout Styles (For standard pages/posts if they have content)
161
- .page-content {
162
- .post-title {
163
- font-size: 1.5rem;
164
- margin-bottom: 0.5rem;
165
- }
166
-
167
- .post-meta {
168
- color: var(--meta-color);
169
- display: block;
170
- }
171
- }
2
+ @import "variables";
3
+ @import "base";
4
+ @import "content";
5
+ @import "layout";
6
+ @import "components";
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: monoholic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Agil Mammadov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-04-06 00:00:00.000000000 Z
11
+ date: 2026-04-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -89,9 +89,7 @@ extra_rdoc_files: []
89
89
  files:
90
90
  - LICENSE
91
91
  - README.md
92
- - _config.yml
93
92
  - _data/menu.yml
94
- - _includes/back_link.html
95
93
  - _includes/footer.html
96
94
  - _includes/head.html
97
95
  - _includes/header.html
@@ -101,6 +99,11 @@ files:
101
99
  - _layouts/home.html
102
100
  - _layouts/page.html
103
101
  - _layouts/post.html
102
+ - _sass/_base.scss
103
+ - _sass/_components.scss
104
+ - _sass/_content.scss
105
+ - _sass/_layout.scss
106
+ - _sass/_variables.scss
104
107
  - _sass/monoholic.scss
105
108
  - assets/css/style.scss
106
109
  homepage: https://github.com/stiermid/monoholic
data/_config.yml DELETED
@@ -1,25 +0,0 @@
1
- name: "monoholic"
2
- title: "monoholic"
3
- author: Agil Mammadov
4
- email: mammadovagil@tutamail.com
5
- description: >
6
- Minimal monochrome dark jekyll theme🧪
7
- baseurl: "/monoholic" # the subpath of your site, e.g. /blog
8
- url: "https://stiermid.github.io" # the base hostname & protocol for your site, e.g. http://example.com
9
- github_username: "stiermid"
10
-
11
- # Build settings
12
- markdown: kramdown
13
- remote_theme: stiermid/monoholic
14
-
15
- theme_config:
16
- back: ".."
17
- date_format: "%Y%m%d"
18
- monochrome_images: true
19
- footer: true # set to false to hide the footer
20
-
21
- # goatcounter: mycode # your GoatCounter site code (e.g. mycode.goatcounter.com)
22
-
23
- plugins:
24
- - jekyll-feed
25
- - jekyll-seo-tag
@@ -1 +0,0 @@
1
- <a href="{{ '/' | relative_url }}">{{ site.theme_config.back }}</a>