rawfeed 0.0.1 → 0.1.1

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 (133) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +21 -0
  3. data/README.md +153 -1
  4. data/_data/resume.yml +184 -0
  5. data/_includes/alert +3 -0
  6. data/_includes/chart +34 -0
  7. data/_includes/details +57 -0
  8. data/_includes/enddetails +2 -0
  9. data/_includes/endtabs +2 -0
  10. data/_includes/image +61 -0
  11. data/_includes/layout/blog_search.html +18 -0
  12. data/_includes/layout/data.liquid +8 -0
  13. data/_includes/layout/disqus.html +30 -0
  14. data/_includes/layout/footer.html +34 -0
  15. data/_includes/layout/giscus.html +21 -0
  16. data/_includes/layout/google_analytics.html +11 -0
  17. data/_includes/layout/head.html +59 -0
  18. data/_includes/layout/header.html +143 -0
  19. data/_includes/layout/maintenance.html +30 -0
  20. data/_includes/layout/paginator.html +35 -0
  21. data/_includes/socials +22 -0
  22. data/_includes/tabs +94 -0
  23. data/_includes/toc +160 -0
  24. data/_includes/video +10 -0
  25. data/_layouts/blog.html +46 -0
  26. data/_layouts/contact.html +285 -0
  27. data/_layouts/default.html +351 -0
  28. data/_layouts/error.html +15 -0
  29. data/_layouts/home.html +58 -0
  30. data/_layouts/page.html +9 -0
  31. data/_layouts/post.html +103 -0
  32. data/_layouts/resume.html +239 -0
  33. data/_layouts/tag.html +22 -0
  34. data/_layouts/tag_posts.html +27 -0
  35. data/_sass/base/_index.scss +63 -0
  36. data/_sass/base/_reset.scss +10 -0
  37. data/_sass/base/_typography.scss +0 -0
  38. data/_sass/components/_badges.scss +24 -0
  39. data/_sass/components/_button.scss +17 -0
  40. data/_sass/components/_forms.scss +42 -0
  41. data/_sass/components/_gifs.scss +5 -0
  42. data/_sass/components/_index.scss +5 -0
  43. data/_sass/components/_markdown.scss +454 -0
  44. data/_sass/includes/_footer.scss +45 -0
  45. data/_sass/includes/_header.scss +240 -0
  46. data/_sass/includes/_highlight.scss +87 -0
  47. data/_sass/includes/_index.scss +9 -0
  48. data/_sass/includes/_maintenance.scss +16 -0
  49. data/_sass/includes/_paginator.scss +22 -0
  50. data/_sass/includes/_rouge-dark.scss +81 -0
  51. data/_sass/includes/_rouge-light.scss +121 -0
  52. data/_sass/includes/_terminal.scss +208 -0
  53. data/_sass/layouts/_blog.scss +96 -0
  54. data/_sass/layouts/_contact.scss +55 -0
  55. data/_sass/layouts/_default.scss +14 -0
  56. data/_sass/layouts/_error.scss +18 -0
  57. data/_sass/layouts/_home.scss +19 -0
  58. data/_sass/layouts/_index.scss +10 -0
  59. data/_sass/layouts/_page.scss +5 -0
  60. data/_sass/layouts/_post.scss +109 -0
  61. data/_sass/layouts/_resume.scss +330 -0
  62. data/_sass/layouts/_tag-posts.scss +48 -0
  63. data/_sass/layouts/_tag.scss +22 -0
  64. data/_sass/main.scss +128 -0
  65. data/_sass/theme/_dark.scss +79 -0
  66. data/_sass/theme/_index.scss +13 -0
  67. data/_sass/theme/_light.scss +56 -0
  68. data/assets/css/style.scss +5 -0
  69. data/assets/images/avatar_back.png +0 -0
  70. data/assets/images/avatar_dark.png +0 -0
  71. data/assets/images/avatar_light.png +0 -0
  72. data/assets/images/favicon.png +0 -0
  73. data/assets/js/avatar.js +50 -0
  74. data/assets/js/default.js +148 -0
  75. data/assets/js/terminal.js +18 -0
  76. data/assets/js/toc.js +22 -0
  77. data/assets/json/blog_search.json +16 -0
  78. data/assets/vendor/bootstrap/css/bootstrap-grid.css +4124 -0
  79. data/assets/vendor/bootstrap/css/bootstrap-grid.css.map +1 -0
  80. data/assets/vendor/bootstrap/css/bootstrap-grid.min.css +7 -0
  81. data/assets/vendor/bootstrap/css/bootstrap-grid.min.css.map +1 -0
  82. data/assets/vendor/bootstrap/css/bootstrap-grid.rtl.css +4123 -0
  83. data/assets/vendor/bootstrap/css/bootstrap-grid.rtl.css.map +1 -0
  84. data/assets/vendor/bootstrap/css/bootstrap-grid.rtl.min.css +7 -0
  85. data/assets/vendor/bootstrap/css/bootstrap-grid.rtl.min.css.map +1 -0
  86. data/assets/vendor/bootstrap/css/bootstrap-reboot.css +488 -0
  87. data/assets/vendor/bootstrap/css/bootstrap-reboot.css.map +1 -0
  88. data/assets/vendor/bootstrap/css/bootstrap-reboot.min.css +7 -0
  89. data/assets/vendor/bootstrap/css/bootstrap-reboot.min.css.map +1 -0
  90. data/assets/vendor/bootstrap/css/bootstrap-reboot.rtl.css +485 -0
  91. data/assets/vendor/bootstrap/css/bootstrap-reboot.rtl.css.map +1 -0
  92. data/assets/vendor/bootstrap/css/bootstrap-reboot.rtl.min.css +7 -0
  93. data/assets/vendor/bootstrap/css/bootstrap-reboot.rtl.min.css.map +1 -0
  94. data/assets/vendor/bootstrap/css/bootstrap-utilities.css +4266 -0
  95. data/assets/vendor/bootstrap/css/bootstrap-utilities.css.map +1 -0
  96. data/assets/vendor/bootstrap/css/bootstrap-utilities.min.css +7 -0
  97. data/assets/vendor/bootstrap/css/bootstrap-utilities.min.css.map +1 -0
  98. data/assets/vendor/bootstrap/css/bootstrap-utilities.rtl.css +4257 -0
  99. data/assets/vendor/bootstrap/css/bootstrap-utilities.rtl.css.map +1 -0
  100. data/assets/vendor/bootstrap/css/bootstrap-utilities.rtl.min.css +7 -0
  101. data/assets/vendor/bootstrap/css/bootstrap-utilities.rtl.min.css.map +1 -0
  102. data/assets/vendor/bootstrap/css/bootstrap.css +10878 -0
  103. data/assets/vendor/bootstrap/css/bootstrap.css.map +1 -0
  104. data/assets/vendor/bootstrap/css/bootstrap.min.css +7 -0
  105. data/assets/vendor/bootstrap/css/bootstrap.min.css.map +1 -0
  106. data/assets/vendor/bootstrap/css/bootstrap.rtl.css +10842 -0
  107. data/assets/vendor/bootstrap/css/bootstrap.rtl.css.map +1 -0
  108. data/assets/vendor/bootstrap/css/bootstrap.rtl.min.css +7 -0
  109. data/assets/vendor/bootstrap/css/bootstrap.rtl.min.css.map +1 -0
  110. data/assets/vendor/bootstrap/js/bootstrap.bundle.js +7075 -0
  111. data/assets/vendor/bootstrap/js/bootstrap.bundle.js.map +1 -0
  112. data/assets/vendor/bootstrap/js/bootstrap.bundle.min.js +7 -0
  113. data/assets/vendor/bootstrap/js/bootstrap.bundle.min.js.map +1 -0
  114. data/assets/vendor/bootstrap/js/bootstrap.esm.js +5202 -0
  115. data/assets/vendor/bootstrap/js/bootstrap.esm.js.map +1 -0
  116. data/assets/vendor/bootstrap/js/bootstrap.esm.min.js +7 -0
  117. data/assets/vendor/bootstrap/js/bootstrap.esm.min.js.map +1 -0
  118. data/assets/vendor/bootstrap/js/bootstrap.js +5249 -0
  119. data/assets/vendor/bootstrap/js/bootstrap.js.map +1 -0
  120. data/assets/vendor/bootstrap/js/bootstrap.min.js +7 -0
  121. data/assets/vendor/bootstrap/js/bootstrap.min.js.map +1 -0
  122. data/assets/vendor/simple-jekyll-search.js +433 -0
  123. data/assets/vendor/simple-jekyll-search.min.js +6 -0
  124. data/lib/rawfeed/draft.rb +31 -0
  125. data/lib/rawfeed/installer.rb +37 -0
  126. data/lib/rawfeed/layout.rb +138 -0
  127. data/lib/rawfeed/page.rb +33 -0
  128. data/lib/rawfeed/post.rb +60 -0
  129. data/lib/rawfeed/resume.rb +59 -0
  130. data/lib/rawfeed/utils.rb +74 -0
  131. data/lib/rawfeed/version.rb +1 -1
  132. data/lib/rawfeed.rb +5 -7
  133. metadata +144 -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
