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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 57520c1d6ff472368d36e60fe8b2cfa73bd3a10ae64e5201d7ff2aae2d05d93f
4
- data.tar.gz: 373041d44db6e27eff5cfb42e6086c5d78b54c1a57e682906ed74d4167f3efe7
3
+ metadata.gz: 4e66f241523945a85596363141b9693e01ac61e5d6eec0771366ced0ef2dc8b6
4
+ data.tar.gz: 7f00fe9a24f801f42065b3b80d760ccdc1b57fc6c46d89664e2f4e654168a545
5
5
  SHA512:
6
- metadata.gz: dea59bee7700b649e1db8740f8b825332b3c382e03ab8e7745ec3261dc7d31140571b26bdf2e7cb27f13910d6974aa7cb9e8f7a38a0dfb8c5064cc5c41c4400d
7
- data.tar.gz: 7ce51565da0ef33816b8f95b37ba80e0300d91135049a80025719d4b91571be9a15c5fe0c3e1d13722f817b1c73f81e76a274fae54d11506e06da75eda0e9159
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: thumb (or icon, or initial) beside a code line, title and
334
- * tagline. The mobile strip shows the project glyph only. Selectable rows
335
- * update the specimen. */
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
- if (!media && fm.icon) {
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 if (!media) {
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
- /* Floor at the CSS inventory minimum so six rows always clear
404
- three stacked resource icons (see --home-inventory-min-height). */
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 = Math.max(tallest, inventoryMin);
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 (event) {
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);
@@ -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-legend);
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-sm);
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 — body
481
- face at the prose size, in legend ink so it sits under the H1. */
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-legend);
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
- .text-detail-sidebar .article-sidebar-heading .ledger-chip-row {
1184
- margin-bottom: var(--space-xs);
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,
@@ -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
- /* Desktop fallback before JS measures the tallest specimen.
1371
- Specimen and inventory share equal columns (specimen was 38% then
1372
- +20% → 45.6%; the list matches that width). Rows still reserve
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-icon-size: 1.55rem;
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-resources-height) + 2 * var(--space-sm)
1372
+ var(--home-inventory-mark-size) + 2 * var(--space-sm) + 2px
1382
1373
  );
1383
1374
  --home-inventory-min-height: calc(
1384
- 6 * var(--home-inventory-row-min) + 5 * var(--space-sm) + 2 * var(--space-md)
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: max(36rem, var(--home-inventory-min-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: 1 1 0;
1413
- align-items: flex-start;
1426
+ flex: 0 0 auto;
1427
+ align-items: center;
1414
1428
  justify-content: flex-start;
1415
1429
  gap: var(--space-md);
1416
- height: auto;
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
- /* Plate fills the row’s content height; width follows 16:9. Stretch keeps
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
- align-self: stretch;
1442
- width: auto;
1443
- height: auto;
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: 2rem;
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-lg);
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: flex-start;
1490
- align-self: flex-start;
1491
- gap: 0.2rem;
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.2rem 0 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-legend);
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.0"
27
+ # GitHub tag: gem "pandorga", github: "alexandrelheinen/pandorga", tag: "v1.10.2"
28
28
  gem "csv"
29
29
  gem "base64"
30
30
  RUBY
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Pandorga
4
- VERSION = "1.10.0"
4
+ VERSION = "1.10.2"
5
5
  end
@@ -1,5 +1,5 @@
1
1
  {
2
- "name": "project-inventory-row/rack card (PLT-AC-15)",
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.ledger-poster",
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
- "p.home-project-inventory-copy",
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."
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pandorga
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.10.0
4
+ version: 1.10.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - The Pandorga contributors