jekyll-vitepress-theme 0.9.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.
Files changed (80) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +93 -0
  4. data/_includes/doc_footer.html +184 -0
  5. data/_includes/head.html +98 -0
  6. data/_includes/home.html +315 -0
  7. data/_includes/local_nav.html +23 -0
  8. data/_includes/nav.html +232 -0
  9. data/_includes/search.html +14 -0
  10. data/_includes/sidebar.html +47 -0
  11. data/_includes/vp_slots/doc_footer.html +0 -0
  12. data/_includes/vp_slots/head.html +1 -0
  13. data/_includes/vp_slots/layout_bottom.html +0 -0
  14. data/_layouts/default.html +127 -0
  15. data/_layouts/home.html +5 -0
  16. data/assets/css/vitepress-components.css +1524 -0
  17. data/assets/css/vitepress-core.css +2149 -0
  18. data/assets/css/vitepress-overrides.css +1408 -0
  19. data/assets/css/vp-icons.css +24 -0
  20. data/assets/images/favicon/apple-touch-icon.png +0 -0
  21. data/assets/images/favicon/favicon-96x96.png +0 -0
  22. data/assets/images/favicon/favicon.ico +0 -0
  23. data/assets/images/favicon/site.webmanifest +21 -0
  24. data/assets/images/favicon/web-app-manifest-192x192.png +0 -0
  25. data/assets/images/favicon/web-app-manifest-512x512.png +0 -0
  26. data/assets/images/file-icons/css.svg +1 -0
  27. data/assets/images/file-icons/default.svg +1 -0
  28. data/assets/images/file-icons/docker.svg +1 -0
  29. data/assets/images/file-icons/env.svg +1 -0
  30. data/assets/images/file-icons/go.svg +1 -0
  31. data/assets/images/file-icons/html.svg +1 -0
  32. data/assets/images/file-icons/java.svg +1 -0
  33. data/assets/images/file-icons/javascript.svg +1 -0
  34. data/assets/images/file-icons/json.svg +1 -0
  35. data/assets/images/file-icons/kotlin.svg +1 -0
  36. data/assets/images/file-icons/make.svg +1 -0
  37. data/assets/images/file-icons/markdown.svg +1 -0
  38. data/assets/images/file-icons/php.svg +1 -0
  39. data/assets/images/file-icons/python.svg +1 -0
  40. data/assets/images/file-icons/ruby.svg +1 -0
  41. data/assets/images/file-icons/rust.svg +1 -0
  42. data/assets/images/file-icons/shell.svg +1 -0
  43. data/assets/images/file-icons/sql.svg +1 -0
  44. data/assets/images/file-icons/text.svg +1 -0
  45. data/assets/images/file-icons/toml.svg +1 -0
  46. data/assets/images/file-icons/typescript.svg +1 -0
  47. data/assets/images/file-icons/vue.svg +1 -0
  48. data/assets/images/file-icons/xml.svg +1 -0
  49. data/assets/images/file-icons/yaml-dark.svg +1 -0
  50. data/assets/images/file-icons/yaml.svg +1 -0
  51. data/assets/images/logo.svg +337 -0
  52. data/assets/images/social-icons/bitbucket.svg +1 -0
  53. data/assets/images/social-icons/bluesky.svg +1 -0
  54. data/assets/images/social-icons/devdotto.svg +1 -0
  55. data/assets/images/social-icons/discord.svg +1 -0
  56. data/assets/images/social-icons/dribbble.svg +1 -0
  57. data/assets/images/social-icons/facebook.svg +1 -0
  58. data/assets/images/social-icons/github.svg +1 -0
  59. data/assets/images/social-icons/gitlab.svg +1 -0
  60. data/assets/images/social-icons/instagram.svg +1 -0
  61. data/assets/images/social-icons/linkedin.svg +1 -0
  62. data/assets/images/social-icons/mastodon.svg +1 -0
  63. data/assets/images/social-icons/medium.svg +1 -0
  64. data/assets/images/social-icons/npm.svg +1 -0
  65. data/assets/images/social-icons/reddit.svg +1 -0
  66. data/assets/images/social-icons/rss.svg +1 -0
  67. data/assets/images/social-icons/slack.svg +1 -0
  68. data/assets/images/social-icons/stackoverflow.svg +1 -0
  69. data/assets/images/social-icons/telegram.svg +1 -0
  70. data/assets/images/social-icons/twitch.svg +1 -0
  71. data/assets/images/social-icons/twitter.svg +1 -0
  72. data/assets/images/social-icons/x.svg +1 -0
  73. data/assets/images/social-icons/youtube.svg +1 -0
  74. data/assets/images/theme/vitepress-logo-large.svg +340 -0
  75. data/assets/images/theme/vitepress-logo-mini.svg +337 -0
  76. data/assets/js/vitepress-theme.js +1301 -0
  77. data/lib/jekyll/vitepress_theme/hooks.rb +111 -0
  78. data/lib/jekyll/vitepress_theme/version.rb +5 -0
  79. data/lib/jekyll-vitepress-theme.rb +3 -0
  80. metadata +143 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b16443ae3825807e971321a1c4492381c0f87e0e45e990c71189ab42dfed67ec