+ );
@@ -0,0 +1,5 @@
1
+ ---
2
+ # Only the main Sass file needs front matter (the dashes are enough)
3
+ ---
4
+
5
+ @use "main";
Binary file
Binary file
Binary file
Binary file
@@ -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,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,18 @@
1
+ document.addEventListener("DOMContentLoaded", () => {
2
+ /* effects terminal: maximize
3
+ --------------------------------------------------------------------------------------------------
4
+ */
5
+ const terminal = document.getElementById("terminal");
6
+
7
+ if (!terminal) return;
8
+
9
+ const btnMax = terminal.querySelector(".terminal-header__max");
10
+
11
+ let isFullscreen = false;
12
+
13
+ // maximize/restore
14
+ btnMax.addEventListener("click", () => {
15
+ isFullscreen = !isFullscreen;
16
+ terminal.classList.toggle("terminal-fullscreen", isFullscreen);
17
+ });
18
+ });
data/assets/js/toc.js ADDED
@@ -0,0 +1,22 @@
1
+ document.addEventListener("DOMContentLoaded", () => {
2
+ /* TOC in top */
3
+ const toc = document.getElementById('toc');
4
+
5
+ if (!toc) return;
6
+
7
+ const sentinel = document.createElement('div');
8
+ toc.parentNode.insertBefore(sentinel, toc);
9
+
10
+ const observer = new IntersectionObserver(
11
+ ([entry]) => {
12
+ if (!entry.isIntersecting) {
13
+ toc.classList.add('toc-fixed');
14
+ } else {
15
+ toc.classList.remove('toc-fixed');
16
+ }
17
+ },
18
+ { threshold: 0 }
19
+ );
20
+
21
+ observer.observe(sentinel);
22
+ });
@@ -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
+ ]