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 +4 -4
- data/CHANGELOG.md +10 -0
- data/_layouts/home.html +53 -2
- data/assets/css/ledger/home.css +72 -45
- 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: fdc6dcec6dea0007093b40500ca2ec287d17170029f68b3f4284090fe14236a1
|
|
4
|
+
data.tar.gz: be5ea215e27ebe6755ce5d09875c8ca175d16daf3d8328c94161255fba179531
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
306
|
-
|
|
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
|
|
data/assets/css/ledger/home.css
CHANGED
|
@@ -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
|
|
961
|
-
the projects index; spare height parks chips and the foot
|
|
962
|
-
Every plate is 16:9, the ratio the thumbnails are drawn at,
|
|
963
|
-
below it. From 900px the specimen
|
|
964
|
-
|
|
965
|
-
above the specimen, one column
|
|
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
|
-
/*
|
|
1142
|
-
clamp
|
|
1143
|
-
|
|
1144
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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-
|
|
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,
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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:
|
|
1382
|
-
|
|
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:
|
|
1420
|
+
align-self: flex-start;
|
|
1393
1421
|
flex: 0 0 auto;
|
|
1394
|
-
gap:
|
|
1395
|
-
|
|
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:
|
|
1405
|
-
height:
|
|
1434
|
+
width: var(--home-inventory-icon-size);
|
|
1435
|
+
height: var(--home-inventory-icon-size);
|
|
1406
1436
|
flex: 0 0 auto;
|
|
1407
|
-
background:
|
|
1408
|
-
color: var(--color-
|
|
1409
|
-
border:
|
|
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"
|
|
1445
|
+
font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 20;
|
|
1425
1446
|
}
|
|
1426
1447
|
|
|
1427
|
-
.home-project-inventory-
|
|
1428
|
-
margin: 0;
|
|
1448
|
+
.home-project-inventory-code .ledger-meta {
|
|
1429
1449
|
font-size: var(--type-label-lg);
|
|
1430
|
-
|
|
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-
|
|
1472
|
+
font-size: var(--type-label-lg);
|
|
1446
1473
|
font-weight: var(--weight-body);
|
|
1447
|
-
line-height: 1.
|
|
1474
|
+
line-height: 1.35;
|
|
1448
1475
|
color: var(--color-on-surface-variant);
|
|
1449
1476
|
overflow: hidden;
|
|
1450
1477
|
text-overflow: ellipsis;
|
data/lib/pandorga/version.rb
CHANGED