pandorga 1.4.7 → 1.4.8

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: b72923b7c78519c2e27d696f963cf147445dd0d8dd089f90a69cde8c2247acbd
4
- data.tar.gz: 703d26b69d010bcd5e535eee0dfd64da725887439cd68edb7cd8da827acb69d8
3
+ metadata.gz: fdc6dcec6dea0007093b40500ca2ec287d17170029f68b3f4284090fe14236a1
4
+ data.tar.gz: be5ea215e27ebe6755ce5d09875c8ca175d16daf3d8328c94161255fba179531
5
5
  SHA512:
6
- metadata.gz: a974cbf723b43a543a0af0a489c74c08bac2bddd4b77275baf5e74c106fde22aa69ea4e0085f0a1a71ba9f25514db61d0e6fc96dd9f03f749645e38e93dfd704
7
- data.tar.gz: 164b159223d96b978e251f271fc8aea4b6535ad3397205efa88860dd1211b31ace3661b3425d6540b72874f1cd8d4348f8480ae305eccce115d45756dd0bfb5b
6
+ metadata.gz: f2f5de4ed2c7737a20b33fe03018c49f8a2267a4903ed065c5af9f99bf1b36e708305186c3d022786152efc15ba39791c6f55c2cf9427d2bac4f97a61cda77a7
7
+ data.tar.gz: 43e93a55bd09913445387e511741522588d2fb51d37589dc51abc4d0d4e4145fa3fef32c7087a7b4d59fa841fe25b2e5cc799bc1c88c2efa3883e7dfb5d546d4
data/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.4.8] — 2026-10-08
4
+
5
+ ### Changed
6
+
7
+ - Home project bench: specimen and inventory share equal ~45.6% columns;
8
+ inventory thumbnails fill row height at 16:9; list titles, copy, and
9
+ resource marks retuned (neutral gray icons, tighter type)
10
+ - Specimen tagline flexes into spare card height and ellipsizes with a
11
+ proper "…" (CSS line-clamp was hard-clipping mid-glyph)
12
+
3
13
  ## [1.4.7] — 2026-10-07
4
14
 
5
15
  ### Fixed
data/_layouts/home.html CHANGED
@@ -250,6 +250,43 @@ layout: shell
250
250
  /* Lock height to the tallest project so swapping never moves the
251
251
  inventory. Remeasure on resize when the specimen column width
252
252
  changes (chip wrap / plate width). */
253
+ /* `-webkit-line-clamp` fails on the specimen card (mid-glyph crop,
254
+ no ellipsis). Copy flexes into spare card height; fit text here. */
255
+ function ellipsizeSpecimenCopy(root) {
256
+ var copy = root.querySelector('.ledger-card-copy');
257
+ if (!copy) return;
258
+ var full = copy.getAttribute('data-full-text') || copy.textContent;
259
+ copy.setAttribute('data-full-text', full);
260
+ copy.textContent = full;
261
+ if (copy.scrollHeight <= copy.clientHeight + 1) return;
262
+
263
+ function fitted(n) {
264
+ if (n >= full.length) {
265
+ copy.textContent = full;
266
+ return copy.scrollHeight <= copy.clientHeight + 1;
267
+ }
268
+ var slice = full.slice(0, n);
269
+ var sp = slice.lastIndexOf(' ');
270
+ if (sp > Math.floor(n * 0.5)) slice = slice.slice(0, sp);
271
+ copy.textContent = slice.replace(/[.,;:\s]+$/u, '') + '…';
272
+ return copy.scrollHeight <= copy.clientHeight + 1;
273
+ }
274
+
275
+ var lo = 0;
276
+ var hi = full.length;
277
+ var best = 0;
278
+ while (lo <= hi) {
279
+ var mid = (lo + hi) >> 1;
280
+ if (fitted(mid)) {
281
+ best = mid;
282
+ lo = mid + 1;
283
+ } else {
284
+ hi = mid - 1;
285
+ }
286
+ }
287
+ fitted(best);
288
+ }
289
+
253
290
  function paintSpecimen(entry) {
254
291
  specimenSlot.innerHTML = '';
255
292
  specimenSlot.appendChild(runtime.renderProjectSpecimen(asItem(entry), {
@@ -258,6 +295,7 @@ layout: shell
258
295
  folio: positionOf(entry.slug) + 1,
259
296
  openLabel: 'Open project'
260
297
  }));
298
+ ellipsizeSpecimenCopy(specimenSlot);
261
299
  }
