imdhemy-jekyll-theme 0.1.0 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1515c0ede2f0e2f57a4ba4a73ab0d572884b971d7d403eddfc3eb10effc63711
4
- data.tar.gz: 7fd36ddbd7002a8942de8be2395de69e6498c62947d1db15437898729b73ace4
3
+ metadata.gz: 179d0424722ed53ef5573005cf1e0368bf2d89bb2ac245e916469ef929b9919f
4
+ data.tar.gz: '093cee0a2647463971ba89a45044cfb8e0fd13ab40f2d7231124ada95cfe95d5'
5
5
  SHA512:
6
- metadata.gz: 74e4c503fbcdc91e5b21a1076f0928286dec9d50350a883460bdefce263f33b2d0090d59764e0163a48f620b06367d225ea404d37785d44c31fe44c4966e46bb
7
- data.tar.gz: cab8c356554ef5cb0e598eda95ebad05bce0897209183d74af96e4ee8638eed3abf6a120f0e3ffb92478ac661ac7a23704de4e83b04b82782b29fec1b65ebae2
6
+ metadata.gz: 74469dd324a8d26623efe87445b80e1ade7c41db4d4ea9339459a38a4b81dc92416c8d7c5ffa3742ce2f26bb009092cc71ad6740b8f5fbbda57d24b7e08e6cbb
7
+ data.tar.gz: 96cf8cd47b2f64084573064bf9169da41c14f7ed6560deb85f280d905c1ed9d5a8f1dcd358fd577b1790c95ccd655e5618ee3df8e7ed841ec31329f561ef077c
data/README.md CHANGED
@@ -1,2 +1,98 @@
1
1
  # Imdhemy Jekyll Theme
