recursero-jekyll-theme 0.1.5 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +69 -18
  3. data/_config.yml +77 -0
  4. data/_data/assets.json +6 -0
  5. data/_data/en.yml +61 -15
  6. data/_data/es.yml +64 -15
  7. data/_data/forms/contacto.yml +2 -2
  8. data/_data/layouts/about.yml +39 -22
  9. data/_data/layouts/category.yml +5 -10
  10. data/_data/layouts/menu.yml +73 -0
  11. data/_data/layouts/page.yml +7 -7
  12. data/_data/layouts/place.yml +13 -11
  13. data/_data/layouts/post.yml +7 -7
  14. data/_includes/contact.html +8 -5
  15. data/_includes/floating_alert.html +6 -0
  16. data/_includes/item.html +38 -0
  17. data/_includes/menu.html +23 -0
  18. data/_includes/onboarding.html +37 -0
  19. data/_includes/pack.html +1 -0
  20. data/_includes/password.html +1 -0
  21. data/_includes/picture.html +23 -0
  22. data/_includes/preload_font.html +1 -0
  23. data/_includes/search.html +4 -3
  24. data/_includes/share.html +3 -2
  25. data/_includes/submit.html +5 -1
  26. data/_layouts/about.html +1 -1
  27. data/_layouts/default.html +34 -2
  28. data/_layouts/page.html +1 -1
  29. data/_layouts/place.html +1 -1
  30. data/_layouts/post.html +2 -2
  31. data/_sass/accessibility.scss +48 -7
  32. data/_sass/editor.scss +17 -0
  33. data/_sass/embed.scss +8 -0
  34. data/_sass/floating_alert.scss +48 -0
  35. data/_sass/fonts.scss +0 -0
  36. data/_sass/helpers.scss +327 -31
  37. data/_sass/menu.scss +36 -0
  38. data/_sass/snap.scss +60 -0
  39. data/_sass/toggler.scss +34 -11
  40. data/assets/css/styles.scss +89 -7
  41. data/assets/css/styles.scss.orig +3 -0
  42. data/assets/data/manifest.js +29 -0
  43. data/assets/fonts/forkawesome-webfont.woff2 +0 -0
  44. data/assets/js/pack.3cf11284b767fdbbefa6.js +113 -0
  45. data/assets/js/pack.3cf11284b767fdbbefa6.js.map +1 -0
  46. data/assets/js/pack.4ced2556b94e5c09e5bc.js +113 -0
  47. data/assets/js/pack.4ced2556b94e5c09e5bc.js.map +1 -0
  48. data/assets/js/pack.c42a6f683b2c0c0fa404.js +90 -0
  49. data/assets/js/pack.c42a6f683b2c0c0fa404.js.map +1 -0
  50. data/assets/js/pack.d9a353affdca4644a9b2.js +113 -0
  51. data/assets/js/pack.d9a353affdca4644a9b2.js.map +1 -0
  52. data/assets/js/sw.3cf11284b767fdbbefa6.js +2 -0
  53. data/assets/js/sw.3cf11284b767fdbbefa6.js.map +1 -0
  54. data/assets/templates/alert.html +7 -0
  55. data/assets/templates/results.html +15 -7
  56. metadata +96 -45
  57. data/_includes/navbar.html +0 -53
  58. data/_sass/share.html +0 -12
  59. data/_sass/share_box.html +0 -16
  60. data/assets/js/pack.js +0 -90
  61. data/assets/js/pack.js.map +0 -1
@@ -27,7 +27,7 @@ description:
27
27
  topics, we invite you to use it as a content warning, so that others
28
28
  may decide when they want to read it.
29
29
  author:
30
- type: 'new_array'
30
+ type: 'array'
31
31
  label:
32
32
  es: 'Autores'
33
33
  en: 'Authors'
@@ -59,7 +59,7 @@ image:
59
59
  Describe the main image for the visually impaired and
60
60
  search engines
