rawfeed 0.1.3 → 0.1.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5c77c26cafbcdaddf6d5297d5ec37d0e6912e305b31055c412d5f3fb595e6011
4
- data.tar.gz: ee87b78c301ed6862181631c4b71938c8fbeb67133262f915218dc63943e9706
3
+ metadata.gz: be86e28f3f858c931e6cb9874b17eb04d07c99314d6c8bc00a914037962b2bcd
4
+ data.tar.gz: 7aaa22c4f212a10039e4a8a5494f0c97c1771f0885ded4a6da3483d0eedd96a2
5
5
  SHA512:
6
- metadata.gz: fb7020880c461a817305c26e2a5076cd7418b2509aaf0207e5b3352e071f4ea86595a24bb9a9791043e23d122686131066b3fb33f062fc0a5c2f16f9e676dd6e
7
- data.tar.gz: 99d68cc1a6ea32e42c900f8e3bf2d6bc4561bad407ee50bd83449586e562ba6aba4bcfcf4b8023acc30260f98e893e2fe8ae52ba0ff46e157128c08fcf0c9a9e
6
+ metadata.gz: dc9c0beeb4ac4c2f6c9082c366f29e59ef0a440bda5cebc9084e9b8b373b998d3fa652004e51b2b78f3c560c2851d3497aea10e4ba46f387c86fb56c880b47e4
7
+ data.tar.gz: 1bd79e2a2b544541e0e324499cb1845f00dfc64182c9a07001b2cdc7cd5f2a29831432697ca3b4f807bfae331233e52f66d01871f5443c8c47d55e3a16643d49
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  <br>
4
4
  <small>Rawfeed — A raw Jekyll theme for minimalists</small>
5
5
  <br>
6
- <a href="https://badge.fury.io/rb/rawfeed"><img src="https://badge.fury.io/rb/rawfeed.svg" alt="Gem Version" height="18"></a>
6
+ <a href="https://badge.fury.io/rb/rawfeed"><img src="https://badge.fury.io/rb/rawfeed.svg?icon=si%3Arubygems" alt="Gem Version" height="18"></a>
7
7
  <br>
8
8
  <a href="https://williamcanin.github.io/rawfeed" target="_blank">Theme Preview</a>
9
9
  </p>
@@ -41,6 +41,7 @@
41
41
  - [x] Maintenance page;
42
42
  - [x] Comments on blog posts with Giscus or Disqus (only in production [jekyll build]);
43
43
  - [x] Google Analytics (only in production [jekyll build]);
