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 generated file: collapsed
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