61
61
  content:
62
- type: 'new_content'
62
+ type: 'content'
63
63
  label:
64
64
  es: 'Contenido del artículo'
65
65
  en: 'Post content'
@@ -67,7 +67,7 @@ content:
67
67
  es: 'Escribe aquí el artículo'
68
68
  en: 'Write your post here'
69
69
  permalink:
70
- type: 'permalink'
70
+ type: 'string'
71
71
  label:
72
72
  es: 'Enlace'
73
73
  en: 'Permalink'
@@ -79,7 +79,7 @@ permalink:
79
79
  If you want to use link format for this post other than the default,
80
80
  change it here.
81
81
  categories:
82
- type: 'new_has_and_belongs_to_many'
82
+ type: 'has_and_belongs_to_many'
83
83
  filter:
84
84
  layout: 'category'
85
85
  inverse: 'posts'
@@ -90,7 +90,7 @@ categories:
90
90
  es: 'Ayudan a organizar los artículos en temas'
91
91
  en: 'Use categories to order posts by theme'
92
92
  tags:
93
- type: 'new_array'
93
+ type: 'array'
94
94
  label:
95
95
  es: 'Etiquetas'
96
96
  en: 'Tags'
@@ -98,7 +98,7 @@ tags:
98
98
  es: 'Usa etiquetas para resaltar palabras clave'
99
99
  en: 'Tags are helpful as keywords'
100
100
  posts:
101
- type: 'new_has_many'
101
+ type: 'related_posts'
102
102
  label:
103
103
  es: 'Artículos relacionados'
104
104
  en: ''
@@ -122,7 +122,7 @@ order:
122
122
  es: 'La posición del artículo en la lista de artículos'
123
123
  en: 'Post position in list'
124
124
  notes:
125
- type: 'new_html'
125
+ type: 'markdown'
126
126
  private: true
127
127
  label:
128
128
  es: 'Notas'
@@ -50,7 +50,7 @@ image:
50
50
  Describe the main image for the visually impaired and
51
51
  search engines
52
52
  content:
53
- type: 'new_content'
53
+ type: 'content'
54
54
  label:
55
55
  es: 'Contenido del artículo'
56
56
  en: 'Post content'
@@ -58,7 +58,7 @@ content:
58
58
  es: 'Escribe aquí el artículo'
59
59
  en: 'Write your post here'
60
60
  permalink:
61
- type: 'permalink'
61
+ type: 'string'
62
62
  label:
63
63
  es: 'Enlace'
64
64
  en: 'Permalink'
@@ -70,7 +70,7 @@ permalink:
70
70
  If you want to use link format for this post other than the default,
71
71
  change it here.
72
72
  categories:
73
- type: 'new_has_and_belongs_to_many'
73
+ type: 'has_and_belongs_to_many'
74
74
  filter:
75
75
  layout: 'category'
76
76
  inverse: 'posts'
@@ -81,7 +81,7 @@ categories:
81
81
  es: 'Ayudan a organizar los artículos en temas'
82
82
  en: 'Use categories to order posts by theme'
83
83
  tags:
84
- type: 'new_array'
84
+ type: 'array'
85
85
  label:
86
86
  es: 'Etiquetas'
87
87
  en: 'Tags'
@@ -89,7 +89,7 @@ tags:
89
89
  es: 'Las etiquetas son términos ad-hoc para agrupar información, pueden ser lugares, especialidades, tipos de cirugía, alertas de contenido, etc.'
90
90
  en: 'Tags are helpful as keywords'
91
91
  posts:
92
- type: 'new_has_many'
92
+ type: 'related_posts'
93
93
  label:
94
94
  es: 'Artículos relacionados'
95
95
  en: ''
@@ -122,7 +122,7 @@ coordenadas:
122
122
  help:
123
123
  es: ''
124
124
  email:
125
- type: 'email'
125
+ type: 'string'
126
126
  label:
