jekyll-theme-dreamcast 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: 00f2a258d4eef7c1d87abe34b096b4f78fb6a56bfa9eb12175aa00dd46da409c
4
+ data.tar.gz: b375e12372002188c8ad228c12f3759d472ca72ac4b827f6321c8db05d9914cf
5
+ SHA512:
6
+ metadata.gz: 3280372310952d1532246f7b30a74e0f09a9617562a22d723882733412fc6cae5f3eed8a3f5344c5ab109da1e912fb07b641b8e1181b86e5021f9c1a0a2860d4
7
+ data.tar.gz: 20be9ee415530aeaea67e7acc68aaeae24d551d9a5ca72815d27ee7eddfca4f37ec5e57465365ba84cd356e1e13e89c5b1a5d63ae313e634ae6b480fbc070004
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Jack Killilea
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 all
13
+ 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 THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,190 @@
1
+ # Jekyll Theme: Dreamcast
2
+
3
+ A retro-futuristic Jekyll theme inspired by the iconic **Sega Dreamcast** console. Features the signature orange and blue color scheme, smooth animations, and a nostalgic gaming aesthetic.
4
+
5
+ ![Dreamcast Theme](screenshot.png)
6
+
7
+ ## Features
8
+
9
+ - **Iconic Dreamcast Colors**: Orange (#FF6600) and Blue (#0052CC) color scheme
10
+ - **Dark/Light Mode**: Smooth theme switching with localStorage persistence
11
+ - **Responsive Design**: Mobile-friendly cards and layouts
12
+ - **Typography**: Modern Exo 2 font for that futuristic feel
13
+ - **Dreamcast-Inspired Elements**:
14
+ - Orange swirl accent dots on headings
15
+ - VMU-inspired code block styling
16
+ - Gradient hover effects
17
+ - Circular theme toggle button
18
+ - **Blog Support**: Post listings with reading time
19
+ - **Project Cards**: Showcase your portfolio with animated cards
20
+ - **Syntax Highlighting**: Beautiful code blocks with Dreamcast colors
21
+
22
+ ## Installation
23
+
24
+ ### As a Remote Theme (GitHub Pages)
25
+
26
+ Add this line to your Jekyll site's `Gemfile`:
27
+
28
+ ```ruby
29
+ gem "jekyll-remote-theme"
30
+ ```
31
+
32
+ And add this to your `_config.yml`:
33
+
34
+ ```yaml
35
+ plugins:
36
+ - jekyll-remote-theme
37
+
38
+ remote_theme: jackkillilea/jekyll-theme-dreamcast
39
+ ```
40
+
41
+ ### As a Gem-based Theme
42
+
43
+ Add this line to your Jekyll site's `Gemfile`:
44
+
45
+ ```ruby
46
+ gem "jekyll-theme-dreamcast"
47
+ ```
48
+
49
+ And add this to your `_config.yml`:
50
+
51
+ ```yaml
52
+ theme: jekyll-theme-dreamcast
53
+ ```
54
+
55
+ Then execute:
56
+
57
+ ```bash
58
+ bundle install
59
+ ```
60
+
61
+ ## Configuration
62
+
63
+ Add the following configuration to your `_config.yml`:
64
+
65
+ ```yaml
66
+ title: Your Name
67
+ author: Your Name
68
+ url: https://yoursite.com
69
+ description: >
70
+ Your site description here
71
+
72
+ theme_config:
73
+ appearance: "dark" # can be "light", "dark" or "auto"
74
+ appearance_toggle: true # show theme toggle button
75
+ back_home_text: "home.." # text for back to home link
76
+ date_format: "%Y-%m-%d" # date format for posts
77
+ show_description: true # show site description on home page
78
+ show_navbar: true # show navigation bar
79
+ show_footer: false # show footer links
80
+ show_copyright: true # show copyright in footer
81
+ show_projects: true # show projects section
82
+ show_blog: false # show blog posts on home page
83
+ show_old_projects: false # show old projects section
84
+ show_misc_list: false # show miscellaneous list
85
+ show_reading_time: true # show reading time in posts
86
+ show_tags: false # show tags in posts
87
+
88
+ # Section titles
89
+ home:
90
+ title_projects: Portfolio
91
+ title_misc_list: Details
92
+ title_blog: Blog
93
+ title_old_projects: Old Projects
94
+
95
+ highlighter: rouge
96
+
97
+ plugins:
98
+ - jekyll-feed
99
+ - jekyll-seo-tag
100
+ ```
101
+
102
+ ## Data Files
103
+
104
+ Create a `_data/home.yml` file for your homepage content:
105
+
106
+ ```yaml
107
+ navbar_entries:
108
+ - title: about
109
+ url: /about
110
+ - title: blog
111
+ url: /blog
112
+
113
+ project_entries:
114
+ - title: My Project
115
+ url: https://github.com/username/project
116
+ desc: A cool project description
117
+ highlight: NEW
118
+
119
+ footer_entries:
120
+ - title: github
121
+ url: https://github.com/username
122
+ ```
123
+
124
+ ## Layouts
125
+
126
+ The theme includes the following layouts:
127
+
128
+ - `default` - Base layout for all pages
129
+ - `home` - Homepage layout with projects and blog
130
+ - `post` - Blog post layout
131
+ - `blog` - Blog listing page
132
+
133
+ ## Color Scheme
134
+
135
+ ### Light Mode
136
+ - Background: #FAFAFA
137
+ - Text: #2A2A2A
138
+ - Headings: #0052CC (Dreamcast Blue)
139
+ - Links: #FF6600 (Dreamcast Orange)
140
+
141
+ ### Dark Mode
142
+ - Background: #1A2332
143
+ - Text: #D0D0D0
144
+ - Headings: #FF8533 (Light Orange)
145
+ - Links: #FF6600 (Dreamcast Orange)
146
+
147
+ ## Customization
148
+
149
+ ### Custom Head Content
150
+
151
+ Create `_includes/custom_head.html` to add custom meta tags, analytics, or other head content.
152
+
153
+ ### Override Styles
154
+
155
+ Create your own CSS file and import the theme styles first:
156
+
157
+ ```scss
158
+ ---
159
+ ---
160
+
161
+ @import "dreamcast";
162
+ @import "list";
163
+ @import "syntax";
164
+
165
+ // Your custom styles here
166
+ ```
167
+
168
+ ## Development
169
+
170
+ To set up your environment to develop this theme:
171
+
172
+ ```bash
173
+ git clone https://github.com/jackkillilea/jekyll-theme-dreamcast
174
+ cd jekyll-theme-dreamcast
175
+ bundle install
176
+ ```
177
+
178
+ ## Contributing
179
+
180
+ Bug reports and pull requests are welcome on GitHub at https://github.com/jackkillilea/jekyll-theme-dreamcast.
181
+
182
+ ## License
183
+
184
+ The theme is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
185
+
186
+ ## Credits
187
+
188
+ Inspired by the legendary Sega Dreamcast console (1998-2001) and its iconic visual design.
189
+
190
+ Built on the foundation of the [Moonwalk](https://github.com/abhinavs/moonwalk) Jekyll theme.
@@ -0,0 +1,26 @@
1
+ <ul class="horizontal-list">
2
+ {% for item in include.collection %}
3
+
4
+ <li class="card">
5
+ <a href="{{ item.url }}">
6
+ <span class="header">
7
+ {{ item.title }}
8
+
9
+ {% if item.highlight %}
10
+ <mark>{{ item.highlight }}</mark>
11
+ {% endif %}
12
+
13
+ </span>
14
+
15
+ <hr />
16
+
17
+ {% if item.desc != false %}
18
+ <p class="body">
19
+ {{ item.desc }}
20
+ </p>
21
+ {% endif %}
22
+ </a>
23
+ </li>
24
+
25
+ {% endfor %}
26
+ </ul>
@@ -0,0 +1 @@
1
+ <!-- Add your custom head content here -->
@@ -0,0 +1,31 @@
1
+ <p class="post-date text-bold">
2
+ {% if page.author %}
3
+ <span class="text-upcase">{{ page.author }}</span> /
4
+ {% endif %}
5
+ {% if page.date %}
6
+ <span class="text-upcase">{{ page.date | date: "%B %Y"}}</span>
7
+ {% endif %}
8
+
9
+ {% if site.theme_config.show_reading_time == true %}
10
+ {% capture words %}
11
+ {{ content | number_of_words | minus: 180 }}
12
+ {% endcapture %}
13
+ {% unless words contains '-' %}
14
+ {{ words | strip | prepend: '(' | append: ' Words, ' }}
15
+ {{ words | plus: 180 | divided_by: 180 | append: ' Minutes)' }}
16
+ {% endunless %}
17
+ {% endif %}
18
+ </p>
19
+
20
+ <div class="soopr-btn"
21
+ data-twitter="SooprCo"
22
+ >
23
+ </div>
24
+
25
+ {% if site.theme_config.show_tags == true %}
26
+ <div class="">
27
+ {% for tag in page.tags %}
28
+ <span class="tag">{{ tag }}</span>
29
+ {% endfor %}
30
+ </div>
31
+ {% endif %}
@@ -0,0 +1,23 @@
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
+ <title>
7
+ {% if page.title %}
8
+ {{ page.title }}
9
+ {% else %}
10
+ {{ site.title }}
11
+ {% endif %}
12
+ </title>
13
+
14
+ {% seo title=false %}
15
+ {% feed_meta %}
16
+
17
+ <link rel="stylesheet" href="{{ "/assets/css/main.css" | relative_url }}" />
18
+ {% if site.theme_config.appearance_toggle %}
19
+ {% include toggle_theme_js.html %}
20
+ {% endif %}
21
+
22
+ {%- include custom_head.html -%}
23
+ </head>
@@ -0,0 +1,10 @@
1
+ <ul class="horizontal-list font-base font-heading text-upcase">
2
+ {% for item in include.collection %}
3
+ <li>
4
+ <a href="{{ item.url }}">
5
+ {{ item.title }}
6
+ </a>
7
+ &nbsp;&nbsp;
8
+ </li>
9
+ {% endfor %}
10
+ </ul>
@@ -0,0 +1,12 @@
1
+ {% if site.posts.size > 0 %}
2
+ <ul>
3
+ {% for post in site.posts %}
4
+ <li class="post-list-item">
5
+ <span class="home-date">
6
+ {{ post.date | date: site.theme_config.date_format }}»
7
+ </span>
8
+ <a href="{{ post.url | relative_url }}">{{ post.title }}</a>
9
+ </li>
10
+ {% endfor %}
11
+ </ul>
12
+ {% endif %}
@@ -0,0 +1,10 @@
1
+ <button title="Toggle Theme" class="theme-toggle">
2
+ <svg viewBox="0 0 32 32" width="24" height="24" fill="currentcolor">
3
+ <circle cx="16" cy="16" r="14" fill="none" stroke="currentcolor" stroke-width="4"></circle>
4
+ <path d="
5
+ M 16 0
6
+ A 16 16 0 0 0 16 32
7
+ z">
8
+ </path>
9
+ </svg>
10
+ </button>
@@ -0,0 +1,30 @@
1
+ <script type="text/javascript">
2
+ window.addEventListener('load', themeChange);
3
+ const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
4
+ if (currentTheme)
5
+ document.documentElement.setAttribute('data-theme', currentTheme);
6
+
7
+ function themeChange() {
8
+ let button = document.querySelector('.theme-toggle');
9
+
10
+ button.addEventListener('click', function (e) {
11
+ let currentTheme = document.documentElement.getAttribute('data-theme');
12
+ if (currentTheme === 'dark') {
13
+ transition();
14
+ document.documentElement.setAttribute('data-theme', 'light');
15
+ localStorage.setItem('theme', 'light');
16
+ } else {
17
+ transition();
18
+ document.documentElement.setAttribute('data-theme', 'dark');
19
+ localStorage.setItem('theme', 'dark');
20
+ }
21
+ });
22
+
23
+ let transition = () => {
24
+ document.documentElement.classList.add('transition');
25
+ window.setTimeout(() => {
26
+ document.documentElement.classList.remove('transition');
27
+ }, 1000);
28
+ }
29
+ }
30
+ </script>
@@ -0,0 +1,19 @@
1
+ <ul>
2
+ {% for item in include.collection %}
3
+ <li>
4
+ {% if item.url != false %}
5
+ <a href="{{ item.url }}">{{ item.title }}</a>
6
+ {% else %}
7
+ {{ item.title }}
8
+ {% endif %}
9
+
10
+ {% if item.post_list == true %}
11
+ {% include post_list.html %}
12
+ {% endif %}
13
+
14
+ {% if item.entries %}
15
+ {% include vertical_list.html collection=item.entries %}
16
+ {% endif %}
17
+ </li>
18
+ {% endfor %}
19
+ </ul>
@@ -0,0 +1,10 @@
1
+ ---
2
+ layout: default
3
+ ---
4
+ <a href="{{ "/" | relative_url }}">{{ site.theme_config.back_home_text }}</a>
5
+
6
+ <header>
7
+ <h1>{{ site.title }}</h1>
8
+ </header>
9
+
10
+ {% include post_list.html %}
@@ -0,0 +1,22 @@
1
+ <!DOCTYPE html>
2
+ <html lang="{{ page.lang | default: "en" }}" class="html" data-theme="{{ site.theme_config.appearance | default: "auto" }}">
3
+ {%- include head.html -%}
4
+ <body>
5
+ <main class="page-content" aria-label="Content">
6
+ <div class="w">
7
+ {{ content }}
8
+ {% if site.theme_config.appearance_toggle %}
9
+ {% include toggle_theme_button.html %}
10
+ {% endif %}
11
+ </div>
12
+ </main>
13
+
14
+ {%- if site.soopr -%}
15
+ {%- if site.soopr.publish_token and jekyll.environment == "production" -%}
16
+ <script async defer data-soopr-token="{{site.soopr.publish_token}}" src="https://sdk.soopr.co/soopr.js"></script>
17
+ {%- else -%}
18
+ <script async defer src="https://sdk.soopr.co/soopr.js"></script>
19
+ {%- endif -%}
20
+ {%- endif -%}
21
+ </body>
22
+ </html>
@@ -0,0 +1,44 @@
1
+ ---
2
+ layout: default
3
+ ---
4
+
5
+ <header>
6
+ {% if site.theme_config.show_navbar == true %}
7
+ {% include horizontal_list.html collection=site.data.home.navbar_entries %}
8
+ <div class="dashed"></div>
9
+ {% endif %}
10
+
11
+ <h1>{{ site.title }}</h1>
12
+ {% if site.theme_config.show_description == true %}
13
+ <p>{{ site.description }}</p>
14
+ {% endif %}
15
+ </header>
16
+
17
+ {{ content }}
18
+
19
+ {% if site.theme_config.show_projects == true %}
20
+ <h2>{{ site.theme_config.home.title_projects }}</h2>
21
+ {% include card_list.html collection=site.data.home.project_entries %}
22
+ {% endif %}
23
+
24
+ {% if site.theme_config.show_misc_list == true %}
25
+ <h2>{{ site.theme_config.home.title_misc_list }}</h2>
26
+ {% include vertical_list.html collection=site.data.home.misc_entries %}
27
+ {% endif %}
28
+
29
+ {% if site.theme_config.show_blog == true %}
30
+ <h2>{{ site.theme_config.home.title_blog }}</h2>
31
+ {% include post_list.html %}
32
+ {% endif %}
33
+
34
+ {% if site.theme_config.show_old_projects == true %}
35
+ <h2>{{ site.theme_config.home.title_old_projects }}</h2>
36
+ {% include card_list.html collection=site.data.home.old_project_entries %}
37
+ {% endif %}
38
+
39
+ {% if site.theme_config.show_footer == true %}
40
+ <footer>
41
+ <div class="dashed"></div>
42
+ {% include horizontal_list.html collection=site.data.home.footer_entries %}
43
+ </footer>
44
+ {% endif %}
@@ -0,0 +1,8 @@
1
+ ---
2
+ layout: default
3
+ ---
4
+
5
+ <a href="{{ "/" | relative_url }}">{{ site.theme_config.back_home_text }}</a>
6
+ <h1 class="post-title">{{ page.title }}</h1>
7
+ {% include date_and_social_share.html %}
8
+ {{ content }}
@@ -0,0 +1,344 @@
1
+ @import url('https://fonts.googleapis.com/css2?family=Exo+2:wght@400;600;700&display=swap');
2
+ @import url('https://fonts.googleapis.com/css2?family=Roboto+Mono&display=swap');
3
+
4
+ html { height: 100%; }
5
+
6
+ body {
7
+ font-family: "Exo 2", -apple-system, "avenir next", avenir, roboto, noto, ubuntu, "helvetica neue", helvetica, sans-serif;
8
+ font-size: 1.0rem;
9
+ line-height: 1.8;
10
+ margin: 0;
11
+ min-height: 100%;
12
+ }
13
+
14
+ pre, code {
15
+ font-family: "Roboto Mono", "Courier New", monospace;
16
+ font-size: 0.9rem;
17
+ }
18
+
19
+ h1 {
20
+ font-weight: 700;
21
+ letter-spacing: -0.5px;
22
+ }
23
+
24
+ h2, h3, h4, h5 {
25
+ margin-top: 1.5em;
26
+ font-weight: 600;
27
+ }
28
+
29
+ hr { margin: 1em 0; }
30
+
31
+ hr.page-break {
32
+ text-align: center;
33
+ border: 0;
34
+
35
+ &:before { content: '-----' }
36
+ &:after { content: attr(data-content) '-----' }
37
+ }
38
+
39
+ p { margin: 1em 0; }
40
+
41
+ li { margin: 0.4em 0; }
42
+
43
+ .w {
44
+ max-width: 720px;
45
+ margin: 0 auto;
46
+ padding: 4em 2em;
47
+ }
48
+
49
+ table, th, td {
50
+ width: 100%;
51
+ border: thin solid var(--border);
52
+ border-collapse: collapse;
53
+ padding: 0.4em;
54
+ }
55
+
56
+ div.highlighter-rouge pre code, pre code.highlighter-rouge {
57
+ display: block;
58
+ overflow-x: auto;
59
+ padding: 1em;
60
+ }
61
+
62
+ blockquote {
63
+ font-style: italic;
64
+ border-left: 4px solid var(--dreamcast-orange);
65
+ padding: 1em;
66
+ background-color: var(--bg-secondary);
67
+ margin: 1em 0;
68
+
69
+ p { margin: 0; }
70
+ }
71
+
72
+ img {
73
+ max-width: 100%;
74
+ display: block;
75
+ margin: 0 auto;
76
+ border-radius: 8px;
77
+ }
78
+
79
+ // -------------- DREAMCAST THEME COLORS -------------- //
80
+ @mixin light-appearance {
81
+ html, body {
82
+ --bg: #FAFAFA;
83
+ --bg-secondary: #F0F0F0;
84
+ --headings: #0052CC;
85
+ --text: #2A2A2A;
86
+ --text-secondary: #666666;
87
+ --links: #FF6600;
88
+ --links-hover: #FF8533;
89
+ --highlight: #FFE0CC;
90
+ --code-text: #0052CC;
91
+ --share-text: #999;
92
+ --border: #DDDDDD;
93
+ --dreamcast-orange: #FF6600;
94
+ --dreamcast-blue: #0052CC;
95
+ --dreamcast-swirl-glow: rgba(255, 102, 0, 0.15);
96
+ }
97
+ }
98
+
99
+ @mixin dark-appearance {
100
+ html, body {
101
+ --bg: #1A2332;
102
+ --bg-secondary: #243447;
103
+ --headings: #FF8533;
104
+ --text: #D0D0D0;
105
+ --text-secondary: #9CA3AF;
106
+ --links: #FF6600;
107
+ --links-hover: #FF8533;
108
+ --highlight: #FF6600;
109
+ --code-text: #6CB6FF;
110
+ --border: #3A4558;
111
+ --dreamcast-orange: #FF6600;
112
+ --dreamcast-blue: #6CB6FF;
113
+ --dreamcast-swirl-glow: rgba(255, 102, 0, 0.2);
114
+ };
115
+ }
116
+
117
+ html[data-theme="dark"] { @include dark-appearance; }
118
+ html[data-theme="light"] { @include light-appearance; }
119
+
120
+ @media (prefers-color-scheme: dark) {
121
+ body[data-theme="auto"] { @include dark-appearance; }
122
+ }
123
+ @media (prefers-color-scheme: light) {
124
+ body[data-theme="auto"] { @include light-appearance; }
125
+ }
126
+
127
+ // -------------------------------------------- //
128
+
129
+ html, body {
130
+ background-color: var(--bg);
131
+ color: var(--text);
132
+ }
133
+
134
+ h1, h2, h3, h4, h5, h6 {
135
+ color: var(--headings);
136
+ }
137
+
138
+ p, strong, b, em, small, li, hr, table, figcaption {
139
+ color: var(--text);
140
+ }
141
+
142
+ .highlight, pre code {
143
+ border-radius: 8px;
144
+ border: 2px solid var(--border);
145
+ }
146
+
147
+ blockquote {
148
+ border-radius: 4px;
149
+ }
150
+
151
+ a {
152
+ color: var(--links);
153
+ text-decoration: none;
154
+ border-bottom: 2px solid transparent;
155
+ transition: all 0.2s ease;
156
+
157
+ &:hover {
158
+ color: var(--links-hover);
159
+ border-bottom-color: var(--links-hover);
160
+ }
161
+ }
162
+
163
+ *:target {
164
+ background-color: var(--bg-secondary);
165
+ box-shadow: 0 0 0 4px var(--bg-secondary);
166
+ border-radius: 4px;
167
+ }
168
+
169
+ html.transition,
170
+ html.transition *,
171
+ html.transition *:before,
172
+ html.transition *:after {
173
+ transition: all 250ms !important;
174
+ transition-delay: 0 !important;
175
+ }
176
+
177
+ // Dreamcast-inspired theme toggle button
178
+ .theme-toggle {
179
+ color: var(--dreamcast-orange);
180
+ background-color: var(--bg-secondary);
181
+ padding: 8px;
182
+ cursor: pointer;
183
+ margin: 1em;
184
+ position: fixed;
185
+ right: 0;
186
+ top: 0;
187
+ border: 2px solid var(--dreamcast-orange);
188
+ border-radius: 50%;
189
+ outline: none;
190
+ width: 40px;
191
+ height: 40px;
192
+ display: flex;
193
+ align-items: center;
194
+ justify-content: center;
195
+ transition: all 0.3s ease;
196
+ box-shadow: 0 2px 8px var(--dreamcast-swirl-glow);
197
+ }
198
+
199
+ .theme-toggle:hover {
200
+ background-color: var(--dreamcast-orange);
201
+ color: var(--bg);
202
+ transform: rotate(180deg);
203
+ box-shadow: 0 4px 16px var(--dreamcast-swirl-glow);
204
+ }
205
+
206
+ .theme-toggle:focus {
207
+ outline: none;
208
+ }
209
+
210
+ .dashed {
211
+ border-top: 2px var(--border) dashed;
212
+ margin: 0.5em 0;
213
+ }
214
+
215
+ mark {
216
+ padding: 0.4em;
217
+ background-color: var(--highlight);
218
+ color: var(--text);
219
+ font-size: 0.8em;
220
+ letter-spacing: 0.5px;
221
+ border-radius: 4px;
222
+ font-weight: 600;
223
+ }
224
+
225
+ .post-date {
226
+ color: var(--text-secondary);
227
+ margin-top: 1rem;
228
+ font-size: 0.8em;
229
+ font-family: "Roboto Mono", "Courier New", monospace;
230
+ text-transform: uppercase;
231
+ letter-spacing: 1px;
232
+ }
233
+
234
+ .home-date {
235
+ font-family: "Roboto Mono", "Courier New", monospace;
236
+ color: var(--text-secondary);
237
+ font-size: 0.85em;
238
+ }
239
+
240
+ .post-list-item a {
241
+ text-decoration: none;
242
+ }
243
+
244
+ .text-bold {
245
+ font-weight: 700;
246
+ }
247
+
248
+ .text-upcase {
249
+ text-transform: uppercase;
250
+ letter-spacing: 1.5px;
251
+ font-weight: 600;
252
+ }
253
+
254
+ p code, li code {
255
+ background-color: var(--bg-secondary);
256
+ padding: 0.3rem 0.5rem;
257
+ color: var(--code-text);
258
+ font-weight: 600;
259
+ border-radius: 4px;
260
+ border: 1px solid var(--border);
261
+ }
262
+
263
+ .post-title {
264
+ margin-bottom: -1.5rem;
265
+ }
266
+
267
+ .project-title {
268
+ margin-bottom: 0.8rem;
269
+ color: var(--headings);
270
+ }
271
+
272
+ .credits {
273
+ font-size: 0.8em;
274
+ color: var(--text-secondary);
275
+ margin: 8em auto -4em auto;
276
+ text-align: center;
277
+
278
+ a {
279
+ color: var(--text-secondary);
280
+ text-decoration: none;
281
+ font-weight: bold;
282
+ }
283
+
284
+ a:hover {
285
+ color: var(--dreamcast-orange);
286
+ }
287
+ }
288
+
289
+ .tag {
290
+ font-family: "Roboto Mono", "Courier New", monospace;
291
+ color: var(--bg);
292
+ background-color: var(--dreamcast-orange);
293
+ padding: 0.4em 1em;
294
+ margin-right: 0.5em;
295
+ border-radius: 20px;
296
+ font-size: 0.7em;
297
+ font-weight: 700;
298
+ text-transform: uppercase;
299
+ letter-spacing: 0.5px;
300
+ display: inline-block;
301
+ transition: all 0.2s ease;
302
+
303
+ &:hover {
304
+ background-color: var(--dreamcast-blue);
305
+ transform: translateY(-2px);
306
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
307
+ }
308
+ }
309
+
310
+ // Dreamcast swirl-inspired accent for headings
311
+ h1::before {
312
+ content: "";
313
+ display: inline-block;
314
+ width: 8px;
315
+ height: 8px;
316
+ background: var(--dreamcast-orange);
317
+ border-radius: 50%;
318
+ margin-right: 12px;
319
+ box-shadow: 0 0 12px var(--dreamcast-swirl-glow);
320
+ }
321
+
322
+ // VMU-inspired pixel border effect for code blocks
323
+ .highlight {
324
+ position: relative;
325
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
326
+
327
+ &::before {
328
+ content: "";
329
+ position: absolute;
330
+ top: -2px;
331
+ left: -2px;
332
+ right: -2px;
333
+ bottom: -2px;
334
+ background: linear-gradient(45deg, var(--dreamcast-orange) 0%, var(--dreamcast-blue) 100%);
335
+ border-radius: 8px;
336
+ z-index: -1;
337
+ opacity: 0;
338
+ transition: opacity 0.3s ease;
339
+ }
340
+
341
+ &:hover::before {
342
+ opacity: 0.3;
343
+ }
344
+ }
data/_sass/list.scss ADDED
@@ -0,0 +1,66 @@
1
+ ul.horizontal-list {
2
+ display: flex;
3
+ margin-top: 0em;
4
+ margin-left: -40px;
5
+ flex-wrap: wrap;
6
+
7
+ li {
8
+ display:inline;
9
+ margin-right: 1em;
10
+ }
11
+
12
+ li a {
13
+ text-decoration: none;
14
+ font-weight: normal
15
+ }
16
+
17
+ }
18
+
19
+ .card {
20
+ padding: 1em;
21
+ border: 2px var(--dreamcast-orange) solid;
22
+ width: 11em;
23
+ height: auto;
24
+ text-align: center;
25
+ font-size: 1em;
26
+ align-items: center;
27
+ background-color: var(--bg-secondary);
28
+ margin-bottom: 0.8em;
29
+ border-radius: 12px;
30
+ transition: all 0.3s ease;
31
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
32
+
33
+ &:hover {
34
+ transform: translateY(-4px);
35
+ box-shadow: 0 6px 16px var(--dreamcast-swirl-glow);
36
+ border-color: var(--dreamcast-blue);
37
+ }
38
+
39
+ .header {
40
+ color: var(--links);
41
+ font-weight: 600;
42
+ }
43
+
44
+ .body {
45
+ font-size: 0.8em;
46
+ }
47
+
48
+ hr {
49
+ margin: 0.5em 0;
50
+ border-color: var(--border);
51
+ }
52
+
53
+ }
54
+
55
+ /* Responsive cards - one column layout on small screens */
56
+ @media screen and (max-width: 600px) {
57
+ ul.horizontal-list li.card {
58
+ width: 100%;
59
+ display: block;
60
+ margin-bottom: 1em;
61
+ margin-left: 1em;
62
+ a, .header {
63
+ font-size: 1em;
64
+ }
65
+ }
66
+ }
data/_sass/syntax.scss ADDED
@@ -0,0 +1,72 @@
1
+ .highlight .hll { background-color: #515151 }
2
+ .highlight { background: #1A2332; color: #f2f0ec }
3
+ .highlight .c { color: #747369 } /* Comment */
4
+ .highlight .err { color: #f2777a } /* Error */
5
+ .highlight .k { color: #cc99cc } /* Keyword */
6
+ .highlight .l { color: #f99157 } /* Literal */
7
+ .highlight .n { color: #f2f0ec } /* Name */
8
+ .highlight .o { color: #66cccc } /* Operator */
9
+ .highlight .p { color: #f2f0ec } /* Punctuation */
10
+ .highlight .ch { color: #747369 } /* Comment.Hashbang */
11
+ .highlight .cm { color: #747369 } /* Comment.Multiline */
12
+ .highlight .cp { color: #747369 } /* Comment.Preproc */
13
+ .highlight .cpf { color: #747369 } /* Comment.PreprocFile */
14
+ .highlight .c1 { color: #747369 } /* Comment.Single */
15
+ .highlight .cs { color: #747369 } /* Comment.Special */
16
+ .highlight .gd { color: #f2777a } /* Generic.Deleted */
17
+ .highlight .ge { font-style: italic } /* Generic.Emph */
18
+ .highlight .gh { color: #f2f0ec; font-weight: bold } /* Generic.Heading */
19
+ .highlight .gi { color: #99cc99 } /* Generic.Inserted */
20
+ .highlight .gp { color: #747369; font-weight: bold } /* Generic.Prompt */
21
+ .highlight .gs { font-weight: bold } /* Generic.Strong */
22
+ .highlight .gu { color: #66cccc; font-weight: bold } /* Generic.Subheading */
23
+ .highlight .kc { color: #cc99cc } /* Keyword.Constant */
24
+ .highlight .kd { color: #cc99cc } /* Keyword.Declaration */
25
+ .highlight .kn { color: #66cccc } /* Keyword.Namespace */
26
+ .highlight .kp { color: #cc99cc } /* Keyword.Pseudo */
27
+ .highlight .kr { color: #cc99cc } /* Keyword.Reserved */
28
+ .highlight .kt { color: #ffcc66 } /* Keyword.Type */
29
+ .highlight .ld { color: #99cc99 } /* Literal.Date */
30
+ .highlight .m { color: #f99157 } /* Literal.Number */
31
+ .highlight .s { color: #99cc99 } /* Literal.String */
32
+ .highlight .na { color: #6699cc } /* Name.Attribute */
33
+ .highlight .nb { color: #f2f0ec } /* Name.Builtin */
34
+ .highlight .nc { color: #ffcc66 } /* Name.Class */
35
+ .highlight .no { color: #f2777a } /* Name.Constant */
36
+ .highlight .nd { color: #66cccc } /* Name.Decorator */
37
+ .highlight .ni { color: #f2f0ec } /* Name.Entity */
38
+ .highlight .ne { color: #f2777a } /* Name.Exception */
39
+ .highlight .nf { color: #6699cc } /* Name.Function */
40
+ .highlight .nl { color: #f2f0ec } /* Name.Label */
41
+ .highlight .nn { color: #ffcc66 } /* Name.Namespace */
42
+ .highlight .nx { color: #6699cc } /* Name.Other */
43
+ .highlight .py { color: #f2f0ec } /* Name.Property */
44
+ .highlight .nt { color: #66cccc } /* Name.Tag */
45
+ .highlight .nv { color: #f2777a } /* Name.Variable */
46
+ .highlight .ow { color: #66cccc } /* Operator.Word */
47
+ .highlight .w { color: #f2f0ec } /* Text.Whitespace */
48
+ .highlight .mb { color: #f99157 } /* Literal.Number.Bin */
49
+ .highlight .mf { color: #f99157 } /* Literal.Number.Float */
50
+ .highlight .mh { color: #f99157 } /* Literal.Number.Hex */
51
+ .highlight .mi { color: #f99157 } /* Literal.Number.Integer */
52
+ .highlight .mo { color: #f99157 } /* Literal.Number.Oct */
53
+ .highlight .sa { color: #99cc99 } /* Literal.String.Affix */
54
+ .highlight .sb { color: #99cc99 } /* Literal.String.Backtick */
55
+ .highlight .sc { color: #f2f0ec } /* Literal.String.Char */
56
+ .highlight .dl { color: #99cc99 } /* Literal.String.Delimiter */
57
+ .highlight .sd { color: #747369 } /* Literal.String.Doc */
58
+ .highlight .s2 { color: #99cc99 } /* Literal.String.Double */
59
+ .highlight .se { color: #f99157 } /* Literal.String.Escape */
60
+ .highlight .sh { color: #99cc99 } /* Literal.String.Heredoc */
61
+ .highlight .si { color: #f99157 } /* Literal.String.Interpol */
62
+ .highlight .sx { color: #99cc99 } /* Literal.String.Other */
63
+ .highlight .sr { color: #99cc99 } /* Literal.String.Regex */
64
+ .highlight .s1 { color: #99cc99 } /* Literal.String.Single */
65
+ .highlight .ss { color: #99cc99 } /* Literal.String.Symbol */
66
+ .highlight .bp { color: #f2f0ec } /* Name.Builtin.Pseudo */
67
+ .highlight .fm { color: #6699cc } /* Name.Function.Magic */
68
+ .highlight .vc { color: #f2777a } /* Name.Variable.Class */
69
+ .highlight .vg { color: #f2777a } /* Name.Variable.Global */
70
+ .highlight .vi { color: #f2777a } /* Name.Variable.Instance */
71
+ .highlight .vm { color: #f2777a } /* Name.Variable.Magic */
72
+ .highlight .il { color: #f99157 } /* Literal.Number.Integer.Long */
@@ -0,0 +1,6 @@
1
+ ---
2
+ ---
3
+
4
+ @import "dreamcast";
5
+ @import "list";
6
+ @import "syntax";
metadata ADDED
@@ -0,0 +1,134 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jekyll-theme-dreamcast
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jack Killilea
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2025-10-13 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: '4.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: jekyll-feed
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.15'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.15'
41
+ - !ruby/object:Gem::Dependency
42
+ name: jekyll-seo-tag
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.7'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.7'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '13.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '13.0'
83
+ description: A retro-futuristic Jekyll theme inspired by the iconic Sega Dreamcast
84
+ console, featuring the signature orange and blue color scheme, smooth animations,
85
+ and a nostalgic gaming aesthetic.
86
+ email:
87
+ - ''
88
+ executables: []
89
+ extensions: []
90
+ extra_rdoc_files: []
91
+ files:
92
+ - LICENSE
93
+ - README.md
94
+ - _includes/card_list.html
95
+ - _includes/custom_head.html
96
+ - _includes/date_and_social_share.html
97
+ - _includes/head.html
98
+ - _includes/horizontal_list.html
99
+ - _includes/post_list.html
100
+ - _includes/toggle_theme_button.html
101
+ - _includes/toggle_theme_js.html
102
+ - _includes/vertical_list.html
103
+ - _layouts/blog.html
104
+ - _layouts/default.html
105
+ - _layouts/home.html
106
+ - _layouts/post.html
107
+ - _sass/dreamcast.scss
108
+ - _sass/list.scss
109
+ - _sass/syntax.scss
110
+ - assets/css/main.scss
111
+ homepage: https://github.com/jackkillilea/jekyll-theme-dreamcast
112
+ licenses:
113
+ - MIT
114
+ metadata: {}
115
+ post_install_message:
116
+ rdoc_options: []
117
+ require_paths:
118
+ - lib
119
+ required_ruby_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ requirements: []
130
+ rubygems_version: 3.5.11
131
+ signing_key:
132
+ specification_version: 4
133
+ summary: A Sega Dreamcast-inspired Jekyll theme
134
+ test_files: []