detached bfab294

fix(web): keep tableless diff files closed, label the lede, show the tag count past the dated limit

commit
bfab2949a14d87aa49d634cee40a167169628c52
author
brice · · 2026-10-11 12:56 UTC
parent
08e6388
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
refs
tag: v0.5.0
41 files · +524 -243
M cmd/ermite/testdata/web/blob-binary.html +10 -2
@@ -383,8 +383,16 @@
383383 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
384384 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
385385 };
386- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
387- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
386+ k-split from:body -> {
387+ let el = q('[data-diff]').arr()[0]; if (!el) return;
388+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
389+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
390+ };
391+ k-unified from:body -> {
392+ let el = q('[data-diff]').arr()[0]; if (!el) return;
393+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
394+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
395+ };
388396 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
389397 k-permalink from:body -> {
390398 let b = document.body.dataset;
@@ -383,8 +383,16 @@
383 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);383 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
384 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })384 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
385 };385 };
386- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);386+ k-split from:body -> {
387- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);387+ let el = q('[data-diff]').arr()[0]; if (!el) return;
388+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
389+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
390+ };
391+ k-unified from:body -> {
392+ let el = q('[data-diff]').arr()[0]; if (!el) return;
393+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
394+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
395+ };
388 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };396 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
389 k-permalink from:body -> {397 k-permalink from:body -> {
390 let b = document.body.dataset;398 let b = document.body.dataset;
M cmd/ermite/testdata/web/blob-code.html +10 -2
@@ -453,8 +453,16 @@
453453 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
454454 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
455455 };
456- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
457- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
456+ k-split from:body -> {
457+ let el = q('[data-diff]').arr()[0]; if (!el) return;
458+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
459+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
460+ };
461+ k-unified from:body -> {
462+ let el = q('[data-diff]').arr()[0]; if (!el) return;
463+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
464+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
465+ };
458466 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
459467 k-permalink from:body -> {
460468 let b = document.body.dataset;
@@ -453,8 +453,16 @@
453 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);453 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
454 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })454 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
455 };455 };
456- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);456+ k-split from:body -> {
457- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);457+ let el = q('[data-diff]').arr()[0]; if (!el) return;
458+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
459+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
460+ };
461+ k-unified from:body -> {
462+ let el = q('[data-diff]').arr()[0]; if (!el) return;
463+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
464+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
465+ };
458 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };466 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
459 k-permalink from:body -> {467 k-permalink from:body -> {
460 let b = document.body.dataset;468 let b = document.body.dataset;
M cmd/ermite/testdata/web/blob-empty.html +10 -2
@@ -383,8 +383,16 @@
383383 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
384384 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
385385 };
386- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
387- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
386+ k-split from:body -> {
387+ let el = q('[data-diff]').arr()[0]; if (!el) return;
388+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
389+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
390+ };
391+ k-unified from:body -> {
392+ let el = q('[data-diff]').arr()[0]; if (!el) return;
393+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
394+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
395+ };
388396 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
389397 k-permalink from:body -> {
390398 let b = document.body.dataset;
@@ -383,8 +383,16 @@
383 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);383 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
384 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })384 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
385 };385 };
386- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);386+ k-split from:body -> {
387- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);387+ let el = q('[data-diff]').arr()[0]; if (!el) return;
388+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
389+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
390+ };
391+ k-unified from:body -> {
392+ let el = q('[data-diff]').arr()[0]; if (!el) return;
393+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
394+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
395+ };
388 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };396 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
389 k-permalink from:body -> {397 k-permalink from:body -> {
390 let b = document.body.dataset;398 let b = document.body.dataset;
M cmd/ermite/testdata/web/blob-image.html +10 -2
@@ -385,8 +385,16 @@
385385 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
386386 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
387387 };
388- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
389- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
388+ k-split from:body -> {
389+ let el = q('[data-diff]').arr()[0]; if (!el) return;
390+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
391+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
392+ };
393+ k-unified from:body -> {
394+ let el = q('[data-diff]').arr()[0]; if (!el) return;
395+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
396+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
397+ };
390398 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
391399 k-permalink from:body -> {
392400 let b = document.body.dataset;
@@ -385,8 +385,16 @@
385 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);385 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
386 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })386 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
387 };387 };
388- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);388+ k-split from:body -> {
389- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);389+ let el = q('[data-diff]').arr()[0]; if (!el) return;
390+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
391+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
392+ };
393+ k-unified from:body -> {
394+ let el = q('[data-diff]').arr()[0]; if (!el) return;
395+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
396+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
397+ };
390 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };398 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
391 k-permalink from:body -> {399 k-permalink from:body -> {
392 let b = document.body.dataset;400 let b = document.body.dataset;
M cmd/ermite/testdata/web/blob-markdown.html +10 -2
@@ -450,8 +450,16 @@
450450 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
451451 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
452452 };
453- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
454- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
453+ k-split from:body -> {
454+ let el = q('[data-diff]').arr()[0]; if (!el) return;
455+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
456+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
457+ };
458+ k-unified from:body -> {
459+ let el = q('[data-diff]').arr()[0]; if (!el) return;
460+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
461+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
462+ };
455463 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
456464 k-permalink from:body -> {
457465 let b = document.body.dataset;
@@ -450,8 +450,16 @@
450 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);450 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
451 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })451 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
452 };452 };
453- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);453+ k-split from:body -> {
454- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);454+ let el = q('[data-diff]').arr()[0]; if (!el) return;
455+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
456+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
457+ };
458+ k-unified from:body -> {
459+ let el = q('[data-diff]').arr()[0]; if (!el) return;
460+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
461+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
462+ };
455 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };463 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
456 k-permalink from:body -> {464 k-permalink from:body -> {
457 let b = document.body.dataset;465 let b = document.body.dataset;
M cmd/ermite/testdata/web/blob-svg.html +10 -2
@@ -408,8 +408,16 @@
408408 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
409409 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
410410 };
411- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
412- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
411+ k-split from:body -> {
412+ let el = q('[data-diff]').arr()[0]; if (!el) return;
413+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
414+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
415+ };
416+ k-unified from:body -> {
417+ let el = q('[data-diff]').arr()[0]; if (!el) return;
418+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
419+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
420+ };
413421 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
414422 k-permalink from:body -> {
415423 let b = document.body.dataset;
@@ -408,8 +408,16 @@
408 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);408 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
409 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })409 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
410 };410 };
411- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);411+ k-split from:body -> {
412- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);412+ let el = q('[data-diff]').arr()[0]; if (!el) return;
413+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
414+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
415+ };
416+ k-unified from:body -> {
417+ let el = q('[data-diff]').arr()[0]; if (!el) return;
418+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
419+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
420+ };
413 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };421 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
414 k-permalink from:body -> {422 k-permalink from:body -> {
415 let b = document.body.dataset;423 let b = document.body.dataset;
M cmd/ermite/testdata/web/blob-text.html +10 -2
@@ -403,8 +403,16 @@
403403 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
404404 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
405405 };
406- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
407- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
406+ k-split from:body -> {
407+ let el = q('[data-diff]').arr()[0]; if (!el) return;
408+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
409+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
410+ };
411+ k-unified from:body -> {
412+ let el = q('[data-diff]').arr()[0]; if (!el) return;
413+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
414+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
415+ };
408416 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
409417 k-permalink from:body -> {
410418 let b = document.body.dataset;
@@ -403,8 +403,16 @@
403 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);403 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
404 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })404 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
405 };405 };
406- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);406+ k-split from:body -> {
407- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);407+ let el = q('[data-diff]').arr()[0]; if (!el) return;
408+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
409+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
410+ };
411+ k-unified from:body -> {
412+ let el = q('[data-diff]').arr()[0]; if (!el) return;
413+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
414+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
415+ };
408 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };416 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
409 k-permalink from:body -> {417 k-permalink from:body -> {
410 let b = document.body.dataset;418 let b = document.body.dataset;
M cmd/ermite/testdata/web/blob-too-large.html +10 -2
@@ -383,8 +383,16 @@
383383 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
384384 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
385385 };
386- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
387- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
386+ k-split from:body -> {
387+ let el = q('[data-diff]').arr()[0]; if (!el) return;
388+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
389+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
390+ };
391+ k-unified from:body -> {
392+ let el = q('[data-diff]').arr()[0]; if (!el) return;
393+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
394+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
395+ };
388396 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
389397 k-permalink from:body -> {
390398 let b = document.body.dataset;
@@ -383,8 +383,16 @@
383 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);383 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
384 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })384 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
385 };385 };
386- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);386+ k-split from:body -> {
387- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);387+ let el = q('[data-diff]').arr()[0]; if (!el) return;
388+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
389+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
390+ };
391+ k-unified from:body -> {
392+ let el = q('[data-diff]').arr()[0]; if (!el) return;
393+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
394+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
395+ };
388 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };396 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
389 k-permalink from:body -> {397 k-permalink from:body -> {
390 let b = document.body.dataset;398 let b = document.body.dataset;
M cmd/ermite/testdata/web/blob-trojan.html +10 -2
@@ -450,8 +450,16 @@
450450 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
451451 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
452452 };
453- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
454- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
453+ k-split from:body -> {
454+ let el = q('[data-diff]').arr()[0]; if (!el) return;
455+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
456+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
457+ };
458+ k-unified from:body -> {
459+ let el = q('[data-diff]').arr()[0]; if (!el) return;
460+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
461+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
462+ };
455463 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
456464 k-permalink from:body -> {
457465 let b = document.body.dataset;
@@ -450,8 +450,16 @@
450 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);450 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
451 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })451 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
452 };452 };
453- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);453+ k-split from:body -> {
454- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);454+ let el = q('[data-diff]').arr()[0]; if (!el) return;
455+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
456+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
457+ };
458+ k-unified from:body -> {
459+ let el = q('[data-diff]').arr()[0]; if (!el) return;
460+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
461+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
462+ };
455 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };463 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
456 k-permalink from:body -> {464 k-permalink from:body -> {
457 let b = document.body.dataset;465 let b = document.body.dataset;
M cmd/ermite/testdata/web/commit-big.html +10 -2
@@ -420,8 +420,16 @@
420420 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
421421 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
422422 };
423- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
424- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
423+ k-split from:body -> {
424+ let el = q('[data-diff]').arr()[0]; if (!el) return;
425+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
426+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
427+ };
428+ k-unified from:body -> {
429+ let el = q('[data-diff]').arr()[0]; if (!el) return;
430+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
431+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
432+ };
425433 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
426434 k-permalink from:body -> {
427435 let b = document.body.dataset;
@@ -420,8 +420,16 @@
420 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);420 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
421 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })421 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
422 };422 };
423- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);423+ k-split from:body -> {
424- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);424+ let el = q('[data-diff]').arr()[0]; if (!el) return;
425+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
426+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
427+ };
428+ k-unified from:body -> {
429+ let el = q('[data-diff]').arr()[0]; if (!el) return;
430+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
431+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
432+ };
425 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };433 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
426 k-permalink from:body -> {434 k-permalink from:body -> {
427 let b = document.body.dataset;435 let b = document.body.dataset;
M cmd/ermite/testdata/web/commit-binary.html +10 -2
@@ -415,8 +415,16 @@
415415 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
416416 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
417417 };
418- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
419- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
418+ k-split from:body -> {
419+ let el = q('[data-diff]').arr()[0]; if (!el) return;
420+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
421+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
422+ };
423+ k-unified from:body -> {
424+ let el = q('[data-diff]').arr()[0]; if (!el) return;
425+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
426+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
427+ };
420428 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
421429 k-permalink from:body -> {
422430 let b = document.body.dataset;
@@ -415,8 +415,16 @@
415 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);415 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
416 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })416 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
417 };417 };
418- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);418+ k-split from:body -> {
419- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);419+ let el = q('[data-diff]').arr()[0]; if (!el) return;
420+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
421+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
422+ };
423+ k-unified from:body -> {
424+ let el = q('[data-diff]').arr()[0]; if (!el) return;
425+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
426+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
427+ };
420 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };428 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
421 k-permalink from:body -> {429 k-permalink from:body -> {
422 let b = document.body.dataset;430 let b = document.body.dataset;
M cmd/ermite/testdata/web/commit-merge.html +10 -2
@@ -454,8 +454,16 @@
454454 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
455455 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
456456 };
457- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
458- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
457+ k-split from:body -> {
458+ let el = q('[data-diff]').arr()[0]; if (!el) return;
459+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
460+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
461+ };
462+ k-unified from:body -> {
463+ let el = q('[data-diff]').arr()[0]; if (!el) return;
464+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
465+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
466+ };
459467 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
460468 k-permalink from:body -> {
461469 let b = document.body.dataset;
@@ -454,8 +454,16 @@
454 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);454 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
455 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })455 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
456 };456 };
457- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);457+ k-split from:body -> {
458- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);458+ let el = q('[data-diff]').arr()[0]; if (!el) return;
459+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
460+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
461+ };
462+ k-unified from:body -> {
463+ let el = q('[data-diff]').arr()[0]; if (!el) return;
464+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
465+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
466+ };
459 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };467 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
460 k-permalink from:body -> {468 k-permalink from:body -> {
461 let b = document.body.dataset;469 let b = document.body.dataset;
M cmd/ermite/testdata/web/commit-modify-split.html +10 -2
@@ -575,8 +575,16 @@ And &lt;b&gt;html&lt;/b&gt; &amp; &#34;quotes&#34;.</pre>
575575 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
576576 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
577577 };
578- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
579- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
578+ k-split from:body -> {
579+ let el = q('[data-diff]').arr()[0]; if (!el) return;
580+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
581+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
582+ };
583+ k-unified from:body -> {
584+ let el = q('[data-diff]').arr()[0]; if (!el) return;
585+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
586+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
587+ };
580588 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
581589 k-permalink from:body -> {
582590 let b = document.body.dataset;
@@ -575,8 +575,16 @@ And &lt;b&gt;html&lt;/b&gt; &amp; &#34;quotes&#34;.</pre>
575 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);575 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
576 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })576 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
577 };577 };
578- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);578+ k-split from:body -> {
579- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);579+ let el = q('[data-diff]').arr()[0]; if (!el) return;
580+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
581+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
582+ };
583+ k-unified from:body -> {
584+ let el = q('[data-diff]').arr()[0]; if (!el) return;
585+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
586+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
587+ };
580 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };588 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
581 k-permalink from:body -> {589 k-permalink from:body -> {
582 let b = document.body.dataset;590 let b = document.body.dataset;
M cmd/ermite/testdata/web/commit-modify.html +10 -2
@@ -575,8 +575,16 @@ And &lt;b&gt;html&lt;/b&gt; &amp; &#34;quotes&#34;.</pre>
575575 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
576576 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
577577 };
578- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
579- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
578+ k-split from:body -> {
579+ let el = q('[data-diff]').arr()[0]; if (!el) return;
580+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
581+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
582+ };
583+ k-unified from:body -> {
584+ let el = q('[data-diff]').arr()[0]; if (!el) return;
585+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
586+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
587+ };
580588 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
581589 k-permalink from:body -> {
582590 let b = document.body.dataset;
@@ -575,8 +575,16 @@ And &lt;b&gt;html&lt;/b&gt; &amp; &#34;quotes&#34;.</pre>
575 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);575 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
576 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })576 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
577 };577 };
578- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);578+ k-split from:body -> {
579- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);579+ let el = q('[data-diff]').arr()[0]; if (!el) return;
580+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
581+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
582+ };
583+ k-unified from:body -> {
584+ let el = q('[data-diff]').arr()[0]; if (!el) return;
585+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
586+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
587+ };
580 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };588 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
581 k-permalink from:body -> {589 k-permalink from:body -> {
582 let b = document.body.dataset;590 let b = document.body.dataset;
M cmd/ermite/testdata/web/commit-rename.html +10 -2
@@ -480,8 +480,16 @@
480480 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
481481 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
482482 };
483- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
484- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
483+ k-split from:body -> {
484+ let el = q('[data-diff]').arr()[0]; if (!el) return;
485+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
486+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
487+ };
488+ k-unified from:body -> {
489+ let el = q('[data-diff]').arr()[0]; if (!el) return;
490+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
491+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
492+ };
485493 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
486494 k-permalink from:body -> {
487495 let b = document.body.dataset;
@@ -480,8 +480,16 @@
480 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);480 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
481 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })481 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
482 };482 };
483- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);483+ k-split from:body -> {
484- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);484+ let el = q('[data-diff]').arr()[0]; if (!el) return;
485+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
486+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
487+ };
488+ k-unified from:body -> {
489+ let el = q('[data-diff]').arr()[0]; if (!el) return;
490+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
491+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
492+ };
485 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };493 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
486 k-permalink from:body -> {494 k-permalink from:body -> {
487 let b = document.body.dataset;495 let b = document.body.dataset;
M cmd/ermite/testdata/web/commit-root.html +10 -2
@@ -796,8 +796,16 @@
796796 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
797797 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
798798 };
799- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
800- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
799+ k-split from:body -> {
800+ let el = q('[data-diff]').arr()[0]; if (!el) return;
801+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
802+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
803+ };
804+ k-unified from:body -> {
805+ let el = q('[data-diff]').arr()[0]; if (!el) return;
806+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
807+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
808+ };
801809 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
802810 k-permalink from:body -> {
803811 let b = document.body.dataset;
@@ -796,8 +796,16 @@
796 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);796 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
797 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })797 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
798 };798 };
799- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);799+ k-split from:body -> {
800- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);800+ let el = q('[data-diff]').arr()[0]; if (!el) return;
801+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
802+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
803+ };
804+ k-unified from:body -> {
805+ let el = q('[data-diff]').arr()[0]; if (!el) return;
806+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
807+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
808+ };
801 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };809 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
802 k-permalink from:body -> {810 k-permalink from:body -> {
803 let b = document.body.dataset;811 let b = document.body.dataset;
M cmd/ermite/testdata/web/commit-trojan.html +10 -2
@@ -589,8 +589,16 @@
589589 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
590590 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
591591 };
592- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
593- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
592+ k-split from:body -> {
593+ let el = q('[data-diff]').arr()[0]; if (!el) return;
594+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
595+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
596+ };
597+ k-unified from:body -> {
598+ let el = q('[data-diff]').arr()[0]; if (!el) return;
599+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
600+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
601+ };
594602 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
595603 k-permalink from:body -> {
596604 let b = document.body.dataset;
@@ -589,8 +589,16 @@
589 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);589 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
590 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })590 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
591 };591 };
592- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);592+ k-split from:body -> {
593- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);593+ let el = q('[data-diff]').arr()[0]; if (!el) return;
594+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
595+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
596+ };
597+ k-unified from:body -> {
598+ let el = q('[data-diff]').arr()[0]; if (!el) return;
599+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
600+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
601+ };
594 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };602 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
595 k-permalink from:body -> {603 k-permalink from:body -> {
596 let b = document.body.dataset;604 let b = document.body.dataset;
M cmd/ermite/testdata/web/commits-page2.html +10 -2
@@ -398,8 +398,16 @@
398398 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
399399 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
400400 };
401- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
402- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
401+ k-split from:body -> {
402+ let el = q('[data-diff]').arr()[0]; if (!el) return;
403+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
404+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
405+ };
406+ k-unified from:body -> {
407+ let el = q('[data-diff]').arr()[0]; if (!el) return;
408+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
409+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
410+ };
403411 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
404412 k-permalink from:body -> {
405413 let b = document.body.dataset;
@@ -398,8 +398,16 @@
398 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);398 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
399 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })399 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
400 };400 };
401- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);401+ k-split from:body -> {
402- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);402+ let el = q('[data-diff]').arr()[0]; if (!el) return;
403+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
404+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
405+ };
406+ k-unified from:body -> {
407+ let el = q('[data-diff]').arr()[0]; if (!el) return;
408+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
409+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
410+ };
403 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };411 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
404 k-permalink from:body -> {412 k-permalink from:body -> {
405 let b = document.body.dataset;413 let b = document.body.dataset;
M cmd/ermite/testdata/web/commits-path.html +10 -2
@@ -413,8 +413,16 @@
413413 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
414414 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
415415 };
416- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
417- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
416+ k-split from:body -> {
417+ let el = q('[data-diff]').arr()[0]; if (!el) return;
418+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
419+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
420+ };
421+ k-unified from:body -> {
422+ let el = q('[data-diff]').arr()[0]; if (!el) return;
423+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
424+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
425+ };
418426 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
419427 k-permalink from:body -> {
420428 let b = document.body.dataset;
@@ -413,8 +413,16 @@
413 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);413 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
414 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })414 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
415 };415 };
416- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);416+ k-split from:body -> {
417- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);417+ let el = q('[data-diff]').arr()[0]; if (!el) return;
418+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
419+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
420+ };
421+ k-unified from:body -> {
422+ let el = q('[data-diff]').arr()[0]; if (!el) return;
423+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
424+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
425+ };
418 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };426 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
419 k-permalink from:body -> {427 k-permalink from:body -> {
420 let b = document.body.dataset;428 let b = document.body.dataset;
M cmd/ermite/testdata/web/commits-root.html +10 -2
@@ -1200,8 +1200,16 @@
12001200 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
12011201 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
12021202 };
1203- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
1204- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
1203+ k-split from:body -> {
1204+ let el = q('[data-diff]').arr()[0]; if (!el) return;
1205+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
1206+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
1207+ };
1208+ k-unified from:body -> {
1209+ let el = q('[data-diff]').arr()[0]; if (!el) return;
1210+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
1211+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
1212+ };
12051213 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
12061214 k-permalink from:body -> {
12071215 let b = document.body.dataset;
@@ -1200,8 +1200,16 @@
1200 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);1200 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
1201 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })1201 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
1202 };1202 };
1203- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);1203+ k-split from:body -> {
1204- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);1204+ let el = q('[data-diff]').arr()[0]; if (!el) return;
1205+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
1206+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
1207+ };
1208+ k-unified from:body -> {
1209+ let el = q('[data-diff]').arr()[0]; if (!el) return;
1210+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
1211+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
1212+ };
1205 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };1213 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
1206 k-permalink from:body -> {1214 k-permalink from:body -> {
1207 let b = document.body.dataset;1215 let b = document.body.dataset;
M cmd/ermite/testdata/web/commits-small.html +10 -2
@@ -565,8 +565,16 @@
565565 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
566566 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
567567 };
568- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
569- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
568+ k-split from:body -> {
569+ let el = q('[data-diff]').arr()[0]; if (!el) return;
570+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
571+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
572+ };
573+ k-unified from:body -> {
574+ let el = q('[data-diff]').arr()[0]; if (!el) return;
575+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
576+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
577+ };
570578 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
571579 k-permalink from:body -> {
572580 let b = document.body.dataset;
@@ -565,8 +565,16 @@
565 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);565 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
566 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })566 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
567 };567 };
568- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);568+ k-split from:body -> {
569- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);569+ let el = q('[data-diff]').arr()[0]; if (!el) return;
570+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
571+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
572+ };
573+ k-unified from:body -> {
574+ let el = q('[data-diff]').arr()[0]; if (!el) return;
575+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
576+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
577+ };
570 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };578 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
571 k-permalink from:body -> {579 k-permalink from:body -> {
572 let b = document.body.dataset;580 let b = document.body.dataset;
M cmd/ermite/testdata/web/empty.html +10 -2
@@ -259,8 +259,16 @@
259259 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
260260 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
261261 };
262- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
263- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
262+ k-split from:body -> {
263+ let el = q('[data-diff]').arr()[0]; if (!el) return;
264+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
265+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
266+ };
267+ k-unified from:body -> {
268+ let el = q('[data-diff]').arr()[0]; if (!el) return;
269+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
270+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
271+ };
264272 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
265273 k-permalink from:body -> {
266274 let b = document.body.dataset;
@@ -259,8 +259,16 @@
259 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);259 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
260 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })260 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
261 };261 };
262- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);262+ k-split from:body -> {
263- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);263+ let el = q('[data-diff]').arr()[0]; if (!el) return;
264+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
265+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
266+ };
267+ k-unified from:body -> {
268+ let el = q('[data-diff]').arr()[0]; if (!el) return;
269+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
270+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
271+ };
264 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };272 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
265 k-permalink from:body -> {273 k-permalink from:body -> {
266 let b = document.body.dataset;274 let b = document.body.dataset;
M cmd/ermite/testdata/web/home.html +10 -2
@@ -295,8 +295,16 @@
295295 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
296296 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
297297 };
298- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
299- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
298+ k-split from:body -> {
299+ let el = q('[data-diff]').arr()[0]; if (!el) return;
300+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
301+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
302+ };
303+ k-unified from:body -> {
304+ let el = q('[data-diff]').arr()[0]; if (!el) return;
305+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
306+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
307+ };
300308 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
301309 k-permalink from:body -> {
302310 let b = document.body.dataset;
@@ -295,8 +295,16 @@
295 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);295 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
296 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })296 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
297 };297 };
298- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);298+ k-split from:body -> {
299- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);299+ let el = q('[data-diff]').arr()[0]; if (!el) return;
300+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
301+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
302+ };
303+ k-unified from:body -> {
304+ let el = q('[data-diff]').arr()[0]; if (!el) return;
305+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
306+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
307+ };
300 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };308 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
301 k-permalink from:body -> {309 k-permalink from:body -> {
302 let b = document.body.dataset;310 let b = document.body.dataset;
M cmd/ermite/testdata/web/not-found-page.html +10 -2
@@ -242,8 +242,16 @@
242242 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
243243 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
244244 };
245- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
246- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
245+ k-split from:body -> {
246+ let el = q('[data-diff]').arr()[0]; if (!el) return;
247+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
248+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
249+ };
250+ k-unified from:body -> {
251+ let el = q('[data-diff]').arr()[0]; if (!el) return;
252+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
253+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
254+ };
247255 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
248256 k-permalink from:body -> {
249257 let b = document.body.dataset;
@@ -242,8 +242,16 @@
242 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);242 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
243 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })243 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
244 };244 };
245- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);245+ k-split from:body -> {
246- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);246+ let el = q('[data-diff]').arr()[0]; if (!el) return;
247+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
248+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
249+ };
250+ k-unified from:body -> {
251+ let el = q('[data-diff]').arr()[0]; if (!el) return;
252+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
253+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
254+ };
247 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };255 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
248 k-permalink from:body -> {256 k-permalink from:body -> {
249 let b = document.body.dataset;257 let b = document.body.dataset;
M cmd/ermite/testdata/web/not-found.html +10 -2
@@ -242,8 +242,16 @@
242242 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
243243 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
244244 };
245- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
246- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
245+ k-split from:body -> {
246+ let el = q('[data-diff]').arr()[0]; if (!el) return;
247+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
248+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
249+ };
250+ k-unified from:body -> {
251+ let el = q('[data-diff]').arr()[0]; if (!el) return;
252+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
253+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
254+ };
247255 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
248256 k-permalink from:body -> {
249257 let b = document.body.dataset;
@@ -242,8 +242,16 @@
242 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);242 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
243 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })243 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
244 };244 };
245- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);245+ k-split from:body -> {
246- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);246+ let el = q('[data-diff]').arr()[0]; if (!el) return;
247+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
248+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
249+ };
250+ k-unified from:body -> {
251+ let el = q('[data-diff]').arr()[0]; if (!el) return;
252+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
253+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
254+ };
247 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };255 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
248 k-permalink from:body -> {256 k-permalink from:body -> {
249 let b = document.body.dataset;257 let b = document.body.dataset;
M cmd/ermite/testdata/web/refs.html +10 -2
@@ -466,8 +466,16 @@
466466 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
467467 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
468468 };
469- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
470- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
469+ k-split from:body -> {
470+ let el = q('[data-diff]').arr()[0]; if (!el) return;
471+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
472+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
473+ };
474+ k-unified from:body -> {
475+ let el = q('[data-diff]').arr()[0]; if (!el) return;
476+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
477+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
478+ };
471479 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
472480 k-permalink from:body -> {
473481 let b = document.body.dataset;
@@ -466,8 +466,16 @@
466 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);466 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
467 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })467 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
468 };468 };
469- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);469+ k-split from:body -> {
470- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);470+ let el = q('[data-diff]').arr()[0]; if (!el) return;
471+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
472+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
473+ };
474+ k-unified from:body -> {
475+ let el = q('[data-diff]').arr()[0]; if (!el) return;
476+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
477+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
478+ };
471 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };479 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
472 k-permalink from:body -> {480 k-permalink from:body -> {
473 let b = document.body.dataset;481 let b = document.body.dataset;
M cmd/ermite/testdata/web/summary.html +13 -3
@@ -75,7 +75,9 @@
7575 </nav>
7676 </header>
7777 <div class="work has-rail">
78-<p class="lede work-lede">A demo repository</p>
78+<section class="work-lede" aria-label="Description">
79+<p class="lede">A demo repository</p>
80+</section>
7981 <main id="main" tabindex="-1">
8082 <section class="card readme" aria-labelledby="readme-h">
8183 <h2 class="card-h" id="readme-h">
@@ -482,8 +484,16 @@
482484 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
483485 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
484486 };
485- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
486- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
487+ k-split from:body -> {
488+ let el = q('[data-diff]').arr()[0]; if (!el) return;
489+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
490+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
491+ };
492+ k-unified from:body -> {
493+ let el = q('[data-diff]').arr()[0]; if (!el) return;
494+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
495+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
496+ };
487497 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
488498 k-permalink from:body -> {
489499 let b = document.body.dataset;
@@ -75,7 +75,9 @@
75 </nav>75 </nav>
76 </header>76 </header>
77 <div class="work has-rail">77 <div class="work has-rail">
78-<p class="lede work-lede">A demo repository</p>78+<section class="work-lede" aria-label="Description">
79+<p class="lede">A demo repository</p>
80+</section>
79 <main id="main" tabindex="-1">81 <main id="main" tabindex="-1">
80 <section class="card readme" aria-labelledby="readme-h">82 <section class="card readme" aria-labelledby="readme-h">
81 <h2 class="card-h" id="readme-h">83 <h2 class="card-h" id="readme-h">
@@ -482,8 +484,16 @@
482 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);484 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
483 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })485 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
484 };486 };
485- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);487+ k-split from:body -> {
486- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);488+ let el = q('[data-diff]').arr()[0]; if (!el) return;
489+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
490+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
491+ };
492+ k-unified from:body -> {
493+ let el = q('[data-diff]').arr()[0]; if (!el) return;
494+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
495+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
496+ };
487 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };497 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
488 k-permalink from:body -> {498 k-permalink from:body -> {
489 let b = document.body.dataset;499 let b = document.body.dataset;
M cmd/ermite/testdata/web/tree-nested.html +10 -2
@@ -401,8 +401,16 @@
401401 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
402402 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
403403 };
404- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
405- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
404+ k-split from:body -> {
405+ let el = q('[data-diff]').arr()[0]; if (!el) return;
406+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
407+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
408+ };
409+ k-unified from:body -> {
410+ let el = q('[data-diff]').arr()[0]; if (!el) return;
411+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
412+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
413+ };
406414 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
407415 k-permalink from:body -> {
408416 let b = document.body.dataset;
@@ -401,8 +401,16 @@
401 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);401 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
402 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })402 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
403 };403 };
404- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);404+ k-split from:body -> {
405- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);405+ let el = q('[data-diff]').arr()[0]; if (!el) return;
406+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
407+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
408+ };
409+ k-unified from:body -> {
410+ let el = q('[data-diff]').arr()[0]; if (!el) return;
411+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
412+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
413+ };
406 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };414 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
407 k-permalink from:body -> {415 k-permalink from:body -> {
408 let b = document.body.dataset;416 let b = document.body.dataset;
M cmd/ermite/testdata/web/tree-root.html +10 -2
@@ -700,8 +700,16 @@
700700 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
701701 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
702702 };
703- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
704- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
703+ k-split from:body -> {
704+ let el = q('[data-diff]').arr()[0]; if (!el) return;
705+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
706+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
707+ };
708+ k-unified from:body -> {
709+ let el = q('[data-diff]').arr()[0]; if (!el) return;
710+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
711+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
712+ };
705713 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
706714 k-permalink from:body -> {
707715 let b = document.body.dataset;
@@ -700,8 +700,16 @@
700 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);700 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
701 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })701 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
702 };702 };
703- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);703+ k-split from:body -> {
704- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);704+ let el = q('[data-diff]').arr()[0]; if (!el) return;
705+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
706+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
707+ };
708+ k-unified from:body -> {
709+ let el = q('[data-diff]').arr()[0]; if (!el) return;
710+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
711+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
712+ };
705 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };713 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
706 k-permalink from:body -> {714 k-permalink from:body -> {
707 let b = document.body.dataset;715 let b = document.body.dataset;
M cmd/ermite/testdata/web/tree-slash-ref.html +10 -2
@@ -398,8 +398,16 @@
398398 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
399399 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
400400 };
401- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
402- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
401+ k-split from:body -> {
402+ let el = q('[data-diff]').arr()[0]; if (!el) return;
403+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
404+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
405+ };
406+ k-unified from:body -> {
407+ let el = q('[data-diff]').arr()[0]; if (!el) return;
408+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
409+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
410+ };
403411 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
404412 k-permalink from:body -> {
405413 let b = document.body.dataset;
@@ -398,8 +398,16 @@
398 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);398 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
399 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })399 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
400 };400 };
401- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);401+ k-split from:body -> {
402- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);402+ let el = q('[data-diff]').arr()[0]; if (!el) return;
403+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
404+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
405+ };
406+ k-unified from:body -> {
407+ let el = q('[data-diff]').arr()[0]; if (!el) return;
408+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
409+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
410+ };
403 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };411 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
404 k-permalink from:body -> {412 k-permalink from:body -> {
405 let b = document.body.dataset;413 let b = document.body.dataset;
M cmd/ermite/testdata/web/tree-subdir.html +10 -2
@@ -429,8 +429,16 @@
429429 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
430430 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
431431 };
432- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
433- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
432+ k-split from:body -> {
433+ let el = q('[data-diff]').arr()[0]; if (!el) return;
434+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
435+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
436+ };
437+ k-unified from:body -> {
438+ let el = q('[data-diff]').arr()[0]; if (!el) return;
439+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
440+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
441+ };
434442 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
435443 k-permalink from:body -> {
436444 let b = document.body.dataset;
@@ -429,8 +429,16 @@
429 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);429 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
430 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })430 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
431 };431 };
432- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);432+ k-split from:body -> {
433- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);433+ let el = q('[data-diff]').arr()[0]; if (!el) return;
434+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
435+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
436+ };
437+ k-unified from:body -> {
438+ let el = q('[data-diff]').arr()[0]; if (!el) return;
439+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
440+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
441+ };
434 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };442 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
435 k-permalink from:body -> {443 k-permalink from:body -> {
436 let b = document.body.dataset;444 let b = document.body.dataset;
M cmd/ermite/web_test.go +22 -0
@@ -9,6 +9,7 @@ import (
99 "os"
1010 "path/filepath"
1111 "regexp"
12+ "strconv"
1213 "strings"
1314 "testing"
1415
@@ -262,3 +263,24 @@ func TestWebContentSecurity(t *testing.T) {
262263 assert.Equal(t, 404, st, p)
263264 }
264265 }
266+
267+// The summary rail names the newest tag; with more tags than it dates, it
268+// gives their count instead of an empty block.
269+func TestWebSummaryLatestTag(t *testing.T) {
270+ h := newHarness(t, harnessOpts{})
271+ h.webRepo("demo")
272+ _, _, body := h.get("/demo")
273+ assert.Contains(t, body, `<a class="tag-name" href="/demo/tree/v0.2.0">`)
274+ assert.Contains(t, body, `<p class="tag-sub dim">add main.go</p>`)
275+
276+ h.seed("many", domain.VisibilityPublic, "a.txt")
277+ wt := t.TempDir()
278+ h.mustGit(wt, "clone", "-q", h.urlAuth(adminToken, "/many.git"), ".")
279+ for i := range 21 {
280+ h.mustGit(wt, "tag", "t"+strconv.Itoa(i))
281+ }
282+ h.mustGit(wt, "push", "-q", "--tags", "origin")
283+ _, _, body = h.get("/many")
284+ assert.NotContains(t, body, `class="latest-tag"`)
285+ assert.Contains(t, body, `<p class="dim">21 tags</p>`)
286+}
@@ -9,6 +9,7 @@ import (
9 "os"9 "os"
10 "path/filepath"10 "path/filepath"
11 "regexp"11 "regexp"
12+ "strconv"
12 "strings"13 "strings"
13 "testing"14 "testing"
14 15
@@ -262,3 +263,24 @@ func TestWebContentSecurity(t *testing.T) {
262 assert.Equal(t, 404, st, p)263 assert.Equal(t, 404, st, p)
263 }264 }
264 }265 }
266+
267+// The summary rail names the newest tag; with more tags than it dates, it
268+// gives their count instead of an empty block.
269+func TestWebSummaryLatestTag(t *testing.T) {
270+ h := newHarness(t, harnessOpts{})
271+ h.webRepo("demo")
272+ _, _, body := h.get("/demo")
273+ assert.Contains(t, body, `<a class="tag-name" href="/demo/tree/v0.2.0">`)
274+ assert.Contains(t, body, `<p class="tag-sub dim">add main.go</p>`)
275+
276+ h.seed("many", domain.VisibilityPublic, "a.txt")
277+ wt := t.TempDir()
278+ h.mustGit(wt, "clone", "-q", h.urlAuth(adminToken, "/many.git"), ".")
279+ for i := range 21 {
280+ h.mustGit(wt, "tag", "t"+strconv.Itoa(i))
281+ }
282+ h.mustGit(wt, "push", "-q", "--tags", "origin")
283+ _, _, body = h.get("/many")
284+ assert.NotContains(t, body, `class="latest-tag"`)
285+ assert.Contains(t, body, `<p class="dim">21 tags</p>`)
286+}
M internal/adapters/web/assets.go +2 -1
@@ -128,7 +128,8 @@ func loadAssets() (*assetSet, error) {
128128 sc.set(&s.urls, put("js", sc.file, b, "text/javascript; charset=utf-8"))
129129 }
130130
131- icon, err := staticFS.ReadFile("static/icon.svg")
131+ // The favicon is the brand picture of the header.
132+ icon, err := staticFS.ReadFile("static/icons/brand.svg")
132133 if err != nil {
133134 return nil, err
134135 }
@@ -128,7 +128,8 @@ func loadAssets() (*assetSet, error) {
128 sc.set(&s.urls, put("js", sc.file, b, "text/javascript; charset=utf-8"))128 sc.set(&s.urls, put("js", sc.file, b, "text/javascript; charset=utf-8"))
129 }129 }
130 130
131- icon, err := staticFS.ReadFile("static/icon.svg")131+ // The favicon is the brand picture of the header.
132+ icon, err := staticFS.ReadFile("static/icons/brand.svg")
132 if err != nil {133 if err != nil {
133 return nil, err134 return nil, err
134 }135 }
M internal/adapters/web/keys.templ +10 -2
@@ -52,8 +52,16 @@ templ Keys() {
5252 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
5353 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
5454 };
55- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);
56- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);
55+ k-split from:body -> {
56+ let el = q('[data-diff]').arr()[0]; if (!el) return;
57+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
58+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
59+ };
60+ k-unified from:body -> {
61+ let el = q('[data-diff]').arr()[0]; if (!el) return;
62+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
63+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
64+ };
5765 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
5866 k-permalink from:body -> {
5967 let b = document.body.dataset;
@@ -52,8 +52,16 @@ templ Keys() {
52 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);52 let i = ns.findIndex(n => n.getBoundingClientRect().top > innerHeight / 3);
53 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })53 let n = ns[i < 0 ? 0 : i]; n.closest('details') && (n.closest('details').open = true); n.scrollIntoView({ block: 'center' })
54 };54 };
55- k-split from:body -> q('[data-diff]').attr['data-diff'] = 'split'; sessionStorage.setItem('diff', 'split'); q('[data-file]').arr().forEach(d => d.open = true);55+ k-split from:body -> {
56- k-unified from:body -> q('[data-diff]').attr['data-diff'] = 'unified'; sessionStorage.setItem('diff', 'unified'); q('[data-file]').arr().forEach(d => d.open = true);56+ let el = q('[data-diff]').arr()[0]; if (!el) return;
57+ el.dataset.diff = 'split'; sessionStorage.setItem('diff', 'split');
58+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
59+ };
60+ k-unified from:body -> {
61+ let el = q('[data-diff]').arr()[0]; if (!el) return;
62+ el.dataset.diff = 'unified'; sessionStorage.setItem('diff', 'unified');
63+ q('[data-file]').arr().filter(d => d.querySelector('.dt')).forEach(d => d.open = true)
64+ };
57 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };65 k-collapse from:body -> { let fs = q('[data-file]').arr(), open = !fs.some(d => d.open); fs.forEach(d => d.open = open) };
58 k-permalink from:body -> {66 k-permalink from:body -> {
59 let b = document.body.dataset;67 let b = document.body.dataset;
M internal/adapters/web/keys_templ.go +1 -1 generated file: collapsed
M internal/adapters/web/pages.templ +2 -0
@@ -71,6 +71,8 @@ templ summaryRail(p SummaryPage) {
7171 <p class="tag-sub dim">{ p.Latest.Subject }</p>
7272 }
7373 </div>
74+ } else {
75+ <p class="dim">{ plural(p.Latest.Count, "tag", "tags") }</p>
7476 }
7577 </section>
7678 }
@@ -71,6 +71,8 @@ templ summaryRail(p SummaryPage) {
71 <p class="tag-sub dim">{ p.Latest.Subject }</p>71 <p class="tag-sub dim">{ p.Latest.Subject }</p>
72 }72 }
73 </div>73 </div>
74+ } else {
75+ <p class="dim">{ plural(p.Latest.Count, "tag", "tags") }</p>
74 }76 }
75 </section>77 </section>
76 }78 }
M internal/adapters/web/pages_templ.go +170 -152
@@ -380,27 +380,45 @@ func summaryRail(p SummaryPage) templ.Component {
380380 if templ_7745c5c3_Err != nil {
381381 return templ_7745c5c3_Err
382382 }
383+ } else {
384+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "<p class=\"dim\">")
385+ if templ_7745c5c3_Err != nil {
386+ return templ_7745c5c3_Err
387+ }
388+ var templ_7745c5c3_Var20 string
389+ templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.JoinStringErrs(plural(p.Latest.Count, "tag", "tags"))
390+ if templ_7745c5c3_Err != nil {
391+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 75, Col: 58}
392+ }
393+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var20))
394+ if templ_7745c5c3_Err != nil {
395+ return templ_7745c5c3_Err
396+ }
397+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "</p>")
398+ if templ_7745c5c3_Err != nil {
399+ return templ_7745c5c3_Err
400+ }
383401 }
384- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "</section>")
402+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "</section>")
385403 if templ_7745c5c3_Err != nil {
386404 return templ_7745c5c3_Err
387405 }
388406 }
389407 if len(p.Recent) > 0 {
390- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "<section aria-labelledby=\"r-recent\"><h2 id=\"r-recent\">Recent commits <a href=\"")
408+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "<section aria-labelledby=\"r-recent\"><h2 id=\"r-recent\">Recent commits <a href=\"")
391409 if templ_7745c5c3_Err != nil {
392410 return templ_7745c5c3_Err
393411 }
394- var templ_7745c5c3_Var20 templ.SafeURL
395- templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.AllHref))
412+ var templ_7745c5c3_Var21 templ.SafeURL
413+ templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.AllHref))
396414 if templ_7745c5c3_Err != nil {
397- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 78, Col: 105}
415+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 80, Col: 105}
398416 }
399- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var20))
417+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var21))
400418 if templ_7745c5c3_Err != nil {
401419 return templ_7745c5c3_Err
402420 }
403- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "\">View all</a></h2>")
421+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "\">View all</a></h2>")
404422 if templ_7745c5c3_Err != nil {
405423 return templ_7745c5c3_Err
406424 }
@@ -408,13 +426,13 @@ func summaryRail(p SummaryPage) templ.Component {
408426 if templ_7745c5c3_Err != nil {
409427 return templ_7745c5c3_Err
410428 }
411- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "</section>")
429+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "</section>")
412430 if templ_7745c5c3_Err != nil {
413431 return templ_7745c5c3_Err
414432 }
415433 }
416434 if len(p.Outline) > 0 && p.Readme != nil {
417- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "<section aria-labelledby=\"r-outline\"><h2 id=\"r-outline\">On this page</h2>")
435+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "<section aria-labelledby=\"r-outline\"><h2 id=\"r-outline\">On this page</h2>")
418436 if templ_7745c5c3_Err != nil {
419437 return templ_7745c5c3_Err
420438 }
@@ -422,7 +440,7 @@ func summaryRail(p SummaryPage) templ.Component {
422440 if templ_7745c5c3_Err != nil {
423441 return templ_7745c5c3_Err
424442 }
425- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "</section>")
443+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "</section>")
426444 if templ_7745c5c3_Err != nil {
427445 return templ_7745c5c3_Err
428446 }
@@ -448,12 +466,12 @@ func Refs(l Layout, p RefsPage) templ.Component {
448466 }()
449467 }
450468 ctx = templ.InitializeContext(ctx)
451- templ_7745c5c3_Var21 := templ.GetChildren(ctx)
452- if templ_7745c5c3_Var21 == nil {
453- templ_7745c5c3_Var21 = templ.NopComponent
469+ templ_7745c5c3_Var22 := templ.GetChildren(ctx)
470+ if templ_7745c5c3_Var22 == nil {
471+ templ_7745c5c3_Var22 = templ.NopComponent
454472 }
455473 ctx = templ.ClearChildren(ctx)
456- templ_7745c5c3_Var22 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
474+ templ_7745c5c3_Var23 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
457475 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
458476 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
459477 if !templ_7745c5c3_IsBuffer {
@@ -465,7 +483,7 @@ func Refs(l Layout, p RefsPage) templ.Component {
465483 }()
466484 }
467485 ctx = templ.InitializeContext(ctx)
468- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "<div class=\"filter\"><label for=\"ref-filter\" class=\"sr\">filter</label> <input id=\"ref-filter\" type=\"search\" data-filter placeholder=\"Filter branches and tags…\" autocomplete=\"off\" hx-on:input=\"let t = this.value.toLowerCase(); q('#ref-rows > tr').arr().forEach(r => r.hidden = !r.textContent.toLowerCase().includes(t));\n let first = q('#ref-rows > tr:not([hidden])').arr()[0]; first && q(first).take('data-cursor', '#ref-rows > tr')\"></div><table class=\"list refs\" aria-label=\"Branches and tags\"><thead><tr><th class=\"cur\"></th><th class=\"c-kind\">kind</th><th class=\"c-name\">name</th><th class=\"c-sha\">commit</th><th class=\"c-sub\">subject</th><th class=\"c-when\">date</th></tr></thead>")
486+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "<div class=\"filter\"><label for=\"ref-filter\" class=\"sr\">filter</label> <input id=\"ref-filter\" type=\"search\" data-filter placeholder=\"Filter branches and tags…\" autocomplete=\"off\" hx-on:input=\"let t = this.value.toLowerCase(); q('#ref-rows > tr').arr().forEach(r => r.hidden = !r.textContent.toLowerCase().includes(t));\n let first = q('#ref-rows > tr:not([hidden])').arr()[0]; first && q(first).take('data-cursor', '#ref-rows > tr')\"></div><table class=\"list refs\" aria-label=\"Branches and tags\"><thead><tr><th class=\"cur\"></th><th class=\"c-kind\">kind</th><th class=\"c-name\">name</th><th class=\"c-sha\">commit</th><th class=\"c-sub\">subject</th><th class=\"c-when\">date</th></tr></thead>")
469487 if templ_7745c5c3_Err != nil {
470488 return templ_7745c5c3_Err
471489 }
@@ -473,32 +491,32 @@ func Refs(l Layout, p RefsPage) templ.Component {
473491 if templ_7745c5c3_Err != nil {
474492 return templ_7745c5c3_Err
475493 }
476- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "</table>")
494+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "</table>")
477495 if templ_7745c5c3_Err != nil {
478496 return templ_7745c5c3_Err
479497 }
480498 if p.Note != "" {
481- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "<p class=\"note\">")
499+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "<p class=\"note\">")
482500 if templ_7745c5c3_Err != nil {
483501 return templ_7745c5c3_Err
484502 }
485- var templ_7745c5c3_Var23 string
486- templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)
503+ var templ_7745c5c3_Var24 string
504+ templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)
487505 if templ_7745c5c3_Err != nil {
488- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 109, Col: 27}
506+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 111, Col: 27}
489507 }
490- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23))
508+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24))
491509 if templ_7745c5c3_Err != nil {
492510 return templ_7745c5c3_Err
493511 }
494- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "</p>")
512+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "</p>")
495513 if templ_7745c5c3_Err != nil {
496514 return templ_7745c5c3_Err
497515 }
498516 }
499517 return nil
500518 })
501- templ_7745c5c3_Err = Shell(l, refsRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var22), templ_7745c5c3_Buffer)
519+ templ_7745c5c3_Err = Shell(l, refsRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var23), templ_7745c5c3_Buffer)
502520 if templ_7745c5c3_Err != nil {
503521 return templ_7745c5c3_Err
504522 }
@@ -522,179 +540,179 @@ func refRow(kind string, r RefRow) templ.Component {
522540 }()
523541 }
524542 ctx = templ.InitializeContext(ctx)
525- templ_7745c5c3_Var24 := templ.GetChildren(ctx)
526- if templ_7745c5c3_Var24 == nil {
527- templ_7745c5c3_Var24 = templ.NopComponent
543+ templ_7745c5c3_Var25 := templ.GetChildren(ctx)
544+ if templ_7745c5c3_Var25 == nil {
545+ templ_7745c5c3_Var25 = templ.NopComponent
528546 }
529547 ctx = templ.ClearChildren(ctx)
530- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "<tr")
548+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "<tr")
531549 if templ_7745c5c3_Err != nil {
532550 return templ_7745c5c3_Err
533551 }
534552 if r.Cursor {
535- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, " data-cursor")
553+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, " data-cursor")
536554 if templ_7745c5c3_Err != nil {
537555 return templ_7745c5c3_Err
538556 }
539557 }
540- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "><td class=\"cur\" aria-hidden=\"true\"></td><td class=\"c-kind mute\">")
558+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "><td class=\"cur\" aria-hidden=\"true\"></td><td class=\"c-kind mute\">")
541559 if templ_7745c5c3_Err != nil {
542560 return templ_7745c5c3_Err
543561 }
544- var templ_7745c5c3_Var25 string
545- templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.JoinStringErrs(kind)
562+ var templ_7745c5c3_Var26 string
563+ templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.JoinStringErrs(kind)
546564 if templ_7745c5c3_Err != nil {
547- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 117, Col: 32}
565+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 119, Col: 32}
548566 }
549- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var25))
567+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var26))
550568 if templ_7745c5c3_Err != nil {
551569 return templ_7745c5c3_Err
552570 }
553- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "</td><td class=\"c-name\"><a href=\"")
571+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "</td><td class=\"c-name\"><a href=\"")
554572 if templ_7745c5c3_Err != nil {
555573 return templ_7745c5c3_Err
556574 }
557- var templ_7745c5c3_Var26 templ.SafeURL
558- templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Href))
575+ var templ_7745c5c3_Var27 templ.SafeURL
576+ templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Href))
559577 if templ_7745c5c3_Err != nil {
560- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 119, Col: 34}
578+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 121, Col: 34}
561579 }
562- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var26))
580+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27))
563581 if templ_7745c5c3_Err != nil {
564582 return templ_7745c5c3_Err
565583 }
566- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "\">")
584+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "\">")
567585 if templ_7745c5c3_Err != nil {
568586 return templ_7745c5c3_Err
569587 }
570- var templ_7745c5c3_Var27 string
571- templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)
588+ var templ_7745c5c3_Var28 string
589+ templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)
572590 if templ_7745c5c3_Err != nil {
573- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 119, Col: 45}
591+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 121, Col: 45}
574592 }
575- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27))
593+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var28))
576594 if templ_7745c5c3_Err != nil {
577595 return templ_7745c5c3_Err
578596 }
579- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "</a> ")
597+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "</a> ")
580598 if templ_7745c5c3_Err != nil {
581599 return templ_7745c5c3_Err
582600 }
583601 if r.Default {
584- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "<span class=\"pill\">default</span>")
602+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "<span class=\"pill\">default</span>")
585603 if templ_7745c5c3_Err != nil {
586604 return templ_7745c5c3_Err
587605 }
588606 }
589- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "</td><td class=\"c-sha\">")
607+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "</td><td class=\"c-sha\">")
590608 if templ_7745c5c3_Err != nil {
591609 return templ_7745c5c3_Err
592610 }
593611 if r.CHref != "" {
594- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "<a href=\"")
612+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "<a href=\"")
595613 if templ_7745c5c3_Err != nil {
596614 return templ_7745c5c3_Err
597615 }
598- var templ_7745c5c3_Var28 templ.SafeURL
599- templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.CHref))
616+ var templ_7745c5c3_Var29 templ.SafeURL
617+ templ_7745c5c3_Var29, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.CHref))
600618 if templ_7745c5c3_Err != nil {
601- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 126, Col: 36}
619+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 128, Col: 36}
602620 }
603- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var28))
621+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var29))
604622 if templ_7745c5c3_Err != nil {
605623 return templ_7745c5c3_Err
606624 }
607- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "\">")
625+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "\">")
608626 if templ_7745c5c3_Err != nil {
609627 return templ_7745c5c3_Err
610628 }
611- var templ_7745c5c3_Var29 string
612- templ_7745c5c3_Var29, templ_7745c5c3_Err = templ.JoinStringErrs(r.Short)
629+ var templ_7745c5c3_Var30 string
630+ templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinStringErrs(r.Short)
613631 if templ_7745c5c3_Err != nil {
614- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 126, Col: 48}
632+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 128, Col: 48}
615633 }
616- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var29))
634+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var30))
617635 if templ_7745c5c3_Err != nil {
618636 return templ_7745c5c3_Err
619637 }
620- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "</a>")
638+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "</a>")
621639 if templ_7745c5c3_Err != nil {
622640 return templ_7745c5c3_Err
623641 }
624642 } else {
625- var templ_7745c5c3_Var30 string
626- templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinStringErrs(r.Short)
643+ var templ_7745c5c3_Var31 string
644+ templ_7745c5c3_Var31, templ_7745c5c3_Err = templ.JoinStringErrs(r.Short)
627645 if templ_7745c5c3_Err != nil {
628- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 128, Col: 13}
646+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 130, Col: 13}
629647 }
630- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var30))
648+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var31))
631649 if templ_7745c5c3_Err != nil {
632650 return templ_7745c5c3_Err
633651 }
634652 }
635- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "</td><td class=\"c-sub\">")
653+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, "</td><td class=\"c-sub\">")
636654 if templ_7745c5c3_Err != nil {
637655 return templ_7745c5c3_Err
638656 }
639- var templ_7745c5c3_Var31 string
640- templ_7745c5c3_Var31, templ_7745c5c3_Err = templ.JoinStringErrs(r.Subject)
657+ var templ_7745c5c3_Var32 string
658+ templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.JoinStringErrs(r.Subject)
641659 if templ_7745c5c3_Err != nil {
642- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 131, Col: 31}
660+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 133, Col: 31}
643661 }
644- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var31))
662+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var32))
645663 if templ_7745c5c3_Err != nil {
646664 return templ_7745c5c3_Err
647665 }
648- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "</td><td class=\"c-when dim\">")
666+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, "</td><td class=\"c-when dim\">")
649667 if templ_7745c5c3_Err != nil {
650668 return templ_7745c5c3_Err
651669 }
652670 if r.WhenAt != "" {
653- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, "<time datetime=\"")
671+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "<time datetime=\"")
654672 if templ_7745c5c3_Err != nil {
655673 return templ_7745c5c3_Err
656674 }
657- var templ_7745c5c3_Var32 string
658- templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)
675+ var templ_7745c5c3_Var33 string
676+ templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)
659677 if templ_7745c5c3_Err != nil {
660- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 134, Col: 29}
678+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 136, Col: 29}
661679 }
662- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var32)
680+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var33)
663681 if templ_7745c5c3_Err != nil {
664682 return templ_7745c5c3_Err
665683 }
666- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, "\" title=\"")
684+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, "\" title=\"")
667685 if templ_7745c5c3_Err != nil {
668686 return templ_7745c5c3_Err
669687 }
670- var templ_7745c5c3_Var33 string
671- templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)
688+ var templ_7745c5c3_Var34 string
689+ templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)
672690 if templ_7745c5c3_Err != nil {
673- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 134, Col: 48}
691+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 136, Col: 48}
674692 }
675- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var33)
693+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var34)
676694 if templ_7745c5c3_Err != nil {
677695 return templ_7745c5c3_Err
678696 }
679- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "\">")
697+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "\">")
680698 if templ_7745c5c3_Err != nil {
681699 return templ_7745c5c3_Err
682700 }
683- var templ_7745c5c3_Var34 string
684- templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.JoinStringErrs(r.When)
701+ var templ_7745c5c3_Var35 string
702+ templ_7745c5c3_Var35, templ_7745c5c3_Err = templ.JoinStringErrs(r.When)
685703 if templ_7745c5c3_Err != nil {
686- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 134, Col: 59}
704+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 136, Col: 59}
687705 }
688- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var34))
706+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var35))
689707 if templ_7745c5c3_Err != nil {
690708 return templ_7745c5c3_Err
691709 }
692- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, "</time>")
710+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, "</time>")
693711 if templ_7745c5c3_Err != nil {
694712 return templ_7745c5c3_Err
695713 }
696714 }
697- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "</td></tr>")
715+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, "</td></tr>")
698716 if templ_7745c5c3_Err != nil {
699717 return templ_7745c5c3_Err
700718 }
@@ -718,12 +736,12 @@ func refsRail(p RefsPage) templ.Component {
718736 }()
719737 }
720738 ctx = templ.InitializeContext(ctx)
721- templ_7745c5c3_Var35 := templ.GetChildren(ctx)
722- if templ_7745c5c3_Var35 == nil {
723- templ_7745c5c3_Var35 = templ.NopComponent
739+ templ_7745c5c3_Var36 := templ.GetChildren(ctx)
740+ if templ_7745c5c3_Var36 == nil {
741+ templ_7745c5c3_Var36 = templ.NopComponent
724742 }
725743 ctx = templ.ClearChildren(ctx)
726- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, "<section aria-labelledby=\"r-refs\"><h2 id=\"r-refs\">Overview</h2>")
744+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "<section aria-labelledby=\"r-refs\"><h2 id=\"r-refs\">Overview</h2>")
727745 if templ_7745c5c3_Err != nil {
728746 return templ_7745c5c3_Err
729747 }
@@ -731,7 +749,7 @@ func refsRail(p RefsPage) templ.Component {
731749 if templ_7745c5c3_Err != nil {
732750 return templ_7745c5c3_Err
733751 }
734- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, "</section>")
752+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, "</section>")
735753 if templ_7745c5c3_Err != nil {
736754 return templ_7745c5c3_Err
737755 }
@@ -756,12 +774,12 @@ func State(l Layout, p StatePage) templ.Component {
756774 }()
757775 }
758776 ctx = templ.InitializeContext(ctx)
759- templ_7745c5c3_Var36 := templ.GetChildren(ctx)
760- if templ_7745c5c3_Var36 == nil {
761- templ_7745c5c3_Var36 = templ.NopComponent
777+ templ_7745c5c3_Var37 := templ.GetChildren(ctx)
778+ if templ_7745c5c3_Var37 == nil {
779+ templ_7745c5c3_Var37 = templ.NopComponent
762780 }
763781 ctx = templ.ClearChildren(ctx)
764- templ_7745c5c3_Var37 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
782+ templ_7745c5c3_Var38 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
765783 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
766784 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
767785 if !templ_7745c5c3_IsBuffer {
@@ -773,51 +791,51 @@ func State(l Layout, p StatePage) templ.Component {
773791 }()
774792 }
775793 ctx = templ.InitializeContext(ctx)
776- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "<section class=\"state\" aria-labelledby=\"state-title\"><p class=\"eyebrow\">")
794+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, "<section class=\"state\" aria-labelledby=\"state-title\"><p class=\"eyebrow\">")
777795 if templ_7745c5c3_Err != nil {
778796 return templ_7745c5c3_Err
779797 }
780- var templ_7745c5c3_Var38 string
781- templ_7745c5c3_Var38, templ_7745c5c3_Err = templ.JoinStringErrs(p.Code)
798+ var templ_7745c5c3_Var39 string
799+ templ_7745c5c3_Var39, templ_7745c5c3_Err = templ.JoinStringErrs(p.Code)
782800 if templ_7745c5c3_Err != nil {
783- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 151, Col: 30}
801+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 153, Col: 30}
784802 }
785- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var38))
803+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var39))
786804 if templ_7745c5c3_Err != nil {
787805 return templ_7745c5c3_Err
788806 }
789- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, "</p><h1 id=\"state-title\">")
807+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, "</p><h1 id=\"state-title\">")
790808 if templ_7745c5c3_Err != nil {
791809 return templ_7745c5c3_Err
792810 }
793- var templ_7745c5c3_Var39 string
794- templ_7745c5c3_Var39, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)
811+ var templ_7745c5c3_Var40 string
812+ templ_7745c5c3_Var40, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)
795813 if templ_7745c5c3_Err != nil {
796- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 152, Col: 33}
814+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 154, Col: 33}
797815 }
798- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var39))
816+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var40))
799817 if templ_7745c5c3_Err != nil {
800818 return templ_7745c5c3_Err
801819 }
802- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, "</h1>")
820+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, "</h1>")
803821 if templ_7745c5c3_Err != nil {
804822 return templ_7745c5c3_Err
805823 }
806824 for _, line := range p.Lines {
807- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, "<p class=\"dim\">")
825+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "<p class=\"dim\">")
808826 if templ_7745c5c3_Err != nil {
809827 return templ_7745c5c3_Err
810828 }
811- var templ_7745c5c3_Var40 string
812- templ_7745c5c3_Var40, templ_7745c5c3_Err = templ.JoinStringErrs(line)
829+ var templ_7745c5c3_Var41 string
830+ templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.JoinStringErrs(line)
813831 if templ_7745c5c3_Err != nil {
814- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 154, Col: 25}
832+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 156, Col: 25}
815833 }
816- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var40))
834+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var41))
817835 if templ_7745c5c3_Err != nil {
818836 return templ_7745c5c3_Err
819837 }
820- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, "</p>")
838+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, "</p>")
821839 if templ_7745c5c3_Err != nil {
822840 return templ_7745c5c3_Err
823841 }
@@ -828,49 +846,49 @@ func State(l Layout, p StatePage) templ.Component {
828846 return templ_7745c5c3_Err
829847 }
830848 }
831- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "<p class=\"state-back\">")
849+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, "<p class=\"state-back\">")
832850 if templ_7745c5c3_Err != nil {
833851 return templ_7745c5c3_Err
834852 }
835853 for _, b := range p.Back {
836- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, "<a href=\"")
854+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "<a href=\"")
837855 if templ_7745c5c3_Err != nil {
838856 return templ_7745c5c3_Err
839857 }
840- var templ_7745c5c3_Var41 templ.SafeURL
841- templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(b.Href))
858+ var templ_7745c5c3_Var42 templ.SafeURL
859+ templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(b.Href))
842860 if templ_7745c5c3_Err != nil {
843- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 161, Col: 36}
861+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 163, Col: 36}
844862 }
845- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var41))
863+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var42))
846864 if templ_7745c5c3_Err != nil {
847865 return templ_7745c5c3_Err
848866 }
849- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, "\">")
867+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, "\">")
850868 if templ_7745c5c3_Err != nil {
851869 return templ_7745c5c3_Err
852870 }
853- var templ_7745c5c3_Var42 string
854- templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.JoinStringErrs(b.Label)
871+ var templ_7745c5c3_Var43 string
872+ templ_7745c5c3_Var43, templ_7745c5c3_Err = templ.JoinStringErrs(b.Label)
855873 if templ_7745c5c3_Err != nil {
856- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 161, Col: 48}
874+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 163, Col: 48}
857875 }
858- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var42))
876+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var43))
859877 if templ_7745c5c3_Err != nil {
860878 return templ_7745c5c3_Err
861879 }
862- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "</a>")
880+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, "</a>")
863881 if templ_7745c5c3_Err != nil {
864882 return templ_7745c5c3_Err
865883 }
866884 }
867- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, "</p></section>")
885+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, "</p></section>")
868886 if templ_7745c5c3_Err != nil {
869887 return templ_7745c5c3_Err
870888 }
871889 return nil
872890 })
873- templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var37), templ_7745c5c3_Buffer)
891+ templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var38), templ_7745c5c3_Buffer)
874892 if templ_7745c5c3_Err != nil {
875893 return templ_7745c5c3_Err
876894 }
@@ -896,12 +914,12 @@ func Login(l Layout, p LoginPage) templ.Component {
896914 }()
897915 }
898916 ctx = templ.InitializeContext(ctx)
899- templ_7745c5c3_Var43 := templ.GetChildren(ctx)
900- if templ_7745c5c3_Var43 == nil {
901- templ_7745c5c3_Var43 = templ.NopComponent
917+ templ_7745c5c3_Var44 := templ.GetChildren(ctx)
918+ if templ_7745c5c3_Var44 == nil {
919+ templ_7745c5c3_Var44 = templ.NopComponent
902920 }
903921 ctx = templ.ClearChildren(ctx)
904- templ_7745c5c3_Var44 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
922+ templ_7745c5c3_Var45 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
905923 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
906924 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
907925 if !templ_7745c5c3_IsBuffer {
@@ -913,75 +931,75 @@ func Login(l Layout, p LoginPage) templ.Component {
913931 }()
914932 }
915933 ctx = templ.InitializeContext(ctx)
916- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, "<section class=\"state\" aria-labelledby=\"state-title\"><h1 id=\"state-title\">")
934+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, "<section class=\"state\" aria-labelledby=\"state-title\"><h1 id=\"state-title\">")
917935 if templ_7745c5c3_Err != nil {
918936 return templ_7745c5c3_Err
919937 }
920- var templ_7745c5c3_Var45 string
921- templ_7745c5c3_Var45, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)
938+ var templ_7745c5c3_Var46 string
939+ templ_7745c5c3_Var46, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)
922940 if templ_7745c5c3_Err != nil {
923- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 173, Col: 33}
941+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 175, Col: 33}
924942 }
925- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var45))
943+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var46))
926944 if templ_7745c5c3_Err != nil {
927945 return templ_7745c5c3_Err
928946 }
929- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, "</h1>")
947+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, "</h1>")
930948 if templ_7745c5c3_Err != nil {
931949 return templ_7745c5c3_Err
932950 }
933951 for _, line := range p.Lines {
934- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, "<p class=\"dim\">")
952+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, "<p class=\"dim\">")
935953 if templ_7745c5c3_Err != nil {
936954 return templ_7745c5c3_Err
937955 }
938- var templ_7745c5c3_Var46 string
939- templ_7745c5c3_Var46, templ_7745c5c3_Err = templ.JoinStringErrs(line)
956+ var templ_7745c5c3_Var47 string
957+ templ_7745c5c3_Var47, templ_7745c5c3_Err = templ.JoinStringErrs(line)
940958 if templ_7745c5c3_Err != nil {
941- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 175, Col: 25}
959+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 177, Col: 25}
942960 }
943- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var46))
961+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var47))
944962 if templ_7745c5c3_Err != nil {
945963 return templ_7745c5c3_Err
946964 }
947- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, "</p>")
965+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 73, "</p>")
948966 if templ_7745c5c3_Err != nil {
949967 return templ_7745c5c3_Err
950968 }
951969 }
952- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, "<form class=\"state-act\" method=\"post\" action=\"")
970+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, "<form class=\"state-act\" method=\"post\" action=\"")
953971 if templ_7745c5c3_Err != nil {
954972 return templ_7745c5c3_Err
955973 }
956- var templ_7745c5c3_Var47 templ.SafeURL
957- templ_7745c5c3_Var47, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Action))
974+ var templ_7745c5c3_Var48 templ.SafeURL
975+ templ_7745c5c3_Var48, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Action))
958976 if templ_7745c5c3_Err != nil {
959- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 177, Col: 73}
977+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 179, Col: 73}
960978 }
961- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var47))
979+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var48))
962980 if templ_7745c5c3_Err != nil {
963981 return templ_7745c5c3_Err
964982 }
965- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 73, "\"><button type=\"submit\" class=\"btn primary\">")
983+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, "\"><button type=\"submit\" class=\"btn primary\">")
966984 if templ_7745c5c3_Err != nil {
967985 return templ_7745c5c3_Err
968986 }
969- var templ_7745c5c3_Var48 string
970- templ_7745c5c3_Var48, templ_7745c5c3_Err = templ.JoinStringErrs(p.Button)
987+ var templ_7745c5c3_Var49 string
988+ templ_7745c5c3_Var49, templ_7745c5c3_Err = templ.JoinStringErrs(p.Button)
971989 if templ_7745c5c3_Err != nil {
972- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 178, Col: 56}
990+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 180, Col: 56}
973991 }
974- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var48))
992+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var49))
975993 if templ_7745c5c3_Err != nil {
976994 return templ_7745c5c3_Err
977995 }
978- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, "</button></form><p class=\"state-back\"><a href=\"/\">Back to home</a></p></section>")
996+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 76, "</button></form><p class=\"state-back\"><a href=\"/\">Back to home</a></p></section>")
979997 if templ_7745c5c3_Err != nil {
980998 return templ_7745c5c3_Err
981999 }
9821000 return nil
9831001 })
984- templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var44), templ_7745c5c3_Buffer)
1002+ templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var45), templ_7745c5c3_Buffer)
9851003 if templ_7745c5c3_Err != nil {
9861004 return templ_7745c5c3_Err
9871005 }
@@ -380,27 +380,45 @@ func summaryRail(p SummaryPage) templ.Component {
380 if templ_7745c5c3_Err != nil {380 if templ_7745c5c3_Err != nil {
381 return templ_7745c5c3_Err381 return templ_7745c5c3_Err
382 }382 }
383+ } else {
384+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "<p class=\"dim\">")
385+ if templ_7745c5c3_Err != nil {
386+ return templ_7745c5c3_Err
387+ }
388+ var templ_7745c5c3_Var20 string
389+ templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.JoinStringErrs(plural(p.Latest.Count, "tag", "tags"))
390+ if templ_7745c5c3_Err != nil {
391+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 75, Col: 58}
392+ }
393+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var20))
394+ if templ_7745c5c3_Err != nil {
395+ return templ_7745c5c3_Err
396+ }
397+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "</p>")
398+ if templ_7745c5c3_Err != nil {
399+ return templ_7745c5c3_Err
400+ }
383 }401 }
384- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "</section>")402+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "</section>")
385 if templ_7745c5c3_Err != nil {403 if templ_7745c5c3_Err != nil {
386 return templ_7745c5c3_Err404 return templ_7745c5c3_Err
387 }405 }
388 }406 }
389 if len(p.Recent) > 0 {407 if len(p.Recent) > 0 {
390- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "<section aria-labelledby=\"r-recent\"><h2 id=\"r-recent\">Recent commits <a href=\"")408+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "<section aria-labelledby=\"r-recent\"><h2 id=\"r-recent\">Recent commits <a href=\"")
391 if templ_7745c5c3_Err != nil {409 if templ_7745c5c3_Err != nil {
392 return templ_7745c5c3_Err410 return templ_7745c5c3_Err
393 }411 }
394- var templ_7745c5c3_Var20 templ.SafeURL412+ var templ_7745c5c3_Var21 templ.SafeURL
395- templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.AllHref))413+ templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.AllHref))
396 if templ_7745c5c3_Err != nil {414 if templ_7745c5c3_Err != nil {
397- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 78, Col: 105}415+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 80, Col: 105}
398 }416 }
399- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var20))417+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var21))
400 if templ_7745c5c3_Err != nil {418 if templ_7745c5c3_Err != nil {
401 return templ_7745c5c3_Err419 return templ_7745c5c3_Err
402 }420 }
403- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "\">View all</a></h2>")421+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "\">View all</a></h2>")
404 if templ_7745c5c3_Err != nil {422 if templ_7745c5c3_Err != nil {
405 return templ_7745c5c3_Err423 return templ_7745c5c3_Err
406 }424 }
@@ -408,13 +426,13 @@ func summaryRail(p SummaryPage) templ.Component {
408 if templ_7745c5c3_Err != nil {426 if templ_7745c5c3_Err != nil {
409 return templ_7745c5c3_Err427 return templ_7745c5c3_Err
410 }428 }
411- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "</section>")429+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "</section>")
412 if templ_7745c5c3_Err != nil {430 if templ_7745c5c3_Err != nil {
413 return templ_7745c5c3_Err431 return templ_7745c5c3_Err
414 }432 }
415 }433 }
416 if len(p.Outline) > 0 && p.Readme != nil {434 if len(p.Outline) > 0 && p.Readme != nil {
417- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "<section aria-labelledby=\"r-outline\"><h2 id=\"r-outline\">On this page</h2>")435+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "<section aria-labelledby=\"r-outline\"><h2 id=\"r-outline\">On this page</h2>")
418 if templ_7745c5c3_Err != nil {436 if templ_7745c5c3_Err != nil {
419 return templ_7745c5c3_Err437 return templ_7745c5c3_Err
420 }438 }
@@ -422,7 +440,7 @@ func summaryRail(p SummaryPage) templ.Component {
422 if templ_7745c5c3_Err != nil {440 if templ_7745c5c3_Err != nil {
423 return templ_7745c5c3_Err441 return templ_7745c5c3_Err
424 }442 }
425- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "</section>")443+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "</section>")
426 if templ_7745c5c3_Err != nil {444 if templ_7745c5c3_Err != nil {
427 return templ_7745c5c3_Err445 return templ_7745c5c3_Err
428 }446 }
@@ -448,12 +466,12 @@ func Refs(l Layout, p RefsPage) templ.Component {
448 }()466 }()
449 }467 }
450 ctx = templ.InitializeContext(ctx)468 ctx = templ.InitializeContext(ctx)
451- templ_7745c5c3_Var21 := templ.GetChildren(ctx)469+ templ_7745c5c3_Var22 := templ.GetChildren(ctx)
452- if templ_7745c5c3_Var21 == nil {470+ if templ_7745c5c3_Var22 == nil {
453- templ_7745c5c3_Var21 = templ.NopComponent471+ templ_7745c5c3_Var22 = templ.NopComponent
454 }472 }
455 ctx = templ.ClearChildren(ctx)473 ctx = templ.ClearChildren(ctx)
456- templ_7745c5c3_Var22 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {474+ templ_7745c5c3_Var23 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
457 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context475 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
458 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)476 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
459 if !templ_7745c5c3_IsBuffer {477 if !templ_7745c5c3_IsBuffer {
@@ -465,7 +483,7 @@ func Refs(l Layout, p RefsPage) templ.Component {
465 }()483 }()
466 }484 }
467 ctx = templ.InitializeContext(ctx)485 ctx = templ.InitializeContext(ctx)
468- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "<div class=\"filter\"><label for=\"ref-filter\" class=\"sr\">filter</label> <input id=\"ref-filter\" type=\"search\" data-filter placeholder=\"Filter branches and tags…\" autocomplete=\"off\" hx-on:input=\"let t = this.value.toLowerCase(); q('#ref-rows > tr').arr().forEach(r => r.hidden = !r.textContent.toLowerCase().includes(t));\n let first = q('#ref-rows > tr:not([hidden])').arr()[0]; first && q(first).take('data-cursor', '#ref-rows > tr')\"></div><table class=\"list refs\" aria-label=\"Branches and tags\"><thead><tr><th class=\"cur\"></th><th class=\"c-kind\">kind</th><th class=\"c-name\">name</th><th class=\"c-sha\">commit</th><th class=\"c-sub\">subject</th><th class=\"c-when\">date</th></tr></thead>")486+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "<div class=\"filter\"><label for=\"ref-filter\" class=\"sr\">filter</label> <input id=\"ref-filter\" type=\"search\" data-filter placeholder=\"Filter branches and tags…\" autocomplete=\"off\" hx-on:input=\"let t = this.value.toLowerCase(); q('#ref-rows > tr').arr().forEach(r => r.hidden = !r.textContent.toLowerCase().includes(t));\n let first = q('#ref-rows > tr:not([hidden])').arr()[0]; first && q(first).take('data-cursor', '#ref-rows > tr')\"></div><table class=\"list refs\" aria-label=\"Branches and tags\"><thead><tr><th class=\"cur\"></th><th class=\"c-kind\">kind</th><th class=\"c-name\">name</th><th class=\"c-sha\">commit</th><th class=\"c-sub\">subject</th><th class=\"c-when\">date</th></tr></thead>")
469 if templ_7745c5c3_Err != nil {487 if templ_7745c5c3_Err != nil {
470 return templ_7745c5c3_Err488 return templ_7745c5c3_Err
471 }489 }
@@ -473,32 +491,32 @@ func Refs(l Layout, p RefsPage) templ.Component {
473 if templ_7745c5c3_Err != nil {491 if templ_7745c5c3_Err != nil {
474 return templ_7745c5c3_Err492 return templ_7745c5c3_Err
475 }493 }
476- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "</table>")494+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "</table>")
477 if templ_7745c5c3_Err != nil {495 if templ_7745c5c3_Err != nil {
478 return templ_7745c5c3_Err496 return templ_7745c5c3_Err
479 }497 }
480 if p.Note != "" {498 if p.Note != "" {
481- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "<p class=\"note\">")499+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "<p class=\"note\">")
482 if templ_7745c5c3_Err != nil {500 if templ_7745c5c3_Err != nil {
483 return templ_7745c5c3_Err501 return templ_7745c5c3_Err
484 }502 }
485- var templ_7745c5c3_Var23 string503+ var templ_7745c5c3_Var24 string
486- templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)504+ templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)
487 if templ_7745c5c3_Err != nil {505 if templ_7745c5c3_Err != nil {
488- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 109, Col: 27}506+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 111, Col: 27}
489 }507 }
490- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23))508+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24))
491 if templ_7745c5c3_Err != nil {509 if templ_7745c5c3_Err != nil {
492 return templ_7745c5c3_Err510 return templ_7745c5c3_Err
493 }511 }
494- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "</p>")512+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "</p>")
495 if templ_7745c5c3_Err != nil {513 if templ_7745c5c3_Err != nil {
496 return templ_7745c5c3_Err514 return templ_7745c5c3_Err
497 }515 }
498 }516 }
499 return nil517 return nil
500 })518 })
501- templ_7745c5c3_Err = Shell(l, refsRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var22), templ_7745c5c3_Buffer)519+ templ_7745c5c3_Err = Shell(l, refsRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var23), templ_7745c5c3_Buffer)
502 if templ_7745c5c3_Err != nil {520 if templ_7745c5c3_Err != nil {
503 return templ_7745c5c3_Err521 return templ_7745c5c3_Err
504 }522 }
@@ -522,179 +540,179 @@ func refRow(kind string, r RefRow) templ.Component {
522 }()540 }()
523 }541 }
524 ctx = templ.InitializeContext(ctx)542 ctx = templ.InitializeContext(ctx)
525- templ_7745c5c3_Var24 := templ.GetChildren(ctx)543+ templ_7745c5c3_Var25 := templ.GetChildren(ctx)
526- if templ_7745c5c3_Var24 == nil {544+ if templ_7745c5c3_Var25 == nil {
527- templ_7745c5c3_Var24 = templ.NopComponent545+ templ_7745c5c3_Var25 = templ.NopComponent
528 }546 }
529 ctx = templ.ClearChildren(ctx)547 ctx = templ.ClearChildren(ctx)
530- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "<tr")548+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "<tr")
531 if templ_7745c5c3_Err != nil {549 if templ_7745c5c3_Err != nil {
532 return templ_7745c5c3_Err550 return templ_7745c5c3_Err
533 }551 }
534 if r.Cursor {552 if r.Cursor {
535- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, " data-cursor")553+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, " data-cursor")
536 if templ_7745c5c3_Err != nil {554 if templ_7745c5c3_Err != nil {
537 return templ_7745c5c3_Err555 return templ_7745c5c3_Err
538 }556 }
539 }557 }
540- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "><td class=\"cur\" aria-hidden=\"true\"></td><td class=\"c-kind mute\">")558+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "><td class=\"cur\" aria-hidden=\"true\"></td><td class=\"c-kind mute\">")
541 if templ_7745c5c3_Err != nil {559 if templ_7745c5c3_Err != nil {
542 return templ_7745c5c3_Err560 return templ_7745c5c3_Err
543 }561 }
544- var templ_7745c5c3_Var25 string562+ var templ_7745c5c3_Var26 string
545- templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.JoinStringErrs(kind)563+ templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.JoinStringErrs(kind)
546 if templ_7745c5c3_Err != nil {564 if templ_7745c5c3_Err != nil {
547- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 117, Col: 32}565+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 119, Col: 32}
548 }566 }
549- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var25))567+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var26))
550 if templ_7745c5c3_Err != nil {568 if templ_7745c5c3_Err != nil {
551 return templ_7745c5c3_Err569 return templ_7745c5c3_Err
552 }570 }
553- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "</td><td class=\"c-name\"><a href=\"")571+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "</td><td class=\"c-name\"><a href=\"")
554 if templ_7745c5c3_Err != nil {572 if templ_7745c5c3_Err != nil {
555 return templ_7745c5c3_Err573 return templ_7745c5c3_Err
556 }574 }
557- var templ_7745c5c3_Var26 templ.SafeURL575+ var templ_7745c5c3_Var27 templ.SafeURL
558- templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Href))576+ templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Href))
559 if templ_7745c5c3_Err != nil {577 if templ_7745c5c3_Err != nil {
560- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 119, Col: 34}578+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 121, Col: 34}
561 }579 }
562- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var26))580+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27))
563 if templ_7745c5c3_Err != nil {581 if templ_7745c5c3_Err != nil {
564 return templ_7745c5c3_Err582 return templ_7745c5c3_Err
565 }583 }
566- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "\">")584+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "\">")
567 if templ_7745c5c3_Err != nil {585 if templ_7745c5c3_Err != nil {
568 return templ_7745c5c3_Err586 return templ_7745c5c3_Err
569 }587 }
570- var templ_7745c5c3_Var27 string588+ var templ_7745c5c3_Var28 string
571- templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)589+ templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)
572 if templ_7745c5c3_Err != nil {590 if templ_7745c5c3_Err != nil {
573- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 119, Col: 45}591+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 121, Col: 45}
574 }592 }
575- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27))593+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var28))
576 if templ_7745c5c3_Err != nil {594 if templ_7745c5c3_Err != nil {
577 return templ_7745c5c3_Err595 return templ_7745c5c3_Err
578 }596 }
579- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "</a> ")597+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "</a> ")
580 if templ_7745c5c3_Err != nil {598 if templ_7745c5c3_Err != nil {
581 return templ_7745c5c3_Err599 return templ_7745c5c3_Err
582 }600 }
583 if r.Default {601 if r.Default {
584- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "<span class=\"pill\">default</span>")602+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "<span class=\"pill\">default</span>")
585 if templ_7745c5c3_Err != nil {603 if templ_7745c5c3_Err != nil {
586 return templ_7745c5c3_Err604 return templ_7745c5c3_Err
587 }605 }
588 }606 }
589- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "</td><td class=\"c-sha\">")607+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "</td><td class=\"c-sha\">")
590 if templ_7745c5c3_Err != nil {608 if templ_7745c5c3_Err != nil {
591 return templ_7745c5c3_Err609 return templ_7745c5c3_Err
592 }610 }
593 if r.CHref != "" {611 if r.CHref != "" {
594- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "<a href=\"")612+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "<a href=\"")
595 if templ_7745c5c3_Err != nil {613 if templ_7745c5c3_Err != nil {
596 return templ_7745c5c3_Err614 return templ_7745c5c3_Err
597 }615 }
598- var templ_7745c5c3_Var28 templ.SafeURL616+ var templ_7745c5c3_Var29 templ.SafeURL
599- templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.CHref))617+ templ_7745c5c3_Var29, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.CHref))
600 if templ_7745c5c3_Err != nil {618 if templ_7745c5c3_Err != nil {
601- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 126, Col: 36}619+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 128, Col: 36}
602 }620 }
603- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var28))621+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var29))
604 if templ_7745c5c3_Err != nil {622 if templ_7745c5c3_Err != nil {
605 return templ_7745c5c3_Err623 return templ_7745c5c3_Err
606 }624 }
607- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "\">")625+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "\">")
608 if templ_7745c5c3_Err != nil {626 if templ_7745c5c3_Err != nil {
609 return templ_7745c5c3_Err627 return templ_7745c5c3_Err
610 }628 }
611- var templ_7745c5c3_Var29 string629+ var templ_7745c5c3_Var30 string
612- templ_7745c5c3_Var29, templ_7745c5c3_Err = templ.JoinStringErrs(r.Short)630+ templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinStringErrs(r.Short)
613 if templ_7745c5c3_Err != nil {631 if templ_7745c5c3_Err != nil {
614- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 126, Col: 48}632+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 128, Col: 48}
615 }633 }
616- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var29))634+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var30))
617 if templ_7745c5c3_Err != nil {635 if templ_7745c5c3_Err != nil {
618 return templ_7745c5c3_Err636 return templ_7745c5c3_Err
619 }637 }
620- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "</a>")638+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "</a>")
621 if templ_7745c5c3_Err != nil {639 if templ_7745c5c3_Err != nil {
622 return templ_7745c5c3_Err640 return templ_7745c5c3_Err
623 }641 }
624 } else {642 } else {
625- var templ_7745c5c3_Var30 string643+ var templ_7745c5c3_Var31 string
626- templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinStringErrs(r.Short)644+ templ_7745c5c3_Var31, templ_7745c5c3_Err = templ.JoinStringErrs(r.Short)
627 if templ_7745c5c3_Err != nil {645 if templ_7745c5c3_Err != nil {
628- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 128, Col: 13}646+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 130, Col: 13}
629 }647 }
630- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var30))648+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var31))
631 if templ_7745c5c3_Err != nil {649 if templ_7745c5c3_Err != nil {
632 return templ_7745c5c3_Err650 return templ_7745c5c3_Err
633 }651 }
634 }652 }
635- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "</td><td class=\"c-sub\">")653+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, "</td><td class=\"c-sub\">")
636 if templ_7745c5c3_Err != nil {654 if templ_7745c5c3_Err != nil {
637 return templ_7745c5c3_Err655 return templ_7745c5c3_Err
638 }656 }
639- var templ_7745c5c3_Var31 string657+ var templ_7745c5c3_Var32 string
640- templ_7745c5c3_Var31, templ_7745c5c3_Err = templ.JoinStringErrs(r.Subject)658+ templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.JoinStringErrs(r.Subject)
641 if templ_7745c5c3_Err != nil {659 if templ_7745c5c3_Err != nil {
642- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 131, Col: 31}660+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 133, Col: 31}
643 }661 }
644- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var31))662+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var32))
645 if templ_7745c5c3_Err != nil {663 if templ_7745c5c3_Err != nil {
646 return templ_7745c5c3_Err664 return templ_7745c5c3_Err
647 }665 }
648- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "</td><td class=\"c-when dim\">")666+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, "</td><td class=\"c-when dim\">")
649 if templ_7745c5c3_Err != nil {667 if templ_7745c5c3_Err != nil {
650 return templ_7745c5c3_Err668 return templ_7745c5c3_Err
651 }669 }
652 if r.WhenAt != "" {670 if r.WhenAt != "" {
653- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, "<time datetime=\"")671+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "<time datetime=\"")
654 if templ_7745c5c3_Err != nil {672 if templ_7745c5c3_Err != nil {
655 return templ_7745c5c3_Err673 return templ_7745c5c3_Err
656 }674 }
657- var templ_7745c5c3_Var32 string675+ var templ_7745c5c3_Var33 string
658- templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)676+ templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)
659 if templ_7745c5c3_Err != nil {677 if templ_7745c5c3_Err != nil {
660- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 134, Col: 29}678+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 136, Col: 29}
661 }679 }
662- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var32)680+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var33)
663 if templ_7745c5c3_Err != nil {681 if templ_7745c5c3_Err != nil {
664 return templ_7745c5c3_Err682 return templ_7745c5c3_Err
665 }683 }
666- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, "\" title=\"")684+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, "\" title=\"")
667 if templ_7745c5c3_Err != nil {685 if templ_7745c5c3_Err != nil {
668 return templ_7745c5c3_Err686 return templ_7745c5c3_Err
669 }687 }
670- var templ_7745c5c3_Var33 string688+ var templ_7745c5c3_Var34 string
671- templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)689+ templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)
672 if templ_7745c5c3_Err != nil {690 if templ_7745c5c3_Err != nil {
673- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 134, Col: 48}691+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 136, Col: 48}
674 }692 }
675- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var33)693+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var34)
676 if templ_7745c5c3_Err != nil {694 if templ_7745c5c3_Err != nil {
677 return templ_7745c5c3_Err695 return templ_7745c5c3_Err
678 }696 }
679- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "\">")697+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "\">")
680 if templ_7745c5c3_Err != nil {698 if templ_7745c5c3_Err != nil {
681 return templ_7745c5c3_Err699 return templ_7745c5c3_Err
682 }700 }
683- var templ_7745c5c3_Var34 string701+ var templ_7745c5c3_Var35 string
684- templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.JoinStringErrs(r.When)702+ templ_7745c5c3_Var35, templ_7745c5c3_Err = templ.JoinStringErrs(r.When)
685 if templ_7745c5c3_Err != nil {703 if templ_7745c5c3_Err != nil {
686- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 134, Col: 59}704+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 136, Col: 59}
687 }705 }
688- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var34))706+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var35))
689 if templ_7745c5c3_Err != nil {707 if templ_7745c5c3_Err != nil {
690 return templ_7745c5c3_Err708 return templ_7745c5c3_Err
691 }709 }
692- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, "</time>")710+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, "</time>")
693 if templ_7745c5c3_Err != nil {711 if templ_7745c5c3_Err != nil {
694 return templ_7745c5c3_Err712 return templ_7745c5c3_Err
695 }713 }
696 }714 }
697- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "</td></tr>")715+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, "</td></tr>")
698 if templ_7745c5c3_Err != nil {716 if templ_7745c5c3_Err != nil {
699 return templ_7745c5c3_Err717 return templ_7745c5c3_Err
700 }718 }
@@ -718,12 +736,12 @@ func refsRail(p RefsPage) templ.Component {
718 }()736 }()
719 }737 }
720 ctx = templ.InitializeContext(ctx)738 ctx = templ.InitializeContext(ctx)
721- templ_7745c5c3_Var35 := templ.GetChildren(ctx)739+ templ_7745c5c3_Var36 := templ.GetChildren(ctx)
722- if templ_7745c5c3_Var35 == nil {740+ if templ_7745c5c3_Var36 == nil {
723- templ_7745c5c3_Var35 = templ.NopComponent741+ templ_7745c5c3_Var36 = templ.NopComponent
724 }742 }
725 ctx = templ.ClearChildren(ctx)743 ctx = templ.ClearChildren(ctx)
726- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, "<section aria-labelledby=\"r-refs\"><h2 id=\"r-refs\">Overview</h2>")744+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "<section aria-labelledby=\"r-refs\"><h2 id=\"r-refs\">Overview</h2>")
727 if templ_7745c5c3_Err != nil {745 if templ_7745c5c3_Err != nil {
728 return templ_7745c5c3_Err746 return templ_7745c5c3_Err
729 }747 }
@@ -731,7 +749,7 @@ func refsRail(p RefsPage) templ.Component {
731 if templ_7745c5c3_Err != nil {749 if templ_7745c5c3_Err != nil {
732 return templ_7745c5c3_Err750 return templ_7745c5c3_Err
733 }751 }
734- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, "</section>")752+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, "</section>")
735 if templ_7745c5c3_Err != nil {753 if templ_7745c5c3_Err != nil {
736 return templ_7745c5c3_Err754 return templ_7745c5c3_Err
737 }755 }
@@ -756,12 +774,12 @@ func State(l Layout, p StatePage) templ.Component {
756 }()774 }()
757 }775 }
758 ctx = templ.InitializeContext(ctx)776 ctx = templ.InitializeContext(ctx)
759- templ_7745c5c3_Var36 := templ.GetChildren(ctx)777+ templ_7745c5c3_Var37 := templ.GetChildren(ctx)
760- if templ_7745c5c3_Var36 == nil {778+ if templ_7745c5c3_Var37 == nil {
761- templ_7745c5c3_Var36 = templ.NopComponent779+ templ_7745c5c3_Var37 = templ.NopComponent
762 }780 }
763 ctx = templ.ClearChildren(ctx)781 ctx = templ.ClearChildren(ctx)
764- templ_7745c5c3_Var37 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {782+ templ_7745c5c3_Var38 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
765 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context783 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
766 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)784 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
767 if !templ_7745c5c3_IsBuffer {785 if !templ_7745c5c3_IsBuffer {
@@ -773,51 +791,51 @@ func State(l Layout, p StatePage) templ.Component {
773 }()791 }()
774 }792 }
775 ctx = templ.InitializeContext(ctx)793 ctx = templ.InitializeContext(ctx)
776- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "<section class=\"state\" aria-labelledby=\"state-title\"><p class=\"eyebrow\">")794+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, "<section class=\"state\" aria-labelledby=\"state-title\"><p class=\"eyebrow\">")
777 if templ_7745c5c3_Err != nil {795 if templ_7745c5c3_Err != nil {
778 return templ_7745c5c3_Err796 return templ_7745c5c3_Err
779 }797 }
780- var templ_7745c5c3_Var38 string798+ var templ_7745c5c3_Var39 string
781- templ_7745c5c3_Var38, templ_7745c5c3_Err = templ.JoinStringErrs(p.Code)799+ templ_7745c5c3_Var39, templ_7745c5c3_Err = templ.JoinStringErrs(p.Code)
782 if templ_7745c5c3_Err != nil {800 if templ_7745c5c3_Err != nil {
783- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 151, Col: 30}801+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 153, Col: 30}
784 }802 }
785- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var38))803+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var39))
786 if templ_7745c5c3_Err != nil {804 if templ_7745c5c3_Err != nil {
787 return templ_7745c5c3_Err805 return templ_7745c5c3_Err
788 }806 }
789- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, "</p><h1 id=\"state-title\">")807+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, "</p><h1 id=\"state-title\">")
790 if templ_7745c5c3_Err != nil {808 if templ_7745c5c3_Err != nil {
791 return templ_7745c5c3_Err809 return templ_7745c5c3_Err
792 }810 }
793- var templ_7745c5c3_Var39 string811+ var templ_7745c5c3_Var40 string
794- templ_7745c5c3_Var39, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)812+ templ_7745c5c3_Var40, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)
795 if templ_7745c5c3_Err != nil {813 if templ_7745c5c3_Err != nil {
796- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 152, Col: 33}814+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 154, Col: 33}
797 }815 }
798- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var39))816+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var40))
799 if templ_7745c5c3_Err != nil {817 if templ_7745c5c3_Err != nil {
800 return templ_7745c5c3_Err818 return templ_7745c5c3_Err
801 }819 }
802- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, "</h1>")820+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, "</h1>")
803 if templ_7745c5c3_Err != nil {821 if templ_7745c5c3_Err != nil {
804 return templ_7745c5c3_Err822 return templ_7745c5c3_Err
805 }823 }
806 for _, line := range p.Lines {824 for _, line := range p.Lines {
807- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, "<p class=\"dim\">")825+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "<p class=\"dim\">")
808 if templ_7745c5c3_Err != nil {826 if templ_7745c5c3_Err != nil {
809 return templ_7745c5c3_Err827 return templ_7745c5c3_Err
810 }828 }
811- var templ_7745c5c3_Var40 string829+ var templ_7745c5c3_Var41 string
812- templ_7745c5c3_Var40, templ_7745c5c3_Err = templ.JoinStringErrs(line)830+ templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.JoinStringErrs(line)
813 if templ_7745c5c3_Err != nil {831 if templ_7745c5c3_Err != nil {
814- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 154, Col: 25}832+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 156, Col: 25}
815 }833 }
816- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var40))834+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var41))
817 if templ_7745c5c3_Err != nil {835 if templ_7745c5c3_Err != nil {
818 return templ_7745c5c3_Err836 return templ_7745c5c3_Err
819 }837 }
820- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, "</p>")838+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, "</p>")
821 if templ_7745c5c3_Err != nil {839 if templ_7745c5c3_Err != nil {
822 return templ_7745c5c3_Err840 return templ_7745c5c3_Err
823 }841 }
@@ -828,49 +846,49 @@ func State(l Layout, p StatePage) templ.Component {
828 return templ_7745c5c3_Err846 return templ_7745c5c3_Err
829 }847 }
830 }848 }
831- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "<p class=\"state-back\">")849+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, "<p class=\"state-back\">")
832 if templ_7745c5c3_Err != nil {850 if templ_7745c5c3_Err != nil {
833 return templ_7745c5c3_Err851 return templ_7745c5c3_Err
834 }852 }
835 for _, b := range p.Back {853 for _, b := range p.Back {
836- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, "<a href=\"")854+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "<a href=\"")
837 if templ_7745c5c3_Err != nil {855 if templ_7745c5c3_Err != nil {
838 return templ_7745c5c3_Err856 return templ_7745c5c3_Err
839 }857 }
840- var templ_7745c5c3_Var41 templ.SafeURL858+ var templ_7745c5c3_Var42 templ.SafeURL
841- templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(b.Href))859+ templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(b.Href))
842 if templ_7745c5c3_Err != nil {860 if templ_7745c5c3_Err != nil {
843- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 161, Col: 36}861+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 163, Col: 36}
844 }862 }
845- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var41))863+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var42))
846 if templ_7745c5c3_Err != nil {864 if templ_7745c5c3_Err != nil {
847 return templ_7745c5c3_Err865 return templ_7745c5c3_Err
848 }866 }
849- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, "\">")867+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, "\">")
850 if templ_7745c5c3_Err != nil {868 if templ_7745c5c3_Err != nil {
851 return templ_7745c5c3_Err869 return templ_7745c5c3_Err
852 }870 }
853- var templ_7745c5c3_Var42 string871+ var templ_7745c5c3_Var43 string
854- templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.JoinStringErrs(b.Label)872+ templ_7745c5c3_Var43, templ_7745c5c3_Err = templ.JoinStringErrs(b.Label)
855 if templ_7745c5c3_Err != nil {873 if templ_7745c5c3_Err != nil {
856- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 161, Col: 48}874+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 163, Col: 48}
857 }875 }
858- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var42))876+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var43))
859 if templ_7745c5c3_Err != nil {877 if templ_7745c5c3_Err != nil {
860 return templ_7745c5c3_Err878 return templ_7745c5c3_Err
861 }879 }
862- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "</a>")880+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, "</a>")
863 if templ_7745c5c3_Err != nil {881 if templ_7745c5c3_Err != nil {
864 return templ_7745c5c3_Err882 return templ_7745c5c3_Err
865 }883 }
866 }884 }
867- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, "</p></section>")885+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, "</p></section>")
868 if templ_7745c5c3_Err != nil {886 if templ_7745c5c3_Err != nil {
869 return templ_7745c5c3_Err887 return templ_7745c5c3_Err
870 }888 }
871 return nil889 return nil
872 })890 })
873- templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var37), templ_7745c5c3_Buffer)891+ templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var38), templ_7745c5c3_Buffer)
874 if templ_7745c5c3_Err != nil {892 if templ_7745c5c3_Err != nil {
875 return templ_7745c5c3_Err893 return templ_7745c5c3_Err
876 }894 }
@@ -896,12 +914,12 @@ func Login(l Layout, p LoginPage) templ.Component {
896 }()914 }()
897 }915 }
898 ctx = templ.InitializeContext(ctx)916 ctx = templ.InitializeContext(ctx)
899- templ_7745c5c3_Var43 := templ.GetChildren(ctx)917+ templ_7745c5c3_Var44 := templ.GetChildren(ctx)
900- if templ_7745c5c3_Var43 == nil {918+ if templ_7745c5c3_Var44 == nil {
901- templ_7745c5c3_Var43 = templ.NopComponent919+ templ_7745c5c3_Var44 = templ.NopComponent
902 }920 }
903 ctx = templ.ClearChildren(ctx)921 ctx = templ.ClearChildren(ctx)
904- templ_7745c5c3_Var44 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {922+ templ_7745c5c3_Var45 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
905 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context923 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
906 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)924 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
907 if !templ_7745c5c3_IsBuffer {925 if !templ_7745c5c3_IsBuffer {
@@ -913,75 +931,75 @@ func Login(l Layout, p LoginPage) templ.Component {
913 }()931 }()
914 }932 }
915 ctx = templ.InitializeContext(ctx)933 ctx = templ.InitializeContext(ctx)
916- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, "<section class=\"state\" aria-labelledby=\"state-title\"><h1 id=\"state-title\">")934+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, "<section class=\"state\" aria-labelledby=\"state-title\"><h1 id=\"state-title\">")
917 if templ_7745c5c3_Err != nil {935 if templ_7745c5c3_Err != nil {
918 return templ_7745c5c3_Err936 return templ_7745c5c3_Err
919 }937 }
920- var templ_7745c5c3_Var45 string938+ var templ_7745c5c3_Var46 string
921- templ_7745c5c3_Var45, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)939+ templ_7745c5c3_Var46, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)
922 if templ_7745c5c3_Err != nil {940 if templ_7745c5c3_Err != nil {
923- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 173, Col: 33}941+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 175, Col: 33}
924 }942 }
925- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var45))943+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var46))
926 if templ_7745c5c3_Err != nil {944 if templ_7745c5c3_Err != nil {
927 return templ_7745c5c3_Err945 return templ_7745c5c3_Err
928 }946 }
929- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, "</h1>")947+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, "</h1>")
930 if templ_7745c5c3_Err != nil {948 if templ_7745c5c3_Err != nil {
931 return templ_7745c5c3_Err949 return templ_7745c5c3_Err
932 }950 }
933 for _, line := range p.Lines {951 for _, line := range p.Lines {
934- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, "<p class=\"dim\">")952+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, "<p class=\"dim\">")
935 if templ_7745c5c3_Err != nil {953 if templ_7745c5c3_Err != nil {
936 return templ_7745c5c3_Err954 return templ_7745c5c3_Err
937 }955 }
938- var templ_7745c5c3_Var46 string956+ var templ_7745c5c3_Var47 string
939- templ_7745c5c3_Var46, templ_7745c5c3_Err = templ.JoinStringErrs(line)957+ templ_7745c5c3_Var47, templ_7745c5c3_Err = templ.JoinStringErrs(line)
940 if templ_7745c5c3_Err != nil {958 if templ_7745c5c3_Err != nil {
941- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 175, Col: 25}959+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 177, Col: 25}
942 }960 }
943- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var46))961+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var47))
944 if templ_7745c5c3_Err != nil {962 if templ_7745c5c3_Err != nil {
945 return templ_7745c5c3_Err963 return templ_7745c5c3_Err
946 }964 }
947- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, "</p>")965+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 73, "</p>")
948 if templ_7745c5c3_Err != nil {966 if templ_7745c5c3_Err != nil {
949 return templ_7745c5c3_Err967 return templ_7745c5c3_Err
950 }968 }
951 }969 }
952- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, "<form class=\"state-act\" method=\"post\" action=\"")970+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, "<form class=\"state-act\" method=\"post\" action=\"")
953 if templ_7745c5c3_Err != nil {971 if templ_7745c5c3_Err != nil {
954 return templ_7745c5c3_Err972 return templ_7745c5c3_Err
955 }973 }
956- var templ_7745c5c3_Var47 templ.SafeURL974+ var templ_7745c5c3_Var48 templ.SafeURL
957- templ_7745c5c3_Var47, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Action))975+ templ_7745c5c3_Var48, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Action))
958 if templ_7745c5c3_Err != nil {976 if templ_7745c5c3_Err != nil {
959- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 177, Col: 73}977+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 179, Col: 73}
960 }978 }
961- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var47))979+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var48))
962 if templ_7745c5c3_Err != nil {980 if templ_7745c5c3_Err != nil {
963 return templ_7745c5c3_Err981 return templ_7745c5c3_Err
964 }982 }
965- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 73, "\"><button type=\"submit\" class=\"btn primary\">")983+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, "\"><button type=\"submit\" class=\"btn primary\">")
966 if templ_7745c5c3_Err != nil {984 if templ_7745c5c3_Err != nil {
967 return templ_7745c5c3_Err985 return templ_7745c5c3_Err
968 }986 }
969- var templ_7745c5c3_Var48 string987+ var templ_7745c5c3_Var49 string
970- templ_7745c5c3_Var48, templ_7745c5c3_Err = templ.JoinStringErrs(p.Button)988+ templ_7745c5c3_Var49, templ_7745c5c3_Err = templ.JoinStringErrs(p.Button)
971 if templ_7745c5c3_Err != nil {989 if templ_7745c5c3_Err != nil {
972- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 178, Col: 56}990+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 180, Col: 56}
973 }991 }
974- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var48))992+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var49))
975 if templ_7745c5c3_Err != nil {993 if templ_7745c5c3_Err != nil {
976 return templ_7745c5c3_Err994 return templ_7745c5c3_Err
977 }995 }
978- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, "</button></form><p class=\"state-back\"><a href=\"/\">Back to home</a></p></section>")996+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 76, "</button></form><p class=\"state-back\"><a href=\"/\">Back to home</a></p></section>")
979 if templ_7745c5c3_Err != nil {997 if templ_7745c5c3_Err != nil {
980 return templ_7745c5c3_Err998 return templ_7745c5c3_Err
981 }999 }
982 return nil1000 return nil
983 })1001 })
984- templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var44), templ_7745c5c3_Buffer)1002+ templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var45), templ_7745c5c3_Buffer)
985 if templ_7745c5c3_Err != nil {1003 if templ_7745c5c3_Err != nil {
986 return templ_7745c5c3_Err1004 return templ_7745c5c3_Err
987 }1005 }
M internal/adapters/web/shell.templ +1 -1
@@ -26,7 +26,7 @@ templ Shell(l Layout, rail templ.Component) {
2626 @Header(l)
2727 <div class={ "work", templ.KV("has-rail", l.HasRail && rail != nil) }>
2828 if l.Lede != "" {
29- <p class="lede work-lede">{ l.Lede }</p>
29+ <section class="work-lede" aria-label="Description"><p class="lede">{ l.Lede }</p></section>
3030 }
3131 <main id="main" tabindex="-1">
3232 { children... }
@@ -26,7 +26,7 @@ templ Shell(l Layout, rail templ.Component) {
26 @Header(l)26 @Header(l)
27 <div class={ "work", templ.KV("has-rail", l.HasRail && rail != nil) }>27 <div class={ "work", templ.KV("has-rail", l.HasRail && rail != nil) }>
28 if l.Lede != "" {28 if l.Lede != "" {
29- <p class="lede work-lede">{ l.Lede }</p>29+ <section class="work-lede" aria-label="Description"><p class="lede">{ l.Lede }</p></section>
30 }30 }
31 <main id="main" tabindex="-1">31 <main id="main" tabindex="-1">
32 { children... }32 { children... }
M internal/adapters/web/shell_templ.go +3 -3 generated file: collapsed
M internal/adapters/web/static/css/20-shell.css +0 -1
@@ -124,7 +124,6 @@
124124 .rail section > :not(h2) { margin: var(--s3) var(--s4); }
125125 .rail section > .list { margin: var(--s2) 0; }
126126 .rail section > p + p { margin-top: calc(-1 * var(--s2)); }
127- .rail h2 .count + a { margin-left: auto; }
128127
129128 /* newest tag in the summary rail */
130129 .latest-tag {
@@ -124,7 +124,6 @@
124 .rail section > :not(h2) { margin: var(--s3) var(--s4); }124 .rail section > :not(h2) { margin: var(--s3) var(--s4); }
125 .rail section > .list { margin: var(--s2) 0; }125 .rail section > .list { margin: var(--s2) 0; }
126 .rail section > p + p { margin-top: calc(-1 * var(--s2)); }126 .rail section > p + p { margin-top: calc(-1 * var(--s2)); }
127- .rail h2 .count + a { margin-left: auto; }
128 127
129 /* newest tag in the summary rail */128 /* newest tag in the summary rail */
130 .latest-tag {129 .latest-tag {
D internal/adapters/web/static/icon.svg +0 -19
@@ -1,19 +0,0 @@
1-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
2- <rect x=".5" y=".5" width="31" height="31" rx="7" fill="#181818" stroke="#2c2c2c"/>
3- <circle cx="22.5" cy="20" r="9" fill="#fff" opacity=".06"/>
4- <circle cx="6" cy="6.5" r=".7" fill="#5a5a5a"/>
5- <circle cx="15" cy="4.5" r=".55" fill="#4a4a4a"/>
6- <rect x="3" y="25.6" width="26" height="1.2" rx=".6" fill="#333"/>
7- <rect x="4" y="21.4" width="8" height="4.2" rx="1.6" fill="#555"/>
8- <g fill="none" stroke="#cfcfcf" stroke-linecap="round" stroke-linejoin="round">
9- <path stroke-width="4.4" d="M10.6 13.2 Q8.2 16.4 8.6 20.4"/>
10- <path stroke-width="3.4" d="M8.8 20.2 L14.4 19.2 L15 25"/>
11- <path stroke-width="2.2" d="M10.8 14.6 Q14 17.6 17 17"/>
12- </g>
13- <circle cx="11.6" cy="9.8" r="2.6" fill="#cfcfcf"/>
14- <path stroke="#6e6e6e" stroke-width="1.6" stroke-linecap="round" d="M18.8 25.4 L26.4 23.4 M18.8 23.4 L26.4 25.4"/>
15- <path fill="#f2f2f2" d="M22.6 23.6 C19.6 22.6 19.7 19.2 21.5 16.4 C21.7 18.2 22.6 18.8 23.2 17.5 C23.4 15.8 22.9 14.6 22.4 13.8 C25.2 15.2 27.2 18.8 25.7 21.8 C25.2 22.8 24 23.6 22.6 23.6 Z"/>
16- <path fill="#8a8a8a" d="M22.7 23.2 C21.4 22.7 21.4 21 22.5 19.6 C22.7 20.6 23.4 20.8 23.8 20.2 C24.7 21.5 24.2 23.1 22.7 23.2 Z"/>
17- <circle cx="20.6" cy="12.6" r=".55" fill="#9a9a9a"/>
18- <circle cx="25.2" cy="11.2" r=".45" fill="#777"/>
19-</svg>
@@ -1,19 +0,0 @@
1-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
2- <rect x=".5" y=".5" width="31" height="31" rx="7" fill="#181818" stroke="#2c2c2c"/>
3- <circle cx="22.5" cy="20" r="9" fill="#fff" opacity=".06"/>
4- <circle cx="6" cy="6.5" r=".7" fill="#5a5a5a"/>
5- <circle cx="15" cy="4.5" r=".55" fill="#4a4a4a"/>
6- <rect x="3" y="25.6" width="26" height="1.2" rx=".6" fill="#333"/>
7- <rect x="4" y="21.4" width="8" height="4.2" rx="1.6" fill="#555"/>
8- <g fill="none" stroke="#cfcfcf" stroke-linecap="round" stroke-linejoin="round">
9- <path stroke-width="4.4" d="M10.6 13.2 Q8.2 16.4 8.6 20.4"/>
10- <path stroke-width="3.4" d="M8.8 20.2 L14.4 19.2 L15 25"/>
11- <path stroke-width="2.2" d="M10.8 14.6 Q14 17.6 17 17"/>
12- </g>
13- <circle cx="11.6" cy="9.8" r="2.6" fill="#cfcfcf"/>
14- <path stroke="#6e6e6e" stroke-width="1.6" stroke-linecap="round" d="M18.8 25.4 L26.4 23.4 M18.8 23.4 L26.4 25.4"/>
15- <path fill="#f2f2f2" d="M22.6 23.6 C19.6 22.6 19.7 19.2 21.5 16.4 C21.7 18.2 22.6 18.8 23.2 17.5 C23.4 15.8 22.9 14.6 22.4 13.8 C25.2 15.2 27.2 18.8 25.7 21.8 C25.2 22.8 24 23.6 22.6 23.6 Z"/>
16- <path fill="#8a8a8a" d="M22.7 23.2 C21.4 22.7 21.4 21 22.5 19.6 C22.7 20.6 23.4 20.8 23.8 20.2 C24.7 21.5 24.2 23.1 22.7 23.2 Z"/>
17- <circle cx="20.6" cy="12.6" r=".55" fill="#9a9a9a"/>
18- <circle cx="25.2" cy="11.2" r=".45" fill="#777"/>
19-</svg>

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 2

Tags 42

↑↓ moveenter openesc close