127
127
  es: 'Correo electrónico'
128
128
  en: 'E-mail address'
@@ -130,7 +130,7 @@ email:
130
130
  es: 'Dirección de correo electrónico para comunicarse'
131
131
  en: 'E-mail address to contact'
132
132
  transporte_publico:
133
- type: 'new_array'
133
+ type: 'array'
134
134
  label:
135
135
  es: 'Transporte público'
136
136
  en: 'Public transportation'
@@ -138,7 +138,7 @@ transporte_publico:
138
138
  es: 'Líneas de colectivos, trenes y subtes que pasan cerca'
139
139
  en: 'Buses, trains and subways nearby'
140
140
  telefonos:
141
- type: 'new_array'
141
+ type: 'array'
142
142
  label:
143
143
  es: 'Teléfonos'
144
144
  en: 'Phone numbers'
@@ -146,7 +146,7 @@ telefonos:
146
146
  es: 'Los números de teléfono para comunicarse, entre paréntesis los horarios u otra información útil, ej. "12345678 (de 10 a 17hs)"'
147
147
  en: 'Phone numbers to call, with opening hours or other useful information in between parentheses, for example "12345678 (de 10 a 17hs)"'
148
148
  horarios_de_atencion:
149
- type: 'new_array'
149
+ type: 'array'
150
150
  label:
151
151
  es: 'Horarios de atención'
152
152
  en: 'Working hours'
@@ -154,7 +154,7 @@ horarios_de_atencion:
154
154
  es: 'En el formato 09:00-17:00'
155
155
  en: 'Use the format 09:00-17:00'
156
156
  redes_sociales:
157
- type: 'new_array'
157
+ type: 'array'
158
158
  label:
159
159
  es: 'Sitio web y redes sociales'
160
160
  en: 'Social networks'
@@ -186,7 +186,7 @@ order:
186
186
  es: 'La posición del artículo en la lista de artículos'
187
187
  en: 'Post position in list'
188
188
  notes:
189
- type: 'new_html'
189
+ type: 'markdown'
190
190
  private: true
191
191
  label:
192
192
  es: 'Notas'
@@ -194,3 +194,5 @@ notes:
194
194
  help:
195
195
  es: 'Comentarios internos, recordatorios, información privada. ¡No se publica en el sitio!'
196
196
  en: "Internal comments, reminders, private information. This won't be published to the website and will appear encrypted in source code"
197
+
198
+
@@ -27,7 +27,7 @@ description:
27
27
  topics, we invite you to use it as a content warning, so that others
28
28
  may decide when they want to read it.
29
29
  author:
30
- type: 'new_array'
30
+ type: 'array'
31
31
  label:
32
32
  es: 'Autores'
33
33
  en: 'Authors'
@@ -59,7 +59,7 @@ image:
59
59
  Describe the main image for the visually impaired and
60
60
  search engines
61
61
  content:
62
- type: 'new_content'
62
+ type: 'content'
63
63
  label:
64
64
  es: 'Contenido del artículo'
65
65
  en: 'Post content'
@@ -67,7 +67,7 @@ content:
67
67
  es: 'Escribe aquí el artículo'
68
68
  en: 'Write your post here'
69
69
  permalink:
70
- type: 'permalink'
70
+ type: 'string'
71
71
  label:
72
72
  es: 'Enlace'
73
73
  en: 'Permalink'
@@ -79,7 +79,7 @@ permalink:
79
79
  If you want to use link format for this post other than the default,
80
80
  change it here.
81
81
  categories:
82
- type: 'new_has_and_belongs_to_many'
82
+ type: 'has_and_belongs_to_many'
83
83
  filter:
84
84
  layout: 'category'
85
85
  inverse: 'posts'
@@ -90,7 +90,7 @@ categories:
90
90
  es: 'Ayudan a organizar los artículos en temas'
91
91
  en: 'Use categories to order posts by theme'
92
92
  tags:
