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 +4 -4
- data/README.md +20 -1
- data/_data/resume.yml +0 -1
- data/_includes/layout/blog_search.html +4 -4
- data/_includes/layout/capture_scripts.liquid +6 -0
- data/_includes/layout/disqus.html +1 -1
- data/_includes/layout/footer.html +10 -8
- data/_includes/layout/giscus.html +1 -1
- data/_includes/layout/head.html +40 -1
- data/_includes/layout/header.html +15 -15
- data/_includes/layout/maintenance.html +3 -3
- data/_includes/layout/paginator.html +4 -4
- data/_includes/toc +44 -1
- data/_layouts/blog.html +1 -1
- data/_layouts/contact.html +24 -24
- data/_layouts/default.html +10 -8
- data/_layouts/error.html +4 -4
- data/_layouts/home.html +1 -1
- data/_layouts/page.html +1 -3
- data/_layouts/pixels.html +1 -0
- data/_layouts/post.html +3 -5
- data/_layouts/resume.html +2 -2
- data/_layouts/tag_posts.html +1 -1
- data/_sass/components/_markdown.scss +12 -12
- data/_sass/includes/_footer.scss +13 -6
- data/_sass/includes/_header.scss +1 -0
- data/_sass/layouts/_resume.scss +1 -4
- data/_sass/theme/_dark.scss +7 -4
- data/_sass/theme/_light.scss +1 -1
- data/assets/js/avatar.js +9 -0
- data/lib/rawfeed/csp_filters.rb +16 -0
- data/lib/rawfeed/page.rb +2 -0
- data/lib/rawfeed/version.rb +1 -1
- data/lib/rawfeed.rb +1 -0
- metadata +4 -2
- data/assets/js/toc.js +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: be86e28f3f858c931e6cb9874b17eb04d07c99314d6c8bc00a914037962b2bcd
|
4
|
+
data.tar.gz: 7aaa22c4f212a10039e4a8a5494f0c97c1771f0885ded4a6da3483d0eedd96a2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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"
|
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.
|
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.
|
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">[ {{ site.
|
13
|
+
<h2 class="blog-subtitle">[ {{ site.strings.blog.search.results | default: "results" }} ]</h2>
|
14
14
|
<ul id="blog-search__results" class="row blog-list"></ul>
|
15
15
|
</div>
|
16
16
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
{% if site.blog.post.comments.disqus.shortname != "" %}
|
2
2
|
<div class="row comments">
|
3
|
-
<h1 class="comments-title">[ {{ site.
|
3
|
+
<h1 class="comments-title">[ {{ site.strings.post.comments | default: "comments" }} ]</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-
|
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.
|
16
|
-
<div class="col-
|
17
|
-
|
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">© {{ site.title | default: theme_name }} {{ since }}{%- if since -%}-{%- endif -%}{{year}} - {{ site.strings.footer.copyright.message }}</div>
|
18
20
|
</div>
|
19
21
|
{%- endif -%}
|
20
22
|
|
21
|
-
{%- if site.
|
22
|
-
<div class="col-
|
23
|
-
<div class="footer-message">{{ site.
|
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-
|
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">[ {{ site.
|
3
|
+
<h1 class="comments-title">[ {{ site.strings.post.comments | default: "comments" }} ]</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 }}"
|
data/_includes/layout/head.html
CHANGED
@@ -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&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>[ <a class="{% if page.url == "/" or page.url == "/index.html" %}menu-active{% endif %}" href="{{home_url}}">{{ site.
|
28
|
+
<span>[ <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> ]</span>
|
29
29
|
{%- else -%}
|
30
|
-
<span>[ 
|
30
|
+
<span>[ {{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> ]</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 }}"
|
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 }}
|
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 }}"
|
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 }}
|
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 »
|
89
|
-
{%- if site.blog.search.enable -%}<a id="blog-search__btn" class="blog-menu__link" href="{{search_url}}">{{ site.
|
89
|
+
{{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> . </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> . </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.
|
99
|
+
<a class="blog-menu__link" href="{{feed_url}}">{{ site.strings.menu.feed | default: "feed" }}</a><strong> . </strong>
|
100
100
|
{%- else index.layout == "home" -%}
|
101
101
|
{%- if page.url contains "/blog/" -%}
|
102
|
-
<span class="blog-menu">{{ site.
|
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}}">
|
102
|
+
<span class="blog-menu">{{ site.strings.menu.blog.title }} »
|
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> . </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> . </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> . </strong>{{site.strings.menu.feed.emoji}}<a class="blog-menu__link" href="{{feed_url}}">{{ site.strings.menu.feed.title | default: "feed" }}</a><strong> . </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.
|
112
|
+
{{ site.strings.menu.blog.emoji }}<a href="{{blog_url}}">{{ site.strings.menu.blog.title }}</a><strong> . </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> . </strong>
|
118
|
+
{{ item.emoji }}<a class="{% if page.url == item.url %}menu-active{% endif %}" href="{{ item.url | relative_url }}">{{ item.title | downcase }}</a><strong> . </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> . </strong>
|
127
|
+
{{ item.emoji }}<a class="{% if page.url == item.url %}menu-active{% endif %}" href="{{ item.url | relative_url }}">{{ item.title | downcase }}</a><strong> . </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
|
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
|
-
← {{ site.
|
9
|
+
← {{ 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
|
-
[ {{ site.
|
17
|
+
[ {{ site.strings.post.pagination.counter[0] }}
|
18
18
|
{{ paginator.page }}
|
19
|
-
{{ site.
|
19
|
+
{{ site.strings.post.pagination.counter[1] }}
|
20
20
|
{{ total_page }} ]
|
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.
|
28
|
+
{{ site.strings.post.pagination.older_text }} →
|
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
|
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">[ {{ site.
|
20
|
+
<h2 class="blog-subtitle">[ {{ site.strings.blog.subtitle | default: "posts" }}: {{ count_posts }} ]</h2>
|
21
21
|
{%- endif -%}
|
22
22
|
|
23
23
|
{%- if site.posts.size > 0 -%}
|
data/_layouts/contact.html
CHANGED
@@ -29,41 +29,41 @@ layout: default
|
|
29
29
|
<span class="contact-title"><strong>[ {{ page.title | downcase }} ]</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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
114
|
-
"{{ site.
|
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.
|
122
|
+
if (text.length < {{ site.strings.contact.message.caracters.min }}) {
|
123
123
|
showModal(
|
124
|
-
"{{ site.
|
125
|
-
"{{ site.
|
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.
|
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.
|
151
|
-
"{{ site.
|
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.
|
157
|
-
"{{ site.
|
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.
|
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.
|
168
|
-
"{{ site.
|
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.
|
174
|
-
"{{ site.
|
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.
|
182
|
+
submitButton.textContent = "{{ site.strings.contact.button.text | default: "Send!" }}";
|
183
183
|
}
|
184
184
|
});
|
185
185
|
</script>
|
data/_layouts/default.html
CHANGED
@@ -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
|
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> » <a class="blog-list__link" href="{{ site.url }}{url}">{title}</a></li>',
|
161
|
-
noResultsText: '<p>{{ site.
|
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.
|
179
|
+
help: `{{ site.strings.home.terminal.commands }}`,
|
178
180
|
about: document.getElementById("home-content").innerHTML,
|
179
|
-
socials: socialsEl ? socialsEl.innerHTML : `{{ site.
|
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.
|
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.
|
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.
|
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.
|
9
|
-
<img class="error-image" src="{{ site.
|
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.
|
12
|
-
<h2 class="error-description">{{ site.
|
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.
|
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.
|
34
|
+
<strong>{{ site.strings.page.updated_on | default: "Page updated on" }}:</strong> {% 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.
|
27
|
+
{{ site.strings.post.author | default: "author" }}: {{ 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.
|
48
|
+
<strong>{{ site.strings.post.updated_on | default: "Post updated on" }}:</strong>
|
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">[ {{ site.
|
97
|
+
<h3 class="related-posts-title">[ {{ site.strings.post.related_posts | default: "related posts" }} ]</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
|
-
<
|
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
|
|
data/_layouts/tag_posts.html
CHANGED
@@ -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>[ {{ site.
|
9
|
+
<h1 class="tag-posts-title"><span>[ {{ site.strings.tags_posts.title }}: </span>{{ page.title }}<span> ]</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
|
-
|
443
|
-
|
444
|
-
|
441
|
+
&[open] summary::before {
|
442
|
+
transform: rotate(90deg) !important;
|
443
|
+
}
|
445
444
|
|
446
|
-
|
447
|
-
|
448
|
-
|
445
|
+
&[open] {
|
446
|
+
background: var(--details-bg-color);
|
447
|
+
border-color: var(--border-color);
|
448
|
+
}
|
449
449
|
|
450
|
-
|
451
|
-
|
452
|
-
|
450
|
+
p:last-child {
|
451
|
+
margin-bottom: 0px;
|
452
|
+
}
|
453
453
|
}
|
454
454
|
|
455
|
-
details
|
456
|
-
margin-
|
455
|
+
.details-content-wrapper {
|
456
|
+
margin-top: 30px;
|
457
457
|
}
|
458
458
|
}
|
data/_sass/includes/_footer.scss
CHANGED
@@ -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
|
-
|
31
|
+
|
32
|
+
@media (max-width: 798px) {
|
30
33
|
text-align: center !important;
|
31
34
|
}
|
32
35
|
}
|
33
|
-
|
36
|
+
|
37
|
+
&-message-wrap {
|
34
38
|
text-align: center;
|
35
|
-
|
39
|
+
|
40
|
+
@media (max-width: 940px) {
|
36
41
|
display: none;
|
37
42
|
}
|
38
43
|
}
|
39
|
-
|
44
|
+
|
45
|
+
&-made-by-wrap {
|
40
46
|
text-align: right;
|
41
|
-
|
47
|
+
|
48
|
+
@media (max-width: 800px) {
|
42
49
|
display: none;
|
43
50
|
}
|
44
51
|
}
|
data/_sass/includes/_header.scss
CHANGED
data/_sass/layouts/_resume.scss
CHANGED
@@ -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;
|
data/_sass/theme/_dark.scss
CHANGED
@@ -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: #
|
63
|
+
resume-text-muted-color: #9d9d9d,
|
61
64
|
);
|
62
65
|
|
63
66
|
/* matrix */
|
data/_sass/theme/_light.scss
CHANGED
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: 😃 # 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}/")
|
data/lib/rawfeed/version.rb
CHANGED
data/lib/rawfeed.rb
CHANGED
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.
|
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
|
-
});
|