@takagaki/cortex-decisions-viewer 0.12.152 → 0.12.155
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.
- package/dist/build.js +2 -2
- package/dist/render.js +24 -12
- package/package.json +1 -1
package/dist/build.js
CHANGED
|
@@ -213,7 +213,7 @@ function sanitizeBody(html) {
|
|
|
213
213
|
* (サニタイズ済みHTMLはテキスト・属性値中の `<` `"` をエスケープ済み)。
|
|
214
214
|
*/
|
|
215
215
|
async function renderRecordBody(markdown) {
|
|
216
|
-
const html = sanitizeBody(await marked_1.marked.parse(markdown, { async: true }))
|
|
216
|
+
const html = sanitizeBody(await marked_1.marked.parse(markdown, { async: true, breaks: true }))
|
|
217
217
|
.replace(/^\s*<h1[^>]*>[\s\S]*?<\/h1>\s*/, "");
|
|
218
218
|
return externalLinksToNewTab(html);
|
|
219
219
|
}
|
|
@@ -222,7 +222,7 @@ async function renderRecordBody(markdown) {
|
|
|
222
222
|
* 順序の理由は renderRecordBody と同じ。
|
|
223
223
|
*/
|
|
224
224
|
async function renderGroundingSection(markdown) {
|
|
225
|
-
return externalLinksToNewTab(sanitizeBody(await marked_1.marked.parse(markdown, { async: true })));
|
|
225
|
+
return externalLinksToNewTab(sanitizeBody(await marked_1.marked.parse(markdown, { async: true, breaks: true })));
|
|
226
226
|
}
|
|
227
227
|
/**
|
|
228
228
|
* 本文markdownを、検索用の軽量plaintextに変換する。
|
package/dist/render.js
CHANGED
|
@@ -4971,14 +4971,13 @@ button.site-icon[aria-busy="true"] .site-icon-plus { opacity: 0; }
|
|
|
4971
4971
|
.card-facet { overflow-wrap: anywhere; min-width: 0; }
|
|
4972
4972
|
.card-facet-yomi { font-size: 11.5px; }
|
|
4973
4973
|
.card-titlerow { display: flex; align-items: baseline; gap: 12px; margin: 0 0 6px; }
|
|
4974
|
-
.card-titlerow .card-title { flex:
|
|
4975
|
-
/*
|
|
4974
|
+
.card-titlerow .card-title { flex: 0 1 auto; min-width: 0; overflow-wrap: anywhere; margin: 2px 0 0; }
|
|
4975
|
+
/* 関係者のアイコン(名前のすぐ右・一覧と各ページで同じ見た目。名前は他の区画と同じく左詰め)。portal.id がある人はポータルの人のページへのリンク */
|
|
4976
4976
|
.card-namerow { display: flex; align-items: center; gap: 10px; margin: 2px 0 6px; }
|
|
4977
|
-
.card-namerow .card-title { flex:
|
|
4978
|
-
.card-titlerow .mface { align-self: center;
|
|
4979
|
-
.card-namerow .mface, .detail-namerow .mface { margin-left: auto; }
|
|
4977
|
+
.card-namerow .card-title { flex: 0 1 auto; min-width: 0; overflow-wrap: anywhere; margin: 0; }
|
|
4978
|
+
.card-titlerow .mface { align-self: center; }
|
|
4980
4979
|
.detail-namerow { display: flex; align-items: center; gap: 12px; margin: 0 0 10px; }
|
|
4981
|
-
.detail-namerow .detail-title { margin: 0; min-width: 0; flex:
|
|
4980
|
+
.detail-namerow .detail-title { margin: 0; min-width: 0; flex: 0 1 auto; overflow-wrap: anywhere; }
|
|
4982
4981
|
.mface { position: relative; flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; border-radius: 50%; overflow: hidden; background: var(--border, #e5e7eb); color: var(--muted, #6b7280); font-size: 13px; font-weight: 700; line-height: 1; text-decoration: none; box-sizing: border-box; }
|
|
4983
4982
|
a.mface:hover { box-shadow: 0 0 0 2px var(--accent, #4f46e5); }
|
|
4984
4983
|
.mface svg { width: 18px; height: 18px; display: block; }
|
|
@@ -5140,7 +5139,7 @@ a.pager-btn:hover { text-decoration: none; }
|
|
|
5140
5139
|
/* ---- 記録ページの「更新履歴」(engine の帳簿由来・#1094 便 35b-1 U2)----
|
|
5141
5140
|
1 行 = 日付・誰・何・きっかけ・GitHub で見る。区切りの「・」は CSS で足す(文字列に混ぜない) */
|
|
5142
5141
|
.change-log { margin-top: 28px; padding-top: 16px; border-top: 1px solid var(--border); }
|
|
5143
|
-
.ch-summary { cursor: pointer; }
|
|
5142
|
+
.ch-summary { cursor: pointer; color: var(--muted); }
|
|
5144
5143
|
.ch-summary .section-label { display: inline; margin: 0; }
|
|
5145
5144
|
.ch-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: 12px; margin-top: 8px; }
|
|
5146
5145
|
.ch-head a { font-size: 12.5px; }
|
|
@@ -8117,7 +8116,7 @@ ${story_1.splitByNameLinks.toString()}
|
|
|
8117
8116
|
}
|
|
8118
8117
|
|
|
8119
8118
|
/** 一覧カードの頭(上の段 + 題)を組む。左側の中身(札・日付・エラーの札)が 1 つも無いときは
|
|
8120
|
-
* 空の .card-meta を作らず、題の行に「🕸 つながり」を置く(#1094
|
|
8119
|
+
* 空の .card-meta を作らず、題の行に「🕸 つながり」を置く(#1094)。関係者のアイコンはどちらの経路でも名前のすぐ右。 */
|
|
8121
8120
|
function cardHead(rec, leftNodes, titleExtra) {
|
|
8122
8121
|
var trace = el("a", { class: "mc-trace", href: "?tab=graph", text: "🕸 つながり" });
|
|
8123
8122
|
trace.addEventListener("click", function (ev) { ev.preventDefault(); ev.stopPropagation(); openExplorerFor(rec); });
|
|
@@ -8125,9 +8124,9 @@ ${story_1.splitByNameLinks.toString()}
|
|
|
8125
8124
|
var eb = fmErrorBadge(rec);
|
|
8126
8125
|
if (eb) meta.appendChild(eb);
|
|
8127
8126
|
var title = cardTitleLink(rec, titleExtra);
|
|
8128
|
-
//
|
|
8127
|
+
// 関係者は名前のすぐ右にアイコン(詳細と同じ mfAvatar・名前は左詰め)
|
|
8129
8128
|
var face = isMemberRec(rec) ? mfAvatar(rec) : null;
|
|
8130
|
-
if (!meta.childNodes.length) return [el("div", { class: "card-titlerow" }, [title,
|
|
8129
|
+
if (!meta.childNodes.length) return [el("div", { class: "card-titlerow" }, [title, face, trace])];
|
|
8131
8130
|
meta.appendChild(trace);
|
|
8132
8131
|
return [meta, face ? el("div", { class: "card-namerow" }, [title, face]) : title];
|
|
8133
8132
|
}
|
|
@@ -20052,6 +20051,7 @@ ${story_1.splitByNameLinks.toString()}
|
|
|
20052
20051
|
* 「作ったはずのものが出てこない」状態が永久に続く(破棄の条件は applyDeleteTombstones)。
|
|
20053
20052
|
*/
|
|
20054
20053
|
function deletedStoreKey() { return "cortex-deleted:" + REPO_SLUG; }
|
|
20054
|
+
var TOMBSTONE_TTL_MS = 24 * 60 * 60 * 1000;
|
|
20055
20055
|
// 「削除より後に始まったビルドか」を判断するときの余裕は PENDING_OPS_MARGIN_MS(30分)。
|
|
20056
20056
|
// **同じ性質の待ちなので定数も1つ**(#391)——別に持つと片方だけ直したときに割れる
|
|
20057
20057
|
|
|
@@ -20094,8 +20094,19 @@ ${story_1.splitByNameLinks.toString()}
|
|
|
20094
20094
|
* クライアントの時計が大きく狂っていても機能が丸ごとは死なない(進んだ時計なら
|
|
20095
20095
|
* 再表示が遅れるだけ)。
|
|
20096
20096
|
*/
|
|
20097
|
-
function tombstoneStale(t, nowMs) {
|
|
20097
|
+
function tombstoneStale(t, nowMs, clockMs) {
|
|
20098
20098
|
if (!t) return false;
|
|
20099
|
+
// 読めない時刻の印は捨てる(壊れた値が隠し続ける側に倒れない)
|
|
20100
|
+
if (typeof t.at !== "number" || !isFinite(t.at)) return true;
|
|
20101
|
+
// 期限切れ(24 時間)。クライアントの時計は注入できる(テスト用 window.__cortexNowMs)
|
|
20102
|
+
if (clockMs - t.at > TOMBSTONE_TTL_MS) return true;
|
|
20103
|
+
// 画面の世代が、削除した画面の世代(gen0)より新しくなった=新しい世代に記録が居るなら、
|
|
20104
|
+
// 戻された(または作り直された)もの。余裕は取らない(取ると、戻した直後の世代で
|
|
20105
|
+
// 消した本人にだけ記録が出ない)。代わりに、削除前の状態から始まったビルドが削除後に
|
|
20106
|
+
// 完成した場合は、次のビルドまで本人にだけ一時的に戻って見える(発注書で了解済みの取捨選択)
|
|
20107
|
+
var g = pendingSiteTimeMs(t.gen0);
|
|
20108
|
+
if (!isNaN(nowMs) && !isNaN(g) && nowMs > g) return true;
|
|
20109
|
+
// gen0 が読めない古い形式は、削除時刻だけで見る(後方互換)
|
|
20099
20110
|
return pendingStale(t.at, t.gen0, nowMs);
|
|
20100
20111
|
}
|
|
20101
20112
|
/** トゥームストーンの相手を SITE から探す(id で引き、無ければパスで照合) */
|
|
@@ -20122,13 +20133,14 @@ ${story_1.splitByNameLinks.toString()}
|
|
|
20122
20133
|
var list = readTombstones();
|
|
20123
20134
|
if (!list.length) return;
|
|
20124
20135
|
var nowMs = pendingSiteTimeMs(SITE.generatedAt);
|
|
20136
|
+
var clockMs = typeof window.__cortexNowMs === "number" ? window.__cortexNowMs : Date.now();
|
|
20125
20137
|
var kept = [];
|
|
20126
20138
|
for (var i = 0; i < list.length; i++) {
|
|
20127
20139
|
var t = list[i];
|
|
20128
20140
|
if (!t || typeof t.path !== "string" || !t.path) continue;
|
|
20129
20141
|
var rec = findTombstoned(t);
|
|
20130
20142
|
if (!rec) continue;
|
|
20131
|
-
if (tombstoneStale(t, nowMs)) continue;
|
|
20143
|
+
if (tombstoneStale(t, nowMs, clockMs)) continue;
|
|
20132
20144
|
rec.deleted = true;
|
|
20133
20145
|
kept.push(t);
|
|
20134
20146
|
}
|
package/package.json
CHANGED