93
- type: 'new_array'
93
+ type: 'array'
94
94
  label:
95
95
  es: 'Etiquetas'
96
96
  en: 'Tags'
@@ -98,7 +98,7 @@ tags:
98
98
  es: 'Usa etiquetas para resaltar palabras clave'
99
99
  en: 'Tags are helpful as keywords'
100
100
  posts:
101
- type: 'new_has_many'
101
+ type: 'related_posts'
102
102
  label:
103
103
  es: 'Artículos relacionados'
104
104
  en: ''
@@ -122,7 +122,7 @@ order:
122
122
  es: 'La posición del artículo en la lista de artículos'
123
123
  en: 'Post position in list'
124
124
  notes:
125
- type: 'new_html'
125
+ type: 'markdown'
126
126
  private: true
127
127
  label:
128
128
  es: 'Notas'
@@ -1,15 +1,18 @@
1
1
  {% comment %}
2
- Esta imagen obtiene una cookie desde la API de Sutty para autorizar el
3
- envío del formulario.
2
+ Esta imagen obtiene una cookie desde la API de Sutty para autorizar el
3
+ envío del formulario.
4
4
  {% endcomment %}
5
- <img class="d-none" src="https://api.sutty.nl/v1/sites/{{ site.hostname }}/contact/cookie.png" />
5
+ <img class="d-none invisible" src="https://api.sutty.nl/v1/sites/{{ site.hostname }}/contact/cookie.png" />
6
6
 
7
7
  {% comment %}
8
8
  El formulario se envía a la API. La definición del formulario se
9
9
  encuentra en _data/forms/contacto.yml
10
10
  {% endcomment %}
11
- <form action="https://api.sutty.nl/v1/sites/{{ site.hostname }}/contact/contacto"
12
- method="post">
11
+ <form
12
+ data-controller="contact"
13
+ data-delay="60"
14
+ action="https://api.sutty.nl/v1/sites/{{ site.hostname }}/contact/{{ include.name }}"
15
+ method="post">
13
16
  {%- for field in include.form -%}
14
17
  {% assign template = field[1].type | append: '.html' %}
15
18
  <div class="col{{ field[1].col | default: 12 | prepend: '-' }}">
