pandorga 1.10.0 → 1.10.2
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 +25 -0
- data/_includes/content-runtime/43-blocks.html +6 -36
- data/_layouts/home.html +5 -6
- data/assets/css/article.css +1 -1
- data/assets/css/ledger/detail.css +37 -6
- data/assets/css/ledger/home.css +47 -86
- data/assets/css/ledger/projects.css +22 -1
- data/examples/full/content/collections/articles/2026-01-01-welcome.md +13 -0
- data/lib/pandorga/commands/new.rb +1 -1
- data/lib/pandorga/version.rb +1 -1
- data/scripts/test/render-parity/blocks/project-inventory-row.json +8 -11
- data/scripts/test/test-css-structure.rb +22 -0
- 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: 4e66f241523945a85596363141b9693e01ac61e5d6eec0771366ced0ef2dc8b6
|
|
4
|
+
data.tar.gz: 7f00fe9a24f801f42065b3b80d760ccdc1b57fc6c46d89664e2f4e654168a545
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 92e01266bf8f8f0c3a59f47596dd2d589dbd357d361471ecd59fba91d1e44b172f9c7eb3bc9b4958e0a27e8e5cb191637fb908044ec0c4a92b67e20b1237eb28
|
|
7
|
+
data.tar.gz: b10c2447cc7dbead75c291ffd0abdd0a32854906dcb87ffc763d4f0435b31836417eb99f0a7a01649c19b1d3b1572fd56865c2b566ead68c62828964e0d42daa
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.10.2] — 2026-10-16
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- On the home projects bench, each inventory row shows the project icon mark
|
|
8
|
+
(or initial fallback), optional index and label strip, and title, without a
|
|
9
|
+
thumbnail poster, tagline preview, or attached-resource icons. On desktop
|
|
10
|
+
(`>= 900px`) each row fits that two-line body and square icon mark, and the
|
|
11
|
+
specimen height matches the inventory stack
|
|
12
|
+
- Project hero action pills keep their label text free of underlines at rest
|
|
13
|
+
and on hover
|
|
14
|
+
|
|
15
|
+
## [1.10.1] — 2026-10-14
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
|
|
19
|
+
- On article, draft, product, and project detail pages, the category pills
|
|
20
|
+
keep `--space-md` above and below, on a phone and in the desktop dossier
|
|
21
|
+
- The description under the title stays the body face at `--type-prose`,
|
|
22
|
+
and uses `--color-on-surface-variant`, the muted ink of secondary text
|
|
23
|
+
- On a phone, the contents dropdown links use `--type-prose`. The gap above
|
|
24
|
+
that dropdown is `--space-sm`. The gap under it stays `--space-md`, the
|
|
25
|
+
same inset as the pills. The date text keeps `--space-sm` under its own
|
|
26
|
+
rule and above the action rule
|
|
27
|
+
|
|
3
28
|
## [1.10.0] — 2026-10-14
|
|
4
29
|
|
|
5
30
|
### Added
|
|
@@ -330,9 +330,9 @@
|
|
|
330
330
|
}
|
|
331
331
|
|
|
332
332
|
/* Rack card for the home portfolio bench.
|
|
333
|
-
* Desktop:
|
|
334
|
-
*
|
|
335
|
-
*
|
|
333
|
+
* Desktop: square icon mark (or initial) beside a code line and title.
|
|
334
|
+
* The mobile strip shows the project glyph only. Selectable rows update
|
|
335
|
+
* the specimen. */
|
|
336
336
|
function renderProjectInventoryRow(item, options) {
|
|
337
337
|
options = options || {};
|
|
338
338
|
var f = blockFields(item);
|
|
@@ -357,12 +357,12 @@
|
|
|
357
357
|
row.setAttribute('aria-label', name);
|
|
358
358
|
}
|
|
359
359
|
|
|
360
|
-
var media = renderPosterMedia(fm.thumbnail, name);
|
|
361
360
|
var initial = String(name || '?').charAt(0).toUpperCase();
|
|
362
|
-
|
|
361
|
+
var media;
|
|
362
|
+
if (fm.icon) {
|
|
363
363
|
media = '<div class="home-project-inventory-mark" aria-hidden="true">' +
|
|
364
364
|
'<span class="material-symbols-outlined">' + escapeHtml(fm.icon) + '</span></div>';
|
|
365
|
-
} else
|
|
365
|
+
} else {
|
|
366
366
|
media = '<div class="home-project-inventory-mark home-project-inventory-mark--initial" aria-hidden="true">' +
|
|
367
367
|
escapeHtml(initial) + '</div>';
|
|
368
368
|
}
|
|
@@ -388,9 +388,6 @@
|
|
|
388
388
|
'<a class="ledger-card-stretch" href="' + escapeAttr(href) + '">' +
|
|
389
389
|
escapeHtml(name) + '</a></h3>';
|
|
390
390
|
}
|
|
391
|
-
if (fm.tagline) {
|
|
392
|
-
html += '<p class="home-project-inventory-copy font-body">' + escapeHtml(fm.tagline) + '</p>';
|
|
393
|
-
}
|
|
394
391
|
html += '</div>';
|
|
395
392
|
if (fm.icon) {
|
|
396
393
|
html += '<span class="home-project-inventory-glyph material-symbols-outlined" aria-hidden="true">' +
|
|
@@ -399,7 +396,6 @@
|
|
|
399
396
|
html += '<span class="home-project-inventory-glyph home-project-inventory-glyph--initial" aria-hidden="true">' +
|
|
400
397
|
escapeHtml(initial) + '</span>';
|
|
401
398
|
}
|
|
402
|
-
html += renderProjectResourceBadges(fm);
|
|
403
399
|
|
|
404
400
|
row.innerHTML = html;
|
|
405
401
|
return row;
|
|
@@ -473,32 +469,6 @@
|
|
|
473
469
|
return links.join('');
|
|
474
470
|
}
|
|
475
471
|
|
|
476
|
-
/* Square resource marks for the home inventory rack — same fields as
|
|
477
|
-
* renderProjectLinks (github / article_url / external_url), icon-only
|
|
478
|
-
* indicators (not links). */
|
|
479
|
-
function renderProjectResourceBadges(fm) {
|
|
480
|
-
var badges = [];
|
|
481
|
-
if (fm.github) {
|
|
482
|
-
badges.push({ icon: 'code', label: 'Code' });
|
|
483
|
-
}
|
|
484
|
-
if (fm.article_url) {
|
|
485
|
-
badges.push({ icon: 'article', label: 'Article' });
|
|
486
|
-
}
|
|
487
|
-
if (fm.external_url) {
|
|
488
|
-
badges.push({ icon: 'public', label: 'Site' });
|
|
489
|
-
}
|
|
490
|
-
if (!badges.length) return '';
|
|
491
|
-
return '<div class="home-project-inventory-resources" aria-label="Attached resources">' +
|
|
492
|
-
badges.map(function (badge) {
|
|
493
|
-
return '<span class="home-project-inventory-resource" title="' +
|
|
494
|
-
escapeAttr(badge.label) + '" aria-label="' +
|
|
495
|
-
escapeAttr(badge.label) + '">' +
|
|
496
|
-
'<span class="material-symbols-outlined" aria-hidden="true">' +
|
|
497
|
-
escapeHtml(badge.icon) + '</span></span>';
|
|
498
|
-
}).join('') +
|
|
499
|
-
'</div>';
|
|
500
|
-
}
|
|
501
|
-
|
|
502
472
|
/* Home specimen — the featured project on the portfolio bench. A system
|
|
503
473
|
* card whose strip carries folio, label and start year, with the title
|
|
504
474
|
* below a 16:9 plate: the thumbnail (icon badge on it) or else the icon
|
data/_layouts/home.html
CHANGED
|
@@ -399,9 +399,10 @@ layout: shell
|
|
|
399
399
|
async function lockSpecimenHeight() {
|
|
400
400
|
var bench = specimenSlot.closest('.home-projects-bench');
|
|
401
401
|
if (!bench) return;
|
|
402
|
+
bench.style.setProperty('--home-project-icon-count', String(iconSlots));
|
|
402
403
|
var tallest = await measureTallestSpecimen();
|
|
403
|
-
/*
|
|
404
|
-
|
|
404
|
+
/* Desktop matches the specimen height to the N-entry inventory stack
|
|
405
|
+
(see --home-inventory-min-height); mobile uses the tallest specimen. */
|
|
405
406
|
var inventoryMin = 0;
|
|
406
407
|
var raw = window.getComputedStyle(bench)
|
|
407
408
|
.getPropertyValue('--home-inventory-min-height').trim();
|
|
@@ -412,7 +413,7 @@ layout: shell
|
|
|
412
413
|
inventoryMin = Math.ceil(probe.getBoundingClientRect().height);
|
|
413
414
|
probe.remove();
|
|
414
415
|
}
|
|
415
|
-
var locked =
|
|
416
|
+
var locked = inventoryMin > 0 ? inventoryMin : tallest;
|
|
416
417
|
if (locked > 0) {
|
|
417
418
|
bench.style.setProperty('--home-specimen-height', locked + 'px');
|
|
418
419
|
}
|
|
@@ -441,12 +442,10 @@ layout: shell
|
|
|
441
442
|
selected: entry.slug === selectedSlug,
|
|
442
443
|
index: i + 1
|
|
443
444
|
});
|
|
444
|
-
row.addEventListener('click', function (
|
|
445
|
-
if (event.target.closest('.home-project-inventory-resources')) return;
|
|
445
|
+
row.addEventListener('click', function () {
|
|
446
446
|
select(entry.slug);
|
|
447
447
|
});
|
|
448
448
|
row.addEventListener('keydown', function (event) {
|
|
449
|
-
if (event.target.closest('.home-project-inventory-resources')) return;
|
|
450
449
|
if (event.key === 'Enter' || event.key === ' ') {
|
|
451
450
|
event.preventDefault();
|
|
452
451
|
select(entry.slug);
|
data/assets/css/article.css
CHANGED
|
@@ -749,7 +749,7 @@ body.figure-lightbox-open {
|
|
|
749
749
|
font-weight: var(--weight-body);
|
|
750
750
|
line-height: var(--leading-body);
|
|
751
751
|
letter-spacing: normal;
|
|
752
|
-
color: var(--color-
|
|
752
|
+
color: var(--color-on-surface-variant);
|
|
753
753
|
margin: 0;
|
|
754
754
|
text-transform: none;
|
|
755
755
|
}
|
|
@@ -413,8 +413,15 @@ aside:has(> .text-detail-sidebar) {
|
|
|
413
413
|
color: var(--color-tertiary);
|
|
414
414
|
}
|
|
415
415
|
|
|
416
|
+
/* The pills are the only thing between the plate edge and the title when
|
|
417
|
+
they lead the block, so the same token above and below centres them.
|
|
418
|
+
An icon above the row already leaves --space-md (its mb-4). */
|
|
419
|
+
.text-detail-sidebar .article-sidebar-heading:has(> .ledger-chip-row:first-child) {
|
|
420
|
+
padding-top: var(--space-md);
|
|
421
|
+
}
|
|
422
|
+
|
|
416
423
|
.text-detail-sidebar .article-sidebar-heading .ledger-chip-row {
|
|
417
|
-
margin: 0 0 var(--space-
|
|
424
|
+
margin: 0 0 var(--space-md);
|
|
418
425
|
}
|
|
419
426
|
|
|
420
427
|
/* Canonical shard, bottom-right, as in the mockup. Decoration only: it is
|
|
@@ -477,15 +484,15 @@ aside:has(> .text-detail-sidebar) {
|
|
|
477
484
|
color: var(--color-secondary);
|
|
478
485
|
}
|
|
479
486
|
|
|
480
|
-
/* Lead thesis. `description` is the article's own one-sentence claim —
|
|
481
|
-
face at the prose size, in
|
|
487
|
+
/* Lead thesis. `description` is the article's own one-sentence claim — the
|
|
488
|
+
body face at the prose size, in the same muted ink as other secondary text. */
|
|
482
489
|
.text-detail-sidebar .article-sidebar-description {
|
|
483
490
|
font-family: var(--font-body);
|
|
484
491
|
font-style: normal;
|
|
485
492
|
font-size: var(--type-prose);
|
|
486
493
|
font-weight: var(--weight-body);
|
|
487
494
|
line-height: var(--leading-body);
|
|
488
|
-
color: var(--color-
|
|
495
|
+
color: var(--color-on-surface-variant);
|
|
489
496
|
margin: var(--space-md) 0 0;
|
|
490
497
|
}
|
|
491
498
|
|
|
@@ -660,6 +667,26 @@ aside:has(> .text-detail-sidebar) {
|
|
|
660
667
|
}
|
|
661
668
|
}
|
|
662
669
|
|
|
670
|
+
/* Phone: the dropdown is the contents control. Its links match the reading
|
|
671
|
+
size. The gap above it shrinks; the gap under it stays the pill inset. */
|
|
672
|
+
@media (max-width: 767px) {
|
|
673
|
+
.text-detail-sidebar .article-toc--disclosure .article-toc-link,
|
|
674
|
+
.projects-dossier .article-toc--disclosure .article-toc-link {
|
|
675
|
+
font-size: var(--type-prose);
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
.text-detail-sidebar:has(.article-toc--disclosure) .article-meta,
|
|
679
|
+
.projects-dossier:has(.article-toc--disclosure) .article-meta,
|
|
680
|
+
.projects-page .projects-dossier:has(.article-toc--disclosure) .projects-dossier-rows {
|
|
681
|
+
padding-bottom: 0;
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
.text-detail-sidebar .article-toc--disclosure,
|
|
685
|
+
.projects-dossier .article-toc--disclosure {
|
|
686
|
+
margin-top: var(--space-sm);
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
|
|
663
690
|
/* The desktop contents card is the last block in the dossier when Related
|
|
664
691
|
Texts are absent, so the same inset keeps its border off the plate edge.
|
|
665
692
|
Related Texts bring a larger top margin, and the two margins collapse. */
|
|
@@ -1180,8 +1207,12 @@ nav.text-page-nav:not(:has(a)) {
|
|
|
1180
1207
|
padding-bottom: var(--space-md);
|
|
1181
1208
|
}
|
|
1182
1209
|
|
|
1183
|
-
|
|
1184
|
-
|
|
1210
|
+
/* The date row's own top rule leaves --space-sm above the text. The
|
|
1211
|
+
flex gap was stacking another --space-md on the action rule, so the
|
|
1212
|
+
date sat high in that band. Drop the gap and the action margin is the
|
|
1213
|
+
matching --space-sm under the text. */
|
|
1214
|
+
.text-detail-sidebar .article-meta {
|
|
1215
|
+
gap: 0;
|
|
1185
1216
|
}
|
|
1186
1217
|
|
|
1187
1218
|
.text-detail-sidebar .article-sidebar-description,
|
data/assets/css/ledger/home.css
CHANGED
|
@@ -1321,10 +1321,6 @@ button.home-project-inventory-row {
|
|
|
1321
1321
|
display: none;
|
|
1322
1322
|
}
|
|
1323
1323
|
|
|
1324
|
-
.home-project-inventory-resources {
|
|
1325
|
-
display: none;
|
|
1326
|
-
}
|
|
1327
|
-
|
|
1328
1324
|
.home-project-inventory-glyph {
|
|
1329
1325
|
display: inline-flex;
|
|
1330
1326
|
align-items: center;
|
|
@@ -1367,23 +1363,20 @@ button.home-project-inventory-row {
|
|
|
1367
1363
|
|
|
1368
1364
|
@media (min-width: 900px) {
|
|
1369
1365
|
|
|
1370
|
-
/*
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
height for three stacked resource icons. */
|
|
1366
|
+
/* Specimen and inventory share equal columns (~45.6% each). Each row fits
|
|
1367
|
+
its square icon mark and two-line code + title body; the specimen height
|
|
1368
|
+
matches the N-entry inventory stack. */
|
|
1374
1369
|
.home-projects-bench {
|
|
1375
|
-
--home-inventory-
|
|
1376
|
-
--home-inventory-icon-gap: 0.2rem;
|
|
1377
|
-
--home-inventory-resources-height: calc(
|
|
1378
|
-
3 * var(--home-inventory-icon-size) + 2 * var(--home-inventory-icon-gap)
|
|
1379
|
-
);
|
|
1370
|
+
--home-inventory-mark-size: 2.75rem;
|
|
1380
1371
|
--home-inventory-row-min: calc(
|
|
1381
|
-
var(--home-inventory-
|
|
1372
|
+
var(--home-inventory-mark-size) + 2 * var(--space-sm) + 2px
|
|
1382
1373
|
);
|
|
1383
1374
|
--home-inventory-min-height: calc(
|
|
1384
|
-
|
|
1375
|
+
var(--home-project-icon-count, 6) * var(--home-inventory-row-min) +
|
|
1376
|
+
(var(--home-project-icon-count, 6) - 1) * var(--space-sm) +
|
|
1377
|
+
2 * var(--space-md)
|
|
1385
1378
|
);
|
|
1386
|
-
--home-specimen-height:
|
|
1379
|
+
--home-specimen-height: var(--home-inventory-min-height);
|
|
1387
1380
|
display: grid;
|
|
1388
1381
|
grid-template-columns: minmax(0, 45.6%) minmax(0, 45.6%);
|
|
1389
1382
|
column-gap: var(--space-xl);
|
|
@@ -1404,17 +1397,39 @@ button.home-project-inventory-row {
|
|
|
1404
1397
|
background: var(--color-panel-contrast);
|
|
1405
1398
|
}
|
|
1406
1399
|
|
|
1400
|
+
.home-specimen-figure:has(> .ledger-poster, > .projects-plate) {
|
|
1401
|
+
flex: 1 1 0;
|
|
1402
|
+
min-height: 0;
|
|
1403
|
+
grid-template-rows: minmax(0, 1fr) auto;
|
|
1404
|
+
gap: var(--space-sm);
|
|
1405
|
+
}
|
|
1406
|
+
|
|
1407
|
+
.home-specimen-figure > .ledger-poster,
|
|
1408
|
+
.home-specimen-figure > .projects-plate {
|
|
1409
|
+
height: 100%;
|
|
1410
|
+
min-height: 0;
|
|
1411
|
+
aspect-ratio: auto;
|
|
1412
|
+
}
|
|
1413
|
+
|
|
1407
1414
|
.home-project-specimen .home-specimen-title {
|
|
1408
1415
|
font-size: var(--type-title);
|
|
1409
1416
|
}
|
|
1410
1417
|
|
|
1418
|
+
.home-project-specimen .ledger-card-copy {
|
|
1419
|
+
flex: 0 0 auto;
|
|
1420
|
+
height: auto;
|
|
1421
|
+
min-height: 0;
|
|
1422
|
+
max-height: calc(var(--type-body) * var(--leading-body) * 2);
|
|
1423
|
+
}
|
|
1424
|
+
|
|
1411
1425
|
.home-project-inventory-row {
|
|
1412
|
-
flex:
|
|
1413
|
-
align-items:
|
|
1426
|
+
flex: 0 0 auto;
|
|
1427
|
+
align-items: center;
|
|
1414
1428
|
justify-content: flex-start;
|
|
1415
1429
|
gap: var(--space-md);
|
|
1416
|
-
height:
|
|
1430
|
+
height: var(--home-inventory-row-min);
|
|
1417
1431
|
min-height: var(--home-inventory-row-min);
|
|
1432
|
+
box-sizing: border-box;
|
|
1418
1433
|
padding: var(--space-sm) var(--space-md);
|
|
1419
1434
|
border: 1px solid var(--border-gentle-divider);
|
|
1420
1435
|
background: var(--color-surface-card);
|
|
@@ -1433,15 +1448,13 @@ button.home-project-inventory-row {
|
|
|
1433
1448
|
box-shadow: inset 3px 0 0 var(--color-primary);
|
|
1434
1449
|
}
|
|
1435
1450
|
|
|
1436
|
-
/*
|
|
1437
|
-
it tall while title/copy/icons stay top-aligned with its top edge. */
|
|
1451
|
+
/* Square icon mark beside the two-line code + title body. */
|
|
1438
1452
|
.home-project-inventory-media {
|
|
1439
1453
|
display: block;
|
|
1440
1454
|
flex: 0 0 auto;
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
aspect-ratio: 16 / 9;
|
|
1455
|
+
width: var(--home-inventory-mark-size);
|
|
1456
|
+
height: var(--home-inventory-mark-size);
|
|
1457
|
+
aspect-ratio: 1 / 1;
|
|
1445
1458
|
overflow: hidden;
|
|
1446
1459
|
background: var(--color-surface-high);
|
|
1447
1460
|
}
|
|
@@ -1451,33 +1464,25 @@ button.home-project-inventory-row {
|
|
|
1451
1464
|
outline-offset: 2px;
|
|
1452
1465
|
}
|
|
1453
1466
|
|
|
1454
|
-
.home-project-inventory-media .ledger-poster,
|
|
1455
1467
|
.home-project-inventory-mark {
|
|
1468
|
+
display: flex;
|
|
1469
|
+
align-items: center;
|
|
1470
|
+
justify-content: center;
|
|
1456
1471
|
width: 100%;
|
|
1457
1472
|
height: 100%;
|
|
1458
1473
|
aspect-ratio: auto;
|
|
1459
1474
|
overflow: hidden;
|
|
1460
1475
|
background: var(--color-surface-high);
|
|
1461
|
-
}
|
|
1462
|
-
|
|
1463
|
-
.home-project-inventory-media .ledger-poster::after {
|
|
1464
|
-
display: none;
|
|
1465
|
-
}
|
|
1466
|
-
|
|
1467
|
-
.home-project-inventory-mark {
|
|
1468
|
-
display: flex;
|
|
1469
|
-
align-items: center;
|
|
1470
|
-
justify-content: center;
|
|
1471
1476
|
color: var(--color-primary);
|
|
1472
1477
|
}
|
|
1473
1478
|
|
|
1474
1479
|
.home-project-inventory-mark .material-symbols-outlined {
|
|
1475
|
-
font-size:
|
|
1480
|
+
font-size: 1.5rem;
|
|
1476
1481
|
}
|
|
1477
1482
|
|
|
1478
1483
|
.home-project-inventory-mark--initial {
|
|
1479
1484
|
font-family: var(--font-content-title);
|
|
1480
|
-
font-size: var(--type-card
|
|
1485
|
+
font-size: var(--type-card);
|
|
1481
1486
|
font-weight: var(--weight-title);
|
|
1482
1487
|
line-height: 1;
|
|
1483
1488
|
color: var(--color-on-surface);
|
|
@@ -1486,53 +1491,20 @@ button.home-project-inventory-row {
|
|
|
1486
1491
|
.home-project-inventory-body {
|
|
1487
1492
|
display: flex;
|
|
1488
1493
|
flex-direction: column;
|
|
1489
|
-
justify-content:
|
|
1490
|
-
align-self:
|
|
1491
|
-
gap: 0.
|
|
1494
|
+
justify-content: center;
|
|
1495
|
+
align-self: center;
|
|
1496
|
+
gap: 0.15rem;
|
|
1492
1497
|
flex: 1 1 0;
|
|
1493
1498
|
min-width: 0;
|
|
1494
1499
|
padding-top: 0;
|
|
1495
1500
|
}
|
|
1496
1501
|
|
|
1497
|
-
.home-project-inventory-resources {
|
|
1498
|
-
display: flex;
|
|
1499
|
-
flex-direction: column;
|
|
1500
|
-
justify-content: flex-start;
|
|
1501
|
-
align-items: center;
|
|
1502
|
-
align-self: flex-start;
|
|
1503
|
-
flex: 0 0 auto;
|
|
1504
|
-
gap: var(--home-inventory-icon-gap);
|
|
1505
|
-
width: var(--home-inventory-icon-size);
|
|
1506
|
-
min-height: var(--home-inventory-resources-height);
|
|
1507
|
-
position: relative;
|
|
1508
|
-
z-index: 1;
|
|
1509
|
-
}
|
|
1510
|
-
|
|
1511
|
-
/* Neutral marks — same voice as list descriptions, not primary CTAs. */
|
|
1512
|
-
.home-project-inventory-resource {
|
|
1513
|
-
display: inline-flex;
|
|
1514
|
-
align-items: center;
|
|
1515
|
-
justify-content: center;
|
|
1516
|
-
width: var(--home-inventory-icon-size);
|
|
1517
|
-
height: var(--home-inventory-icon-size);
|
|
1518
|
-
flex: 0 0 auto;
|
|
1519
|
-
background: transparent;
|
|
1520
|
-
color: var(--color-on-surface-variant);
|
|
1521
|
-
border: 0;
|
|
1522
|
-
}
|
|
1523
|
-
|
|
1524
|
-
.home-project-inventory-resource .material-symbols-outlined {
|
|
1525
|
-
font-size: 1rem;
|
|
1526
|
-
line-height: 1;
|
|
1527
|
-
font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 20;
|
|
1528
|
-
}
|
|
1529
|
-
|
|
1530
1502
|
.home-project-inventory-code .ledger-meta {
|
|
1531
1503
|
font-size: var(--type-label-lg);
|
|
1532
1504
|
}
|
|
1533
1505
|
|
|
1534
1506
|
.home-project-inventory-title {
|
|
1535
|
-
margin: 0
|
|
1507
|
+
margin: 0;
|
|
1536
1508
|
font-family: var(--font-content-title);
|
|
1537
1509
|
font-size: calc(var(--type-card) - 2pt);
|
|
1538
1510
|
font-weight: var(--weight-title);
|
|
@@ -1549,17 +1521,6 @@ button.home-project-inventory-row {
|
|
|
1549
1521
|
color: var(--color-primary);
|
|
1550
1522
|
}
|
|
1551
1523
|
|
|
1552
|
-
.home-project-inventory-copy {
|
|
1553
|
-
margin: 0;
|
|
1554
|
-
font-size: var(--type-label-lg);
|
|
1555
|
-
font-weight: var(--weight-body);
|
|
1556
|
-
line-height: 1.35;
|
|
1557
|
-
color: var(--color-on-surface-variant);
|
|
1558
|
-
overflow: hidden;
|
|
1559
|
-
text-overflow: ellipsis;
|
|
1560
|
-
white-space: nowrap;
|
|
1561
|
-
}
|
|
1562
|
-
|
|
1563
1524
|
/* Two classes: the glyph also carries .material-symbols-outlined, whose
|
|
1564
1525
|
font stylesheet loads after this one and sets display. */
|
|
1565
1526
|
.home-project-inventory-row .home-project-inventory-glyph {
|
|
@@ -241,6 +241,7 @@
|
|
|
241
241
|
.projects-page .projects-lead-subtitle,
|
|
242
242
|
.projects-page .projects-hero-subtitle {
|
|
243
243
|
margin: 0;
|
|
244
|
+
font-family: var(--font-body);
|
|
244
245
|
color: var(--color-on-surface-variant);
|
|
245
246
|
letter-spacing: 0.02em;
|
|
246
247
|
}
|
|
@@ -459,9 +460,10 @@
|
|
|
459
460
|
|
|
460
461
|
.projects-page .projects-hero-standfirst {
|
|
461
462
|
margin: var(--space-md) 0 0;
|
|
463
|
+
font-family: var(--font-body);
|
|
462
464
|
font-size: var(--type-subtitle);
|
|
463
465
|
line-height: var(--leading-body);
|
|
464
|
-
color: var(--color-
|
|
466
|
+
color: var(--color-on-surface-variant);
|
|
465
467
|
max-width: var(--reading-measure);
|
|
466
468
|
}
|
|
467
469
|
|
|
@@ -553,6 +555,25 @@
|
|
|
553
555
|
}
|
|
554
556
|
}
|
|
555
557
|
|
|
558
|
+
/* Tag row centred between the hero edge and the title. The column is a
|
|
559
|
+
flex stack with a --space-xs gap, so the margins make up the rest of
|
|
560
|
+
--space-md on each side. */
|
|
561
|
+
.projects-page .projects-hero-body > .ledger-chip-row {
|
|
562
|
+
margin-bottom: calc(var(--space-md) - var(--space-xs));
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
.projects-page .projects-hero-body > :not(.ledger-chip-row) + .ledger-chip-row {
|
|
566
|
+
margin-top: calc(var(--space-md) - var(--space-xs));
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
.projects-page .projects-hero-body > .ledger-chip-row + .projects-hero-title {
|
|
570
|
+
margin-top: 0;
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
.projects-page .projects-hero-body:has(> .ledger-chip-row:first-child) {
|
|
574
|
+
padding-top: var(--space-md);
|
|
575
|
+
}
|
|
576
|
+
|
|
556
577
|
@media (max-width: 1023px) {
|
|
557
578
|
.projects-page .projects-hero {
|
|
558
579
|
margin-bottom: var(--space-xl);
|
|
@@ -2,8 +2,21 @@
|
|
|
2
2
|
title: Welcome to the full example
|
|
3
3
|
key: welcome
|
|
4
4
|
date: 2026-01-01
|
|
5
|
+
description: A short claim under the title, in the example voice.
|
|
5
6
|
tags: [Writing]
|
|
6
7
|
language: en
|
|
7
8
|
---
|
|
8
9
|
|
|
9
10
|
Fictional persona content for `examples/full`.
|
|
11
|
+
|
|
12
|
+
## Opening
|
|
13
|
+
|
|
14
|
+
The first section gives the contents list a heading.
|
|
15
|
+
|
|
16
|
+
## Second plate
|
|
17
|
+
|
|
18
|
+
Another heading keeps the menu from collapsing to a single line.
|
|
19
|
+
|
|
20
|
+
## Closing
|
|
21
|
+
|
|
22
|
+
A third heading is the minimum the contents list will draw.
|
|
@@ -24,7 +24,7 @@ module Pandorga
|
|
|
24
24
|
|
|
25
25
|
gem "pandorga", "~> 1.3"
|
|
26
26
|
# Local checkout: gem "pandorga", path: "../pandorga"
|
|
27
|
-
# GitHub tag: gem "pandorga", github: "alexandrelheinen/pandorga", tag: "v1.10.
|
|
27
|
+
# GitHub tag: gem "pandorga", github: "alexandrelheinen/pandorga", tag: "v1.10.2"
|
|
28
28
|
gem "csv"
|
|
29
29
|
gem "base64"
|
|
30
30
|
RUBY
|
data/lib/pandorga/version.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "project-inventory-row/rack card (PLT-AC-
|
|
2
|
+
"name": "project-inventory-row/rack card (PLT-AC-41)",
|
|
3
3
|
"block": "renderProjectInventoryRow",
|
|
4
4
|
"args": [
|
|
5
5
|
{
|
|
@@ -25,28 +25,25 @@
|
|
|
25
25
|
"selectors": [
|
|
26
26
|
"button.home-project-inventory-row",
|
|
27
27
|
"div.home-project-inventory-media",
|
|
28
|
-
"div.
|
|
28
|
+
"div.home-project-inventory-mark",
|
|
29
29
|
"div.home-project-inventory-code",
|
|
30
30
|
"span.home-project-inventory-index",
|
|
31
31
|
"h3.home-project-inventory-title",
|
|
32
|
-
"
|
|
33
|
-
"span.home-project-inventory-glyph",
|
|
34
|
-
"div.home-project-inventory-resources",
|
|
35
|
-
"span.home-project-inventory-resource"
|
|
32
|
+
"span.home-project-inventory-glyph"
|
|
36
33
|
],
|
|
37
34
|
"forbidden": [
|
|
38
35
|
"ledger-card-stretch",
|
|
39
|
-
"role=\"button\""
|
|
36
|
+
"role=\"button\"",
|
|
37
|
+
"ledger-poster",
|
|
38
|
+
"home-project-inventory-copy",
|
|
39
|
+
"home-project-inventory-resources",
|
|
40
|
+
"home-project-inventory-resource"
|
|
40
41
|
],
|
|
41
42
|
"contains": [
|
|
42
43
|
">02<",
|
|
43
44
|
">Simulation<",
|
|
44
45
|
">ARCO<",
|
|
45
|
-
">A city-scale race replayed from telemetry.<",
|
|
46
46
|
">route<",
|
|
47
|
-
">code<",
|
|
48
|
-
">article<",
|
|
49
|
-
">public<",
|
|
50
47
|
"aria-pressed=\"false\"",
|
|
51
48
|
"data-slug=\"arco\""
|
|
52
49
|
]
|
|
@@ -226,6 +226,28 @@ sheets.each do |path|
|
|
|
226
226
|
end
|
|
227
227
|
end
|
|
228
228
|
|
|
229
|
+
# PLT-AC-41. Home project inventory rows use the square icon mark, two-line
|
|
230
|
+
# code + title body, and no tagline preview or attached-resource icons; the
|
|
231
|
+
# desktop specimen height matches the N-entry inventory height.
|
|
232
|
+
home_sheet = strip_comments(File.read(CSS_ROOT.join("ledger/home.css")))
|
|
233
|
+
%w[
|
|
234
|
+
home-project-inventory-copy
|
|
235
|
+
home-project-inventory-resources
|
|
236
|
+
home-project-inventory-resource
|
|
237
|
+
].each do |retired_home|
|
|
238
|
+
if home_sheet.match?(/[.#]#{Regexp.escape(retired_home)}\b/)
|
|
239
|
+
errors << "assets/css/ledger/home.css: .#{retired_home} must be removed (PLT-AC-41)"
|
|
240
|
+
end
|
|
241
|
+
end
|
|
242
|
+
require_declarations(
|
|
243
|
+
errors, "assets/css/ledger/home.css", home_sheet,
|
|
244
|
+
".home-project-inventory-media", ["aspect-ratio: 1 / 1"]
|
|
245
|
+
)
|
|
246
|
+
require_declarations(
|
|
247
|
+
errors, "assets/css/ledger/home.css", home_sheet,
|
|
248
|
+
".home-projects-bench", ["--home-specimen-height: var(--home-inventory-min-height)"]
|
|
249
|
+
)
|
|
250
|
+
|
|
229
251
|
fail!("CSS structure problems:\n - #{errors.join("\n - ")}") unless errors.empty?
|
|
230
252
|
|
|
231
253
|
puts " #{sheets.size} stylesheet(s) balanced, no conflict markers."
|