pandorga 1.2.1 → 1.2.3
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/CHANGELOG.md +22 -0
- data/_data/translations.yml +115 -0
- data/_layouts/blog.html +39 -25
- data/_layouts/shell.html +1 -3
- data/assets/css/ledger/home.css +38 -30
- data/examples/full/_config.yml +2 -2
- data/examples/full/content/pages/headers.yml +3 -3
- data/lib/pandorga/commands/new.rb +1 -1
- data/lib/pandorga/registry/schema.yml +1 -1
- data/lib/pandorga/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6564a5382e67a496ec1fb1a08c3bd76601f7fe3e49bfcd7c6950e96c7fec84be
|
|
4
|
+
data.tar.gz: 3a57c483bbd9c36e1db0caa694e996ab6b6b9f72c9fb0db248b02bb419307888
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 38e07ea84144b6fe8812369ee5f0282493ce98cea31454ed8a6a6f072c7275024189524e8e863a3be0307ce55f6dc7bac81d6198f5ae202704df67164d0423fb
|
|
7
|
+
data.tar.gz: 36ce18aedcd108d7d247bd050badf62f64d83000b1d0c97dbc7325f7a03bdea8a7dc0ef15ca38fa595222c0e3efe9e4f5c8ba1668e5c831f6ce3558da793b176
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.2.3] — 2026-10-05
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- Home portfolio cards use a denser equal grid (projects listing layout untouched)
|
|
8
|
+
- Corrects the 1.2.2 mis-target that compacted the projects index instead of the home band
|
|
9
|
+
|
|
10
|
+
## [1.2.2] — 2026-10-05
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Blog listing chrome follows `pages[].language` (`en` default; `pt-BR` for Portuguese UI strings)
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
|
|
18
|
+
- Home draft cards are taller (~40%) so excerpts stay readable
|
|
19
|
+
- Full example blog page is `Rascunhos` with `language: pt-BR`
|
|
20
|
+
|
|
21
|
+
### Removed
|
|
22
|
+
|
|
23
|
+
- Mobile nav no longer shows a page `badge` note (language belongs in `language`, not a sidebar label)
|
|
24
|
+
|
|
3
25
|
## [1.2.1] — 2026-10-05
|
|
4
26
|
|
|
5
27
|
### Added
|
data/_data/translations.yml
CHANGED
|
@@ -83,3 +83,118 @@ cited_by:
|
|
|
83
83
|
ptbr: "Citado por"
|
|
84
84
|
frfr: "Cité par"
|
|
85
85
|
eses: "Citado por"
|
|
86
|
+
filter:
|
|
87
|
+
enus: "Filter"
|
|
88
|
+
ptbr: "Filtrar"
|
|
89
|
+
frfr: "Filtrer"
|
|
90
|
+
eses: "Filtrar"
|
|
91
|
+
keyword:
|
|
92
|
+
enus: "Keyword"
|
|
93
|
+
ptbr: "Palavra-chave"
|
|
94
|
+
frfr: "Mot-clé"
|
|
95
|
+
eses: "Palabra clave"
|
|
96
|
+
filter_by_keyword:
|
|
97
|
+
enus: "Filter entries by keyword"
|
|
98
|
+
ptbr: "Filtrar entradas por palavra-chave"
|
|
99
|
+
frfr: "Filtrer les entrées par mot-clé"
|
|
100
|
+
eses: "Filtrar entradas por palabra clave"
|
|
101
|
+
keyword_placeholder:
|
|
102
|
+
enus: "Title, summary, tag…"
|
|
103
|
+
ptbr: "Título, resumo, tag…"
|
|
104
|
+
frfr: "Titre, résumé, tag…"
|
|
105
|
+
eses: "Título, resumen, etiqueta…"
|
|
106
|
+
loading_entries:
|
|
107
|
+
enus: "Loading entries..."
|
|
108
|
+
ptbr: "Carregando entradas..."
|
|
109
|
+
frfr: "Chargement des entrées…"
|
|
110
|
+
eses: "Cargando entradas…"
|
|
111
|
+
nothing_matches_filters:
|
|
112
|
+
enus: "Nothing matches these filters yet."
|
|
113
|
+
ptbr: "Nada corresponde a estes filtros ainda."
|
|
114
|
+
frfr: "Rien ne correspond encore à ces filtres."
|
|
115
|
+
eses: "Nada coincide con estos filtros todavía."
|
|
116
|
+
order_date_written:
|
|
117
|
+
enus: "Order: date written"
|
|
118
|
+
ptbr: "Ordem: data de escrita"
|
|
119
|
+
frfr: "Ordre : date d'écriture"
|
|
120
|
+
eses: "Orden: fecha de escritura"
|
|
121
|
+
order_last_revised:
|
|
122
|
+
enus: "Order: last revised"
|
|
123
|
+
ptbr: "Ordem: última revisão"
|
|
124
|
+
frfr: "Ordre : dernière révision"
|
|
125
|
+
eses: "Orden: última revisión"
|
|
126
|
+
order_random:
|
|
127
|
+
enus: "Order: random"
|
|
128
|
+
ptbr: "Ordem: aleatória"
|
|
129
|
+
frfr: "Ordre : aléatoire"
|
|
130
|
+
eses: "Orden: aleatorio"
|
|
131
|
+
form_label:
|
|
132
|
+
enus: "Form"
|
|
133
|
+
ptbr: "Forma"
|
|
134
|
+
frfr: "Forme"
|
|
135
|
+
eses: "Forma"
|
|
136
|
+
order_by:
|
|
137
|
+
enus: "Order by"
|
|
138
|
+
ptbr: "Ordenar por"
|
|
139
|
+
frfr: "Trier par"
|
|
140
|
+
eses: "Ordenar por"
|
|
141
|
+
all_label:
|
|
142
|
+
enus: "All"
|
|
143
|
+
ptbr: "Todas"
|
|
144
|
+
frfr: "Toutes"
|
|
145
|
+
eses: "Todas"
|
|
146
|
+
date_written:
|
|
147
|
+
enus: "Date written"
|
|
148
|
+
ptbr: "Data de escrita"
|
|
149
|
+
frfr: "Date d'écriture"
|
|
150
|
+
eses: "Fecha de escritura"
|
|
151
|
+
last_revised:
|
|
152
|
+
enus: "Last revised"
|
|
153
|
+
ptbr: "Última revisão"
|
|
154
|
+
frfr: "Dernière révision"
|
|
155
|
+
eses: "Última revisión"
|
|
156
|
+
revised_prefix:
|
|
157
|
+
enus: "Revised"
|
|
158
|
+
ptbr: "Revisado"
|
|
159
|
+
frfr: "Révisé"
|
|
160
|
+
eses: "Revisado"
|
|
161
|
+
entry_singular:
|
|
162
|
+
enus: "entry"
|
|
163
|
+
ptbr: "entrada"
|
|
164
|
+
frfr: "entrée"
|
|
165
|
+
eses: "entrada"
|
|
166
|
+
entry_plural:
|
|
167
|
+
enus: "entries"
|
|
168
|
+
ptbr: "entradas"
|
|
169
|
+
frfr: "entrées"
|
|
170
|
+
eses: "entradas"
|
|
171
|
+
of_total:
|
|
172
|
+
enus: "of"
|
|
173
|
+
ptbr: "de"
|
|
174
|
+
frfr: "sur"
|
|
175
|
+
eses: "de"
|
|
176
|
+
licensing_reuse:
|
|
177
|
+
enus: "Licensing & reuse"
|
|
178
|
+
ptbr: "Licença e reutilização"
|
|
179
|
+
frfr: "Licence et réutilisation"
|
|
180
|
+
eses: "Licencia y reutilización"
|
|
181
|
+
entries_published_under:
|
|
182
|
+
enus: "Entries published under"
|
|
183
|
+
ptbr: "Entradas publicadas sob"
|
|
184
|
+
frfr: "Entrées publiées sous"
|
|
185
|
+
eses: "Entradas publicadas bajo"
|
|
186
|
+
attribution_to:
|
|
187
|
+
enus: "Attribution to"
|
|
188
|
+
ptbr: "Atribuição a"
|
|
189
|
+
frfr: "Attribution à"
|
|
190
|
+
eses: "Atribución a"
|
|
191
|
+
licence_terms:
|
|
192
|
+
enus: "Licence terms"
|
|
193
|
+
ptbr: "Termos da licença"
|
|
194
|
+
frfr: "Conditions de licence"
|
|
195
|
+
eses: "Términos de la licencia"
|
|
196
|
+
post_load_error:
|
|
197
|
+
enus: "This post could not be loaded right now."
|
|
198
|
+
ptbr: "Este rascunho não pôde ser carregado agora."
|
|
199
|
+
frfr: "Ce billet n'a pas pu être chargé pour le moment."
|
|
200
|
+
eses: "Esta nota no se pudo cargar ahora."
|
data/_layouts/blog.html
CHANGED
|
@@ -3,6 +3,12 @@ layout: shell
|
|
|
3
3
|
---
|
|
4
4
|
{%- assign blog_locale = page.lang | default: site.pandorga.identity.locale | default: "en" -%}
|
|
5
5
|
{%- assign blog_title = page.title | default: "Blog" -%}
|
|
6
|
+
{%- assign blog_ui = "enus" -%}
|
|
7
|
+
{%- assign _blog_lang = blog_locale | downcase | replace: "_", "-" -%}
|
|
8
|
+
{%- if _blog_lang == "pt-br" or _blog_lang == "ptbr" or _blog_lang == "pt" -%}
|
|
9
|
+
{%- assign blog_ui = "ptbr" -%}
|
|
10
|
+
{%- endif -%}
|
|
11
|
+
{%- assign t = site.data.translations -%}
|
|
6
12
|
|
|
7
13
|
<main class="relative max-w-7xl mx-auto px-4 sm:px-8 md:px-16 pt-10 pb-16 rascunhos-main{% if page.accent and page.accent != 'blue' %} page-accent--{{ page.accent }}{% endif %}"
|
|
8
14
|
{% include page/listing-runtime-attrs.html
|
|
@@ -23,23 +29,23 @@ layout: shell
|
|
|
23
29
|
<div id="blog-listing" class="rascunhos-body">
|
|
24
30
|
{%- comment -%}
|
|
25
31
|
Same sidebar pattern as the articles listing: keyword box, facets, and
|
|
26
|
-
licence.
|
|
27
|
-
|
|
32
|
+
licence. Chrome follows page.language (English default; pt-BR for
|
|
33
|
+
rascunhos). Dates use the same locale.
|
|
28
34
|
{%- endcomment -%}
|
|
29
35
|
<aside class="writing-rail listing-filter" data-listing-filter-root hidden>
|
|
30
36
|
<button type="button" class="writing-rail-trigger listing-filter-trigger"
|
|
31
37
|
data-listing-filter-trigger aria-expanded="false"
|
|
32
38
|
aria-controls="rascunhos-filter-panel">
|
|
33
39
|
<span class="material-symbols-outlined" aria-hidden="true">filter_list</span>
|
|
34
|
-
<span class="font-label writing-rail-trigger-label">
|
|
40
|
+
<span class="font-label writing-rail-trigger-label">{{ t.filter[blog_ui] }}</span>
|
|
35
41
|
</button>
|
|
36
42
|
|
|
37
43
|
<div id="rascunhos-filter-panel" class="writing-rail-panel" data-listing-filter-panel hidden>
|
|
38
|
-
<p class="listing-filter-group-label font-label text-on-surface-variant">
|
|
44
|
+
<p class="listing-filter-group-label font-label text-on-surface-variant">{{ t.keyword[blog_ui] }}</p>
|
|
39
45
|
<label class="writing-rail-search">
|
|
40
|
-
<span class="sr-only">
|
|
46
|
+
<span class="sr-only">{{ t.filter_by_keyword[blog_ui] }}</span>
|
|
41
47
|
<input type="search" class="listing-filter-search writing-rail-input font-body"
|
|
42
|
-
data-listing-filter-q placeholder="
|
|
48
|
+
data-listing-filter-q placeholder="{{ t.keyword_placeholder[blog_ui] }}" autocomplete="off">
|
|
43
49
|
<span class="material-symbols-outlined writing-rail-search-icon" aria-hidden="true">search</span>
|
|
44
50
|
</label>
|
|
45
51
|
<div data-listing-filter-chips></div>
|
|
@@ -65,10 +71,10 @@ layout: shell
|
|
|
65
71
|
|
|
66
72
|
<div class="rascunhos-entries" id="posts-list">
|
|
67
73
|
<section id="empty-state" class="rascunhos-state">
|
|
68
|
-
<p class="font-body text-on-surface-variant italic">
|
|
74
|
+
<p class="font-body text-on-surface-variant italic">{{ t.loading_entries[blog_ui] }}</p>
|
|
69
75
|
</section>
|
|
70
76
|
<section id="no-results" class="rascunhos-state hidden">
|
|
71
|
-
<p class="font-body text-on-surface-variant italic">
|
|
77
|
+
<p class="font-body text-on-surface-variant italic">{{ t.nothing_matches_filters[blog_ui] }}</p>
|
|
72
78
|
</section>
|
|
73
79
|
</div>
|
|
74
80
|
|
|
@@ -125,6 +131,11 @@ layout: shell
|
|
|
125
131
|
var filterUi = null;
|
|
126
132
|
var dateLocale = '{{ blog_locale }}';
|
|
127
133
|
if (dateLocale === 'ptbr' || dateLocale === 'pt_BR') dateLocale = 'pt-BR';
|
|
134
|
+
var uiLang = '{{ blog_ui }}';
|
|
135
|
+
|
|
136
|
+
function t(key) {
|
|
137
|
+
return runtime.translate(key, uiLang) || key;
|
|
138
|
+
}
|
|
128
139
|
|
|
129
140
|
/* Folio number by slug. Assigned once over the whole log, oldest first, so
|
|
130
141
|
* an entry keeps the number it was written under no matter which filter,
|
|
@@ -133,9 +144,9 @@ layout: shell
|
|
|
133
144
|
var folioBySlug = Object.create(null);
|
|
134
145
|
|
|
135
146
|
var SORT_LABELS = {
|
|
136
|
-
published: '
|
|
137
|
-
updated: '
|
|
138
|
-
random: '
|
|
147
|
+
published: t('order_date_written'),
|
|
148
|
+
updated: t('order_last_revised'),
|
|
149
|
+
random: t('order_random')
|
|
139
150
|
};
|
|
140
151
|
|
|
141
152
|
var MONTH_FORMAT = new Intl.DateTimeFormat(dateLocale, {
|
|
@@ -201,18 +212,18 @@ layout: shell
|
|
|
201
212
|
return [
|
|
202
213
|
{
|
|
203
214
|
key: 'tag',
|
|
204
|
-
label: '
|
|
205
|
-
options: [{ value: null, label: '
|
|
215
|
+
label: t('form_label'),
|
|
216
|
+
options: [{ value: null, label: t('all_label') + ' (' + allPosts.length + ')' }].concat(tags.map(function (tag) {
|
|
206
217
|
return { value: tag, label: tag + ' (' + tagCounts[tag] + ')' };
|
|
207
218
|
}))
|
|
208
219
|
},
|
|
209
220
|
{
|
|
210
221
|
key: 'sort',
|
|
211
|
-
label: '
|
|
222
|
+
label: t('order_by'),
|
|
212
223
|
options: [
|
|
213
|
-
{ value: 'published', label: '
|
|
214
|
-
{ value: 'updated', label: '
|
|
215
|
-
{ value: 'random', label: '
|
|
224
|
+
{ value: 'published', label: t('date_written') },
|
|
225
|
+
{ value: 'updated', label: t('last_revised') },
|
|
226
|
+
{ value: 'random', label: t('random_text') }
|
|
216
227
|
]
|
|
217
228
|
}
|
|
218
229
|
];
|
|
@@ -226,10 +237,10 @@ layout: shell
|
|
|
226
237
|
if (orderEl) orderEl.textContent = SORT_LABELS[state.sort] || SORT_LABELS.published;
|
|
227
238
|
if (!tallyEl) return;
|
|
228
239
|
var total = allPosts.length;
|
|
229
|
-
var word = total === 1 ? '
|
|
240
|
+
var word = total === 1 ? t('entry_singular') : t('entry_plural');
|
|
230
241
|
tallyEl.textContent = shown === total
|
|
231
242
|
? total + ' ' + word
|
|
232
|
-
: shown + '
|
|
243
|
+
: shown + ' ' + t('of_total') + ' ' + total + ' ' + word;
|
|
233
244
|
}
|
|
234
245
|
|
|
235
246
|
/* ── Notebook furniture ──────────────────────────────────────────────
|
|
@@ -287,7 +298,7 @@ layout: shell
|
|
|
287
298
|
var folio = folioBySlug[post.slug];
|
|
288
299
|
var updated = postUpdated(post);
|
|
289
300
|
var revised = updated && updated.slice(0, 10) !== String(fm.date || '').slice(0, 10)
|
|
290
|
-
? '<span class="rascunhos-revision">
|
|
301
|
+
? '<span class="rascunhos-revision">' + runtime.escapeHtml(t('revised_prefix')) + ' ' +
|
|
291
302
|
runtime.escapeHtml(runtime.formatDate(updated, dateLocale)) + '</span>'
|
|
292
303
|
: '';
|
|
293
304
|
|
|
@@ -488,16 +499,19 @@ layout: shell
|
|
|
488
499
|
var licence = manifest && manifest.content_license;
|
|
489
500
|
if (!licence || !licence.name) return;
|
|
490
501
|
|
|
491
|
-
var parts = ['<span class="writing-rail-licence-label font-label">
|
|
502
|
+
var parts = ['<span class="writing-rail-licence-label font-label">' +
|
|
503
|
+
runtime.escapeHtml(t('licensing_reuse')) + '</span>'];
|
|
492
504
|
var named = licence.id ? licence.name + ' (' + licence.id + ')' : licence.name;
|
|
493
|
-
parts.push('<p class="writing-rail-licence-copy font-body">
|
|
505
|
+
parts.push('<p class="writing-rail-licence-copy font-body">' +
|
|
506
|
+
runtime.escapeHtml(t('entries_published_under')) + ' ' +
|
|
494
507
|
runtime.escapeHtml(named) + '.</p>');
|
|
495
508
|
if (licence.rights_holder) {
|
|
496
|
-
parts.push('<p class="writing-rail-licence-copy font-body">
|
|
509
|
+
parts.push('<p class="writing-rail-licence-copy font-body">' +
|
|
510
|
+
runtime.escapeHtml(t('attribution_to')) + ' ' +
|
|
497
511
|
runtime.escapeHtml(licence.rights_holder) + '.</p>');
|
|
498
512
|
}
|
|
499
513
|
var href = licence.page_path || licence.url;
|
|
500
|
-
if (href) parts.push(runtime.renderCtaLink(href, '
|
|
514
|
+
if (href) parts.push(runtime.renderCtaLink(href, t('licence_terms')));
|
|
501
515
|
|
|
502
516
|
licenceEl.innerHTML = parts.join('');
|
|
503
517
|
licenceEl.hidden = false;
|
|
@@ -526,7 +540,7 @@ layout: shell
|
|
|
526
540
|
emptyState: emptyState,
|
|
527
541
|
grid: grid,
|
|
528
542
|
noResults: noResults,
|
|
529
|
-
message: '
|
|
543
|
+
message: t('post_load_error')
|
|
530
544
|
});
|
|
531
545
|
});
|
|
532
546
|
}
|
data/_layouts/shell.html
CHANGED
|
@@ -150,9 +150,7 @@
|
|
|
150
150
|
<a href="{{ _p.url }}" role="menuitem"
|
|
151
151
|
class="flex items-center gap-2.5 font-body {% if nav_active == _key %}text-primary font-semibold{% else %}text-on-surface-variant hover:text-primary{% endif %} transition-colors duration-300 py-2 px-1">
|
|
152
152
|
{% if _item.icon %}<span class="material-symbols-outlined text-lg shrink-0 flex items-center justify-center" aria-hidden="true">{{ _item.icon }}</span>{% endif %}
|
|
153
|
-
<span class="
|
|
154
|
-
_p.title }}{% if _p.badge %}<span class="marginalia font-label text-tertiary">{{ _p.badge }}</span>{% endif
|
|
155
|
-
%}</span>
|
|
153
|
+
<span class="leading-none">{{ _p.title }}</span>
|
|
156
154
|
</a>
|
|
157
155
|
{% endfor %}
|
|
158
156
|
{% endfor %}
|
data/assets/css/ledger/home.css
CHANGED
|
@@ -845,6 +845,12 @@ html[data-theme="light"] .home-hero-plate {
|
|
|
845
845
|
border-color var(--motion-duration-fast) var(--motion-ease-default);
|
|
846
846
|
}
|
|
847
847
|
|
|
848
|
+
/* ~40% taller poster than the shared 16/9 plate so the dropped-sheet body
|
|
849
|
+
keeps room for the excerpt (four-up columns were clipping copy to a sliver). */
|
|
850
|
+
.home-draft-card .ledger-poster {
|
|
851
|
+
aspect-ratio: 16 / 12.6;
|
|
852
|
+
}
|
|
853
|
+
|
|
848
854
|
/* A handful of fixed degrees per grid position — not a JS random() — so the
|
|
849
855
|
tilt is identical on every render and every screenshot. */
|
|
850
856
|
.home-draft-list>*:nth-child(4n + 1) {
|
|
@@ -897,13 +903,15 @@ html[data-theme="light"] .home-hero-plate {
|
|
|
897
903
|
`flex: 1` gives the paragraph a definite block size from the flex
|
|
898
904
|
allocation, so line-clamp/overflow clip against that height instead of
|
|
899
905
|
growing past the ellipsis (the old flex:1 + clamp:2 bug that left text
|
|
900
|
-
after "…" and sliced mid-glyph at the card edge).
|
|
906
|
+
after "…" and sliced mid-glyph at the card edge).
|
|
907
|
+
min-height ~40% above the old six-line band so short posters still leave
|
|
908
|
+
readable excerpt room. */
|
|
901
909
|
flex: 1 1 auto;
|
|
902
|
-
min-height:
|
|
910
|
+
min-height: calc(var(--type-subtitle) * var(--leading-body) * 8.4);
|
|
903
911
|
height: 0;
|
|
904
912
|
display: -webkit-box;
|
|
905
|
-
-webkit-line-clamp:
|
|
906
|
-
line-clamp:
|
|
913
|
+
-webkit-line-clamp: 8;
|
|
914
|
+
line-clamp: 8;
|
|
907
915
|
-webkit-box-orient: vertical;
|
|
908
916
|
overflow: hidden;
|
|
909
917
|
}
|
|
@@ -935,44 +943,38 @@ html[data-theme="light"] .home-hero-plate {
|
|
|
935
943
|
}
|
|
936
944
|
}
|
|
937
945
|
|
|
938
|
-
/* ── Engineering artifacts ──
|
|
946
|
+
/* ── Engineering artifacts ──
|
|
947
|
+
Uniform dense cells (not the old 7/5 tension scale): four portfolio cards
|
|
948
|
+
on the home band were reading as oversized panels. Equal columns + a short
|
|
949
|
+
poster keep them catalogue-sized; the projects listing page is unchanged. */
|
|
939
950
|
.home-system-grid {
|
|
940
951
|
display: grid;
|
|
941
952
|
grid-template-columns: minmax(0, 1fr);
|
|
942
|
-
gap: var(--space-
|
|
943
|
-
|
|
944
|
-
stretched into its neighbor's poster height with empty card under its
|
|
945
|
-
links. Left at the grid's default (stretch) now instead: `.ledger-card`
|
|
946
|
-
and `.ledger-system-card` are already flex columns whose body grows
|
|
947
|
-
(`.ledger-card-copy { flex: 1 }`) and whose footer is pinned to the
|
|
948
|
-
bottom (`.ledger-card-foot { margin-top: auto }` in base.css), so the
|
|
949
|
-
extra height a short card gets from stretch reads as intentional air
|
|
950
|
-
above a bottom-anchored footer rather than as a dead gap under it. */
|
|
953
|
+
gap: var(--space-md);
|
|
954
|
+
align-items: stretch;
|
|
951
955
|
}
|
|
952
956
|
|
|
953
|
-
@media (min-width:
|
|
957
|
+
@media (min-width: 700px) {
|
|
954
958
|
.home-system-grid {
|
|
955
959
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
956
960
|
}
|
|
957
961
|
}
|
|
958
962
|
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
grid-template-columns: repeat(12, minmax(0, 1fr));
|
|
964
|
-
gap: var(--space-xl);
|
|
965
|
-
}
|
|
963
|
+
.home-system-grid .ledger-system-card {
|
|
964
|
+
gap: var(--space-xs);
|
|
965
|
+
padding: var(--space-md);
|
|
966
|
+
}
|
|
966
967
|
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
968
|
+
.home-system-grid .ledger-system-card>.ledger-poster,
|
|
969
|
+
.home-system-grid .ledger-system-card>.projects-plate {
|
|
970
|
+
width: auto;
|
|
971
|
+
margin: calc(var(--space-md) * -1) calc(var(--space-md) * -1) 0;
|
|
972
|
+
aspect-ratio: 2 / 1;
|
|
973
|
+
}
|
|
971
974
|
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
}
|
|
975
|
+
.home-system-grid .ledger-system-card .ledger-card-title {
|
|
976
|
+
font-size: var(--type-card);
|
|
977
|
+
line-height: 1.2;
|
|
976
978
|
}
|
|
977
979
|
|
|
978
980
|
.home-system-grid .ledger-card-links {
|
|
@@ -983,7 +985,13 @@ html[data-theme="light"] .home-hero-plate {
|
|
|
983
985
|
font-family: var(--font-body);
|
|
984
986
|
font-size: var(--type-subtitle);
|
|
985
987
|
font-weight: var(--weight-body);
|
|
988
|
+
line-height: var(--leading-body);
|
|
986
989
|
color: var(--color-legend);
|
|
990
|
+
display: -webkit-box;
|
|
991
|
+
-webkit-box-orient: vertical;
|
|
992
|
+
-webkit-line-clamp: 2;
|
|
993
|
+
line-clamp: 2;
|
|
994
|
+
overflow: hidden;
|
|
987
995
|
}
|
|
988
996
|
|
|
989
997
|
|
data/examples/full/_config.yml
CHANGED
|
@@ -54,11 +54,11 @@ pandorga:
|
|
|
54
54
|
home: { featured: true, limit: 3 }
|
|
55
55
|
- key: blog
|
|
56
56
|
template: blog
|
|
57
|
-
title:
|
|
57
|
+
title: Rascunhos
|
|
58
58
|
collection: posts
|
|
59
59
|
path: /pages/blog/
|
|
60
60
|
detail: /posts/:slug/
|
|
61
|
-
language:
|
|
61
|
+
language: pt-BR
|
|
62
62
|
accent: ochre
|
|
63
63
|
nav: { group: Writing, icon: stylus_note }
|
|
64
64
|
home: { limit: 4 }
|
|
@@ -3,9 +3,9 @@ articles:
|
|
|
3
3
|
kicker: Writing
|
|
4
4
|
note: Long-form essays from the full example.
|
|
5
5
|
blog:
|
|
6
|
-
title:
|
|
7
|
-
kicker:
|
|
8
|
-
note:
|
|
6
|
+
title: Rascunhos
|
|
7
|
+
kicker: Caderno
|
|
8
|
+
note: Notas curtas e rascunhos.
|
|
9
9
|
projects:
|
|
10
10
|
title: Projects
|
|
11
11
|
kicker: Systems
|
|
@@ -24,7 +24,7 @@ module Pandorga
|
|
|
24
24
|
|
|
25
25
|
gem "pandorga", "~> 1.2"
|
|
26
26
|
# Local checkout: gem "pandorga", path: "../pandorga"
|
|
27
|
-
# GitHub tag: gem "pandorga", github: "alexandrelheinen/pandorga", tag: "v1.2.
|
|
27
|
+
# GitHub tag: gem "pandorga", github: "alexandrelheinen/pandorga", tag: "v1.2.3"
|
|
28
28
|
gem "csv"
|
|
29
29
|
gem "base64"
|
|
30
30
|
RUBY
|
|
@@ -97,7 +97,7 @@ pages:
|
|
|
97
97
|
language:
|
|
98
98
|
type: string
|
|
99
99
|
required: false
|
|
100
|
-
notes: Listing
|
|
100
|
+
notes: "Listing chrome + dates (`en` default). Use `pt-BR` for Portuguese UI (e.g. blog / rascunhos)"
|
|
101
101
|
home_attributes:
|
|
102
102
|
title: "`home` attributes"
|
|
103
103
|
entries:
|
data/lib/pandorga/version.rb
CHANGED