@@ -0,0 +1,6 @@
1
+ <div
2
+ data-controller="floating-alert"
3
+ class="floating-alert floating-alert-bottom floating-alert-default"
4
+ role="status" aria-live="polite" aria-atomic="true">
5
+ <div data-target="toast.content" class="floating-alert-content white background-black-t4"></div>
6
+ </div>
@@ -0,0 +1,38 @@
1
+ {%- comment -%}
2
+ El ítem tiene un dropdown si tiene sub ítems o si tiene categorías.
3
+ {%- endcomment -%}
4
+ {%- assign dropdown = include.item.items | present -%}
5
+ {%- unless dropdown -%}
6
+ {%- assign dropdown = include.item.categories | present -%}
7
+ {%- endunless -%}
8
+
9
+ <div class="nav-item w-100 w-lg-auto {{ dropdown | value_if: 'dropdown d-flex flex-wrap' }}">
10
+ {%- comment -%}
11
+ La URL del item puede ser:
12
+ * El artículo vinculado
13
+ * El vínculo escrito manualmente
14
+ * La primera categoría de la lista
15
+ * La dirección propia (en el caso de categorías)
16
+ {%- endcomment -%}
17
+ <a
18
+ href="{{ include.item.post.url | default: include.item.link | default: include.item.categories[0].url | default: include.item.url }}"
19
+ class="nav-link flex-grow-1 flex-grow-lg-0">
20
+ {{ include.item.title }}
21
+ </a>
22
+
23
+ {%- if dropdown -%}
24
+ <button class="dropdown-toggle border-0 background-white w-5 w-lg-auto pl-lg-3"></button>
25
+ <div class="dropdown-menu w-100 w-lg-auto flex-grow-1 flex-grow-lg-0">
26
+ {% for item in include.item.items %}
27
+ {%- include_cached item.html item=item -%}
28
+ {% endfor %}
29
+
30
+ {%- comment -%}
31
+ Esto necesita `replace` en sutty-archives
32
+ {%- endcomment -%}
33
+ {%- for item in include.item.categories offset: 1 -%}
34
+ {%- include_cached item.html item=item -%}
35
+ {%- endfor -%}
36
+ </div>
37
+ {%- endif -%}
38
+ </div>
@@ -0,0 +1,23 @@
1
+ {%- comment -%}
2
+ Empezamos con los ítems que no dependen de otros e implementamos
3
+ recursivamente.
4
+ {%- endcomment -%}
5
+ {%- assign items = site.posts | where: 'layout', 'menu' | where: 'item', nil -%}
6
+
7
+ <nav class="navbar navbar-expand-lg navbar-light">
8
+ <button class="navbar-toggler"
9
+ type="button"
10
+ data-toggle="collapse"
11
+ data-target="#menu"
12
+ aria-label="{{ site.i18n.menu.title }}">
13
+ <span class="navbar-toggler-icon"></span>
14
+ </button>
15
+
16
+ <div class="collapse navbar-collapse" id="menu">
17
+ <div class="navbar-nav w-100 d-flex align-items-start justify-content-center">
18
+ {% for item in items %}
19
+ {%- include_cached item.html item=item -%}
20
+ {% endfor %}
21
+ </div>
22
+ </div>
23
+ </nav>
@@ -0,0 +1,37 @@
1
+ {% comment %}
2
+ La barra de notificaciones, donde le pedimos a les usuaries que vayan
3
+ haciendo varias cosas. Quizás debería llamarse onboarding.
4
+
5
+ Primero tenemos que poder salir del navegador interno de Facebook,
6
+ Instagram, Telegram, etc.
7
+ {% endcomment %}
8
+
9
+ <aside
10
+ data-sw="{{ jekyll.production | ternary: site.data.assets['sw.js'], 'sw.js' }}"
11
+ data-controller="onboarding"
12
+ class="w-100 background-primary"
13
+ role="status"
14
+ aria-live="polite"
15
+ aria-atomic="true">
16
+ <div data-onboarding-target="internalBrowser" hidden>
17
+ <div class="h-20vh d-flex align-items-center">
18
+ {% comment %}
19
+ Con esta URL le decimos a Android y posible iOS que queremos abrir
20
+ este link en un navegador externo.
21
+
22
+ https://stackoverflow.com/a/58342222
23
+ {% endcomment %}
24
+ <a href="intent:{{ site.url }}#Intent;end" class="btn btn-block btn-primary">
25
+ {{ site.i18n.onboarding.internal_browser }}
26
+ </a>
27
+ </div>
28
+ </div>
29
+
30
+ <div data-onboarding-target="browser" hidden>
31
+ <div class="h-20vh d-flex align-items-center">
32
+ <button data-action="onboarding#install" class="btn btn-block btn-primary">
33
+ {{ site.i18n.onboarding.browser }}
34
+ </button>
35
+ </div>
36
+ </div>
37
+ </aside>
@@ -0,0 +1 @@
1
+ <script defer src="{{ jekyll.production | ternary: site.data.assets['assets/js/pack.js'], 'assets/js/pack.js' }}"></script>
@@ -0,0 +1 @@
1
+ {% include input.html field=include.field form=include.form %}
@@ -0,0 +1,23 @@
1
+ {% comment %}
2
+ Imágenes responsive. Esto logra que solo se carguen las versiones de
3
+ las imágenes con el ancho máximo de la pantalla.
4
+
5
+ TODO: Las imágenes en md y superior nunca llegan al ancho máximo así
6
+ que tienen una resolución de más.
7
+ {% endcomment %}
8
+ {%- assign image = include.image.path | default: 'public/placeholder.png' %}
9
+ {%- assign height = include.height | default: site.i18n.post.height -%}
10
+ {%- assign width = include.width | default: '100' -%}
11
+
12
+ <picture>
13
+ {% for size in site.images.sizes %}
14
+ <source srcset="{{ image | thumbnail: size }}" media="(max-width: {{ size }}px)" />
15
+ {% endfor %}
16
+
17
+ <img
18
+ class="u-photo w-{{ width }} {{ include.cover | equals: false | value_unless: 'fit-cover' }} h-{{ height }} {{ include.extra }}"
19
+ loading="lazy"
20
+ itemprop="image"
21
+ src="{{ image | thumbnail: 1140 }}"
22
+ alt="{{ include.image.description | include.default_description }}" />
23
+ </picture>
@@ -0,0 +1 @@
1
+ <link rel="preload" as="font" type="font/woff2" crossorigin href="{{ include.font }}?{{ site.time | date: '%s' }}" />
@@ -1,15 +1,16 @@
1
1
  {%- comment -%}