2
- [...]
2
+
3
+ Jekyll theme for my personal website. [imdhemy.com](https://imdhemy.com)
4
+
5
+ ## Installation (Recommended: RubyGem)
6
+
7
+ Install the theme as a gem and pin a semantic version.
8
+
9
+ Add to your site's `Gemfile`:
10
+
11
+ ```ruby
12
+ gem "imdhemy-jekyll-theme", "1.0.0"
13
+ ```
14
+
15
+ Set the theme in your site's `_config.yml`:
16
+
17
+ ```yaml
18
+ theme: imdhemy-jekyll-theme
19
+ ```
20
+
21
+ Then run:
22
+
23
+ ```bash
24
+ bundle install
25
+ ```
26
+
27
+ ## Migrating From `remote_theme`
28
+
29
+ If your site currently uses:
30
+
31
+ ```yaml
32
+ remote_theme: imdhemy/imdhemy-jekyll-theme
33
+ ```
34
+
35
+ Migrate to the gem flow:
36
+
37
+ 1. Remove `remote_theme` from `_config.yml`.
38
+ 2. Add `theme: imdhemy-jekyll-theme` to `_config.yml`.
39
+ 3. Add `gem "imdhemy-jekyll-theme", "<semantic-version>"` to your `Gemfile`.
40
+ 4. Run `bundle install`.
41
+
42
+ ## Usage
43
+
44
+ You can find examples in the [example](/example) directory.
45
+
46
+ ## Development Quick Start
47
+
48
+ Use this sequence every time you start working on the theme locally.
49
+
50
+ ### 1. Prerequisites
51
+
52
+ - Ruby 3.3.4 + Bundler
53
+ - Node.js 24 + npm
54
+
55
+ The project pins runtime versions in:
56
+
57
+ - `.ruby-version`
58
+ - `.nvmrc`
59
+ - `.node-version`
60
+ - `.tool-versions`
61
+
62
+ ### 2. Install dependencies
63
+
64
+ ```bash
65
+ bundle install
66
+ npm install
67
+ ```
68
+
69
+ ### 3. Start development
70
+
71
+ Run the theme preview and JS watcher together:
72
+
73
+ ```bash
74
+ npm start
75
+ ```
76
+
77
+ This runs:
78
+
79
+ - `bundle exec rake preview` to serve the example site from `http://127.0.0.1:4000/example/`
80
+ - `vite build --watch` to rebuild `assets/js/dist/main.js` on JS changes
81
+
82
+ ### 4. Day-to-day workflow
83
+
84
+ - Edit layouts/includes/styles in the theme root.
85
+ - Edit sample content under `example/` to verify real pages.
86
+ - Keep `npm start` running while you work.
87
+
88
+ ### 5. Useful standalone commands
89
+
90
+ ```bash
91
+ npm run rake # Jekyll preview only
92
+ npm run js:build # JS production build
93
+ npm run js:watch # JS watcher only
94
+ ```
95
+
96
+ ## License
97
+
98
+ The theme is available as open source under the terms of the [MIT License](/LICENSE.txt).
@@ -1,3 +1,3 @@
1
- <div class="max-w-screen-md mx-auto bg-white p-5 text-xl content">
1
+ <div class="m-auto max-w-screen-md bg-white p-5 text-xl content">
2
2
  {{ content }}
3
3
  </div>
@@ -1,3 +1,4 @@
1
+ {% if site.contributions.size > 0 %}
1
2
  <section class="mb-8">
2
3
  <div class="container mx-auto">
3
4
  <div class="p-5 max-w-screen-lg mx-auto">
@@ -18,3 +19,4 @@
18
19
  </div>
19
20
  </div>
20
21
  </section>
22
+ {% endif %}
@@ -13,7 +13,7 @@
13
13
  <!-- begin right part -->
14
14
  <div class="flex-auto">
15
15
  <div class="flex justify-end lg:hidden">
16
- <button type="button">
16
+ <button type="button" class="menu-toggle" data-target="#mobile-nav">
17
17
  <ion-icon name="menu-outline"></ion-icon>
18
18
  </button>
19
19
  </div>
@@ -34,7 +34,7 @@
34
34
  </div>
35
35
  <!-- begin mobile nav -->
36
36
  <nav id="mobile-nav"
37
- class="-z-10 opacity-0 absolute top-32 right-6 block min-w-fit w-40 bg-white p-5 rounded-md shadow-md ease-linear">
37
+ class="menu -z-10 opacity-0 absolute top-32 right-6 block min-w-fit w-40 bg-white p-5 rounded-md shadow-md ease-linear">
38
38
  <div class="ml-auto">
39
39
  <ul class="p-0 m-0 flex-column items-center">
40
40
  {% for page in site.navigation %}
@@ -1,11 +1,11 @@
1
- <div class="max-w-screen-lg mx-auto bg-white p-5">
2
- <h1 class="font-black font-sans text-2xl lg:text-7xl post-title">{{ page.title }}</h1>
1
+ <div class="max-w-screen-md mx-auto bg-white p-5">
2
+ <h1 class="font-black font-sans text-2xl lg:text-4xl post-title">{{ page.title }}</h1>
3
3
  </div>
4
4
 
5
5
  <div class="max-w-screen-md mx-auto bg-white p-5">
6
6
  <div class="flex justify-between flex-wrap my-2">
7
7
  <div class="flex items-center mr-8">
8
- <img src="{{ site.baseurl }}/{{ site.author.avatar }}" alt="{{ author.name }}"
8
+ <img src="{{ site.baseurl }}{{ site.author.avatar }}" alt="{{ author.name }}"
9
9
  class="rounded-full w-10 h-10 mr-3 block"/>
10
10
  <div>
11
11
  <p class="text-gray-700 text-sm font-bold">{{ site.author.name }}</p>
@@ -24,9 +24,15 @@
24
24
 
25
25
  {% if page.image %}
26
26
  <div class="relative overflow-hidden">
27
- <img src="{{ site.baseurl }}/{{ page.image }}"
28
- alt="{{ page.title }}"
27
+ <img src="{{ site.baseurl }}{{ page.image }}"
28
+ alt="{{ page.image_alt | default: page.title }}"
29
29
  class="w-full h-auto rounded"/>
30
+ <!-- Image source -->
31
+ {% if page.image_source %}
32
+ <div class="bg-white text-xs text-gray-500 px-2 py-1">
33
+ Image source: {{ page.image_source }}
34
+ </div>
35
+ {% endif %}
30
36
  </div>
31
37
  {% endif %}
32
38
  </div>
@@ -1,11 +1,13 @@
1
1
  <article class="flex flex-col lg:flex-row items-center mb-8 pb-8 border-b border-gray-200">
2
2
  <!-- thumbnail -->
3
+ {% if post.image %}
3
4
  <a href="{{ site.baseurl }}{{ post.url }}"
4
5
  class="w-full relative block lg:min-w-[250px] lg:max-w-[250px] lg:max-h-[250px] aspect-square lg:mr-5 mb-5 lg:mb-0 rounded-lg overflow-hidden">
5
6
  <img src="{{ site.baseurl }}{{ post.image }}"
6
7
  class="absolute inset-0 w-full h-full object-cover hover:scale-105 ease-in duration-300"
7
8
  alt="{{ post.title }}"/>
8
9
  </a>
10
+ {% endif %}
9
11
  <!-- content -->
10
12
  <div>
11
13
  {% assign tags = post.tags %}
@@ -0,0 +1,16 @@
1
+ <!-- Facebook Meta Tags -->
2
+ <meta property="og:title" content="{{ page.title | escape }}">
3
+ <meta property="og:type" content="article">
4
+ <meta property="og:image" content="{{ site.url }}{{ site.baseurl }}{{ page.image }}">
5
+ <meta property="og:url" content="{{ site.url }}{{ site.baseurl }}{{ page.url }}">
6
+ <meta property="og:description"
7
+ content="{{ page.excerpt | default: site.description | strip_html | normalize_whitespace | truncate: 160 | escape }}">
8
+ <meta property="og:site_name" content="{{ site.title | escape }}">
9
+
10
+ <!-- Twitter Meta Tags -->
11
+ <meta name="twitter:card" content="summary_large_image">
12
+ <meta name="twitter:title" content="{{ page.title | escape }}">
13
+ <meta name="twitter:description"
14
+ content="{{ page.excerpt | default: site.description | strip_html | normalize_whitespace | truncate: 160 | escape }}">
15
+ <meta name="twitter:image" content="{{ site.url }}{{ site.baseurl }}{{ page.image }}">
16
+
@@ -20,7 +20,7 @@
20
20
  </div>
21
21
  </div>
22
22
  </div>
23
- <div class="bg-[url('{{ site.baseurl }}{{ site.footer.bg_image }}')] opacity-75 absolute top-0 left-0 w-full h-full bg-bottom bg-cover -z-10"></div>
23
+ <div class="bg-social opacity-75 absolute top-0 left-0 w-full h-full bg-bottom bg-cover -z-10"></div>
24
24
  <div class="absolute top-0 left-0 w-full h-full bg-black -z-20"></div>
25
25
  </div>
26
26
  </section>
@@ -1,3 +1,4 @@
1
+ {% if site.testimonials.size > 0 %}
1
2
  <section class="mb-8">
2
3
  <div class="container mx-auto">
3
4
  <div class="p-5 max-w-screen-lg mx-auto">
@@ -8,8 +9,9 @@
8
9
  <div class="w-full">
9
10
  <div class="relative p-8 overflow-hidden bg-violet-100 rounded-3xl">
10
11
  <div class="relative z-1 flex items-center mb-8">
11
- <div class="relative w-[68px] h-[68px] mr-3 border-2 border-indigo-600 rounded-full">
12
- <img class="absolute top-0 left-0 w-full h-full object-cover rounded-full select-none p-[2px]"
12
+ <div class="relative min-w-[68px] min-h-[68px] mr-3 border-2 border-indigo-600 rounded-full">
13
+ <img width="40px" height="40px"
14
+ class="absolute top-0 left-0 w-full h-full object-cover rounded-full select-none p-[2px]"
13
15
  src="{{ testimonial.image }}"
14
16
  alt=""/>
15
17
  </div>
@@ -34,3 +36,4 @@
34
36
  </div>
35
37
  </div>
36
38
  </section>
39
+ {% endif %}
@@ -8,11 +8,28 @@
8
8
  <title>{% if page.title %}{{ page.title | escape }}{% else %}{{ site.title | escape }}{% endif %}</title>
9
9
  <meta name="description"
10
10
  content="{{ page.excerpt | default: site.description | strip_html | normalize_whitespace | truncate: 160 | escape }}">
11
+
12
+
13
+ <link rel="preconnect" href="https://fonts.googleapis.com">
14
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
15
+ <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+Display:ital,wght@0,100..900;1,100..900&display=swap"
16
+ rel="stylesheet">
17
+ <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+Display:ital,wght@0,100..900;1,100..900&family=Noto+Serif:ital,wght@0,100..900;1,100..900&display=swap"
18
+ rel="stylesheet">
19
+
11
20
  <link rel="canonical" href="{{ page.url | replace:'index.html', '' | absolute_url }}">
12
21
  <link rel="stylesheet" href="{{ '/assets/css/main.css?v=' | append: site.github.build_revision | relative_url }}">
22
+ {% if site.favicon %}
23
+ <link rel="icon" type="image/png" href="{{ site.favicon | relative_url }}">
24
+ {% endif %}
13
25
  {% if page.math %}
14
26
  {% include math.html %}
15
27
  {% endif %}
28
+
29
+ {% if page.layout == 'post' %}
30
+ {% include social-media-meta.html %}
31
+ {% endif %}
32
+
16
33
  </head>
17
34
  <body class="min-h-screen">
18
35
  <div class="min-h-screen">
@@ -23,11 +40,6 @@
23
40
  {% include footer.html %}
24
41
  </div>
25
42
 
26
-
27
- <!-- Ion icons -->
28
- <script type="module" src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.esm.js"></script>
29
- <script nomodule src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.js"></script>
30
-
31
43
  <!-- Main JS file -->
32
44
  <script src="{{ '/assets/js/dist/main.js?v=' | append: site.github.build_revision | relative_url }}"></script>
33
45
  </body>
@@ -0,0 +1,227 @@
1
+ *,
2
+ *::before,
3
+ *::after {
4
+ box-sizing: border-box;
5
+ border: 0 solid #e5e7eb;
6
+ }
7
+
8
+ *::before,
9
+ *::after {
10
+ --tw-content: "";
11
+ }
12
+
13
+ html,
14
+ :host {
15
+ line-height: 1.5;
16
+ -webkit-text-size-adjust: 100%;
17
+ tab-size: 4;
18
+ font-family: "Noto Sans Display", "Helvetica Neue", Helvetica, Arial, sans-serif;
19
+ font-feature-settings: normal;
20
+ font-variation-settings: normal;
21
+ -webkit-tap-highlight-color: transparent;
22
+ }
23
+
24
+ body {
25
+ margin: 0;
26
+ line-height: inherit;
27
+ }
28
+
29
+ hr {
30
+ height: 0;
31
+ color: inherit;
32
+ border-top-width: 1px;
33
+ }
34
+
35
+ abbr:where([title]) {
36
+ text-decoration: underline dotted;
37
+ }
38
+
39
+ h1,
40
+ h2,
41
+ h3,
42
+ h4,
43
+ h5,
44
+ h6 {
45
+ font-size: inherit;
46
+ font-weight: inherit;
47
+ }
48
+
49
+ a {
50
+ color: inherit;
51
+ text-decoration: inherit;
52
+ }
53
+
54
+ b,
55
+ strong {
56
+ font-weight: bolder;
57
+ }
58
+
59
+ code,
60
+ kbd,
61
+ pre,
62
+ samp {
63
+ font-family: monospace;
64
+ font-size: 1em;
65
+ font-feature-settings: normal;
66
+ font-variation-settings: normal;
67
+ }
68
+
69
+ small {
70
+ font-size: 80%;
71
+ }
72
+
73
+ sub,
74
+ sup {
75
+ position: relative;
76
+ vertical-align: baseline;
77
+ font-size: 75%;
78
+ line-height: 0;
79
+ }
80
+
81
+ sub {
82
+ bottom: -0.25em;
83
+ }
84
+
85
+ sup {
86
+ top: -0.5em;
87
+ }
88
+
89
+ table {
90
+ border-collapse: collapse;
91
+ border-color: inherit;
92
+ text-indent: 0;
93
+ }
94
+
95
+ button,
96
+ input,
97
+ optgroup,
98
+ select,
99
+ textarea {
100
+ margin: 0;
101
+ padding: 0;
102
+ color: inherit;
103
+ font: inherit;
104
+ letter-spacing: inherit;
105
+ }
106
+
107
+ button,
108
+ select {
109
+ text-transform: none;
110
+ }
111
+
112
+ button,
113
+ input:where([type="button"]),
114
+ input:where([type="reset"]),
115
+ input:where([type="submit"]) {
116
+ appearance: button;
117
+ background-color: transparent;
118
+ background-image: none;
119
+ }
120
+
121
+ :-moz-focusring {
122
+ outline: auto;
123
+ }
124
+
125
+ :-moz-ui-invalid {
126
+ box-shadow: none;
127
+ }
128
+
129
+ progress {
130
+ vertical-align: baseline;
131
+ }
132
+
133
+ ::-webkit-inner-spin-button,
134
+ ::-webkit-outer-spin-button {
135
+ height: auto;
136
+ }
137
+
138
+ [type="search"] {
139
+ appearance: textfield;
140
+ outline-offset: -2px;
141
+ }
142
+
143
+ ::-webkit-search-decoration {
144
+ appearance: none;
145
+ }
146
+
147
+ ::-webkit-file-upload-button {
148
+ appearance: button;
149
+ font: inherit;
150
+ }
151
+
152
+ summary {
153
+ display: list-item;
154
+ }
155
+
156
+ blockquote,
157
+ dd,
158
+ dl,
159
+ figure,
160
+ h1,
161
+ h2,
162
+ h3,
163
+ h4,
164
+ h5,
165
+ h6,
166
+ hr,
167
+ p,
168
+ pre {
169
+ margin: 0;
170
+ }
171
+
172
+ fieldset,
173
+ legend,
174
+ menu,
175
+ ol,
176
+ ul,
177
+ dialog {
178
+ margin: 0;
179
+ padding: 0;
180
+ }
181
+
182
+ menu,
183
+ ol,
184
+ ul {
185
+ list-style: none;
186
+ }
187
+
188
+ textarea {
189
+ resize: vertical;
190
+ }
191
+
192
+ input::placeholder,
193
+ textarea::placeholder {
194
+ opacity: 1;
195
+ color: #9ca3af;
196
+ }
197
+
198
+ button,
199
+ [role="button"] {
200
+ cursor: pointer;
201
+ }
202
+
203
+ :disabled {
204
+ cursor: default;
205
+ }
206
+
207
+ audio,
208
+ canvas,
209
+ embed,
210
+ iframe,
211
+ img,
212
+ object,
213
+ svg,
214
+ video {
215
+ display: block;
216
+ vertical-align: middle;
217
+ }
218
+
219
+ img,
220
+ video {
221
+ max-width: 100%;
222
+ height: auto;
223
+ }
224
+
225
+ [hidden]:where(:not([hidden="until-found"])) {
226
+ display: none;
227
+ }
@@ -0,0 +1,24 @@
1
+ * {
2
+ -webkit-font-smoothing: antialiased;
3
+ -webkit-tap-highlight-color: transparent;
4
+ tap-highlight-color: transparent;
5
+ }
6
+
7
+ ::selection {
8
+ background: #4d41e0;
9
+ color: #fff;
10
+ }
11
+
12
+ ::-moz-selection {
13
+ background: #4d41e0;
14
+ color: #fff;
15
+ }
16
+
17
+ h1,
18
+ h2,
19
+ h3,
20
+ h4,
21
+ h5,
22
+ h6 {
23
+ font-family: "Noto Serif", Georgia, Cambria, "Times New Roman", Times, serif;
24
+ }