44
+ - and more [here](#vendors)
44
45
 
45
46
  # Installation
46
47
 
@@ -133,6 +134,24 @@ npm run publish
133
134
 
134
135
  For more tasks, see: `bundle exec rake --tasks`
135
136
 
137
+ # Vendors
138
+
139
+ [ Technologies and Services Used ]
140
+
141
+ This [Jekyll](https://jekyllrb.com) theme was developed using the following services and
142
+ technologies, to whom we would like to thank for their work and availability:
143
+
144
+ | Vendor | Link | Use in Theme |
145
+ | -------- | ------- | ------- |
146
+ | **Bootstrap 5** | [https://getbootstrap.com](https://getbootstrap.com/) | Framework for responsive design and base components |
147
+ | **Font Awesome** | [https://fontawesome.com](https://fontawesome.com/) | Providing vector icons |
148
+ | **Google Fonts** | [https://fonts.google.com](https://fonts.google.com/) | Styling and appearance of texts (custom fonts) |
149
+ | **Google Apps Script** | [https://developers.google.com/apps-script](https://developers.google.com/apps-script) | Email sending and form processing functionality (Contact page). |
150
+ | **Google reCAPTCHA** | [https://www.google.com/recaptcha/about/](https://www.google.com/recaptcha/about/) | Form spam protection (if implemented). |
151
+ | **Giscus** | [https://giscus.app](https://giscus.app/) | *GitHub Discussions-based commenting system option* |
152
+ | **Disqus** | [https://disqus.com](https://disqus.com/) | *Comment system option* |
153
+ | **Gulp** | [https://gulpjs.com](https://gulpjs.com/) | Minification and cleaning |
154
+
136
155
  ## Donation
137
156
 
138
157
  Click on the image below to be redirected the donation forms:
data/_data/resume.yml CHANGED
@@ -143,7 +143,6 @@ body:
143
143
 
144
144
  # section: [Certificates]
145
145
  # Full links will only appear in print mode. Online and PDF modes are clickable.
146
- # TODO: Bugfix: Quando tem muitos certificados, existe uma quebra de espaço absurda na impressão
147
146
  certificates:
148
147
  enable: true
149
148
  caption: Certificates
@@ -1,16 +1,16 @@
1
1
  {%- if site.blog.search.enable -%}
2
- <div class="row blog-search" aria-hidden="true">
2
+ <div class="row blog-search" inert>
3
3
  <div class="col-sm">
4
4
  <div class="blog-search__wapper">
5
- <strong>»</strong><input id="blog-search__input" type="text" class="blog-search__input" placeholder="{{ site.text.blog.search.placeholder }}" aria-label="{{ site.blog.search.placeholder }}">
5
+ <strong>»</strong><input id="blog-search__input" type="text" class="blog-search__input" placeholder="{{ site.strings.blog.search.placeholder }}" aria-label="{{ site.blog.search.placeholder }}">
6
6
  <button id="blog-search__btn-clean" class="blog-search__btn-clean" type="button">
7
- {{ site.text.blog.search.button_clean.text }}
7
+ {{ site.strings.blog.search.button_clean.text }}
8
8
  </button>
9
9
  </div>
10
10
  </div>
11
11
 
12
12
  <div id="blog-search__results-wrapper" class="row disabled">
13
- <h2 class="blog-subtitle">[&nbsp;{{ site.text.blog.search.results | default: "results" }}&nbsp;]</h2>
13
+ <h2 class="blog-subtitle">[&nbsp;{{ site.strings.blog.search.results | default: "results" }}&nbsp;]</h2>
14
14
  <ul id="blog-search__results" class="row blog-list"></ul>
15
15
  </div>
16
16
 
@@ -0,0 +1,6 @@
1
+ {%- capture theme_script -%}
2
+ (function() {
3
+ const savedTheme = localStorage.getItem('theme') || 'light';
4
+ document.documentElement.setAttribute('data-theme', savedTheme);
5
+ })();
6
+ {%- endcapture -%}
@@ -1,6 +1,6 @@
1
1
  {% if site.blog.post.comments.disqus.shortname != "" %}
2
2
  <div class="row comments">
3
- <h1 class="comments-title">[&nbsp;{{ site.text.post.comments | default: "comments" }}&nbsp;]</h1>
3
+ <h1 class="comments-title">[&nbsp;{{ site.strings.post.comments | default: "comments" }}&nbsp;]</h1>
4
4
  <div class="comments-content">
5
5
  <div id="disqus_thread"></div>
6
6
  <script>
@@ -3,7 +3,7 @@
3
3
  <footer class="container-fluid fixed-bottom footer">
4
4
  {%- if site.footer.top_button.enable -%}
5
5
  <div class="row top">
6
- <div class="col-sm d-flex justify-content-end">
6
+ <div class="col-md d-flex justify-content-end">
7
7
  <!-- old: <a id="top-link" class="top-link" href="#top"><i class="fa-regular fa-square-caret-up"></i></a> -->
8
8
  <a id="top-link" class="top-link" href="#top">^</a>
9
9
  </div>
@@ -12,19 +12,21 @@
12
12
 
13
13
  <div class="row footer-wrapper">
14
14
 
15
- {%- if site.text.footer.copyright -%}
16
- <div class="col-sm">
17
- <div class="footer-copyright">{{ site.title | default: theme_name }}&nbsp;{{ site.text.footer.copyright }}</div>
15
+ {%- if site.strings.footer.copyright -%}
16
+ <div class="col-md footer-copyright-wrap">
17
+ {%- assign year = site.time | date: "%Y" -%}
18
+ {%- assign since = site.strings.footer.copyright.since -%}
19
+ <div class="footer-copyright">©&nbsp;{{ site.title | default: theme_name }}&nbsp;{{ since }}{%- if since -%}-{%- endif -%}{{year}}&nbsp;-&nbsp;{{ site.strings.footer.copyright.message }}</div>
18
20
  </div>
19
21
  {%- endif -%}
20
22
 
21
- {%- if site.text.footer.message -%}
22
- <div class="col-sm">
23
- <div class="footer-message">{{ site.text.footer.message }}</div>
23
+ {%- if site.strings.footer.message -%}
24
+ <div class="col-md footer-message-wrap">
25
+ <div class="footer-message">{{ site.strings.footer.message }}</div>
24
26
  </div>
25
27
  {%- endif -%}
26
28
 
27
- <div class="col-sm">
29
+ <div class="col-md footer-made-by-wrap">
28
30
  <div class="footer-made-by">
29
31
  Using the <a href="{{ project_url }}" target="_blank" rel="noopener noreferrer">{{ theme_name }}</a> theme for <a href="https://jekyllrb.com" target="_blank" rel="noopener noreferrer">Jekyll</a>.
30
32
  </div>
@@ -1,6 +1,6 @@
1
1
  {%- if site.blog.post.comments.giscus.repo != "" and site.blog.post.comments.giscus.category_id != "" -%}
2
2
  <div class="row comments">
3
- <h1 class="comments-title">[&nbsp;{{ site.text.post.comments | default: "comments" }}&nbsp;]</h1>
3
+ <h1 class="comments-title">[&nbsp;{{ site.strings.post.comments | default: "comments" }}&nbsp;]</h1>
4
4
  <div class="row comments-content">
5
5
  <script src="https://giscus.app/client.js"
6
6
  data-repo="{{ site.blog.post.comments.giscus.repo }}"
@@ -9,6 +9,46 @@
9
9
  <title>{{ page.title }} | {{ site.title | default: theme_name }}</title>
10
10
  {%- endif -%}
11
11
 
12
+ {% comment %} Security {% endcomment %}
13
+ {%- if jekyll.environment == 'production' %}
14
+ {% comment %} { %- include layout/capture_scripts.liquid -% } {% endcomment %}
15
+
16
+ <script>
17
+ if (window.top !== window.self) {
18
+ // Prevents the site from being displayed inside an <iframe>
19
+ window.top.location = window.self.location;
20
+ }
21
+ </script>
22
+ <!-- TODO: Colocar os script inline <script> todos em .js para evistar o uso de 'unsafe-inline' em script-src -->
23
+ <meta http-equiv="Content-Security-Policy"
24
+ content="
25
+ default-src 'self';
26
+ img-src 'self' data: {{ site.csp.img-src | join: ' ' }};
27
+ script-src 'self' 'unsafe-inline'
28
+ https://cdn.jsdelivr.net
29
+ https://cdnjs.cloudflare.com
30
+ https://giscus.app
31
+ https://disqus.com;
32
+ style-src 'self' 'unsafe-inline'
33
+ https://cdnjs.cloudflare.com
34
+ https://fonts.googleapis.com
35
+ https://cdn.jsdelivr.net
36
+ https://giscus.app
37
+ https://disqus.com;
38
+ font-src 'self' https://fonts.gstatic.com https://cdnjs.cloudflare.com data:;
39
+ connect-src 'self' {{ site.csp.connect-src | join: ' ' }};
40
+ frame-src {{ site.csp.frame-src | join: ' ' }};
41
+ object-src 'none';
42
+ base-uri 'self';
43
+ form-action 'self';
44
+ ">
45
+ <!-- ⚠️ CSP,HSTS,COOP and enabled in the theme, remember to also configure it in Cloudflare or your server -->
46
+ <meta http-equiv="Strict-Transport-Security" content="max-age=31536000; includeSubDomains; preload">
47
+ <meta http-equiv="Cross-Origin-Opener-Policy" content="same-origin">
48
+ <meta http-equiv="Cross-Origin-Embedder-Policy" content="require-corp">
49
+ <!-- ⚠️ CSP,HSTS,COOP enabled in the theme, remember to also configure it in Cloudflare or your server -->
50
+ {%- endif -%}
51
+
12
52
  {% comment %} favicon {% endcomment %}
13
53
  <link rel="icon" type="image/png" href="{{ '/assets/images/favicon.png' | relative_url }}">
14
54
  <link rel="apple-touch-icon" href="{{ '/assets/images/favicon.png' | relative_url }}">
@@ -31,7 +71,6 @@
31
71
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
32
72
  <link href="https://fonts.googleapis.com/css2?family=SUSE+Mono:ital,wght@0,100..800;1,100..800&display=swap" rel="stylesheet">
33
73
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inconsolata:400,700&amp;display=swap">
34
- <link href="https://fonts.googleapis.com/css2?family=Special+Elite&display=swap" rel="stylesheet">
35
74
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"/>
36
75
 
37
76
  {% comment %} bootstrap {% endcomment %}
@@ -25,9 +25,9 @@
25
25
  <div class="container">
26
26
  <div class="row">
27
27
  {%- if index.layout == "blog" -%}
28
- <span>[&nbsp;<a class="{% if page.url == "/" or page.url == "/index.html" %}menu-active{% endif %}" href="{{home_url}}">{{ site.text.menu.blog | default: "blog" | downcase }}</a>&nbsp;]</span>
28
+ <span>[&nbsp;<a class="{% if page.url == "/" or page.url == "/index.html" %}menu-active{% endif %}" href="{{home_url}}">{{ site.strings.menu.blog.title | default: "blog" | downcase }}</a>&nbsp;]</span>
29
29
  {%- else -%}
30
- <span>[&nbsp;<a class="{% if page.url == "/" or page.url == "/index.html" %}menu-active{% endif %}" href="{{home_url}}">{{ site.text.menu.home | default: "home" | downcase }}</a>&nbsp;]</span>
30
+ <span>[&nbsp;{{site.strings.menu.home.emoji}}<a class="{% if page.url == "/" or page.url == "/index.html" %}menu-active{% endif %}" href="{{home_url}}">{{ site.strings.menu.home.title | default: "home" | downcase }}</a>&nbsp;]</span>
31
31
  {%- endif -%}
32
32
  </div>
33
33
  </div>
@@ -56,10 +56,10 @@
56
56
  <div class="avatar-flipper light-theme {% if site.avatar.open %}avatar-flipper__open-true{% endif %}{% if site.avatar.flip %} can-flip{% endif %}">
57
57
  <div class="avatar-card">
58
58
  <div class="avatar-front">
59
- <img id="avatarImgLight" class="avatar-img" src="{{ avatar_path_light | relative_url }}" alt="{{ site.title }}" width="70">
59
+ <img id="avatarImgLight" class="avatar-img" src="{{ avatar_path_light | relative_url }}" alt="{{ site.title }}">
60
60
  </div>
61
61
  <div class="avatar-back">
62
- <img class="avatar-img" src="{{ avatar_path_back | relative_url }}" alt="{{ site.title }} - Verso" width="70">
62
+ <img class="avatar-img" src="{{ avatar_path_back | relative_url }}" alt="{{ site.title }}">
63
63
  </div>
64
64
  </div>
65
65
  </div>
@@ -67,10 +67,10 @@
67
67
  <div class="avatar-flipper dark-theme {% if site.avatar.open %} avatar-flipper__open-true{% endif %}{% if site.avatar.flip %} can-flip{% endif %}">
68
68
  <div class="avatar-card">
69
69
  <div class="avatar-front">
70
- <img id="avatarImgDark" class="avatar-img" src="{{ avatar_path_dark | relative_url }}" alt="{{ site.title }}" width="70">
70
+ <img id="avatarImgDark" class="avatar-img" src="{{ avatar_path_dark | relative_url }}" alt="{{ site.title }}">
71
71
  </div>
72
72
  <div class="avatar-back">
73
- <img class="avatar-img" src="{{ avatar_path_back | relative_url }}" alt="{{ site.title }} - Verso" width="70">
73
+ <img class="avatar-img" src="{{ avatar_path_back | relative_url }}" alt="{{ site.title }}">
74
74
  </div>
75
75
  </div>
76
76
  </div>
@@ -86,7 +86,7 @@
86
86
  <div class="col-sm d-flex justify-content-center column-bottom">
87
87
  {%- if index.layout == "blog" -%}
88
88
  <span class="blog-menu">menu&nbsp;»
89
- &nbsp;{%- if site.blog.search.enable -%}<a id="blog-search__btn" class="blog-menu__link" href="{{search_url}}">{{ site.text.menu.search | default: "search" }}</a><strong>&nbsp;.&nbsp;</strong>{%- endif -%}<a class="blog-menu__link{% if page.url == "/blog/tags/" or page.url == "/blog/tags/index.html" %} menu-active{% endif %}" href="{{tags_url}}">{{ site.text.menu.tags | default: "tags" }}</a><strong>&nbsp;.&nbsp;</strong>
89
+ &nbsp;{{site.strings.menu.search.emoji}}{%- if site.blog.search.enable -%}<a id="blog-search__btn" class="blog-menu__link" href="{{search_url}}">{{ site.strings.menu.search.title | default: "search" }}</a><strong>&nbsp;.&nbsp;</strong>{%- endif -%}<a class="blog-menu__link{% if page.url == "/blog/tags/" or page.url == "/blog/tags/index.html" %} menu-active{% endif %}" href="{{tags_url}}">{{ site.strings.menu.tags.title | default: "tags" }}</a><strong>&nbsp;.&nbsp;</strong>
90
90
  </span>
91
91
  {% assign sorted_pages = site.pages | sort: 'order' %}
92
92
  {%- for item in sorted_pages -%}
@@ -96,11 +96,11 @@
96
96
  {%- endunless -%}
97
97
  {%- endif -%}
98
98
  {%- endfor -%}
99
- <a class="blog-menu__link" href="{{feed_url}}">{{ site.text.menu.feed | default: "feed" }}</a><strong>&nbsp;.&nbsp;</strong>
99
+ <a class="blog-menu__link" href="{{feed_url}}">{{ site.strings.menu.feed | default: "feed" }}</a><strong>&nbsp;.&nbsp;</strong>
100
100
  {%- else index.layout == "home" -%}
101
101
  {%- if page.url contains "/blog/" -%}
102
- <span class="blog-menu">{{ site.text.menu.blog }}&nbsp;»
103
- <a class="blog-menu__link{% if page.url == "/blog/" or page.url == "/blog/index.html" or page.url contains "/blog/page/" %} menu-active{% endif %}" href="{{blog_url}}">posts</a><strong>&nbsp;.&nbsp;</strong>{%- if site.blog.search.enable -%}<a id="blog-search__btn" class="blog-menu__link" href="{{search_url}}">{{ site.text.menu.search | default: "search" }}</a><strong>&nbsp;.&nbsp;</strong>{%- endif -%}<a class="blog-menu__link{% if page.url == "/blog/tags/" or page.url == "/blog/tags/index.html" %} menu-active{% endif %}" href="{{tags_url}}">{{ site.text.menu.tags | default: "tags" }}</a><strong>&nbsp;.&nbsp;</strong><a class="blog-menu__link" href="{{feed_url}}">{{ site.text.menu.feed | default: "feed" }}</a><strong>&nbsp;.&nbsp;</strong>
102
+ <span class="blog-menu">{{ site.strings.menu.blog.title }}&nbsp;»
103
+ <a class="blog-menu__link{% if page.url == "/blog/" or page.url == "/blog/index.html" or page.url contains "/blog/page/" %} menu-active{% endif %}" href="{{blog_url}}">{{site.strings.menu.blog.emoji}}{{site.strings.menu.blog.subtitle}}</a><strong>&nbsp;.&nbsp;</strong>{%- if site.blog.search.enable -%}{{site.strings.menu.search.emoji}}<a id="blog-search__btn" class="blog-menu__link" href="{{search_url}}">{{ site.strings.menu.search.text | default: "search" }}</a><strong>&nbsp;.&nbsp;</strong>{%- endif -%}{{site.strings.menu.tags.emoji}}<a class="blog-menu__link{% if page.url == "/blog/tags/" or page.url == "/blog/tags/index.html" %} menu-active{% endif %}" href="{{tags_url}}">{{ site.strings.menu.tags.text | default: "tags" }}</a><strong>&nbsp;.&nbsp;</strong>{{site.strings.menu.feed.emoji}}<a class="blog-menu__link" href="{{feed_url}}">{{ site.strings.menu.feed.title | default: "feed" }}</a><strong>&nbsp;.&nbsp;</strong>
104
104
  </span>
105
105
  {%- else -%}
106
106
  {%- assign published_pages = site.pages | where_exp:"p","p.path contains '_pages/' and p.published" -%}
@@ -109,22 +109,22 @@
109
109
  {%- endif -%}
110
110
  {%- if site.pagination.enabled == true -%}
111
111
  {%- if blog_page -%}
112
- <a href="{{blog_url}}">{{ site.text.menu.blog }}</a><strong>&nbsp;.&nbsp;</strong>
112
+ {{ site.strings.menu.blog.emoji }}<a href="{{blog_url}}">{{ site.strings.menu.blog.title }}</a><strong>&nbsp;.&nbsp;</strong>
113
113
  {%- endif -%}
114
114
  {% assign sorted_pages = site.pages | sort: 'order' %}
115
115
  {%- for item in sorted_pages -%}
116
- {%- if item.path contains '_pages/' -%}
116
+ {%- if item.path contains '_pages/' and item.in_menu -%}
117
117
  {%- unless item.url contains "blog" or item.url contains "404.html" -%}
118
- <a class="{% if page.url == item.url %}menu-active{% endif %}" href="{{ item.url | relative_url }}">{{ item.title | downcase }}</a><strong>&nbsp;.&nbsp;</strong>
118
+ {{ item.emoji }}<a class="{% if page.url == item.url %}menu-active{% endif %}" href="{{ item.url | relative_url }}">{{ item.title | downcase }}</a><strong>&nbsp;.&nbsp;</strong>
119
119
  {%- endunless -%}
120
120
  {%- endif -%}
121
121
  {%- endfor -%}
122
122
  {%- else -%}
123
123
  {% assign sorted_pages = site.pages | sort: 'order' %}
124
124
  {%- for item in sorted_pages -%}
125
- {%- if item.path contains '_pages/' and item.published != false -%}
125
+ {%- if item.path contains '_pages/' and item.published != false and item.in_menu -%}
126
126
  {%- unless item.url contains "/tags/" or item.url contains "404.html" -%}
127
- <a class="{% if page.url == item.url %}menu-active{% endif %}" href="{{ item.url | relative_url }}">{{ item.title | downcase }}</a><strong>&nbsp;.&nbsp;</strong>
127
+ {{ item.emoji }}<a class="{% if page.url == item.url %}menu-active{% endif %}" href="{{ item.url | relative_url }}">{{ item.title | downcase }}</a><strong>&nbsp;.&nbsp;</strong>
128
128
  {%- endunless -%}
129
129
  {%- endif -%}
130
130
  {%- endfor -%}
@@ -1,8 +1,8 @@
1
1
  {% include layout/data.liquid %}
2
2
 
3
3
  <!DOCTYPE html>
4
- <html lang="{{ site.lang | default: 'en-US' }}">
5
- {%- include head.html -%}
4
+ <html lang="{{ site.lang | default: 'en' }}">
5
+ {%- include layout/head.html -%}
6
6
  <body>
7
7
  <div class="mt-4 maintenance">
8
8
  <div class="container">
@@ -25,6 +25,6 @@
25
25
  </div>
26
26
  </div>
27
27
  </div>
28
- {%- include footer.html -%}
28
+ {%- include layout/footer.html -%}
29
29
  </body>
30
30
  </html>
@@ -6,7 +6,7 @@
6
6
  {%- if paginator.previous_page -%}
7
7
  <li class="page-item">
8
8
  <a class="page-link blog-pagination__newer" href="{{ paginator.previous_page_path | prepend: site.baseurl | prepend: site.url }}">
9
- &larr;&nbsp;{{ site.text.post.pagination.newer_text }}
9
+ &larr;&nbsp;{{ site.strings.post.pagination.newer_text }}
10
10
  </a>
11
11
  </li>
12
12
  {%- endif -%}
@@ -14,9 +14,9 @@
14
14
  {%- if total_page > 1 -%}
15
15
  <li class="page-item">
16
16
  <span class="page-link blog-pagination__counter">
17
- [&nbsp;{{ site.text.post.pagination.counter[0] }}
17
+ [&nbsp;{{ site.strings.post.pagination.counter[0] }}
18
18
  {{ paginator.page }}
19
- {{ site.text.post.pagination.counter[1] }}
19
+ {{ site.strings.post.pagination.counter[1] }}
20
20
  {{ total_page }}&nbsp;]
21
21
  </span>
22
22
  </li>
@@ -25,7 +25,7 @@
25
25
  {%- if paginator.next_page -%}
26
26
  <li class="page-item">
27
27
  <a class="page-link blog-pagination__older" href="{{ paginator.next_page_path | prepend: site.baseurl | prepend: site.url }}">
28
- {{ site.text.post.pagination.older_text }}&nbsp;&rarr;
28
+ {{ site.strings.post.pagination.older_text }}&nbsp;&rarr;
29
29
  </a>
30
30
  </li>
31
31
  {%- endif -%}
data/_includes/toc CHANGED
@@ -7,12 +7,46 @@
7
7
  </div>
8
8
  <div class="toc-list-wrapper">
9
9
  <ul class="toc-list" role="list"></ul>
10
- <p class="toc-empty" style="display:none">No titles found.</p>
10
+ <p class="toc-empty" style="display:none">No titles found. Remove TOC!</p>
11
11
  </div>
12
12
  </nav>
13
13
 
14
14
  <script>
15
15
  (function () {
16
+ const minLayoutWidth = 1830;
17
+
18
+ const toc = document.getElementById('toc');
19
+ if (toc) {
20
+ const sentinel = document.createElement('div');
21
+ toc.parentNode.insertBefore(sentinel, toc);
22
+
23
+ function shouldApplyFixed() {
24
+ return window.innerWidth > minLayoutWidth;
25
+ }
26
+
27
+ const observer = new IntersectionObserver(
28
+ ([entry]) => {
29
+ if (shouldApplyFixed()) {
30
+ if (!entry.isIntersecting) {
31
+ toc.classList.add('toc-fixed');
32
+ } else {
33
+ toc.classList.remove('toc-fixed');
34
+ }
35
+ } else {
36
+ toc.classList.remove('toc-fixed');
37
+ }
38
+ },
39
+ { threshold: 0 }
40
+ );
41
+ observer.observe(sentinel);
42
+
43
+ window.addEventListener('resize', () => {
44
+ if (!shouldApplyFixed()) {
45
+ toc.classList.remove('toc-fixed');
46
+ }
47
+ });
48
+ }
49
+
16
50
  function slugify(text) {
17
51
  if (!text) return '';
18
52
  return text.toString().toLowerCase().trim()
@@ -126,6 +160,15 @@
126
160
  const tocTop = toc.offsetTop;
127
161
 
128
162
  function handleScrollFix() {
163
+ if (window.innerWidth <= minLayoutWidth) {
164
+ toc.classList.remove('fixed');
165
+ toc.style.position = '';
166
+ toc.style.top = '';
167
+ toc.style.zIndex = '';
168
+ toc.style.width = '';
169
+ return;
170
+ }
171
+
129
172
  const scrollTop = window.scrollY || document.documentElement.scrollTop;
130
173
 
131
174
  // Fixes pinning behavior in Chrome
data/_layouts/blog.html CHANGED
@@ -17,7 +17,7 @@ layout: default
17
17
 
18
18
  <div id="posts" class="row">
19
19
  {%- if page.title -%}
20
- <h2 class="blog-subtitle">[&nbsp;{{ site.text.blog.subtitle | default: "posts" }}:&nbsp;&nbsp;{{ count_posts }}&nbsp;]</h2>
20
+ <h2 class="blog-subtitle">[&nbsp;{{ site.strings.blog.subtitle | default: "posts" }}:&nbsp;&nbsp;{{ count_posts }}&nbsp;]</h2>
21
21
  {%- endif -%}
22
22
 
23
23
  {%- if site.posts.size > 0 -%}
@@ -29,41 +29,41 @@ layout: default
29
29
  <span class="contact-title"><strong>[&nbsp;{{ page.title | downcase }}&nbsp;]</strong></span>
30
30
  <form id="contactForm" class="mt-4 contact-form">
31
31
  <div class="mb-3">
32
- {% comment %} <label for="inputName" class="form-label">{{ site.text.contact.name | default: "Name" | downcase }}</label> {% endcomment %}
32
+ {% comment %} <label for="inputName" class="form-label">{{ site.strings.contact.name | default: "Name" | downcase }}</label> {% endcomment %}
33
33
  <input id="inputName"
34
34
  name="name"
35
35
  type="text"
36
- placeholder="{{ site.text.contact.name.placeholder | default: 'First and last name' }}"
36
+ placeholder="{{ site.strings.contact.name.placeholder | default: 'First and last name' }}"
37
37
  class="form-control contact-form__name"
38
38
  required>
39
39
  </div>
40
40
  <div class="mb-3">
41
- {% comment %} <label for="inputEmail" class="form-label">{{ site.text.contact.name | default: "Email address" | downcase }}</label> {% endcomment %}
41
+ {% comment %} <label for="inputEmail" class="form-label">{{ site.strings.contact.name | default: "Email address" | downcase }}</label> {% endcomment %}
42
42
  <input id="inputEmail"
43
43
  name="email"
44
44
  type="email"
45
- placeholder="{{ site.text.contact.email.placeholder | default: 'Your best email address' }}"
45
+ placeholder="{{ site.strings.contact.email.placeholder | default: 'Your best email address' }}"
46
46
  class="form-control contact-form__email"
47
47
  aria-describedby="emailHelp"
48
48
  required>
49
49
  <div id="emailHelp" class="form-text contact-form__help">
50
- {{ site.text.contact.email.help | default: "We'll never share your email with anyone else." }}
50
+ {{ site.strings.contact.email.help | default: "We'll never share your email with anyone else." }}
51
51
  </div>
52
52
  </div>
53
53
  <textarea id="textMessage"
54
54
  name="message"
55
55
  class="form-control contact-form__message"
56
- placeholder="{{ site.text.contact.message.placeholder | default: 'Write your message here' }}"
56
+ placeholder="{{ site.strings.contact.message.placeholder | default: 'Write your message here' }}"
57
57
  style="min-height: 150px"
58
58
  required></textarea>
59
- <small style="display: block; font-size: 8pt; opacity: .6">{{ site.text.contact.message.caracters.warning.content }}</small>
59
+ <small style="display: block; font-size: 8pt; opacity: .6">{{ site.strings.contact.message.caracters.warning.content }}</small>
60
60
  <!-- TODO: version: 0.2.0 Make reCaptcha change themes instantly -->
61
61
  <div id="g-recaptcha" class="g-recaptcha mt-2" data-sitekey="{{ site.google.recaptcha.pubkey }}" style="display: inline-block; margin: 5px 0;"></div>
62
62
  <div class="d-flex justify-content-end mb-5">
63
63
  <button id="submitButton"
64
64
  type="submit"
65
65
  class="btn contact-form__submit">
66
- {{ site.text.contact.button.text | default: 'Send!' }}
66
+ {{ site.strings.contact.button.text | default: 'Send!' }}
67
67
  </button>
68
68
  </div>
69
69
  </form>
@@ -110,8 +110,8 @@ layout: default
110
110
  const recaptchaResponse = grecaptcha.getResponse();
111
111
  if (!recaptchaResponse) {
112
112
  showModal(
113
- "{{ site.text.contact.recaptcha.warning.title | default: 'Warning' }}",
114
- "{{ site.text.contact.recaptcha.warning.content | default: "Please tick the 'I'm not a robot' box." }}",
113
+ "{{ site.strings.contact.recaptcha.warning.title | default: 'Warning' }}",
114
+ "{{ site.strings.contact.recaptcha.warning.content | default: "Please tick the 'I'm not a robot' box." }}",
115
115
  "warning"
116
116
  );
117
117
  return;
@@ -119,17 +119,17 @@ layout: default
119
119
 
120
120
  const textarea = document.getElementById('textMessage');
121
121
  const text = textarea.value.trim();
122
- if (text.length < {{ site.text.contact.message.caracters.min }}) {
122
+ if (text.length < {{ site.strings.contact.message.caracters.min }}) {
123
123
  showModal(
124
- "{{ site.text.contact.message.caracters.warning.title | default: 'Warning' }}",
125
- "{{ site.text.contact.message.caracters.warning.content | default: "The message must have at least 50 characters." }}",
124
+ "{{ site.strings.contact.message.caracters.warning.title | default: 'Warning' }}",
125
+ "{{ site.strings.contact.message.caracters.warning.content | default: "The message must have at least 50 characters." }}",
126
126
  "warning"
127
127
  );
128
128
  return;
129
129
  }
130
130
 
131
131
  submitButton.disabled = true;
132
- submitButton.textContent = "{{ site.text.contact.message.status | default: "Sending...Wait" }}";
132
+ submitButton.textContent = "{{ site.strings.contact.message.status | default: "Sending...Wait" }}";
133
133
 
134
134
  const formData = new FormData(form);
135
135
  const data = Object.fromEntries(formData.entries());
@@ -147,31 +147,31 @@ layout: default
147
147
  form.reset();
148
148
  grecaptcha.reset();
149
149
  showModal(
150
- "{{ site.text.contact.message.success.title | default: 'Message Sent' }}",
151
- "{{ site.text.contact.message.success.content | default: 'Your message has been sent successfully!' }}",
150
+ "{{ site.strings.contact.message.success.title | default: 'Message Sent' }}",
151
+ "{{ site.strings.contact.message.success.content | default: 'Your message has been sent successfully!' }}",
152
152
  "success"
153
153
  );
154
154
  } else {
155
155
  showModal(
156
- "{{ site.text.contact.message.error.title | default: 'Error' }}",
157
- "{{ site.text.contact.message.error.content | default: 'Something went wrong while sending your message.' }}",
156
+ "{{ site.strings.contact.message.error.title | default: 'Error' }}",
157
+ "{{ site.strings.contact.message.error.content | default: 'Something went wrong while sending your message.' }}",
158
158
  "error"
159
159
  );
160
- throw new Error(result.message || "{{ site.text.contact.message.error.content | default: "An unknown error has occurred." }}");
160
+ throw new Error(result.message || "{{ site.strings.contact.message.error.content | default: "An unknown error has occurred." }}");
161
161
  }
162
162
 
163
163
  } catch (error) {
164
164
  console.error("Error sending:", error);
165
165
  if (error.message.includes("reCAPTCHA")) {
166
166
  showModal(
167
- "{{ site.text.contact.message.error.title | default: 'Error' }}",
168
- "{{ site.text.contact.recaptcha.fail | default: "Verification failed. Please reload the page and try again." }}",
167
+ "{{ site.strings.contact.message.error.title | default: 'Error' }}",
168
+ "{{ site.strings.contact.recaptcha.fail | default: "Verification failed. Please reload the page and try again." }}",
169
169
  "error"
170
170
  );
171
171
  } else {
172
172
  showModal(
173
- "{{ site.text.contact.message.error.title | default: 'Error' }}",
174
- "{{ site.text.contact.recaptcha.error | default: "An error occurred while sending the message. Please try again." }}",
173
+ "{{ site.strings.contact.message.error.title | default: 'Error' }}",
174
+ "{{ site.strings.contact.recaptcha.error | default: "An error occurred while sending the message. Please try again." }}",
175
175
  "error"
176
176
  );
177
177
  }
@@ -179,7 +179,7 @@ layout: default
179
179
 
180
180
  } finally {
181
181
  submitButton.disabled = false;
182
- submitButton.textContent = "{{ site.text.contact.button.text | default: "Send!" }}";
182
+ submitButton.textContent = "{{ site.strings.contact.button.text | default: "Send!" }}";
183
183
  }
184
184
  });
185
185
  </script>
@@ -8,7 +8,7 @@
8
8
  {%- assign index = site.pages | where: "path", "index.md" | first -%}
9
9
 
10
10
  <!DOCTYPE html>
11
- <html id="top" lang="{{ site.lang | default: 'en-US' }}" data-theme="light">
11
+ <html id="top" lang="{{ site.lang | default: 'en' }}" data-theme="light">
12
12
  {%- include layout/head.html -%}
13
13
  <body data-layout="{{ page.layout | default: '' }}" data-terminal-enabled="{{ site.home.terminal.enable | default: false }}">
14
14
  {%- if site.home.terminal.enable and page.url == "/" and index.layout == "home" -%}
@@ -28,7 +28,7 @@
28
28
  </body>
29
29
 
30
30
  <!-- Scripts -->
31
- <script src="{{ '/assets/vendor/bootstrap/js/bootstrap.bundle.js' | relative_url }}"></script>
31
+ <script src="{{ '/assets/vendor/bootstrap/js/bootstrap.bundle.min.js' | relative_url }}"></script>
32
32
 
33
33
  {%- if page.comments != false and site.blog.post.comments.provider == 'giscus' -%}
34
34
  <script>
@@ -71,6 +71,7 @@
71
71
 
72
72
  const openSearch = () => {
73
73
  box.classList.add('is-open');
74
+ box.removeAttribute('inert');
74
75
  box.style.maxHeight = box.scrollHeight + 'px';
75
76
  box.style.opacity = '1';
76
77
  box.addEventListener('transitionend', function onOpened(e) {
@@ -89,6 +90,7 @@
89
90
  box.style.maxHeight = '0';
90
91
  box.style.opacity = '0';
91
92
  });
93
+ box.setAttribute('inert', '');
92
94
  box.classList.remove('is-open');
93
95
  };
94
96
 
@@ -158,7 +160,7 @@
158
160
  searchInput: document.getElementById('blog-search__input'),
159
161
  resultsContainer: document.getElementById('blog-search__results'),
160
162
  searchResultTemplate: '<li><span class="blog-list__meta"><time datetime="{date}">{date}</time></span>&nbsp;»&nbsp; <a class="blog-list__link" href="{{ site.url }}{url}">{title}</a></li>',
161
- noResultsText: '<p>{{ site.text.blog.no_results | default: "No results found" }}</p>',
163
+ noResultsText: '<p>{{ site.strings.blog.no_results | default: "No results found" }}</p>',
162
164
  json: "{{ '/assets/json/blog_search.json' | relative_url }}"
163
165
  })
164
166
  });
@@ -174,9 +176,9 @@
174
176
  const socialsEl = document.getElementById("terminal-screen--socials");
175
177
 
176
178
  const commands = {
177
- help: `{{ site.text.home.terminal.commands }}`,
179
+ help: `{{ site.strings.home.terminal.commands }}`,
178
180
  about: document.getElementById("home-content").innerHTML,
179
- socials: socialsEl ? socialsEl.innerHTML : `{{ site.text.home.terminal.no_socials }}`,
181
+ socials: socialsEl ? socialsEl.innerHTML : `{{ site.strings.home.terminal.no_socials }}`,
180
182
  };
181
183
 
182
184
  function createInputLine() {
@@ -185,7 +187,7 @@
185
187
 
186
188
  const prompt = document.createElement('span');
187
189
  prompt.className = 'prompt';
188
- prompt.textContent = `[{{ site.text.home.terminal.user }}@{{ site.text.home.terminal.hostname }}:~]$`;
190
+ prompt.textContent = `[{{ site.strings.home.terminal.user }}@{{ site.strings.home.terminal.hostname }}:~]$`;
189
191
 
190
192
  // wrapper para conter input, cursor e measure
191
193
  const wrapper = document.createElement('span');
@@ -194,7 +196,7 @@
194
196
  const input = document.createElement('input');
195
197
  input.type = 'text';
196
198
  input.className = 'input';
197
- input.placeholder = `{{ site.text.home.terminal.welcome }}`;
199
+ input.placeholder = `{{ site.strings.home.terminal.welcome }}`;
198
200
  input.spellcheck = false;
199
201
  input.autocomplete = 'off';
200
202
  input.autocorrect = 'off';
@@ -298,7 +300,7 @@
298
300
  case cmd === 'about': writeLineHTML(commands.about); break;
299
301
  case cmd === 'socials': writeLineHTML(commands.socials); break;
300
302
  case cmd === 'clear': screen.innerHTML=''; break;
301
- default: if(cmd) commandsPrint(cmd + `{{ site.text.home.terminal.error }}`, mode='text');
303
+ default: if(cmd) commandsPrint(cmd + `{{ site.strings.home.terminal.error }}`, mode='text');
302
304
  }
303
305
  }
304
306
 
data/_layouts/error.html CHANGED
@@ -5,11 +5,11 @@ layout: default
5
5
  <div class="container error">
6
6
  <div class="row">
7
7
  <div class="col-sm text-center">
8
- {%- if site.text.error.image -%}
9
- <img class="error-image" src="{{ site.text.error.image }}" alt="error 404">
8
+ {%- if site.strings.error.image -%}
9
+ <img class="error-image" src="{{ site.strings.error.image }}" alt="error 404">
10
10
  {%- endif -%}
11
- <h1 class="error-title">{{ site.text.error.title | escape }}</h1>
12
- <h2 class="error-description">{{ site.text.error.message | markdownify }}</h2>
11
+ <h1 class="error-title">{{ site.strings.error.title | escape }}</h1>
12
+ <h2 class="error-description">{{ site.strings.error.message | markdownify }}</h2>
13
13
  </div>
14
14
  </div>
15
15
  </div>
data/_layouts/home.html CHANGED
@@ -9,7 +9,7 @@ layout: default
9
9
  <div class="terminal-header__btn terminal-header__close" title="close"></div>
10
10
  <div class="terminal-header__btn terminal-header__min" title="minimize"></div>
11
11
  <div class="terminal-header__btn terminal-header__max" title="maximize"></div>
12
- <div class="terminal-header__title">{{ site.text.home.terminal.user }}@{{ site.text.home.terminal.hostname }}</div>
12
+ <div class="terminal-header__title">{{ site.strings.home.terminal.user }}@{{ site.strings.home.terminal.hostname }}</div>
13
13
  </div>
14
14
 
15
15
  <div id="screen" class="terminal-screen">
data/_layouts/page.html CHANGED
@@ -31,10 +31,8 @@ layout: default
31
31
  {%- if page.update_date -%}
32
32
  <div class="row page-modified">
33
33
  <time class="dt-modified" datetime="{{ page.date | date_to_xmlschema }}" itemprop="dateModified">
34
- <strong>{{ site.text.page.updated_on | default: "Page updated on" }}:</strong>&nbsp;{% datelang page.update_date format:date_format %}
34
+ <strong>{{ site.strings.page.updated_on | default: "Page updated on" }}:</strong>&nbsp;{% datelang page.update_date format:date_format %}
35
35
  </time>
36
36
  </div>
37
37
  {%- endif -%}
38
38
  </div>
39
-
40
- <script src="{{ '/assets/js/toc.js' | relative_url }}"></script>
@@ -0,0 +1 @@
1
+ <!-- TODO: Aqui vai ser um layout para uma página de coleção de imagens com post de texto -->
data/_layouts/post.html CHANGED
@@ -24,7 +24,7 @@ layout: default
24
24
  {%- if page.author -%}
25
25
  <span itemprop="author" itemscope itemtype="http://schema.org/Person">
26
26
  <span class="p-author h-card" itemprop="name">
27
- {{ site.text.post.author | default: "author" }}:&nbsp;{{ page.author }}
27
+ {{ site.strings.post.author | default: "author" }}:&nbsp;{{ page.author }}
28
28
  </span>
29
29
  </span>
30
30
  {%- endif -%}
@@ -45,7 +45,7 @@ layout: default
45
45
  {%- if page.update_date -%}
46
46
  <div class="row post-modified">
47
47
  <time class="dt-modified" datetime="{{ page.date | date_to_xmlschema }}" itemprop="dateModified">
48
- <strong>{{ site.text.post.updated_on | default: "Post updated on" }}:</strong>&nbsp;
48
+ <strong>{{ site.strings.post.updated_on | default: "Post updated on" }}:</strong>&nbsp;
49
49
  {%- if site.datelang -%}
50
50
  {% datelang page.update_date format:date_format %}
51
51
  {%- else -%}
@@ -94,7 +94,7 @@ layout: default
94
94
 
95
95
  {%- if related_posts.size > 0 -%}
96
96
  <div class="row related-posts">
97
- <h3 class="related-posts-title">[&nbsp;{{ site.text.post.related_posts | default: "related posts" }}&nbsp;]</h3>
97
+ <h3 class="related-posts-title">[&nbsp;{{ site.strings.post.related_posts | default: "related posts" }}&nbsp;]</h3>
98
98
 
99
99
  <ul class="related-posts-list">
100
100
  {%- for post in related_posts limit:5 -%}
@@ -116,5 +116,3 @@ layout: default
116
116
  {%- endif -%}
117
117
 
118
118
  </article>
119
-
120
- <script src="{{ '/assets/js/toc.js' | relative_url }}"></script>
data/_layouts/resume.html CHANGED
@@ -151,7 +151,7 @@
151
151
  <small>{{ cert.certificate }}</small>
152
152
  </a>
153
153
  {%- else -%}
154
- <span>{{ cert.course }}</span>
154
+ <strong>{{ cert.course }}</strong>
155
155
  {%- endif -%}
156
156
  </div>
157
157
  </div>
@@ -264,7 +264,7 @@
264
264
  </body>
265
265
 
266
266
  <!-- Scripts -->
267
- <script src="{{ '/assets/vendor/bootstrap/js/bootstrap.bundle.js' | relative_url }}"></script>
267
+ <script src="{{ '/assets/vendor/bootstrap/js/bootstrap.bundle.min.js' | relative_url }}"></script>
268
268
 
269
269
  <script src="{{ '/assets/js/default.js' | relative_url }}"></script>
270
270
 
@@ -6,7 +6,7 @@ layout: default
6
6
 
7
7
  <div class="container tag-posts">
8
8
  <div class="row">
9
- <h1 class="tag-posts-title"><span>[&nbsp;{{ site.text.tags_posts.title }}:&nbsp;</span>{{ page.title }}<span>&nbsp;]</span></h1>
9
+ <h1 class="tag-posts-title"><span>[&nbsp;{{ site.strings.tags_posts.title }}:&nbsp;</span>{{ page.title }}<span>&nbsp;]</span></h1>
10
10
 
11
11
  <ul class="row tag-posts-list">
12
12
  {%- for post in page.posts -%}
@@ -437,22 +437,22 @@
437
437
  transition: transform .2s ease;
438
438
  }
439
439
  }
440
- }
441
440
 
442
- .details-content-wrapper {
443
- margin-top: 30px;
444
- }
441
+ &[open] summary::before {
442
+ transform: rotate(90deg) !important;
443
+ }
445
444
 
446
- details details summary details[open] summary::before {
447
- transform: rotate(90deg);
448
- }
445
+ &[open] {
446
+ background: var(--details-bg-color);
447
+ border-color: var(--border-color);
448
+ }
449
449
 
450
- details[open] {
451
- background: var(--details-bg-color);
452
- border-color: var(--border-color);
450
+ p:last-child {
451
+ margin-bottom: 0px;
452
+ }
453
453
  }
454
454
 
455
- details p:last-child {
456
- margin-bottom: 0px;
455
+ .details-content-wrapper {
456
+ margin-top: 30px;
457
457
  }
458
458
  }
@@ -13,9 +13,11 @@
13
13
  background-color: transparent;
14
14
  margin-bottom: 5px;
15
15
  margin-right: 2px;
16
+
16
17
  @media (max-width: 1040px) {
17
18
  display: none;
18
19
  }
20
+
19
21
  &-link {
20
22
  font-size: 3rem;
21
23
  display: none;
@@ -24,21 +26,26 @@
24
26
  }
25
27
  }
26
28
 
27
- &-copyright {
29
+ &-copyright-wrap {
28
30
  text-align: left;
29
- @media (max-width: 400px) {
31
+
32
+ @media (max-width: 798px) {
30
33
  text-align: center !important;
31
34
  }
32
35
  }
33
- &-message {
36
+
37
+ &-message-wrap {
34
38
  text-align: center;
35
- @media (max-width: 1040px) {
39
+
40
+ @media (max-width: 940px) {
36
41
  display: none;
37
42
  }
38
43
  }
39
- &-made-by {
44
+
45
+ &-made-by-wrap {
40
46
  text-align: right;
41
- @media (max-width: 400px) {
47
+
48
+ @media (max-width: 800px) {
42
49
  display: none;
43
50
  }
44
51
  }
@@ -107,6 +107,7 @@
107
107
  }
108
108
 
109
109
  &-img {
110
+ width: 70px !important;
110
111
  border: 2px dotted var(--primary-color);
111
112
  border-radius: 10%;
112
113
  margin-bottom: 5px;
@@ -16,7 +16,7 @@
16
16
  body,
17
17
  .resume,
18
18
  .container-fluid {
19
- background: #fff !important;
19
+ background-color: #fff !important;
20
20
  box-shadow: none !important;
21
21
  border: none !important;
22
22
  }
@@ -50,8 +50,6 @@
50
50
  }
51
51
 
52
52
  .section {
53
- page-break-inside: avoid;
54
-
55
53
  &-title {
56
54
  font-size: 12pt;
57
55
  font-weight: 700;
@@ -60,7 +58,6 @@
60
58
  &-item {
61
59
  font-size: 10.5pt;
62
60
  margin-bottom: 0.4em;
63
- page-break-inside: avoid;
64
61
 
65
62
  a {
66
63
  color: black;
@@ -1,14 +1,17 @@
1
1
  $theme-colors: (
2
2
  bg: #181818,
3
- text: #bfbfbf,
3
+ // default text: #bfbfbf;
4
+ text: #d5d5d5,
4
5
  text-muted: #9b9b9b,
5
6
  // default primary: #66c9e2 | #61b8b8
6
7
  // primary dark blue: #668be2
7
8
  // primary grovbox: #ebdbb2
8
9
  // primary oliva: #639e5b
9
10
  // primary oliva2: #75a683
10
- // primary opaque aqua: #61b8b8
11
- primary: #4ce4c8,
11
+ // primary opaque aqua fosco: #61b8b8
12
+ // primary opaque aqua 2: #4ce4c8
13
+ // primary opaque aqua 3: #5ebdac
14
+ primary: #5ebdac,
12
15
  shadow-color: rgba(0, 0, 0, 0.1),
13
16
  code-color: #f55ca8,
14
17
  code-block-header-color: #141414,
@@ -57,7 +60,7 @@ $theme-colors: (
57
60
  resume-border-color: #000000,
58
61
  resume-title-text-color: white,
59
62
  resume-content-text-color: #d3d3d3,
60
- resume-text-muted-color: #707070,
63
+ resume-text-muted-color: #9d9d9d,
61
64
  );
62
65
 
63
66
  /* matrix */
@@ -2,7 +2,7 @@ $theme-colors: (
2
2
  bg: #f3f3f3,
3
3
  // bg default: #f3f3f3
4
4
  text: #020202,
5
- text-muted: #808080,
5
+ text-muted: #3e3e3e,
6
6
  primary: #a00,
7
7
  shadow-color: rgba(0, 0, 0, 0.1),
8
8
  code-color: #db3688,
data/assets/js/avatar.js CHANGED
@@ -1,3 +1,12 @@
1
+ /* TODO: Colocar cada script para página ideal, por exemplo:
2
+ home: home.js [terminal]
3
+ blog: blog.js
4
+ tag: tag.js
5
+ default.js será script que contem em todas páginas. [botão de top]
6
+ post: post.js [toc]
7
+ page: page.js
8
+ */
9
+
1
10
  document.addEventListener("DOMContentLoaded", () => {
2
11
  // O alvo do clique agora é o contêiner INTERATIVO
3
12
  const flipperAvatars = document.querySelectorAll('.avatar-flipper__open-true');
@@ -0,0 +1,16 @@
1
+ require "jekyll"
2
+ require 'digest'
3
+ require 'base64'
4
+
5
+ module Rawfeed
6
+ module CspFilters
7
+ # Generates a SHA256 hash and encodes it in Base64, ready for use in a CSP.
8
+ def sha256_base64(input)
9
+ # Calculates the SHA256 hash of the input text.
10
+ hash = Digest::SHA256.digest(input)
11
+ # Encodes the result in strict Base64 (no line breaks).
12
+ Base64.strict_encode64(hash)
13
+ end
14
+ end
15
+ end
16
+ Liquid::Template.register_filter(Rawfeed::CspFilters)
data/lib/rawfeed/page.rb CHANGED
@@ -16,9 +16,11 @@ module Rawfeed
16
16
  file.puts("layout: page")
17
17
  file.puts("order: #number")
18
18
  file.puts("title: \"#{array[0]}\"")
19
+ file.puts("emoji: 😃&nbsp; # Add an emoji to the page menu or leave it blank")
19
20
  file.puts("author: \"Your Name\"")
20
21
  file.puts("date: #{array[2]} -0300")
21
22
  file.puts("update_date: ")
23
+ file.puts("in_menu: true")
22
24
  file.puts("reading_time: true")
23
25
  file.puts("published: false")
24
26
  file.puts("permalink: /#{permalink}/")
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Rawfeed
4
- VERSION = "0.1.3"
4
+ VERSION = "0.1.4"
5
5
  end
data/lib/rawfeed.rb CHANGED
@@ -9,3 +9,4 @@ require_relative "rawfeed/resume"
9
9
  require_relative "rawfeed/layout"
10
10
  require "rawfeed/datelang"
11
11
  require "rawfeed/reading_time"
12
+ require "rawfeed/csp_filters"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rawfeed
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - William C. Canin
@@ -143,6 +143,7 @@ files:
143
143
  - _includes/endtabs
144
144
  - _includes/image
145
145
  - _includes/layout/blog_search.html
146
+ - _includes/layout/capture_scripts.liquid
146
147
  - _includes/layout/data.liquid
147
148
  - _includes/layout/disqus.html
148
149
  - _includes/layout/footer.html
@@ -162,6 +163,7 @@ files:
162
163
  - _layouts/error.html
163
164
  - _layouts/home.html
164
165
  - _layouts/page.html
166
+ - _layouts/pixels.html
165
167
  - _layouts/post.html
166
168
  - _layouts/resume.html
167
169
  - _layouts/tag.html
@@ -207,7 +209,6 @@ files:
207
209
  - assets/js/avatar.js
208
210
  - assets/js/default.js
209
211
  - assets/js/terminal.js
210
- - assets/js/toc.js
211
212
  - assets/json/blog_search.json
212
213
  - assets/json/datelang.json
213
214
  - assets/vendor/bootstrap/css/bootstrap-grid.css
@@ -257,6 +258,7 @@ files:
257
258
  - assets/vendor/simple-jekyll-search.js
258
259
  - assets/vendor/simple-jekyll-search.min.js
259
260
  - lib/rawfeed.rb
261
+ - lib/rawfeed/csp_filters.rb
260
262
  - lib/rawfeed/datelang.rb
261
263
  - lib/rawfeed/draft.rb
262
264
  - lib/rawfeed/installer.rb
data/assets/js/toc.js DELETED
@@ -1,22 +0,0 @@
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
- });