2
2
  Encabezado con buscador
3
3
  {%- endcomment -%}
4
+ {%- assign param = include.param | default: 'search' -%}
4
5
  <section id="{{ site.i18n.search.id }}">
5
6
  <div class="jumbotron">
6
- <form method="get" class="search" action="{{ site.i18n.search.url }}" data-controller="search">
7
+ <form method="get" class="search" action="{{ site.i18n.search.url }}" data-controller="search" data-action="search#search">
7
8
  <div class="form-group">
8
- <label for="search" class="sr-only">{{ site.i18n.search.placeholder }}</label>
9
+ <label for="{{ param }}_q" class="sr-only">{{ site.i18n.search.placeholder }}</label>
9
10
  <input
10
11
  type="search"
11
12
  required
12
- id="q"
13
+ id="{{ param }}_q"
13
14
  name="q"
14
15
  placeholder="{{ site.i18n.search.placeholder }}"
15
16
  class="form-control form-control-lg m-0"
data/_includes/share.html CHANGED
@@ -5,6 +5,7 @@
5
5
  {% endunless %}
6
6
  {% assign title = include.title | default: '' | cgi_escape %}
7
7
  {% assign description = include.description | default: '' | cgi_escape %}
8
+ {% assign tags = include.tags | join: ',' | default: '' | cgi_escape %}
8
9
 
9
10
  <a
10
11
  {% if include.share.url == '%url' %}
@@ -12,10 +13,10 @@
12
13
  {% else %}
13
14
  target="_blank"
14
15
  {% endif %}
15
- rel="nofollow"
16
+ rel="noopener nofollow"
16
17
  title="{{ include.share.title }}"
17
18
  class="d-flex flex-column align-items-center p-3"
18
- href="{{ include.share.url | replace: '%url', url | replace: '%title', title | replace: '%description', description }}">
19
+ href="{{ include.share.url | replace: '%url', url | replace: '%title', title | replace: '%description', description | replace: '%tags', tags }}">
19
20
  <i class="fa fa-fw fa-2x fa-{{ include.share.icon }}"></i>
20
21
  <span>{{ include.share.title }}</span>
21
22
  </a>
@@ -1 +1,5 @@
1
- <input type="submit" class="btn btn-success" value="{{ include.field[1].label[site.locale] }}" />
1
+ <input
2
+ data-target="contact.submit"
3
+ type="submit"
4
+ class="btn btn-success"
5
+ value="{{ include.field[1].label[site.locale] }}" />
data/_layouts/about.html CHANGED
@@ -22,7 +22,7 @@ layout: default
22
22
 
23
23
  <p>
24
24
  <time class="dt-published" datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">
25
- {%- assign date_format = site.i18n.date | default: "%b %-d, %Y" -%}
25
+ {%- assign date_format = site.i18n.date.format | default: "%b %-d, %Y" -%}
26
26
  {{ page.date | date: date_format }}
