@takagaki/cortex-decisions-viewer 0.12.108 → 0.12.110

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/render.js +112 -13
  2. package/package.json +1 -1
package/dist/render.js CHANGED
@@ -4912,6 +4912,9 @@ button.site-icon[aria-busy="true"] .site-icon-plus { opacity: 0; }
4912
4912
  cursor: pointer; transition: border-color .12s, transform .12s;
4913
4913
  }
4914
4914
  .card:hover { border-color: var(--accent); }
4915
+ /* 前へ/次へで移った後に一覧へ戻ったときの、今開いていたカードの目印(分類B・オーナー指摘)。
4916
+ 新しい見た目は作らず、.card:hover と同じ強調(アクセント色の枠)を使い回す */
4917
+ .card.is-returned-to { border-color: var(--accent); }
4915
4918
  .card-meta { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; font-size: 12.5px; color: var(--muted); margin-bottom: 6px; }
4916
4919
  /* card-title はカードの見出し(#1 新しいタブでも開けるよう <a> にした)。見た目は元の <div> と揃える */
4917
4920
  .card-title { display: block; font-size: 16px; font-weight: 650; margin: 2px 0 6px; color: var(--text); }
@@ -4926,8 +4929,10 @@ a.pager-btn:hover { text-decoration: none; }
4926
4929
  /* 前へ/次へ(#2)の端は <a> ではなく <span>(キーボードでも踏めないように)。このクラスで見た目をそろえる */
4927
4930
  .pager-btn.is-disabled { opacity: .4; cursor: default; pointer-events: none; }
4928
4931
  .pager-ind { color: var(--muted); font-size: 13px; min-width: 72px; text-align: center; }
4929
- /* 詳細の「前へ/次へ」は本文の上(戻るリンクのすぐ下)に置くので、一覧の下の余白は要らない */
4930
- .detail-pager { justify-content: flex-start; padding: 0 0 16px; }
4932
+ /* 詳細の「前へ/次へ」は本文の上(戻るリンクのすぐ下)に置くので、一覧の下の余白は要らない。
4933
+ 「前へ」は左端・「次へ」は右端に置く(オーナー指摘)。常に両方の <a>/<span> が居るので、
4934
+ 端で押せない側があっても space-between でもう片方の位置は動かない */
4935
+ .detail-pager { justify-content: space-between; padding: 0 0 16px; }
4931
4936
 
4932
4937
  /* ---- badges / chips ---- */