262
300
 
263
301
  function measureTallestSpecimen() {
@@ -302,8 +340,21 @@ layout: shell
302
340
  var bench = specimenSlot.closest('.home-projects-bench');
303
341
  if (!bench) return;
304
342
  var tallest = measureTallestSpecimen();
305
- if (tallest > 0) {
306
- bench.style.setProperty('--home-specimen-height', tallest + 'px');
343
+ /* Floor at the CSS inventory minimum so six rows always clear
344
+ three stacked resource icons (see --home-inventory-min-height). */
345
+ var inventoryMin = 0;
346
+ var raw = window.getComputedStyle(bench)
347
+ .getPropertyValue('--home-inventory-min-height').trim();
348
+ if (raw) {
349
+ var probe = document.createElement('div');
350
+ probe.style.cssText = 'position:absolute;visibility:hidden;height:' + raw;
351
+ bench.appendChild(probe);
352
+ inventoryMin = Math.ceil(probe.getBoundingClientRect().height);
353
+ probe.remove();
354
+ }
355
+ var locked = Math.max(tallest, inventoryMin);
356
+ if (locked > 0) {
357
+ bench.style.setProperty('--home-specimen-height', locked + 'px');
307
358
  }
308
359
  }
309
360
 
@@ -957,12 +957,13 @@ html[data-theme="light"] .home-hero-plate {
957
957
  A specimen card beside a filing rack of project cards. Height is locked to
958
958
  the tallest project (home.html measures once, then sets
959
959
  `--home-specimen-height`), so swapping projects never resizes the band or
960
- the inventory. Taglines stay full length and chips wrap whole pills like
961
- the projects index; spare height parks chips and the foot on the floor.
962
- Every plate is 16:9, the ratio the thumbnails are drawn at, with the title
963
- below it. From 900px the specimen is half the band and the rack a narrower
964
- column beside it, the rest left blank. Below 900px the rack is an icon strip
965
- above the specimen, one column per project. */
960
+ the inventory. Taglines clamp to two lines with an ellipsis; chips wrap
961
+ whole pills like the projects index; spare height parks chips and the foot
962
+ on the floor. Every plate is 16:9, the ratio the thumbnails are drawn at,
963
+ with the title below it. From 900px the specimen and the rack share equal
964
+ columns (~45.6% each); rows reserve height for three resource icons.
965
+ Below 900px the rack is an icon strip above the specimen, one column
966
+ per project. */
966
967
  .home-projects-bench {
967
968
  --home-specimen-height: 32rem;
968
969
  --home-icon-btn-size: 2.75rem;
@@ -1138,12 +1139,15 @@ html[data-theme="light"] .home-hero-plate {
1138
1139
  white-space: nowrap;
1139
1140
  }
1140
1141
 
1141
- /* Full tagline, same as `.ledger-system-card` on the projects index — no
1142
- clamp and no flex-shrink that would crop mid-sentence. The chip row wraps
1143
- whole pills to the next line (never mid-label); spare height still parks
1144
- them and the foot on the floor. */
1142
+ /* Tagline fills spare height between the plate and the chips/foot.
1143
+ `-webkit-line-clamp` hard-clips mid-glyph on this card, so home.html
1144
+ ellipsizes against the flex-allocated box after paint (`height: 0` +
1145
+ `flex: 1` is the same definite-size trick as `.home-draft-card`). */
1145
1146
  .home-project-specimen .ledger-card-copy {
1146
- flex: 0 0 auto;
1147
+ flex: 1 1 auto;
1148
+ min-height: calc(var(--type-body) * var(--leading-body) * 2);
1149
+ height: 0;
1150
+ overflow: hidden;
1147
1151
  font-size: var(--type-body);
1148
1152
  line-height: var(--leading-body);
1149
1153
  color: var(--color-on-surface-variant);
@@ -1153,14 +1157,14 @@ html[data-theme="light"] .home-hero-plate {
1153
1157
  flex: 0 0 auto;
1154
1158
  flex-wrap: wrap;
1155
1159
  gap: var(--space-xs);
1156
- margin: auto 0 0;
1160
+ margin: 0;
1157
1161
  }
1158
1162
 
1159
1163
  .home-specimen-foot {
1160
1164
  flex: 0 0 auto;
1161
1165
  flex-wrap: wrap;
1162
1166
  gap: var(--space-md);
1163
- margin-top: auto;
1167
+ margin-top: var(--space-sm);
1164
1168
  padding-top: var(--space-md);
1165
1169
  }
1166
1170
 
@@ -1281,11 +1285,25 @@ html[data-theme="light"] .home-hero-plate {
1281
1285
 
1282
1286
  @media (min-width: 900px) {
1283
1287
 
1284
- /* Desktop fallback before JS measures the tallest specimen. */
1288
+ /* Desktop fallback before JS measures the tallest specimen.
1289
+ Specimen and inventory share equal columns (specimen was 38% then
1290
+ +20% → 45.6%; the list matches that width). Rows still reserve
1291
+ height for three stacked resource icons. */
1285
1292
  .home-projects-bench {
1286
- --home-specimen-height: 36rem;
1293
+ --home-inventory-icon-size: 1.55rem;
1294
+ --home-inventory-icon-gap: 0.2rem;
1295
+ --home-inventory-resources-height: calc(
1296
+ 3 * var(--home-inventory-icon-size) + 2 * var(--home-inventory-icon-gap)
1297
+ );
1298
+ --home-inventory-row-min: calc(
1299
+ var(--home-inventory-resources-height) + 2 * var(--space-sm)
1300
+ );
1301
+ --home-inventory-min-height: calc(
1302
+ 6 * var(--home-inventory-row-min) + 5 * var(--space-sm) + 2 * var(--space-md)
1303
+ );
1304
+ --home-specimen-height: max(36rem, var(--home-inventory-min-height));
1287
1305
  display: grid;
1288
- grid-template-columns: minmax(0, 50%) minmax(20rem, 40%);
1306
+ grid-template-columns: minmax(0, 45.6%) minmax(0, 45.6%);
1289
1307
  column-gap: var(--space-xl);
1290
1308
  align-items: stretch;
1291
1309
  }
@@ -1295,6 +1313,9 @@ html[data-theme="light"] .home-hero-plate {
1295
1313
  display: flex;
1296
1314
  flex-direction: column;
1297
1315
  gap: var(--space-sm);
1316
+ box-sizing: border-box;
1317
+ width: 100%;
1318
+ min-width: 0;
1298
1319
  min-height: 0;
1299
1320
  overflow: hidden;
1300
1321
  padding: var(--space-md);
@@ -1307,10 +1328,11 @@ html[data-theme="light"] .home-hero-plate {
1307
1328
 
1308
1329
  .home-project-inventory-row {
1309
1330
  flex: 1 1 0;
1331
+ align-items: flex-start;
1310
1332
  justify-content: flex-start;
1311
1333
  gap: var(--space-md);
1312
1334
  height: auto;
1313
- min-height: 0;
1335
+ min-height: var(--home-inventory-row-min);
1314
1336
  padding: var(--space-sm) var(--space-md);
1315
1337
  border: 1px solid var(--border-gentle-divider);
1316
1338
  background: var(--color-surface-card);
@@ -1329,10 +1351,14 @@ html[data-theme="light"] .home-hero-plate {
1329
1351
  box-shadow: inset 3px 0 0 var(--color-primary);
1330
1352
  }
1331
1353
 
1354
+ /* Plate fills the row’s content height; width follows 16:9. Stretch keeps
1355
+ it tall while title/copy/icons stay top-aligned with its top edge. */
1332
1356
  .home-project-inventory-media {
1333
1357
  display: block;
1334
1358
  flex: 0 0 auto;
1335
- width: 5.5rem;
1359
+ align-self: stretch;
1360
+ width: auto;
1361
+ height: auto;
1336
1362
  aspect-ratio: 16 / 9;
1337
1363
  overflow: hidden;
1338
1364
  background: var(--color-surface-high);
@@ -1364,12 +1390,12 @@ html[data-theme="light"] .home-hero-plate {
1364
1390
  }
1365
1391
 
1366
1392
  .home-project-inventory-mark .material-symbols-outlined {
1367
- font-size: 1.5rem;
1393
+ font-size: 2rem;
1368
1394
  }
1369
1395
 
1370
1396
  .home-project-inventory-mark--initial {
1371
1397
  font-family: var(--font-content-title);
1372
- font-size: var(--type-card);
1398
+ font-size: var(--type-card-lg);
1373
1399
  font-weight: var(--weight-title);
1374
1400
  line-height: 1;
1375
1401
  color: var(--color-on-surface);
@@ -1378,10 +1404,12 @@ html[data-theme="light"] .home-hero-plate {
1378
1404
  .home-project-inventory-body {
1379
1405
  display: flex;
1380
1406
  flex-direction: column;
1381
- justify-content: center;
1382
- gap: 0.1rem;
1407
+ justify-content: flex-start;
1408
+ align-self: flex-start;
1409
+ gap: 0.2rem;
1383
1410
  flex: 1 1 0;
1384
1411
  min-width: 0;
1412
+ padding-top: 0;
1385
1413
  }
1386
1414
 
1387
1415
  .home-project-inventory-resources {
@@ -1389,45 +1417,44 @@ html[data-theme="light"] .home-hero-plate {
1389
1417
  flex-direction: column;
1390
1418
  justify-content: flex-start;
1391
1419
  align-items: center;
1392
- align-self: stretch;
1420
+ align-self: flex-start;
1393
1421
  flex: 0 0 auto;
1394
- gap: 0.2rem;
1395
- min-height: 0;
1422
+ gap: var(--home-inventory-icon-gap);
1423
+ width: var(--home-inventory-icon-size);
1424
+ min-height: var(--home-inventory-resources-height);
1396
1425
  position: relative;
1397
1426
  z-index: 1;
1398
1427
  }
1399
1428
 
1429
+ /* Neutral marks — same voice as list descriptions, not primary CTAs. */
1400
1430
  .home-project-inventory-resource {
1401
1431
  display: inline-flex;
1402
1432
  align-items: center;
1403
1433
  justify-content: center;
1404
- width: 1.55rem;
1405
- height: 1.55rem;
1434
+ width: var(--home-inventory-icon-size);
1435
+ height: var(--home-inventory-icon-size);
1406
1436
  flex: 0 0 auto;
1407
- background: var(--color-surface-card);
1408
- color: var(--color-primary);
1409
- border: 1px solid color-mix(in srgb, var(--border-gentle-divider) 80%, transparent);
1410
- }
1411
-
1412
- .home-band--contrast .home-project-inventory-resource {
1413
- background: var(--color-surface-card-contrast);
1414
- }
1415
-
1416
- .home-project-inventory-row.is-selected .home-project-inventory-resource,
1417
- .home-band--contrast .home-project-inventory-row.is-selected .home-project-inventory-resource {
1418
- background: var(--color-surface-card);
1437
+ background: transparent;
1438
+ color: var(--color-on-surface-variant);
1439
+ border: 0;
1419
1440
  }
1420
1441
 
1421
1442
  .home-project-inventory-resource .material-symbols-outlined {
1422
1443
  font-size: 1rem;
1423
1444
  line-height: 1;
1424
- font-variation-settings: "FILL" 0, "wght" 500, "GRAD" 0, "opsz" 20;
1445
+ font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 20;
1425
1446
  }
1426
1447
 
1427
- .home-project-inventory-title {
1428
- margin: 0;
1448
+ .home-project-inventory-code .ledger-meta {
1429
1449
  font-size: var(--type-label-lg);
1430
- line-height: 1.25;
1450
+ }
1451
+
1452
+ .home-project-inventory-title {
1453
+ margin: 0.2rem 0 0;
1454
+ font-family: var(--font-content-title);
1455
+ font-size: calc(var(--type-card) - 2pt);
1456
+ font-weight: var(--weight-title);
1457
+ line-height: 1.2;
1431
1458
  color: var(--color-on-surface);
1432
1459
  overflow: hidden;
1433
1460
  text-overflow: ellipsis;
@@ -1442,9 +1469,9 @@ html[data-theme="light"] .home-hero-plate {
1442
1469
 
1443
1470
  .home-project-inventory-copy {
1444
1471
  margin: 0;
1445
- font-size: var(--type-meta);
1472
+ font-size: var(--type-label-lg);
1446
1473
  font-weight: var(--weight-body);
1447
- line-height: 1.4;
1474
+ line-height: 1.35;
1448
1475
  color: var(--color-on-surface-variant);
1449
1476
  overflow: hidden;
1450
1477
  text-overflow: ellipsis;
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Pandorga
4
- VERSION = "1.4.7"
4
+ VERSION = "1.4.8"
5
5
  end
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.4.7
4
+ version: 1.4.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - The Pandorga contributors