27
27
  </time>
28
28
  {%- for author in page.author -%}
@@ -9,14 +9,46 @@
9
9
  <meta name="color-scheme" content="light"/>
10
10
  <meta name="referrer" content="strict-origin-when-cross-origin"/>
11
11
 
12
+ {% comment %}
13
+ No tenemos forma de hashear SASS aún, por lo que renovamos la caché
14
+ aplicando la hora de compilación del sitio. Es importante que los
15
+ CSS se renueven cuando se regenera el sitio, porque pueden contener
16
+ variables dinámicas (como personalización de colores y tipografía) o
17
+ minificarse distinto dependiendo del contenido.
18
+ {% endcomment %}
12
19
  <link href="assets/css/styles.css" rel="stylesheet">
13
- <script defer type="text/javascript" src="assets/js/pack.js"></script>
20
+
21
+ {% comment %}
22
+ Webpack. La configuración se pasa por variables de entorno, en
23
+ desarrollo hay que evitar el archivo .env (copiarlo de .env.example
24
+ si no existe.
25
+ {% endcomment %}
26
+ <link rel="preload" as="script" type="text/javascript" href="env.js" />
27
+ <script type="text/javascript" src="env.js"></script>
28
+ {% include_cached pack.html %}
29
+
30
+ {% comment %}
31
+ Agregar otras tipografías. Esto hace que las tipografías se carguen
32
+ lo más rápido posible y minimizar el tiempo en que se ven las del
33
+ navegador. En Firefox todavía no está soportado.
34
+
35
+ Fork Awesome lleva la hora de generación para poder renovarlo si
36
+ agregamos íconos nuevos, de lo contrario puede quedar cacheado para
37
+ siempre y les visitantes van a ver íconos rotos.
38
+ {% endcomment %}
39
+ {% include_cached preload_font.html font='assets/fonts/forkawesome-webfont.woff2' %}
40
+
41
+ <link rel="icon" type="image/svg+xml" href="public/favicon.svg">
42
+ <link rel="alternate icon" href="public/favicon.ico">
43
+ <link rel="mask-icon" href="public/favicon.svg" color="white">
44
+ <link rel="manifest" href="manifest.json">
14
45
 
15
46
  {% seo %}
16
47
  {% feed_meta %}
17
48
  </head>
18
49
  <body class="d-flex flex-column justify-content-between d-print-block min-vh-100">
19
- {% include navbar.html %}
50
+ {%- include_cached onboarding.html -%}
51
+ {%- include_cached menu.html active_cache_key=page.layout %}
20
52
  {% include_cached search.html %}
21
53
 
22
54
  <main class="flex-grow-1 container-fluid d-flex flex-column justify-content-start">
data/_layouts/page.html CHANGED
@@ -28,7 +28,7 @@ layout: default
28
28
 
29
29
  <p>
30
30
  <time class="dt-published" datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">
31
- {%- assign date_format = site.i18n.date | default: "%b %-d, %Y" -%}
31
+ {%- assign date_format = site.i18n.date.format | default: "%b %-d, %Y" -%}
32
32
  {{ page.date | date: date_format }}
33
33
  </time>
34
34
  {%- for author in page.author -%}
data/_layouts/place.html CHANGED
@@ -28,7 +28,7 @@ layout: default
28
28
 
29
29
  <p>
30
30
  <time class="dt-published" datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">
31
- {%- assign date_format = site.i18n.date | default: "%b %-d, %Y" -%}
31
+ {%- assign date_format = site.i18n.date.format | default: "%b %-d, %Y" -%}
32
32
  {{ page.date | date: date_format }}
33
33
  </time>
34
34
  {%- for author in page.author -%}
data/_layouts/post.html CHANGED
@@ -28,8 +28,8 @@ layout: default
28
28
 
29
29
  <p>
30
30
  <time class="dt-published" datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">
31
- {%- assign date_format = site.i18n.date | default: "%b %-d, %Y" -%}
32
- {{ page.date | date: date_format }}
31
+ {%- assign date_format = site.i18n.date.format | default: "%b %-d, %Y" -%}
32
+ {{ page.date | date_local: date_format }}
33
33
  </time>
34
34
  {%- for author in page.author -%}
35
35
 
@@ -1,13 +1,54 @@
1
- * {
2
- scroll-behavior: smooth;
3
- }
1
+ ////
2
+ /// Accesibilidad
3
+ /// @group Accesibilidad
4
+ ////
5
+
6
+ /// La navegación es suave. Esto hace que al navegar a elementos dentro
7
+ /// de la misma página no haga un salto, sino que haya una transición.
8
+ ///
9
+ /// Es especialmente útil en sliders.
10
+ ///
11
+ /// Sin embargo puede producir mareos a algunas personas.
12
+ * { scroll-behavior: smooth; }
4
13
 
5
- /*
6
- * Deshabilita animaciones si la usuaria las tiene deshabilitadas
7
- */
14
+ /// Aquí se aplica la opción `prefers-reduced-motion: reduce`, pero
15
+ /// SassDoc no la estaría mostrando.
8
16
  @media (prefers-reduced-motion: reduce) {
17
+ /// Si les usuaries prefirieron reducir las animaciones de los sitios,
18
+ /// deshabilitamos la navegación suavizada y las animaciones.
9
19
  * {
10
- scroll-behavior: auto;
20
+ scroll-behavior: auto !important;
11
21
  animation: none !important;
12
22
  }
13
23
  }
24
+
25
+ /// Utilizamos Axe para poder marcarnos cuáles elementos no cumplen con
26
+ /// parámetros de accesibilidad durante el desarrollo. Esta clase
27
+ /// muestra un borde rojo alrededor de los elementos inaccesibles y al
28
+ /// obtener el foco, muestra los mensajes de error generados por Axe.js.
29
+ ///
30
+ /// @link _packs/entry.js
31
+ .inaccesible {
32
+ outline: $red 1px solid;
33
+
34
+ @extend .position-relative;
35
+
36
+ &:focus::after {
37
+ @extend .position-fixed;
38
+ @extend .background-red;
39
+ @extend .white;
40
+ @extend .p-3;
41
+
42
+ left: 0;
43
+ bottom: 0;
44
+ width: 100vw;
45
+ font-size: 1rem;
46
+
47
+ word-wrap: normal;
48
+ line-break: auto;
49
+ white-space: pre-line;
50
+
51
+ /// El contenido se trae desde el ariaLabel del elemento.
52
+ content: attr(aria-label);
53
+ }
54
+ }
data/_sass/editor.scss ADDED
@@ -0,0 +1,17 @@
1
+ ////
2
+ /// Estilos del editor de Sutty
3
+ /// @group Editor
4
+ ///
5
+
6
+ /// Alineaciones soportadas. No soportamos justificado porque es
7
+ /// difícil que quede bien en web.
8
+ $aligns: (left,center,right);
9
+
10
+ /// Recorrer las alineaciones.
11
+ /// @name Alineaciones
12
+ @each $align in $aligns {
13
+ /// El editor coloca la alineación en un atributo data-align,
14
+ /// recorriendo cada una de las alineaciones disponibles.
15
+ /// @todo Lograr que SassDoc muestre el código completo.
16
+ div[data-align="#{$align}"] { text-align: $align; }
17
+ }
data/_sass/embed.scss CHANGED
@@ -1,3 +1,11 @@
1
+ ////
2
+ /// Recursos externos
3
+ /// @group Recursos externos
4
+ ///
5
+
6
+ /// Los `<iframe>` ocupan todo el ancho del contenedor y tienen un alto
7
+ /// mínimo de 480px.
8
+ /// @link jekyll-embed-urls
1
9
  iframe {
2
10
  border: 0;
3
11
  width: 100%;