diff --git a/index.js b/index.js index 217d3fd..9c01258 100644 --- a/index.js +++ b/index.js @@ -496,6 +496,7 @@ const defaultSettings = { compressionEveryN: 10, // UI 面板 + noticeDisplayMode: "normal", // normal|compact panelTheme: "crimson", // 面板主题 crimson|cyan|amber|violet }; @@ -1054,6 +1055,30 @@ function syncStageNoticeAbortAction(stage) { }); } +function getStageNoticeDisplayMode(level = "info") { + const configuredMode = getSettings()?.noticeDisplayMode; + if ( + configuredMode === "compact" && + level !== "warning" && + level !== "error" + ) { + return "compact"; + } + return "normal"; +} + +function refreshVisibleStageNotices() { + for (const stage of Object.keys(stageNoticeHandles)) { + const handle = stageNoticeHandles[stage]; + if (!handle || handle.isClosed?.()) continue; + const status = getStageUiStatus(stage); + if (!status) continue; + updateStageNotice(stage, status.text, status.meta, status.level, { + title: getStageNoticeTitle(stage), + }); + } +} + function updateStageNotice( stage, text, @@ -1069,6 +1094,7 @@ function updateStageNotice( const input = { title, message, + displayMode: options.displayMode || getStageNoticeDisplayMode(noticeLevel), level: noticeLevel, busy, persist, @@ -5483,6 +5509,7 @@ function updateModuleSettings(patch = {}) { "hideOldMessagesKeepLastN", ]); const recallUiKeys = new Set(["recallCardUserInputDisplayMode"]); + const noticeUiKeys = new Set(["noticeDisplayMode"]); const settings = getSettings(); Object.assign(settings, patch); extension_settings[MODULE_NAME] = settings; @@ -5543,6 +5570,10 @@ function updateModuleSettings(patch = {}) { schedulePersistedRecallMessageUiRefresh(30); } + if (Object.keys(patch).some((key) => noticeUiKeys.has(key))) { + refreshVisibleStageNotices(); + } + scheduleServerSettingsSave(); return settings; } diff --git a/notice.js b/notice.js index 19e7e20..6690b0f 100644 --- a/notice.js +++ b/notice.js @@ -60,6 +60,16 @@ function ensureStyle(doc) { -webkit-backdrop-filter: blur(10px) saturate(125%); } + .st-bme-notice[data-layout="compact"] { + display: flex; + align-items: center; + gap: 10px; + width: fit-content; + max-width: 100%; + align-self: flex-end; + padding: 10px; + } + .st-bme-notice::after { content: ""; position: absolute; @@ -87,6 +97,7 @@ function ensureStyle(doc) { background: rgba(255, 255, 255, 0.08); border: 1px solid rgba(255, 255, 255, 0.14); box-shadow: inset 0 1px 1px rgba(255, 255, 255, 0.16); + flex-shrink: 0; } .st-bme-notice[data-busy="true"] .st-bme-notice__icon { @@ -97,6 +108,12 @@ function ensureStyle(doc) { min-width: 0; } + .st-bme-notice[data-layout="compact"] .st-bme-notice__content { + display: flex; + align-items: center; + min-width: 0; + } + .st-bme-notice__title { margin: 0; font-size: 17px; @@ -106,6 +123,14 @@ function ensureStyle(doc) { color: #f0f6ff; } + .st-bme-notice[data-layout="compact"] .st-bme-notice__title { + font-size: 16px; + line-height: 1.2; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + .st-bme-notice__message { margin: 4px 0 0; font-size: 14px; @@ -126,6 +151,15 @@ function ensureStyle(doc) { -webkit-mask-image: linear-gradient(90deg, transparent 0%, black 6%, black 88%, transparent 100%); } + .st-bme-notice[data-layout="compact"] .st-bme-notice__message, + .st-bme-notice[data-layout="compact"] .st-bme-notice__progress { + display: none !important; + } + + .st-bme-notice[data-layout="compact"] .st-bme-notice__actions { + margin: 0 0 0 8px; + } + .st-bme-notice__actions { display: flex; gap: 8px; @@ -170,6 +204,7 @@ function ensureStyle(doc) { line-height: 1; cursor: pointer; transition: background 140ms ease; + flex-shrink: 0; } .st-bme-notice__close:hover, @@ -280,8 +315,11 @@ function getIcon(level) { function applyNoticeState(item, input, progress) { const level = input.level || "info"; + const displayMode = input.displayMode === "compact" ? "compact" : "normal"; + const isCompact = displayMode === "compact"; item.dataset.level = level; item.dataset.busy = input.busy ? "true" : "false"; + item.dataset.layout = displayMode; const icon = item.querySelector(".st-bme-notice__icon"); if (icon) { @@ -296,6 +334,7 @@ function applyNoticeState(item, input, progress) { const message = item.querySelector(".st-bme-notice__message"); if (message) { message.textContent = input.message || ""; + message.hidden = isCompact || !String(input.message || "").trim(); if (input.marquee) { message.classList.add("st-bme-notice__message--marquee"); } else { @@ -319,7 +358,7 @@ function applyNoticeState(item, input, progress) { } } - if (input.persist) { + if (input.persist || isCompact) { progress.style.display = "none"; progress.style.animationDuration = ""; } else { diff --git a/panel.html b/panel.html index c43dc56..d1f0143 100644 --- a/panel.html +++ b/panel.html @@ -1055,6 +1055,30 @@ +
+
+
+
提示信息
+
+ 控制提取、召回等顶部通知的显示样式。 +
+
+
+
+ + +
+
+ 精简模式会将工作中的提示压缩为标题卡片;错误和警告仍显示完整内容,避免关键信息被隐藏。 +
+
+
diff --git a/panel.js b/panel.js index d31a408..e96d8c2 100644 --- a/panel.js +++ b/panel.js @@ -1685,6 +1685,10 @@ function _refreshConfigTab() { "bme-setting-recall-card-user-input-display-mode", settings.recallCardUserInputDisplayMode ?? "beautify_only", ); + _setInputValue( + "bme-setting-notice-display-mode", + settings.noticeDisplayMode ?? "normal", + ); _setInputValue("bme-setting-extract-every", settings.extractEvery ?? 1); _setInputValue( @@ -2025,6 +2029,17 @@ function _bindConfigControls() { }); recallCardUserInputDisplayModeEl.dataset.bmeBound = "true"; } + const noticeDisplayModeEl = document.getElementById( + "bme-setting-notice-display-mode", + ); + if (noticeDisplayModeEl && noticeDisplayModeEl.dataset.bmeBound !== "true") { + noticeDisplayModeEl.addEventListener("change", () => { + _patchSettings({ + noticeDisplayMode: noticeDisplayModeEl.value || "normal", + }); + }); + noticeDisplayModeEl.dataset.bmeBound = "true"; + } bindNumber("bme-setting-extract-every", 1, 1, 50, (value) => _patchSettings({ extractEvery: value }),