4
+ data.tar.gz: 87acf037fa7f85bbfda93cee166d5788f0c4a1e82c4183acbbfc4bd8c65c90ab
5
+ SHA512:
6
+ metadata.gz: a745075f8f8ce30ab015f96eb5acf3fa2f82a5860f311e6775fadf9078b170698592687c52913753192b0be4bcc9ad5ad1d795b09e895bad2b513a7654b53b10
7
+ data.tar.gz: b5288a28f63ca4725bdbb0e1f3334db18bdb96f8588f6504436daca4bcb596ab45ec53e66656853ab112c0b0dbb08830c53da0868212a8081107644bc90d514d
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Carmine Paolino
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,93 @@
1
+ # Jekyll VitePress Theme
2
+
3
+ A reusable Jekyll theme gem that reproduces the VitePress default docs experience.
4
+
5
+ ## What it includes
6
+
7
+ - VitePress-style layout structure (top nav, sidebar, outline, doc footer)
8
+ - Appearance toggle with `auto -> dark -> light`
9
+ - Local search modal (`/`, `Ctrl/Cmd+K`, `Cmd+K`)
10
+ - Code block copy button, language labels, file-title bars and icons
11
+ - Rouge-native syntax theme config (`vp_theme.rouge_theme.light/dark`)
12
+ - Last-updated hook via plugin
13
+ - Slot includes for lightweight theme extension (`_includes/vp_slots/head.html`, `doc_footer.html`, `layout_bottom.html`)
14
+
15
+ ## Installation
16
+
17
+ 1. Add the gem to your `Gemfile`:
18
+
19
+ ```ruby
20
+ gem "jekyll-vitepress-theme"
21
+ ```
22
+
23
+ 2. Enable it in `_config.yml`:
24
+
25
+ ```yaml
26
+ theme: jekyll-vitepress-theme
27
+ plugins:
28
+ - jekyll-vitepress-theme
29
+ ```
30
+
31
+ 3. Add `vp_theme` configuration:
32
+
33
+ ```yaml
34
+ vp_theme:
35
+ nav:
36
+ - text: Guide
37
+ link: /what-is-jekyll-vitepress-theme/
38
+ collections: [getting_started, core_features, advanced]
39
+ sidebar_collections:
40
+ - id: getting_started
41
+ text: Introduction
42
+ ```
43
+
44
+ ## Local development (this repo)
45
+
46
+ ```bash
47
+ bundle install
48
+ npm install
49
+ bundle exec jekyll serve --livereload
50
+ ```
51
+
52
+ Open `http://127.0.0.1:4000`.
53
+
54
+ ## Local Quality Gates
55
+
56
+ ```bash
57
+ # one-shot verification
58
+ bundle exec rake verify
59
+
60
+ # regenerate built-in social icon assets after changing icon list
61
+ npm run build:social-icons
62
+
63
+ # install and run git hooks
64
+ bundle exec overcommit --install
65
+ bundle exec overcommit --sign pre-commit
66
+ bundle exec overcommit --sign pre-push
67
+ bundle exec overcommit --run
68
+ ```
69
+
70
+ ## Docs versioning (this repo)
71
+
72
+ - `main` deploys unreleased docs to `/next/`
73
+ - `main` runs a release gate; when the gem version is unpublished, release docs deploy to `/v/x.y.z/` and refresh `/latest/`
74
+ - `gh-pages/versions.yml` is the single source of truth for the version selector
75
+
76
+ ## Theme configuration
77
+
78
+ See docs pages:
79
+
80
+ - [Getting Started](/getting-started/)
81
+ - [Configuration Reference](/configuration-reference/)
82
+ - [Frontmatter Reference](/frontmatter-reference/)
83
+
84
+ ## Release a gem
85
+
86
+ ```bash
87
+ gem build jekyll-vitepress-theme.gemspec
88
+ gem push jekyll-vitepress-theme-<version>.gem
89
+ ```
90
+
91
+ ## License
92
+
93
+ MIT
@@ -0,0 +1,184 @@
1
+ {% assign edit_link_enabled = true %}
2
+ {% if site.vp_theme.edit_link == false or page.edit_link == false %}
3
+ {% assign edit_link_enabled = false %}
4
+ {% endif %}
5
+
6
+ {% assign edit_link = nil %}
7
+ {% if edit_link_enabled and site.vp_theme.edit_link and site.vp_theme.edit_link.pattern and page.path %}
8
+ {% assign edit_link = site.vp_theme.edit_link.pattern | replace: ':path', page.path %}
9
+ {% endif %}
10
+
11
+ {% assign edit_link_text = 'Edit this page on GitHub' %}
12
+ {% if site.vp_theme.edit_link and site.vp_theme.edit_link.text %}
13
+ {% assign edit_link_text = site.vp_theme.edit_link.text %}
14
+ {% endif %}
15
+
16
+ {% assign last_updated_enabled = true %}
17
+ {% if site.vp_theme.last_updated == false or page.last_updated == false %}
18
+ {% assign last_updated_enabled = false %}
19
+ {% endif %}
20
+
21
+ {% assign last_updated_text = 'Last updated' %}
22
+ {% if site.vp_theme.last_updated and site.vp_theme.last_updated.text %}
23
+ {% assign last_updated_text = site.vp_theme.last_updated.text %}
24
+ {% endif %}
25
+
26
+ {% assign last_updated_format = '%-d %b %Y, %H:%M' %}
27
+ {% if site.vp_theme.last_updated and site.vp_theme.last_updated.format %}
28
+ {% assign last_updated_format = site.vp_theme.last_updated.format %}
29
+ {% endif %}
30
+
31
+ {% assign last_updated_at = page.last_updated_at | default: page.last_updated | default: nil %}
32
+ {% assign show_last_updated = false %}
33
+ {% if last_updated_enabled and last_updated_at %}
34
+ {% assign show_last_updated = true %}
35
+ {% endif %}
36
+
37
+ {% assign prev_doc = nil %}
38
+ {% assign next_doc = nil %}
39
+ {% if page.collection %}
40
+ {% assign docs = site[page.collection] | sort: 'nav_order' %}
41
+ {% assign found_current = false %}
42
+ {% for doc in docs %}
43
+ {% if found_current and next_doc == nil %}
44
+ {% assign next_doc = doc %}
45
+ {% endif %}
46
+
47
+ {% if doc.url == page.url %}
48
+ {% assign found_current = true %}
49
+ {% elsif found_current == false %}
50
+ {% assign prev_doc = doc %}
51
+ {% endif %}
52
+ {% endfor %}
53
+ {% endif %}
54
+
55
+ {% assign doc_footer_enabled = true %}
56
+ {% if site.vp_theme.doc_footer == false or page.doc_footer == false %}
57
+ {% assign doc_footer_enabled = false %}
58
+ {% endif %}
59
+
60
+ {% assign prev_enabled = doc_footer_enabled %}
61
+ {% assign next_enabled = doc_footer_enabled %}
62
+ {% assign prev_desc = 'Previous page' %}
63
+ {% assign next_desc = 'Next page' %}
64
+
65
+ {% if site.vp_theme.doc_footer and site.vp_theme.doc_footer != false %}
66
+ {% if site.vp_theme.doc_footer.prev == false %}
67
+ {% assign prev_enabled = false %}
68
+ {% elsif site.vp_theme.doc_footer.prev %}
69
+ {% assign prev_desc = site.vp_theme.doc_footer.prev %}
70
+ {% endif %}
71
+
72
+ {% if site.vp_theme.doc_footer.next == false %}
73
+ {% assign next_enabled = false %}
74
+ {% elsif site.vp_theme.doc_footer.next %}
75
+ {% assign next_desc = site.vp_theme.doc_footer.next %}
76
+ {% endif %}
77
+ {% endif %}
78
+
79
+ {% if page.doc_footer and page.doc_footer != false %}
80
+ {% if page.doc_footer.prev == false %}
81
+ {% assign prev_enabled = false %}
82
+ {% elsif page.doc_footer.prev %}
83
+ {% assign prev_desc = page.doc_footer.prev %}
84
+ {% endif %}
85
+
86
+ {% if page.doc_footer.next == false %}
87
+ {% assign next_enabled = false %}
88
+ {% elsif page.doc_footer.next %}
89
+ {% assign next_desc = page.doc_footer.next %}
90
+ {% endif %}
91
+ {% endif %}
92
+
93
+ {% if page.prev == false %}
94
+ {% assign prev_enabled = false %}
95
+ {% endif %}
96
+
97
+ {% if page.next == false %}
98
+ {% assign next_enabled = false %}
99
+ {% endif %}
100
+
101
+ {% assign prev_url = nil %}
102
+ {% assign prev_title = nil %}
103
+ {% assign next_url = nil %}
104
+ {% assign next_title = nil %}
105
+
106
+ {% if prev_enabled %}
107
+ {% if page.prev and page.prev != false and page.prev.link %}
108
+ {% assign prev_url = page.prev.link %}
109
+ {% assign prev_title = page.prev.text | default: page.prev.link %}
110
+ {% elsif prev_doc %}
111
+ {% assign prev_url = prev_doc.url | relative_url %}
112
+ {% assign prev_title = prev_doc.title %}
113
+ {% endif %}
114
+ {% endif %}
115
+
116
+ {% if next_enabled %}
117
+ {% if page.next and page.next != false and page.next.link %}
118
+ {% assign next_url = page.next.link %}
119
+ {% assign next_title = page.next.text | default: page.next.link %}
120
+ {% elsif next_doc %}
121
+ {% assign next_url = next_doc.url | relative_url %}
122
+ {% assign next_title = next_doc.title %}
123
+ {% endif %}
124
+ {% endif %}
125
+
126
+ {% assign show_prev_link = false %}
127
+ {% assign show_next_link = false %}
128
+ {% if prev_url and prev_title %}
129
+ {% assign show_prev_link = true %}
130
+ {% endif %}
131
+ {% if next_url and next_title %}
132
+ {% assign show_next_link = true %}
133
+ {% endif %}
134
+
135
+ {% assign show_footer = false %}
136
+ {% if edit_link or show_last_updated or show_prev_link or show_next_link %}
137
+ {% assign show_footer = true %}
138
+ {% endif %}
139
+
140
+ {% if show_footer %}
141
+ <footer class="VPDocFooter">
142
+ {% if edit_link or show_last_updated %}
143
+ <div class="edit-info">
144
+ {% if edit_link %}
145
+ <div class="edit-link">
146
+ <a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="{{ edit_link }}" target="_blank" rel="noreferrer">
147
+ <span class="vpi-square-pen edit-link-icon"></span>
148
+ {{ edit_link_text }}
149
+ </a>
150
+ </div>
151
+ {% endif %}
152
+ {% if show_last_updated %}
153
+ <div class="last-updated">
154
+ <p class="VPLastUpdated">{{ last_updated_text }}: <time datetime="{{ last_updated_at | date_to_xmlschema }}" lang="{{ site.lang | default: 'en-US' }}">{{ last_updated_at | date: last_updated_format }}</time></p>
155
+ </div>
156
+ {% endif %}
157
+ </div>
158
+ {% endif %}
159
+
160
+ {% if show_prev_link or show_next_link %}
161
+ <nav class="prev-next" aria-labelledby="doc-footer-aria-label">
162
+ <span class="visually-hidden" id="doc-footer-aria-label">Pager</span>
163
+
164
+ <div class="pager">
165
+ {% if show_prev_link %}
166
+ <a class="VPLink link pager-link prev" href="{{ prev_url }}">
167
+ <span class="desc">{{ prev_desc }}</span>
168
+ <span class="title">{{ prev_title }}</span>
169
+ </a>
170
+ {% endif %}
171
+ </div>
172
+
173
+ <div class="pager">
174
+ {% if show_next_link %}
175
+ <a class="VPLink link pager-link next" href="{{ next_url }}">
176
+ <span class="desc">{{ next_desc }}</span>
177
+ <span class="title">{{ next_title }}</span>
178
+ </a>
179
+ {% endif %}
180
+ </div>
181
+ </nav>
182
+ {% endif %}
183
+ </footer>
184
+ {% endif %}
@@ -0,0 +1,98 @@
1
+ <head>
2
+ <meta charset="UTF-8">
3
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
4
+ {% assign page_title = page.title | default: site.title %}
5
+ <title>{% if page_title and page_title != site.title %}{{ page_title }} | {{ site.title }}{% else %}{{ site.title }}{% endif %}</title>
6
+ <meta name="description" content="{{ page.description | default: site.description | escape }}">
7
+ <link rel="icon" href="{{ site.vp_theme.logo | default: site.vp_theme.logo_light | default: '/vitepress-logo-mini.svg' | relative_url }}">
8
+ {% assign vp_google_fonts_url = site.vp_theme.google_fonts_url | default: 'https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap' %}
9
+ {% if vp_google_fonts_url %}
10
+ <link rel="preconnect" href="https://fonts.googleapis.com">
11
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
12
+ <link rel="stylesheet" href="{{ vp_google_fonts_url }}">
13
+ {% endif %}
14
+
15
+ <script>
16
+ (function() {
17
+ var storageKey = 'vitepress-theme-appearance';
18
+ var validModes = ['auto', 'dark', 'light'];
19
+ function normalizeMode(value) {
20
+ return validModes.indexOf(value) >= 0 ? value : 'auto';
21
+ }
22
+ var mode = 'auto';
23
+ try {
24
+ var stored = window.localStorage.getItem(storageKey);
25
+ if (stored) mode = normalizeMode(stored);
26
+ } catch (e) {}
27
+
28
+ var isDark = mode === 'dark' || (mode === 'auto' && window.matchMedia('(prefers-color-scheme: dark)').matches);
29
+ document.documentElement.classList.toggle('dark', isDark);
30
+ document.documentElement.classList.toggle('light', !isDark);
31
+ document.documentElement.setAttribute('data-appearance-mode', mode);
32
+
33
+ if (/Mac|iPhone|iPad|iPod/.test(navigator.platform)) {
34
+ document.documentElement.classList.add('mac');
35
+ }
36
+ })();
37
+ </script>
38
+
39
+ <link rel="stylesheet" href="{{ '/assets/css/vitepress-core.css' | relative_url }}">
40
+ <link rel="stylesheet" href="{{ '/assets/css/vitepress-components.css' | relative_url }}">
41
+ <link rel="stylesheet" href="{{ '/assets/css/vp-icons.css' | relative_url }}">
42
+ <link rel="stylesheet" href="{{ '/assets/css/vitepress-overrides.css' | relative_url }}">
43
+
44
+ {% assign vp_font_family_base = site.vp_theme.font_family_base %}
45
+ {% assign vp_font_family_mono = site.vp_theme.font_family_mono %}
46
+ {% assign vp_css_vars_light = site.vp_theme.css_vars.light %}
47
+ {% assign vp_css_vars_dark = site.vp_theme.css_vars.dark %}
48
+ {% assign has_theme_var_overrides = false %}
49
+ {% if vp_font_family_base or vp_font_family_mono %}
50
+ {% assign has_theme_var_overrides = true %}
51
+ {% endif %}
52
+ {% if vp_css_vars_light and vp_css_vars_light.size > 0 %}
53
+ {% assign has_theme_var_overrides = true %}
54
+ {% endif %}
55
+ {% if vp_css_vars_dark and vp_css_vars_dark.size > 0 %}
56
+ {% assign has_theme_var_overrides = true %}
57
+ {% endif %}
58
+ {% if has_theme_var_overrides %}
59
+ <style id="vp-theme-vars">
60
+ :root {
61
+ {% if vp_font_family_base %}--vp-font-family-base: {{ vp_font_family_base }};{% endif %}
62
+ {% if vp_font_family_mono %}--vp-font-family-mono: {{ vp_font_family_mono }};{% endif %}
63
+ {% if vp_css_vars_light %}
64
+ {% for pair in vp_css_vars_light %}
65
+ {% assign css_var_name = pair[0] | strip %}
66
+ {% if css_var_name contains '--' %}
67
+ {{ css_var_name }}: {{ pair[1] }};
68
+ {% else %}
69
+ --{{ css_var_name }}: {{ pair[1] }};
70
+ {% endif %}
71
+ {% endfor %}
72
+ {% endif %}
73
+ }
74
+ {% if vp_css_vars_dark and vp_css_vars_dark.size > 0 %}
75
+ .dark {
76
+ {% for pair in vp_css_vars_dark %}
77
+ {% assign css_var_name = pair[0] | strip %}
78
+ {% if css_var_name contains '--' %}
79
+ {{ css_var_name }}: {{ pair[1] }};
80
+ {% else %}
81
+ --{{ css_var_name }}: {{ pair[1] }};
82
+ {% endif %}
83
+ {% endfor %}
84
+ }
85
+ {% endif %}
86
+ </style>
87
+ {% endif %}
88
+
89
+ {% assign vp_rouge_css = site.vp_theme._generated_rouge_css %}
90
+ {% if vp_rouge_css and vp_rouge_css != '' %}
91
+ <style id="vp-rouge-theme">
92
+ {{ vp_rouge_css }}
93
+ </style>
94
+ {% endif %}
95
+
96
+ {% include vp_slots/head.html %}
97
+ <script src="{{ '/assets/js/vitepress-theme.js' | relative_url }}" defer></script>
98
+ </head>