4933
4938
  .badge {
@@ -8594,6 +8599,11 @@ ${calendarAddUrl.toString()}
8594
8599
  // ⚠ 詳細→詳細(後述の前へ/次へ)では更新しない。** 更新すると、何件か読み進めてから
8595
8600
  // 一覧へ戻ったときに「最後に見ていた詳細でのスクロール位置」に飛んでしまう。
8596
8601
  // 一覧に戻る行き先は常に「一覧を離れたときの位置」でなければならない
8602
+ //
8603
+ // ⚠ ただし前へ/次へを使った後は、この「離れたときの位置」より下の pagerNavUsed /
8604
+ // currentDetailId(オーナー指摘・分類B 2026-10-02)が優先する。** 前へ/次へで
8605
+ // 10件先へ移ってから「一覧へ戻る」と、離れたときの位置ではなく今開いている記録の
8606
+ // カードの位置へ戻るべき、という指摘のため
8597
8607
  var savedListScrollY = 0;
8598
8608
  // どのタブの一覧で覚えた位置か(実装レビュー②)。** route() は詳細を描くとき、その記録の
8599
8609
  // 種類で listState.tab を書き換える(例: 用語集の一覧からウィキリンクで決定の詳細へ移ると
@@ -8604,17 +8614,89 @@ ${calendarAddUrl.toString()}
8604
8614
  // 直前に描いたのが詳細(not foundも含む)か一覧か。popstate(ブラウザの戻る/進む)は
8605
8615
  // go() を通らないので、この印で「詳細→一覧」の遷移だけを見分けて復元する
8606
8616
  var lastWasDetail = false;
8617
+ // 今の詳細(currentDetailId)に着いた最後の移動が、前へ/次へ(buildDetailPager の
8618
+ // navBtn)経由だったか(オーナー指摘・分類B 2026-10-02。実装レビューで、前へ/次への
8619
+ // 後に本文中のウィキリンクを挟む等の「直前だけ別経路」のときに古い値が残っていた不具合
8620
+ // が見つかり、go() の呼び出しごとに毎回立て直す形に直した)。一覧へ戻るとき true なら、
8621
+ // savedListScrollY ではなく今開いている記録(currentDetailId)のカードの位置へ戻す
8622
+ var pagerNavUsed = false;
8623
+ // 今いる詳細のレコードID(renderDetail/renderGenericDetail の先頭で更新)。
8624
+ // pagerNavUsed と組みで、一覧へ戻るときにどのカードへ戻せばよいかを覚える
8625
+ var currentDetailId = null;
8607
8626
  if ("scrollRestoration" in history) history.scrollRestoration = "manual";
8608
8627
 
8609
- function go(id) {
8628
+ /**
8629
+ * 今のタブで一覧に並んでいる順(絞り込み後)。前へ/次へ(pagerOrder/buildDetailPager)
8630
+ * と同じ並びを使う——ここだけ別の並びにすると、戻ったときのページ・位置が実際の
8631
+ * 一覧とずれる
8632
+ */
8633
+ function currentTabFilteredItems() {
8634
+ if (listState.tab === "decisions") return filteredDecisions();
8635
+ return filteredGenericItems(findTab(listState.tab));
8636
+ }
8637
+
8638
+ /**
8639
+ * 前へ/次へで今開いている記録(currentDetailId)が、一覧の何ページ目に出るか。
8640
+ * 絞り込みに現れない(#2 のフォールバックと同じ状況)ときは null——その場合は
8641
+ * カードが一覧に無いので、呼び出し側は今までどおりの位置に任せる
8642
+ */
8643
+ function pageOfCurrentDetail() {
8644
+ var items = currentTabFilteredItems();
8645
+ for (var i = 0; i < items.length; i++) {
8646
+ if (items[i].id === currentDetailId) return Math.floor(i / PAGE_SIZE) + 1;
8647
+ }
8648
+ return null;
8649
+ }
8650
+
8651
+ /**
8652
+ * 今開いているページの中から id のカードを探し、画面に入る位置へスクロールして
8653
+ * 少しだけ目立たせる(.is-returned-to は .card:hover と同じ強調の使い回し。新しい
8654
+ * 見た目は作らない)。見つからなければ何もせず false——呼び出し側が今までどおりの
8655
+ * 位置(savedListScrollY)にフォールバックする
8656
+ */
8657
+ function scrollToDetailCard(id) {
8658
+ var cards = document.querySelectorAll(".card[data-record-id]");
8659
+ var card = null;
8660
+ for (var i = 0; i < cards.length; i++) {
8661
+ if (cards[i].getAttribute("data-record-id") === id) { card = cards[i]; break; }
8662
+ }
8663
+ if (!card) return false;
8664
+ if (card.scrollIntoView) card.scrollIntoView({ block: "center" });
8665
+ card.classList.add("is-returned-to");
8666
+ setTimeout(function () { card.classList.remove("is-returned-to"); }, 1500);
8667
+ return true;
8668
+ }
8669
+
8670
+ /**
8671
+ * @param viaPager buildDetailPager の navBtn(前へ/次へ)からの呼び出しだけ true。
8672
+ * ⚠ **直前の1回だけを見る(実装レビューで判明)。** 前へ/次へを何度か使った後でも、
8673
+ * 間に本文中のウィキリンク等(viaPager 無し)を1回でも挟めば、その時点で false に
8674
+ * 戻す——戻すのは「今の詳細(currentDetailId)に着いた最後の移動」の種類であって、
8675
+ * 一覧を離れてから1回でも前へ/次へを使ったか、ではない。でないと、前へ/次へ→
8676
+ * ウィキリンクで別の記録へ、と移ってから一覧へ戻ったときに、ウィキリンクで着いた
8677
+ * 記録が「前へ/次へで着いた」ことになってしまう
8678
+ */
8679
+ function go(id, viaPager) {
8610
8680
  // 一覧から詳細へ移るときだけ、今の一覧のスクロール位置とタブを覚える
8611
8681
  if (id && !lastWasDetail) { savedListScrollY = window.scrollY; savedListTab = listState.tab; }
8682
+ // 前へ/次へを使った後に一覧へ戻るなら、今開いている記録のカードが出るページへ
8683
+ var usePagerTarget = !id && pagerNavUsed && currentDetailId;
8684
+ if (usePagerTarget) { var p = pageOfCurrentDetail(); if (p) listState.page = p; }
8612
8685
  var url = id ? "?id=" + encodeURIComponent(id) : tabUrl(listState.tab);
8613
- history.pushState({}, "", url);
8686
+ // viaPager を履歴に残す。ブラウザの戻る/進む(popstate)は go() を通らないので、
8687
+ // その着地が前へ/次へ経由だったかを後から知る手がかりがここにしか無い
8688
+ history.pushState({ viaPager: !!viaPager }, "", url);
8614
8689
  route();
8615
- // 詳細は常に先頭から。一覧は、離れたときと同じタブに戻るときだけ元の位置へ
8616
- if (id) window.scrollTo(0, 0);
8617
- else window.scrollTo(0, listState.tab === savedListTab ? savedListScrollY : 0);
8690
+ // 詳細は常に先頭から。一覧は、前へ/次へを使っていれば今の記録のカードへ、
8691
+ // 使っていなければ離れたときと同じタブに戻るときだけ元の位置へ
8692
+ if (id) {
8693
+ pagerNavUsed = !!viaPager;
8694
+ window.scrollTo(0, 0);
8695
+ } else {
8696
+ if (!(usePagerTarget && scrollToDetailCard(currentDetailId))) {
8697
+ window.scrollTo(0, listState.tab === savedListTab ? savedListScrollY : 0);
8698
+ }
8699
+ }
8618
8700
  }
8619
8701
 
8620
8702
  var listState = { tab: DEFAULT_TAB, q: "", category: "", month: "", status: "", page: 1 };
@@ -20177,16 +20259,19 @@ ${calendarAddUrl.toString()}
20177
20259
  var prevRec = idx > 0 ? ordered[idx - 1] : null;
20178
20260
  var nextRec = idx < ordered.length - 1 ? ordered[idx + 1] : null;
20179
20261
  function navBtn(rec, cls, text) {
20262
+ // 見た目は新設せず、同じ詳細画面の「つながり」ボタン(.trace-btn)のリキッドグラス
20263
+ // (角丸・やわらかい影・半透明の地)をそのまま使い回す(オーナー指摘)
20180
20264
  // 端では押せない。<a href="#"> のままだとポインタは止められても、Tab→Enter では
20181
20265
  // 踏めてしまう(#へ飛んで popstate が走り、詳細を描き直してしまう)ので、
20182
20266
  // 端では href を持たない <span> にする(実装レビュー④)
20183
- if (!rec) return el("span", { class: "pager-btn is-disabled " + cls, "aria-disabled": "true", text: text });
20184
- var a = el("a", { class: "pager-btn " + cls, href: "?id=" + encodeURIComponent(rec.id), text: text });
20267
+ if (!rec) return el("span", { class: "pager-btn trace-btn is-disabled " + cls, "aria-disabled": "true", text: text });
20268
+ var a = el("a", { class: "pager-btn trace-btn " + cls, href: "?id=" + encodeURIComponent(rec.id), text: text });
20185
20269
  a.addEventListener("click", function (ev) {
20186
20270
  if (!isPlainClick(ev)) { ev.stopPropagation(); return; }
20187
20271
  ev.preventDefault();
20188
20272
  ev.stopPropagation();
20189
- go(rec.id);
20273
+ // 前へ/次へを使ったので、一覧へ戻るときは今の記録のカードの位置へ(オーナー指摘・分類B 2026-10-02)
20274
+ go(rec.id, true);
20190
20275
  });
20191
20276
  return a;
20192
20277
  }
@@ -20220,6 +20305,7 @@ ${calendarAddUrl.toString()}
20220
20305
  // ---------- 汎用詳細 ----------
20221
20306
  function renderGenericDetail(r) {
20222
20307
  lastWasDetail = true;
20308
+ currentDetailId = r.id;
20223
20309
  app.innerHTML = "";
20224
20310
  countEl.textContent = "";
20225
20311
 
@@ -20919,6 +21005,7 @@ ${calendarAddUrl.toString()}
20919
21005
  // ---------- Decision詳細 ----------
20920
21006
  function renderDetail(d) {
20921
21007
  lastWasDetail = true;
21008
+ currentDetailId = d.id;
20922
21009
  app.innerHTML = "";
20923
21010
  countEl.textContent = "";
20924
21011
 
@@ -21010,6 +21097,8 @@ ${calendarAddUrl.toString()}
21010
21097
 
21011
21098
  function renderNotFound(id) {
21012
21099
  lastWasDetail = true;
21100
+ // 実在しない記録なので、戻る先のカードは無い(今までどおりの位置にフォールバックさせる)
21101
+ currentDetailId = null;
21013
21102
  app.innerHTML = "";
21014
21103
  var back = el("a", { class: "detail-back", href: "?", text: "← 一覧へ戻る" });
21015
21104
  back.addEventListener("click", function (ev) { ev.preventDefault(); go(null); });
@@ -21496,19 +21585,29 @@ ${calendarAddUrl.toString()}
21496
21585
 
21497
21586
  // ブラウザの「戻る」「進む」。go() を通らないので、ここで一覧⇄詳細のスクロールだけ別に見る
21498
21587
  // (#1 ブラウザの戻るでも一覧のスクロール位置を保つ)
21499
- window.addEventListener("popstate", function () {
21588
+ window.addEventListener("popstate", function (ev) {
21500
21589
  var goingToId = getParam("id");
21501
21590
  var cameFromDetail = lastWasDetail;
21502
21591
  // 「進む」で一覧→詳細に戻ることもある(戻る→スクロール→進む、で位置が古くなる実装レビュー③)。
21503
21592
  // go() と同じ条件で、そのときの一覧の位置とタブを覚え直す
21504
21593
  if (goingToId && !cameFromDetail) { savedListScrollY = window.scrollY; savedListTab = listState.tab; }
21594
+ // ブラウザの「戻る」で一覧へ戻るときも、go() と同じく前へ/次へを使っていたら
21595
+ // 今開いている記録のカードが出るページへ(オーナー指摘・分類B 2026-10-02)
21596
+ var usePagerTarget = !goingToId && cameFromDetail && pagerNavUsed && currentDetailId;
21597
+ if (usePagerTarget) { var p = pageOfCurrentDetail(); if (p) listState.page = p; }
21505
21598
  route();
21506
21599
  if (!goingToId && cameFromDetail) {
21507
- // 一覧へ戻る。離れたときと同じタブのときだけ元の位置へ(違えば先頭)
21508
- window.scrollTo(0, listState.tab === savedListTab ? savedListScrollY : 0);
21600
+ // 一覧へ戻る。前へ/次へを使っていれば今の記録のカードへ、使っていなければ
21601
+ // 離れたときと同じタブのときだけ元の位置へ(違えば先頭)
21602
+ if (!(usePagerTarget && scrollToDetailCard(currentDetailId))) {
21603
+ window.scrollTo(0, listState.tab === savedListTab ? savedListScrollY : 0);
21604
+ }
21509
21605
  } else if (goingToId) {
21510
21606
  // 詳細はブラウザの戻る/進むでも常に先頭から
21511
21607
  // (scrollRestoration を manual にしたので、ここで明示しないとブラウザがどこへも戻さない)
21608
+ // pagerNavUsed も go() と同じく、この着地が前へ/次へ経由だったか(history.state.viaPager)
21609
+ // で立て直す——go() を通らない popstate では、ここだけがその情報を持っている
21610
+ pagerNavUsed = !!(ev.state && ev.state.viaPager);
21512
21611
  window.scrollTo(0, 0);
21513
21612
  }
21514
21613
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@takagaki/cortex-decisions-viewer",
3
- "version": "0.12.108",
3
+ "version": "0.12.110",
4
4
  "description": "Cortexの意思決定記録(Decisions/*.md)を静的サイトにビルドして閲覧する。各レコードに「Edit on GitHub」リンクを付与する。",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,