arsxy-theme 1.0.0.pre.rc
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 +7 -0
- data/LICENSE +21 -0
- data/README.md +166 -0
- data/_config.yml +131 -0
- data/_includes/footer.html +45 -0
- data/_includes/header.html +68 -0
- data/_includes/image.html +8 -0
- data/_includes/related-posts.html +83 -0
- data/_includes/search.html +32 -0
- data/_includes/social-sharing.html +86 -0
- data/_includes/toc.html +83 -0
- data/_layouts/default.html +76 -0
- data/_layouts/docs.html +90 -0
- data/_layouts/home.html +172 -0
- data/_layouts/post.html +114 -0
- data/_sass/_base.scss +264 -0
- data/_sass/_dark-mode.scss +749 -0
- data/_sass/_layout.scss +118 -0
- data/_sass/_responsive.scss +157 -0
- data/_sass/_syntax-highlighting.scss +147 -0
- data/_sass/_typography.scss +226 -0
- data/_sass/_utilities.scss +138 -0
- data/_sass/_variables.scss +63 -0
- data/_sass/components/_code.scss +245 -0
- data/_sass/components/_docs.scss +263 -0
- data/_sass/components/_footer.scss +170 -0
- data/_sass/components/_header.scss +313 -0
- data/_sass/components/_homepage.scss +597 -0
- data/_sass/components/_image.scss +22 -0
- data/_sass/components/_pagination.scss +146 -0
- data/_sass/components/_post.scss +1039 -0
- data/_sass/components/_related-posts.scss +70 -0
- data/_sass/components/_search.scss +276 -0
- data/_sass/components/_social-sharing.scss +95 -0
- data/_sass/components/_toc.scss +193 -0
- data/assets/css/main.scss +24 -0
- data/assets/images/favicon/android-chrome-192x192.png +0 -0
- data/assets/images/favicon/android-chrome-512x512.png +0 -0
- data/assets/images/favicon/apple-touch-icon.png +0 -0
- data/assets/images/favicon/favicon-16x16.png +0 -0
- data/assets/images/favicon/favicon-32x32.png +0 -0
- data/assets/images/favicon/favicon.ico +0 -0
- data/assets/images/favicon/site.webmanifest +19 -0
- data/assets/images/new-features-update.svg +58 -0
- data/assets/images/related-posts-example.svg +37 -0
- data/assets/images/seo-optimization.png +0 -0
- data/assets/images/social-sharing-sample.png +0 -0
- data/assets/images/ss-arsxy-theme.png +0 -0
- data/assets/images/table-of-content-thumbnail.png +0 -0
- data/assets/images/theme-demo-2.jpeg +0 -0
- data/assets/images/theme-demo.jpeg +0 -0
- data/assets/images/welcome-to-arsxy-theme.png +0 -0
- data/assets/js/main.js +369 -0
- data/assets/js/search-index.json +31 -0
- data/assets/js/search.js +207 -0
- metadata +226 -0
data/assets/js/search.js
ADDED
@@ -0,0 +1,207 @@
|
|
1
|
+
/**
|
2
|
+
* Search functionality for Arsxy Theme
|
3
|
+
*/
|
4
|
+
(function() {
|
5
|
+
// DOM Elements
|
6
|
+
const searchInput = document.getElementById('search-input');
|
7
|
+
const searchInputOverlay = document.getElementById('search-input-overlay');
|
8
|
+
const searchResults = document.getElementById('search-results');
|
9
|
+
const searchResultsOverlay = document.getElementById('search-results-overlay');
|
10
|
+
const searchToggleButton = document.getElementById('search-toggle-button');
|
11
|
+
const closeSearchButton = document.getElementById('close-search');
|
12
|
+
const searchOverlay = document.getElementById('search-overlay');
|
13
|
+
|
14
|
+
// Search state
|
15
|
+
let searchIndex = [];
|
16
|
+
let activeSearchArea = null; // To know which search area is currently active
|
17
|
+
|
18
|
+
// Get site baseurl from meta tag (added by Jekyll)
|
19
|
+
const baseUrlMeta = document.querySelector('meta[name="baseurl"]');
|
20
|
+
const baseUrl = baseUrlMeta ? baseUrlMeta.getAttribute('content') : '';
|
21
|
+
|
22
|
+
// Fetch search index with proper baseurl
|
23
|
+
fetch(baseUrl + '/assets/js/search-index.json')
|
24
|
+
.then(response => {
|
25
|
+
if (!response.ok) {
|
26
|
+
throw new Error(`HTTP error! Status: ${response.status}`);
|
27
|
+
}
|
28
|
+
return response.json();
|
29
|
+
})
|
30
|
+
.then(data => {
|
31
|
+
searchIndex = data;
|
32
|
+
console.log('Search index loaded successfully:', data.length, 'items');
|
33
|
+
})
|
34
|
+
.catch(error => {
|
35
|
+
console.error('Error loading search index:', error);
|
36
|
+
});
|
37
|
+
|
38
|
+
// Event listeners for toggle buttons
|
39
|
+
if (searchToggleButton) {
|
40
|
+
searchToggleButton.addEventListener('click', () => {
|
41
|
+
openSearchOverlay();
|
42
|
+
});
|
43
|
+
}
|
44
|
+
|
45
|
+
if (closeSearchButton) {
|
46
|
+
closeSearchButton.addEventListener('click', () => {
|
47
|
+
closeSearchOverlay();
|
48
|
+
});
|
49
|
+
}
|
50
|
+
|
51
|
+
// Function to open search overlay
|
52
|
+
function openSearchOverlay() {
|
53
|
+
searchOverlay.classList.add('active');
|
54
|
+
setTimeout(() => {
|
55
|
+
searchInputOverlay.focus();
|
56
|
+
}, 100);
|
57
|
+
activeSearchArea = 'overlay';
|
58
|
+
}
|
59
|
+
|
60
|
+
// Function to close search overlay
|
61
|
+
function closeSearchOverlay() {
|
62
|
+
searchOverlay.classList.remove('active');
|
63
|
+
searchInputOverlay.value = '';
|
64
|
+
searchResultsOverlay.innerHTML = '';
|
65
|
+
activeSearchArea = null;
|
66
|
+
}
|
67
|
+
|
68
|
+
// Global keyboard shortcut for search (Ctrl+S / Cmd+S)
|
69
|
+
document.addEventListener('keydown', (e) => {
|
70
|
+
// Check for Ctrl+S or Cmd+S (Mac)
|
71
|
+
if ((e.ctrlKey || e.metaKey) && e.key === 's') {
|
72
|
+
// Prevent default browser save dialog
|
73
|
+
e.preventDefault();
|
74
|
+
|
75
|
+
// Open search overlay if it exists
|
76
|
+
if (searchOverlay) {
|
77
|
+
openSearchOverlay();
|
78
|
+
}
|
79
|
+
}
|
80
|
+
|
81
|
+
// Close overlay with Escape key
|
82
|
+
if (e.key === 'Escape' && searchOverlay && searchOverlay.classList.contains('active')) {
|
83
|
+
closeSearchOverlay();
|
84
|
+
}
|
85
|
+
});
|
86
|
+
|
87
|
+
// Handle search input
|
88
|
+
function registerSearchHandler(input, resultsContainer) {
|
89
|
+
if (!input) return;
|
90
|
+
|
91
|
+
input.addEventListener('input', debounce(function() {
|
92
|
+
const query = input.value.trim().toLowerCase();
|
93
|
+
|
94
|
+
if (query.length < 2) {
|
95
|
+
resultsContainer.innerHTML = '';
|
96
|
+
return;
|
97
|
+
}
|
98
|
+
|
99
|
+
performSearch(query, resultsContainer);
|
100
|
+
}, 300));
|
101
|
+
|
102
|
+
input.addEventListener('keydown', function(e) {
|
103
|
+
// If Enter is pressed and we have results
|
104
|
+
if (e.key === 'Enter' && resultsContainer.querySelector('.search-result')) {
|
105
|
+
const firstResult = resultsContainer.querySelector('.search-result a');
|
106
|
+
if (firstResult) {
|
107
|
+
window.location.href = firstResult.getAttribute('href');
|
108
|
+
}
|
109
|
+
}
|
110
|
+
});
|
111
|
+
}
|
112
|
+
|
113
|
+
// Register the search handlers for both search areas
|
114
|
+
if (searchInput) {
|
115
|
+
registerSearchHandler(searchInput, searchResults);
|
116
|
+
}
|
117
|
+
|
118
|
+
if (searchInputOverlay) {
|
119
|
+
registerSearchHandler(searchInputOverlay, searchResultsOverlay);
|
120
|
+
}
|
121
|
+
|
122
|
+
// Perform search
|
123
|
+
function performSearch(query, resultsContainer) {
|
124
|
+
// Clear previous results
|
125
|
+
resultsContainer.innerHTML = '';
|
126
|
+
|
127
|
+
if (searchIndex.length === 0) {
|
128
|
+
resultsContainer.innerHTML = '<div class="search-message">Search index is loading...</div>';
|
129
|
+
return;
|
130
|
+
}
|
131
|
+
|
132
|
+
// Filter the search index based on the query
|
133
|
+
const results = searchIndex.filter(item => {
|
134
|
+
const titleMatch = item.title.toLowerCase().includes(query);
|
135
|
+
const contentMatch = item.content.toLowerCase().includes(query);
|
136
|
+
const tagsMatch = item.tags ? item.tags.some(tag => tag.toLowerCase().includes(query)) : false;
|
137
|
+
const categoryMatch = item.categories ? item.categories.some(cat => cat.toLowerCase().includes(query)) : false;
|
138
|
+
|
139
|
+
return titleMatch || contentMatch || tagsMatch || categoryMatch;
|
140
|
+
});
|
141
|
+
|
142
|
+
// Display results
|
143
|
+
if (results.length === 0) {
|
144
|
+
resultsContainer.innerHTML = '<div class="search-message">No results found</div>';
|
145
|
+
return;
|
146
|
+
}
|
147
|
+
|
148
|
+
// Create results HTML
|
149
|
+
const resultsHTML = results.slice(0, 10).map(result => {
|
150
|
+
// Find the position of the query in the content
|
151
|
+
const contentLower = result.content.toLowerCase();
|
152
|
+
const queryPosition = contentLower.indexOf(query);
|
153
|
+
|
154
|
+
// Create excerpt with context around the match
|
155
|
+
let contextExcerpt = result.excerpt;
|
156
|
+
if (queryPosition !== -1) {
|
157
|
+
const start = Math.max(0, queryPosition - 50);
|
158
|
+
const end = Math.min(result.content.length, queryPosition + query.length + 50);
|
159
|
+
contextExcerpt = '...' + result.content.substring(start, end) + '...';
|
160
|
+
}
|
161
|
+
|
162
|
+
// Highlight the query in the excerpt
|
163
|
+
const highlightedExcerpt = highlightQuery(contextExcerpt, query);
|
164
|
+
|
165
|
+
return `
|
166
|
+
<div class="search-result">
|
167
|
+
<a href="${result.url}" class="search-result-link">
|
168
|
+
<h3 class="search-result-title">${highlightQuery(result.title, query)}</h3>
|
169
|
+
<div class="search-result-meta">
|
170
|
+
<span class="search-result-date">${result.date}</span>
|
171
|
+
${result.categories ? '<span class="search-result-categories">' + result.categories.join(', ') + '</span>' : ''}
|
172
|
+
</div>
|
173
|
+
<div class="search-result-excerpt">${highlightedExcerpt}</div>
|
174
|
+
</a>
|
175
|
+
</div>
|
176
|
+
`;
|
177
|
+
}).join('');
|
178
|
+
|
179
|
+
resultsContainer.innerHTML = resultsHTML;
|
180
|
+
}
|
181
|
+
|
182
|
+
// Highlight the query in a text string
|
183
|
+
function highlightQuery(text, query) {
|
184
|
+
if (!text) return '';
|
185
|
+
|
186
|
+
const regex = new RegExp('(' + escapeRegExp(query) + ')', 'gi');
|
187
|
+
return text.replace(regex, '<mark>$1</mark>');
|
188
|
+
}
|
189
|
+
|
190
|
+
// Escape special characters for use in a regular expression
|
191
|
+
function escapeRegExp(string) {
|
192
|
+
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
193
|
+
}
|
194
|
+
|
195
|
+
// Debounce function to limit how often a function is called
|
196
|
+
function debounce(func, wait) {
|
197
|
+
let timeout;
|
198
|
+
return function() {
|
199
|
+
const context = this;
|
200
|
+
const args = arguments;
|
201
|
+
clearTimeout(timeout);
|
202
|
+
timeout = setTimeout(() => {
|
203
|
+
func.apply(context, args);
|
204
|
+
}, wait);
|
205
|
+
};
|
206
|
+
}
|
207
|
+
})();
|
metadata
ADDED
@@ -0,0 +1,226 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: arsxy-theme
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0.pre.rc
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- awcodify
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2025-05-16 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.10.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.10.0
|
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.12'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.12'
|
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.6'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.6'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: jekyll-sitemap
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.4'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.4'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: jekyll-paginate
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.1'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.1'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: jekyll-minifier
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.1.10
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.1.10
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: jekyll-responsive-image
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1.5'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.5'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: bundler
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '2.0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '2.0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rake
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '12.0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '12.0'
|
139
|
+
description: Arsxy Theme is a minimal Jekyll theme optimized for readability, performance,
|
140
|
+
and SEO. It features a clean flat design, responsive layout, and optimized assets
|
141
|
+
for speed.
|
142
|
+
email:
|
143
|
+
- awcodify@gmail.com
|
144
|
+
executables: []
|
145
|
+
extensions: []
|
146
|
+
extra_rdoc_files: []
|
147
|
+
files:
|
148
|
+
- LICENSE
|
149
|
+
- README.md
|
150
|
+
- _config.yml
|
151
|
+
- _includes/footer.html
|
152
|
+
- _includes/header.html
|
153
|
+
- _includes/image.html
|
154
|
+
- _includes/related-posts.html
|
155
|
+
- _includes/search.html
|
156
|
+
- _includes/social-sharing.html
|
157
|
+
- _includes/toc.html
|
158
|
+
- _layouts/default.html
|
159
|
+
- _layouts/docs.html
|
160
|
+
- _layouts/home.html
|
161
|
+
- _layouts/post.html
|
162
|
+
- _sass/_base.scss
|
163
|
+
- _sass/_dark-mode.scss
|
164
|
+
- _sass/_layout.scss
|
165
|
+
- _sass/_responsive.scss
|
166
|
+
- _sass/_syntax-highlighting.scss
|
167
|
+
- _sass/_typography.scss
|
168
|
+
- _sass/_utilities.scss
|
169
|
+
- _sass/_variables.scss
|
170
|
+
- _sass/components/_code.scss
|
171
|
+
- _sass/components/_docs.scss
|
172
|
+
- _sass/components/_footer.scss
|
173
|
+
- _sass/components/_header.scss
|
174
|
+
- _sass/components/_homepage.scss
|
175
|
+
- _sass/components/_image.scss
|
176
|
+
- _sass/components/_pagination.scss
|
177
|
+
- _sass/components/_post.scss
|
178
|
+
- _sass/components/_related-posts.scss
|
179
|
+
- _sass/components/_search.scss
|
180
|
+
- _sass/components/_social-sharing.scss
|
181
|
+
- _sass/components/_toc.scss
|
182
|
+
- assets/css/main.scss
|
183
|
+
- assets/images/favicon/android-chrome-192x192.png
|
184
|
+
- assets/images/favicon/android-chrome-512x512.png
|
185
|
+
- assets/images/favicon/apple-touch-icon.png
|
186
|
+
- assets/images/favicon/favicon-16x16.png
|
187
|
+
- assets/images/favicon/favicon-32x32.png
|
188
|
+
- assets/images/favicon/favicon.ico
|
189
|
+
- assets/images/favicon/site.webmanifest
|
190
|
+
- assets/images/new-features-update.svg
|
191
|
+
- assets/images/related-posts-example.svg
|
192
|
+
- assets/images/seo-optimization.png
|
193
|
+
- assets/images/social-sharing-sample.png
|
194
|
+
- assets/images/ss-arsxy-theme.png
|
195
|
+
- assets/images/table-of-content-thumbnail.png
|
196
|
+
- assets/images/theme-demo-2.jpeg
|
197
|
+
- assets/images/theme-demo.jpeg
|
198
|
+
- assets/images/welcome-to-arsxy-theme.png
|
199
|
+
- assets/js/main.js
|
200
|
+
- assets/js/search-index.json
|
201
|
+
- assets/js/search.js
|
202
|
+
homepage: https://github.com/awcodify/arsxy-theme
|
203
|
+
licenses:
|
204
|
+
- MIT
|
205
|
+
metadata: {}
|
206
|
+
post_install_message:
|
207
|
+
rdoc_options: []
|
208
|
+
require_paths:
|
209
|
+
- lib
|
210
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
211
|
+
requirements:
|
212
|
+
- - ">="
|
213
|
+
- !ruby/object:Gem::Version
|
214
|
+
version: '0'
|
215
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
216
|
+
requirements:
|
217
|
+
- - ">="
|
218
|
+
- !ruby/object:Gem::Version
|
219
|
+
version: '0'
|
220
|
+
requirements: []
|
221
|
+
rubygems_version: 3.5.16
|
222
|
+
signing_key:
|
223
|
+
specification_version: 4
|
224
|
+
summary: A clean, fast and SEO-friendly Jekyll theme with flat design and responsive
|
225
|
+
layout
|
226
|
+
test_files: []
|