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.
- 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 +8 -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 +351 -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 +239 -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 +454 -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/default.js +148 -0
- data/assets/js/terminal.js +18 -0
- data/assets/js/toc.js +22 -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 +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 | 
            +
            );
         | 
| 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,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 | 
            +
            ]
         |