rawfeed 0.0.1 → 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 +4 -4
- data/LICENSE.txt +21 -0
- data/README.md +153 -1
- data/_data/resume.yml +184 -0
- data/_includes/alert +3 -0
- data/_includes/chart +34 -0
- data/_includes/details +57 -0
- data/_includes/enddetails +2 -0
- data/_includes/endtabs +2 -0
- data/_includes/image +61 -0
- data/_includes/layout/blog_search.html +18 -0
- data/_includes/layout/data.liquid +3 -0
- data/_includes/layout/disqus.html +30 -0
- data/_includes/layout/footer.html +34 -0
- data/_includes/layout/giscus.html +21 -0
- data/_includes/layout/google_analytics.html +11 -0
- data/_includes/layout/head.html +59 -0
- data/_includes/layout/header.html +143 -0
- data/_includes/layout/maintenance.html +30 -0
- data/_includes/layout/paginator.html +35 -0
- data/_includes/socials +22 -0
- data/_includes/tabs +94 -0
- data/_includes/toc +160 -0
- data/_includes/video +10 -0
- data/_layouts/blog.html +46 -0
- data/_layouts/contact.html +285 -0
- data/_layouts/default.html +248 -0
- data/_layouts/error.html +15 -0
- data/_layouts/home.html +58 -0
- data/_layouts/page.html +9 -0
- data/_layouts/post.html +103 -0
- data/_layouts/resume.html +260 -0
- data/_layouts/tag.html +22 -0
- data/_layouts/tag_posts.html +27 -0
- data/_sass/base/_index.scss +63 -0
- data/_sass/base/_reset.scss +10 -0
- data/_sass/base/_typography.scss +0 -0
- data/_sass/components/_badges.scss +24 -0
- data/_sass/components/_button.scss +17 -0
- data/_sass/components/_forms.scss +42 -0
- data/_sass/components/_gifs.scss +5 -0
- data/_sass/components/_index.scss +5 -0
- data/_sass/components/_markdown.scss +453 -0
- data/_sass/includes/_footer.scss +45 -0
- data/_sass/includes/_header.scss +240 -0
- data/_sass/includes/_highlight.scss +87 -0
- data/_sass/includes/_index.scss +9 -0
- data/_sass/includes/_maintenance.scss +16 -0
- data/_sass/includes/_paginator.scss +22 -0
- data/_sass/includes/_rouge-dark.scss +81 -0
- data/_sass/includes/_rouge-light.scss +121 -0
- data/_sass/includes/_terminal.scss +208 -0
- data/_sass/layouts/_blog.scss +96 -0
- data/_sass/layouts/_contact.scss +55 -0
- data/_sass/layouts/_default.scss +14 -0
- data/_sass/layouts/_error.scss +18 -0
- data/_sass/layouts/_home.scss +19 -0
- data/_sass/layouts/_index.scss +10 -0
- data/_sass/layouts/_page.scss +5 -0
- data/_sass/layouts/_post.scss +109 -0
- data/_sass/layouts/_resume.scss +330 -0
- data/_sass/layouts/_tag-posts.scss +48 -0
- data/_sass/layouts/_tag.scss +22 -0
- data/_sass/main.scss +128 -0
- data/_sass/theme/_dark.scss +79 -0
- data/_sass/theme/_index.scss +13 -0
- data/_sass/theme/_light.scss +56 -0
- data/assets/css/style.scss +5 -0
- data/assets/images/avatar_back.png +0 -0
- data/assets/images/avatar_dark.png +0 -0
- data/assets/images/avatar_light.png +0 -0
- data/assets/images/favicon.png +0 -0
- data/assets/js/avatar.js +50 -0
- data/assets/js/blog_search.js +102 -0
- data/assets/js/default.js +148 -0
- data/assets/js/terminal.js +15 -0
- data/assets/js/toc.js +20 -0
- data/assets/json/blog_search.json +16 -0
- data/assets/vendor/bootstrap/css/bootstrap-grid.css +4124 -0
- data/assets/vendor/bootstrap/css/bootstrap-grid.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap-grid.min.css +7 -0
- data/assets/vendor/bootstrap/css/bootstrap-grid.min.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap-grid.rtl.css +4123 -0
- data/assets/vendor/bootstrap/css/bootstrap-grid.rtl.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap-grid.rtl.min.css +7 -0
- data/assets/vendor/bootstrap/css/bootstrap-grid.rtl.min.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap-reboot.css +488 -0
- data/assets/vendor/bootstrap/css/bootstrap-reboot.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap-reboot.min.css +7 -0
- data/assets/vendor/bootstrap/css/bootstrap-reboot.min.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap-reboot.rtl.css +485 -0
- data/assets/vendor/bootstrap/css/bootstrap-reboot.rtl.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap-reboot.rtl.min.css +7 -0
- data/assets/vendor/bootstrap/css/bootstrap-reboot.rtl.min.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap-utilities.css +4266 -0
- data/assets/vendor/bootstrap/css/bootstrap-utilities.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap-utilities.min.css +7 -0
- data/assets/vendor/bootstrap/css/bootstrap-utilities.min.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap-utilities.rtl.css +4257 -0
- data/assets/vendor/bootstrap/css/bootstrap-utilities.rtl.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap-utilities.rtl.min.css +7 -0
- data/assets/vendor/bootstrap/css/bootstrap-utilities.rtl.min.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap.css +10878 -0
- data/assets/vendor/bootstrap/css/bootstrap.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap.min.css +7 -0
- data/assets/vendor/bootstrap/css/bootstrap.min.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap.rtl.css +10842 -0
- data/assets/vendor/bootstrap/css/bootstrap.rtl.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap.rtl.min.css +7 -0
- data/assets/vendor/bootstrap/css/bootstrap.rtl.min.css.map +1 -0
- data/assets/vendor/bootstrap/js/bootstrap.bundle.js +7075 -0
- data/assets/vendor/bootstrap/js/bootstrap.bundle.js.map +1 -0
- data/assets/vendor/bootstrap/js/bootstrap.bundle.min.js +7 -0
- data/assets/vendor/bootstrap/js/bootstrap.bundle.min.js.map +1 -0
- data/assets/vendor/bootstrap/js/bootstrap.esm.js +5202 -0
- data/assets/vendor/bootstrap/js/bootstrap.esm.js.map +1 -0
- data/assets/vendor/bootstrap/js/bootstrap.esm.min.js +7 -0
- data/assets/vendor/bootstrap/js/bootstrap.esm.min.js.map +1 -0
- data/assets/vendor/bootstrap/js/bootstrap.js +5249 -0
- data/assets/vendor/bootstrap/js/bootstrap.js.map +1 -0
- data/assets/vendor/bootstrap/js/bootstrap.min.js +7 -0
- data/assets/vendor/bootstrap/js/bootstrap.min.js.map +1 -0
- data/assets/vendor/simple-jekyll-search.js +433 -0
- data/assets/vendor/simple-jekyll-search.min.js +6 -0
- data/lib/rawfeed/draft.rb +31 -0
- data/lib/rawfeed/installer.rb +37 -0
- data/lib/rawfeed/layout.rb +138 -0
- data/lib/rawfeed/page.rb +33 -0
- data/lib/rawfeed/post.rb +60 -0
- data/lib/rawfeed/resume.rb +59 -0
- data/lib/rawfeed/utils.rb +74 -0
- data/lib/rawfeed/version.rb +1 -1
- data/lib/rawfeed.rb +5 -7
- metadata +145 -2
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
$theme-colors: (
|
|
2
|
+
bg: #181818,
|
|
3
|
+
text: #bfbfbf,
|
|
4
|
+
text-muted: #9b9b9b,
|
|
5
|
+
// default primary: #66c9e2 | #61b8b8
|
|
6
|
+
// primary dark blue: #668be2
|
|
7
|
+
// primary grovbox: #ebdbb2
|
|
8
|
+
// primary oliva: #639e5b
|
|
9
|
+
// primary oliva2: #75a683
|
|
10
|
+
// primary opaque aqua: #61b8b8
|
|
11
|
+
primary: #4ce4c8,
|
|
12
|
+
shadow-color: rgba(0, 0, 0, 0.1),
|
|
13
|
+
code-color: #f55ca8,
|
|
14
|
+
code-block-header-color: #141414,
|
|
15
|
+
border-color: #373737,
|
|
16
|
+
scrollbar-color: rgba(255, 255, 255, 0.534),
|
|
17
|
+
blockquote-bg-color: #131313,
|
|
18
|
+
footer-border-color: #020202,
|
|
19
|
+
footer-bg-color: #111111,
|
|
20
|
+
terminal-shadow: 0 10px 30px rgba(0, 0, 0, 0.7),
|
|
21
|
+
sumary-bg-color: #303030,
|
|
22
|
+
checkbox-border-color: #2b2b2b,
|
|
23
|
+
checkbox-border-color-after: #999999,
|
|
24
|
+
table-border-color: #a5a5a5,
|
|
25
|
+
table-color: #bfbfbf,
|
|
26
|
+
table-tr-bg-color: #131313,
|
|
27
|
+
table-tr-border-color: #585858,
|
|
28
|
+
table-td-border-color: #585858,
|
|
29
|
+
table-tr-odd-bg-color: #313131,
|
|
30
|
+
table-tr-even-bg-color: #181818,
|
|
31
|
+
terminal-color: #97ff97,
|
|
32
|
+
terminal-bg-color: #000000,
|
|
33
|
+
terminal-border-color: #1a1a1a,
|
|
34
|
+
terminal-btn-close-bg-color: #0bff55,
|
|
35
|
+
terminal-btn-min-bg-color: #0b9e3a,
|
|
36
|
+
terminal-btn-max-bg-color: #0b6b2a,
|
|
37
|
+
terminal-title-color: #4b8f3e,
|
|
38
|
+
terminal-screen-text-shadow: "0 0 5px #00FF41, 0 0 10px #00B831",
|
|
39
|
+
terminal-screen-after-bg-color: "repeating-linear-gradient(to bottom, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.5) 1px, transparent 1px,transparent 3px)",
|
|
40
|
+
terminal-header-border-bottom-color: rgba(56, 56, 56, 0.5),
|
|
41
|
+
terminal-prompt-text-color: #97ff97,
|
|
42
|
+
terminal-screen-text-transform: uppercase,
|
|
43
|
+
terminal-cursor-color: #7cff6b,
|
|
44
|
+
terminal-screen-link-color: aqua,
|
|
45
|
+
details-bg-color: #383838,
|
|
46
|
+
video-border-color: #333333,
|
|
47
|
+
chart-bg-color: #fff,
|
|
48
|
+
chart-box-shadow-color: rgba(0, 0, 0, 0.9),
|
|
49
|
+
tabs-bg-color: #303030,
|
|
50
|
+
tabs-color: var(--text-color),
|
|
51
|
+
tabs-border-color: #555555,
|
|
52
|
+
tabs-nav-border-color: #222,
|
|
53
|
+
tab-btn-color: var(--primary-color),
|
|
54
|
+
tab-btn-color-hover: var(--text-color),
|
|
55
|
+
tab-btn-color-active: #e0e0e0,
|
|
56
|
+
resume-bg-color: #111,
|
|
57
|
+
resume-border-color: #000000,
|
|
58
|
+
resume-title-text-color: white,
|
|
59
|
+
resume-content-text-color: #d3d3d3,
|
|
60
|
+
resume-text-muted-color: #707070,
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
/* matrix */
|
|
64
|
+
// $theme-colors: (
|
|
65
|
+
// bg: #000400,
|
|
66
|
+
// text: #00ff00,
|
|
67
|
+
// text-muted: #9b9b9b,
|
|
68
|
+
// primary: #ffffff,
|
|
69
|
+
// shadow-color: rgba(0,0,0,0.1),
|
|
70
|
+
// code-color: #f55ca8,
|
|
71
|
+
// code-block-header-color: #020702,
|
|
72
|
+
// border-color: #373737,
|
|
73
|
+
// scrollbar-color: rgba(255, 255, 255, 0.534),
|
|
74
|
+
// blockquote-bg-color: #131313,
|
|
75
|
+
// footer-border-color: #020202,
|
|
76
|
+
// footer-bg-color: #111111,
|
|
77
|
+
// terminal-shadow: 0 10px 30px rgba(0,0,0,0.7),
|
|
78
|
+
// sumary-bg-color: #1f1f1f,
|
|
79
|
+
// );
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
@use "sass:map";
|
|
2
|
+
@use "light" as light;
|
|
3
|
+
@use "dark" as dark;
|
|
4
|
+
|
|
5
|
+
@function theme-color($key, $mode: light) {
|
|
6
|
+
@if $mode == light {
|
|
7
|
+
@return map.get(light.$theme-colors, $key);
|
|
8
|
+
}
|
|
9
|
+
@else if $mode == dark {
|
|
10
|
+
@return map.get(dark.$theme-colors, $key);
|
|
11
|
+
}
|
|
12
|
+
@return null;
|
|
13
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
$theme-colors: (
|
|
2
|
+
bg: #f3f3f3,
|
|
3
|
+
// bg default: #f3f3f3
|
|
4
|
+
text: #020202,
|
|
5
|
+
text-muted: #808080,
|
|
6
|
+
primary: #a00,
|
|
7
|
+
shadow-color: rgba(0, 0, 0, 0.1),
|
|
8
|
+
code-color: #db3688,
|
|
9
|
+
code-block-header-color: #f5f5f5,
|
|
10
|
+
border-color: #dfdfdf,
|
|
11
|
+
scrollbar-color: rgba(0, 0, 0, 0.18),
|
|
12
|
+
blockquote-bg-color: #e4e4e4,
|
|
13
|
+
footer-border-color: #e4e4e4,
|
|
14
|
+
footer-bg-color: #f3f3f3,
|
|
15
|
+
terminal-shadow: 0 10px 30px rgba(0, 0, 0, 0.7),
|
|
16
|
+
sumary-bg-color: #fbfbfb,
|
|
17
|
+
checkbox-border-color: #d3d3d3,
|
|
18
|
+
checkbox-border-color-after: #1f1f1f,
|
|
19
|
+
table-border-color: #a5a5a5,
|
|
20
|
+
table-color: #020202,
|
|
21
|
+
table-tr-bg-color: #d8d8d8,
|
|
22
|
+
table-tr-border-color: #949494,
|
|
23
|
+
table-td-border-color: #949494,
|
|
24
|
+
table-tr-odd-bg-color: #f3f3f3,
|
|
25
|
+
table-tr-even-bg-color: #e7e7e7,
|
|
26
|
+
terminal-color: #131313,
|
|
27
|
+
terminal-bg-color: #ffffff,
|
|
28
|
+
terminal-border-color: #aaaaaa,
|
|
29
|
+
terminal-btn-close-bg-color: #5c5c5c,
|
|
30
|
+
terminal-btn-min-bg-color: #747474,
|
|
31
|
+
terminal-btn-max-bg-color: #949494,
|
|
32
|
+
terminal-title-color: #252525,
|
|
33
|
+
terminal-screen-text-shadow: none,
|
|
34
|
+
terminal-screen-after-bg-color: none,
|
|
35
|
+
terminal-header-border-bottom-color: rgba(206, 206, 206, 0.5),
|
|
36
|
+
terminal-prompt-text-color: #000000,
|
|
37
|
+
terminal-screen-text-transform: none,
|
|
38
|
+
terminal-cursor-color: #020202,
|
|
39
|
+
terminal-screen-link-color: var(--primary-color),
|
|
40
|
+
details-bg-color: #fbfbfb,
|
|
41
|
+
video-border-color: #c9c9c9,
|
|
42
|
+
chart-bg-color: #fff,
|
|
43
|
+
chart-box-shadow-color: rgba(0, 0, 0, 0.7),
|
|
44
|
+
tabs-bg-color: #fdfdfd,
|
|
45
|
+
tabs-color: var(--text-color),
|
|
46
|
+
tabs-border-color: #cfcfcf,
|
|
47
|
+
tabs-nav-border-color: #757575,
|
|
48
|
+
tab-btn-color: var(--primary-color),
|
|
49
|
+
tab-btn-color-hover: var(--text-color),
|
|
50
|
+
tab-btn-color-active: #303030,
|
|
51
|
+
resume-bg-color: white,
|
|
52
|
+
resume-border-color: #ddd,
|
|
53
|
+
resume-title-text-color: black,
|
|
54
|
+
resume-content-text-color: #222,
|
|
55
|
+
resume-text-muted-color: #555,
|
|
56
|
+
);
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
data/assets/js/avatar.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
document.addEventListener("DOMContentLoaded", () => {
|
|
2
|
+
// O alvo do clique agora é o contêiner INTERATIVO
|
|
3
|
+
const flipperAvatars = document.querySelectorAll('.avatar-flipper__open-true');
|
|
4
|
+
const modalEl = document.getElementById('avatarModal');
|
|
5
|
+
const modalAvatar = document.getElementById('modalAvatar');
|
|
6
|
+
const header = document.querySelector('.header');
|
|
7
|
+
const bsModal = new bootstrap.Modal(modalEl);
|
|
8
|
+
|
|
9
|
+
flipperAvatars.forEach((flipper) => {
|
|
10
|
+
// Escuta o clique no contêiner inteiro
|
|
11
|
+
flipper.addEventListener("click", () => {
|
|
12
|
+
// Encontra o card que realmente anima
|
|
13
|
+
const card = flipper.querySelector('.avatar-card');
|
|
14
|
+
// Encontra a imagem de TRÁS e pega o seu src ANTES da animação
|
|
15
|
+
const backImage = flipper.querySelector('.avatar-back img');
|
|
16
|
+
const backImageSrc = backImage.src;
|
|
17
|
+
|
|
18
|
+
// Adiciona a classe de animação ao card
|
|
19
|
+
card.classList.add("flip-avatar");
|
|
20
|
+
|
|
21
|
+
card.addEventListener(
|
|
22
|
+
"animationend",
|
|
23
|
+
() => {
|
|
24
|
+
card.classList.remove("flip-avatar");
|
|
25
|
+
|
|
26
|
+
// Usa o src da imagem de trás que guardamos
|
|
27
|
+
modalAvatar.src = backImageSrc;
|
|
28
|
+
|
|
29
|
+
bsModal.show();
|
|
30
|
+
},
|
|
31
|
+
{ once: true }
|
|
32
|
+
);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// quando o modal está visível, escondemos os contêineres (esta parte já estava correta)
|
|
37
|
+
modalEl.addEventListener("shown.bs.modal", () => {
|
|
38
|
+
modalAvatar.classList.remove("modal-avatar");
|
|
39
|
+
void modalAvatar.offsetWidth;
|
|
40
|
+
modalAvatar.classList.add("modal-avatar");
|
|
41
|
+
header.classList.remove("modal-active");
|
|
42
|
+
|
|
43
|
+
flipperAvatars.forEach((flipper) => flipper.classList.add("hidden"));
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// quando o modal é fechado, mostramos os contêineres (esta parte já estava correta)
|
|
47
|
+
modalEl.addEventListener("hidden.bs.modal", () => {
|
|
48
|
+
flipperAvatars.forEach((flipper) => flipper.classList.remove("hidden"));
|
|
49
|
+
});
|
|
50
|
+
});
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
document.addEventListener("DOMContentLoaded", () => {
|
|
2
|
+
/* blog search open
|
|
3
|
+
--------------------------------------------------------------------------------------------------
|
|
4
|
+
*/
|
|
5
|
+
const btn = document.getElementById('blog-search__btn');
|
|
6
|
+
const box = document.querySelector('.blog-search');
|
|
7
|
+
const searchInput = document.getElementById('blog-search__input');
|
|
8
|
+
const blogPosts = document.getElementById('posts');
|
|
9
|
+
const searchResults = document.getElementById('blog-search__results');
|
|
10
|
+
const searchResultsWrapper = document.getElementById('blog-search__results-wrapper');
|
|
11
|
+
const btnSearchClean = document.getElementById('blog-search__btn-clean');
|
|
12
|
+
const blogSeachInput = document.getElementById('blog-search__input');
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
if (!btn || !box) return;
|
|
16
|
+
|
|
17
|
+
const openSearch = () => {
|
|
18
|
+
box.classList.add('is-open');
|
|
19
|
+
box.style.maxHeight = box.scrollHeight + 'px';
|
|
20
|
+
box.style.opacity = '1';
|
|
21
|
+
box.addEventListener('transitionend', function onOpened(e) {
|
|
22
|
+
if (e.propertyName === 'max-height') {
|
|
23
|
+
box.style.maxHeight = 'none';
|
|
24
|
+
box.removeEventListener('transitionend', onOpened);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
blogSeachInput.focus();
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const closeSearch = () => {
|
|
31
|
+
box.style.maxHeight = box.scrollHeight + 'px';
|
|
32
|
+
void box.offsetHeight; // reflow force
|
|
33
|
+
requestAnimationFrame(() => {
|
|
34
|
+
box.style.maxHeight = '0';
|
|
35
|
+
box.style.opacity = '0';
|
|
36
|
+
});
|
|
37
|
+
box.classList.remove('is-open');
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
btn.addEventListener('click', (e) => {
|
|
41
|
+
e.preventDefault();
|
|
42
|
+
// if are already in /blog/, toggle
|
|
43
|
+
const pathname = location.pathname.replace(/\/$/, '');
|
|
44
|
+
const isBlog = pathname === '/blog' || pathname === '/blog/index.html';
|
|
45
|
+
|
|
46
|
+
if (!isBlog) {
|
|
47
|
+
// if are on another page, go to /blog/ and open it
|
|
48
|
+
window.location.href = '/blog/?search=open';
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// toggle
|
|
53
|
+
if (box.classList.contains('is-open')) {
|
|
54
|
+
closeSearch();
|
|
55
|
+
searchInput.value = '';
|
|
56
|
+
blogPosts.classList.remove('disabled');
|
|
57
|
+
searchResultsWrapper.classList.add('disabled');
|
|
58
|
+
} else {
|
|
59
|
+
openSearch();
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// opens automatically if arrived from another link with ?search=open
|
|
64
|
+
const params = new URLSearchParams(location.search);
|
|
65
|
+
if (params.get('search') === 'open') {
|
|
66
|
+
setTimeout(openSearch, 30);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/* clean button input blog search
|
|
70
|
+
--------------------------------------------------------------------------------------------------
|
|
71
|
+
*/
|
|
72
|
+
function clearSearch() {
|
|
73
|
+
blogSeachInput.value = '';
|
|
74
|
+
blogPosts.classList.remove('disabled');
|
|
75
|
+
searchResults.classList.add('disabled');
|
|
76
|
+
searchResultsWrapper.classList.add('disabled');
|
|
77
|
+
blogSeachInput.focus();
|
|
78
|
+
}
|
|
79
|
+
btnSearchClean.addEventListener('click', clearSearch);
|
|
80
|
+
document.addEventListener('keydown', (e) => {
|
|
81
|
+
if (e.key === 'Escape') {
|
|
82
|
+
clearSearch();
|
|
83
|
+
closeSearch();
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
/* open results and close posts in search (toggle)
|
|
88
|
+
--------------------------------------------------------------------------------------------------
|
|
89
|
+
*/
|
|
90
|
+
searchInput.addEventListener('input', () => {
|
|
91
|
+
if (searchInput.value.trim().length > 0) {
|
|
92
|
+
blogPosts.classList.add('disabled');
|
|
93
|
+
searchResults.classList.remove('disabled');
|
|
94
|
+
searchResultsWrapper.classList.remove('disabled');
|
|
95
|
+
} else {
|
|
96
|
+
blogPosts.classList.remove('disabled');
|
|
97
|
+
searchResults.classList.add('disabled');
|
|
98
|
+
searchResultsWrapper.classList.add('disabled');
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
});
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
document.addEventListener("DOMContentLoaded", () => {
|
|
2
|
+
/* lock menu context (click right mouse)
|
|
3
|
+
--------------------------------------------------------------------------------------------------
|
|
4
|
+
*/
|
|
5
|
+
document.addEventListener('contextmenu', e => e.preventDefault());
|
|
6
|
+
|
|
7
|
+
/* Show/disappear top button
|
|
8
|
+
--------------------------------------------------------------------------------------------------
|
|
9
|
+
*/
|
|
10
|
+
let topButton = document.getElementById("top-link");
|
|
11
|
+
const scrollThreshold = 700;
|
|
12
|
+
window.onscroll = function () { scrollFunction() };
|
|
13
|
+
|
|
14
|
+
function scrollFunction() {
|
|
15
|
+
if (document.body.scrollTop > scrollThreshold || document.documentElement.scrollTop > scrollThreshold) {
|
|
16
|
+
topButton.style.display = "block";
|
|
17
|
+
} else {
|
|
18
|
+
topButton.style.display = "none";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
topButton.addEventListener("click", topFunction);
|
|
23
|
+
|
|
24
|
+
function topFunction() {
|
|
25
|
+
window.scrollTo({
|
|
26
|
+
top: 0,
|
|
27
|
+
behavior: 'smooth'
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/* function Giscus
|
|
32
|
+
--------------------------------------------------------------------------------------------------
|
|
33
|
+
*/
|
|
34
|
+
function setGiscusTheme(theme) {
|
|
35
|
+
// The function only executes if the themes object exists
|
|
36
|
+
if (window.giscusThemes) {
|
|
37
|
+
const giscusTheme = theme === 'light'
|
|
38
|
+
? window.giscusThemes.light
|
|
39
|
+
: window.giscusThemes.dark;
|
|
40
|
+
|
|
41
|
+
const message = {
|
|
42
|
+
giscus: {
|
|
43
|
+
setConfig: {
|
|
44
|
+
theme: giscusTheme
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
// Let's use a timeout to ensure the Giscus iframe is ready
|
|
50
|
+
const giscusInterval = setInterval(() => {
|
|
51
|
+
const giscusFrame = document.querySelector('iframe.giscus-frame');
|
|
52
|
+
// Se o iframe existir no documento...
|
|
53
|
+
if (giscusFrame) {
|
|
54
|
+
// ...we sent the message...
|
|
55
|
+
giscusFrame.contentWindow.postMessage(message, 'https://giscus.app');
|
|
56
|
+
// ...and we stopped trying.
|
|
57
|
+
clearInterval(giscusInterval);
|
|
58
|
+
}
|
|
59
|
+
}, 500);
|
|
60
|
+
|
|
61
|
+
// As an extra safeguard, we stop trying after a few seconds
|
|
62
|
+
// to avoid creating an infinite loop if something goes wrong.
|
|
63
|
+
setTimeout(() => {
|
|
64
|
+
clearInterval(giscusInterval);
|
|
65
|
+
}, 4000); // Stop trying after 4 seconds
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/* change theme light/dark
|
|
70
|
+
--------------------------------------------------------------------------------------------------
|
|
71
|
+
*/
|
|
72
|
+
const toggleButton = document.getElementById('toggle-theme');
|
|
73
|
+
const icon = toggleButton.querySelector('i');
|
|
74
|
+
// const avatar = document.getElementById('avatarImage');
|
|
75
|
+
const root = document.documentElement;
|
|
76
|
+
|
|
77
|
+
function setTheme(theme) {
|
|
78
|
+
root.setAttribute('data-theme', theme);
|
|
79
|
+
|
|
80
|
+
icon.classList.remove('fa-sun', 'fa-moon');
|
|
81
|
+
icon.classList.add(theme === 'dark' ? 'fa-sun' : 'fa-moon');
|
|
82
|
+
|
|
83
|
+
if (typeof setGiscusTheme === 'function') {
|
|
84
|
+
setGiscusTheme(theme);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// if (avatar) {
|
|
88
|
+
// avatar.src = theme === 'light'
|
|
89
|
+
// ? avatar.dataset.light
|
|
90
|
+
// : avatar.dataset.dark;
|
|
91
|
+
// }
|
|
92
|
+
|
|
93
|
+
localStorage.setItem('theme', theme);
|
|
94
|
+
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// boot with saved or light
|
|
98
|
+
setTheme(localStorage.getItem('theme') || 'light');
|
|
99
|
+
|
|
100
|
+
// change theme on click
|
|
101
|
+
toggleButton.addEventListener('click', () => {
|
|
102
|
+
const current = root.getAttribute('data-theme');
|
|
103
|
+
const next = current === 'light' ? 'dark' : 'light';
|
|
104
|
+
setTheme(next);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
/* highlight code
|
|
109
|
+
--------------------------------------------------------------------------------------------------
|
|
110
|
+
*/
|
|
111
|
+
document.querySelectorAll("div.highlight, figure.highlight").forEach(highlightBlock => {
|
|
112
|
+
const container = document.createElement("div");
|
|
113
|
+
container.className = "code-block-container";
|
|
114
|
+
const header = document.createElement("div");
|
|
115
|
+
header.className = "code-block-header";
|
|
116
|
+
|
|
117
|
+
// button copy
|
|
118
|
+
const button = document.createElement("button");
|
|
119
|
+
button.className = "copy-btn";
|
|
120
|
+
button.type = "button";
|
|
121
|
+
button.setAttribute("aria-label", "Copy code");
|
|
122
|
+
|
|
123
|
+
const icon = document.createElement("i");
|
|
124
|
+
icon.className = "fa-solid fa-clipboard";
|
|
125
|
+
button.appendChild(icon);
|
|
126
|
+
|
|
127
|
+
header.appendChild(button);
|
|
128
|
+
|
|
129
|
+
highlightBlock.parentNode.insertBefore(container, highlightBlock);
|
|
130
|
+
container.appendChild(header);
|
|
131
|
+
container.appendChild(highlightBlock);
|
|
132
|
+
|
|
133
|
+
// event copy
|
|
134
|
+
button.addEventListener("click", () => {
|
|
135
|
+
const codeElement = highlightBlock.querySelector("td.code");
|
|
136
|
+
const textToCopy = codeElement ? codeElement.innerText.trim() : highlightBlock.innerText.trim();
|
|
137
|
+
|
|
138
|
+
navigator.clipboard.writeText(textToCopy).then(() => {
|
|
139
|
+
icon.className = "fa-solid fa-check";
|
|
140
|
+
setTimeout(() => (icon.className = "fa-solid fa-clipboard"), 2000);
|
|
141
|
+
}, () => {
|
|
142
|
+
icon.className = "fa-solid fa-xmark";
|
|
143
|
+
setTimeout(() => (icon.className = "fa-solid fa-clipboard"), 2000);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
document.addEventListener("DOMContentLoaded", () => {
|
|
2
|
+
/* effects terminal: maximize
|
|
3
|
+
--------------------------------------------------------------------------------------------------
|
|
4
|
+
*/
|
|
5
|
+
const terminal = document.getElementById("terminal");
|
|
6
|
+
const btnMax = terminal.querySelector(".terminal-header__max");
|
|
7
|
+
|
|
8
|
+
let isFullscreen = false;
|
|
9
|
+
|
|
10
|
+
// maximize/restore
|
|
11
|
+
btnMax.addEventListener("click", () => {
|
|
12
|
+
isFullscreen = !isFullscreen;
|
|
13
|
+
terminal.classList.toggle("terminal-fullscreen", isFullscreen);
|
|
14
|
+
});
|
|
15
|
+
});
|
data/assets/js/toc.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
document.addEventListener("DOMContentLoaded", () => {
|
|
2
|
+
/* TOC in top */
|
|
3
|
+
const toc = document.getElementById('toc');
|
|
4
|
+
|
|
5
|
+
const sentinel = document.createElement('div');
|
|
6
|
+
toc.parentNode.insertBefore(sentinel, toc);
|
|
7
|
+
|
|
8
|
+
const observer = new IntersectionObserver(
|
|
9
|
+
([entry]) => {
|
|
10
|
+
if (!entry.isIntersecting) {
|
|
11
|
+
toc.classList.add('toc-fixed');
|
|
12
|
+
} else {
|
|
13
|
+
toc.classList.remove('toc-fixed');
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
{ threshold: 0 }
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
observer.observe(sentinel);
|
|
20
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: none
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
{%- assign date_format = "%b %-d,%Y" -%}
|
|
6
|
+
|
|
7
|
+
[
|
|
8
|
+
{% for post in site.posts %}
|
|
9
|
+
{
|
|
10
|
+
"title" : "{{ post.title | escape }}",
|
|
11
|
+
"tags" : "{{ post.tags | join: ', ' }}",
|
|
12
|
+
"url" : "{{ site.baseurl }}{{ post.url }}",
|
|
13
|
+
"date" : "{{ post.date | date: date_format }}"
|
|
14
|
+
} {% unless forloop.last %},{% endunless %}
|
|
15
|
+
{% endfor %}
|
|
16
|
+
]
|