diff --git a/package.v2.json b/package.v2.json index 7ce61af9..a967d52b 100644 --- a/package.v2.json +++ b/package.v2.json @@ -3,12 +3,13 @@ "name": "订阅助手(增强版)", "description": "多场景管理订阅,实现订阅全生命周期管理。", "labels": "订阅", - "version": "0.6.11", + "version": "0.6.12", "icon": "https://raw.githubusercontent.com/InfinityPacer/MoviePilot-Plugins/main/icons/subscribeassistantenhanced.png", "author": "InfinityPacer", "level": 1, "system_version": ">=2.14.6", "history": { + "v0.6.12": "配置页滚动条跟随主程序样式,并恢复移动端修改项计数。", "v0.6.11": "修正全集洗版可能阻断新增集自动纠错的问题。", "v0.6.10": "完善配置页前端质量检查与构建门禁,提升构建稳定性。", "v0.6.9": "完善分集转全集的覆盖校验、优先级迁移与回滚,并优化新增剧集订阅重建和转换生命周期。", diff --git a/plugins.v2/subscribeassistantenhanced/README.md b/plugins.v2/subscribeassistantenhanced/README.md index be995456..7fab02af 100644 --- a/plugins.v2/subscribeassistantenhanced/README.md +++ b/plugins.v2/subscribeassistantenhanced/README.md @@ -16,6 +16,7 @@ ## 版本更新日志 +- v0.6.12:配置页滚动条跟随主程序样式,并恢复移动端修改项计数。 - v0.6.11:修正全集洗版可能阻断新增集自动纠错的问题。 - v0.6.10:完善配置页前端质量检查与构建门禁,提升构建稳定性。 - v0.6.9:完善分集转全集的覆盖校验、优先级迁移与回滚,并优化新增剧集订阅重建和转换生命周期。 diff --git a/plugins.v2/subscribeassistantenhanced/__init__.py b/plugins.v2/subscribeassistantenhanced/__init__.py index 9f123c2b..737f61db 100644 --- a/plugins.v2/subscribeassistantenhanced/__init__.py +++ b/plugins.v2/subscribeassistantenhanced/__init__.py @@ -89,7 +89,7 @@ class SubscribeAssistantEnhanced(_PluginBase): # 插件图标 plugin_icon = "https://raw.githubusercontent.com/InfinityPacer/MoviePilot-Plugins/main/icons/subscribeassistantenhanced.png" # 插件版本 - plugin_version = "0.6.11" + plugin_version = "0.6.12" _site_cache_candidate_helper_warned = False # 插件作者 plugin_author = "InfinityPacer" diff --git a/plugins.v2/subscribeassistantenhanced/frontend/dist/assets/__federation_expose_Config-C8q1BGHX.js b/plugins.v2/subscribeassistantenhanced/frontend/dist/assets/__federation_expose_Config-BnxwDL9k.js similarity index 96% rename from plugins.v2/subscribeassistantenhanced/frontend/dist/assets/__federation_expose_Config-C8q1BGHX.js rename to plugins.v2/subscribeassistantenhanced/frontend/dist/assets/__federation_expose_Config-BnxwDL9k.js index 942b5a14..5beb2f6d 100644 --- a/plugins.v2/subscribeassistantenhanced/frontend/dist/assets/__federation_expose_Config-C8q1BGHX.js +++ b/plugins.v2/subscribeassistantenhanced/frontend/dist/assets/__federation_expose_Config-BnxwDL9k.js @@ -982,6 +982,7 @@ function normalizeLocale(source) { } const messages = { "zh-CN": { + "config.changedCount": "{count} 项待保存", "config.changes": "本次修改", "config.moreChanges": "另有 {count} 项", "config.runOnce": "运行一次", @@ -1049,6 +1050,7 @@ const messages = { "section.custom": "自定义规则" }, "zh-TW": { + "config.changedCount": "{count} 項待儲存", "config.changes": "本次修改", "config.moreChanges": "另有 {count} 項", "config.runOnce": "執行一次", @@ -1116,6 +1118,7 @@ const messages = { "section.custom": "自訂規則" }, "en-US": { + "config.changedCount": "{count} to save", "config.changes": "Changes", "config.moreChanges": "{count} more", "config.runOnce": "Run once", @@ -1797,69 +1800,74 @@ const _hoisted_12 = { class: "sae-group-nav__heading" }; const _hoisted_13 = { class: "sae-group-nav__help" }; const _hoisted_14 = { class: "sae-group-nav__help-title" }; const _hoisted_15 = { class: "sae-field-surface" }; -const _hoisted_16 = { class: "sae-field-surface__heading-copy" }; -const _hoisted_17 = { class: "sae-field-surface__mobile-actions" }; -const _hoisted_18 = { class: "sae-field-section__rows" }; -const _hoisted_19 = { class: "sae-field-row__copy" }; -const _hoisted_20 = { class: "sae-field-row__label" }; -const _hoisted_21 = { key: 0 }; -const _hoisted_22 = { class: "sae-field-control" }; -const _hoisted_23 = { +const _hoisted_16 = { class: "sae-field-surface__heading" }; +const _hoisted_17 = { class: "sae-field-surface__heading-copy" }; +const _hoisted_18 = { class: "sae-field-surface__mobile-actions" }; +const _hoisted_19 = { class: "sae-field-section__rows" }; +const _hoisted_20 = { class: "sae-field-row__copy" }; +const _hoisted_21 = { class: "sae-field-row__label" }; +const _hoisted_22 = { key: 0 }; +const _hoisted_23 = { class: "sae-field-control" }; +const _hoisted_24 = { key: 0, class: "sae-select-summary__primary" }; -const _hoisted_24 = { +const _hoisted_25 = { key: 1, class: "sae-select-summary__count" }; -const _hoisted_25 = { +const _hoisted_26 = { key: 3, class: "sae-number-stepper" }; -const _hoisted_26 = { +const _hoisted_27 = { key: 0, class: "sae-number-stepper__unit" }; -const _hoisted_27 = { +const _hoisted_28 = { key: 0, class: "sae-field-section sae-tracker-entry" }; -const _hoisted_28 = { class: "sae-tracker-entry__copy" }; -const _hoisted_29 = { +const _hoisted_29 = { class: "sae-tracker-entry__copy" }; +const _hoisted_30 = { key: 1, class: "sae-field-section sae-tracker-entry" }; -const _hoisted_30 = { class: "sae-tracker-entry__copy" }; -const _hoisted_31 = { class: "sae-impact-preview" }; -const _hoisted_32 = { class: "sae-impact-preview__title sae-summary-section__title" }; -const _hoisted_33 = { class: "sae-impact-preview__list" }; -const _hoisted_34 = { +const _hoisted_31 = { class: "sae-tracker-entry__copy" }; +const _hoisted_32 = { class: "sae-impact-preview" }; +const _hoisted_33 = { class: "sae-impact-preview__title sae-summary-section__title" }; +const _hoisted_34 = { class: "sae-impact-preview__list" }; +const _hoisted_35 = { key: 0, class: "sae-change-summary" }; -const _hoisted_35 = { class: "sae-change-summary__title sae-summary-section__title" }; -const _hoisted_36 = { key: 0 }; -const _hoisted_37 = ["aria-label"]; -const _hoisted_38 = { class: "sae-runtime-summary__title sae-summary-section__title" }; -const _hoisted_39 = { +const _hoisted_36 = { class: "sae-change-summary__title sae-summary-section__title" }; +const _hoisted_37 = { key: 0 }; +const _hoisted_38 = ["aria-label"]; +const _hoisted_39 = { class: "sae-runtime-summary__title sae-summary-section__title" }; +const _hoisted_40 = { key: 0, class: "sae-runtime-summary__state" }; -const _hoisted_40 = { +const _hoisted_41 = { key: 1, class: "sae-runtime-summary__metrics" }; -const _hoisted_41 = { class: "sae-runtime-summary__row" }; const _hoisted_42 = { class: "sae-runtime-summary__row" }; const _hoisted_43 = { class: "sae-runtime-summary__row" }; -const _hoisted_44 = { +const _hoisted_44 = { class: "sae-runtime-summary__row" }; +const _hoisted_45 = { key: 2, class: "sae-runtime-summary__unavailable" }; -const _hoisted_45 = { +const _hoisted_46 = { key: 0, class: "sae-mobile-save-dock" }; +const _hoisted_47 = { + "aria-live": "polite", + class: "sae-mobile-save-dock__state" +}; const {computed,getCurrentInstance,onBeforeUnmount,onMounted,ref} = await importShared('vue'); const {useTheme} = await importShared('vuetify'); @@ -1900,14 +1908,10 @@ const _sfc_main = /* @__PURE__ */ _defineComponent({ const yamlDialogOpen = ref(false); const mobileGroupSheet = ref(false); const configHeaderSentinel = ref(null); - const fieldSurfaceHeading = ref(null); const headerScrolled = ref(false); const theme = useTheme(); const aceTheme = computed(() => theme.current.value.dark ? "github_dark" : "github"); let headerObserver; - let configScrollRoot = null; - let fieldScrollRoot = null; - let scrollIdleTimer; const sectionDefinitions = { global: [ { titleKey: "section.running", keys: ["enabled", "notify"] }, @@ -2074,27 +2078,12 @@ const _sfc_main = /* @__PURE__ */ _defineComponent({ total: values.length }; }); - function handleConfigScroll(event) { - const scrollRoot = event.currentTarget; - if (!scrollRoot) return; - scrollRoot.classList.add("sae-config-scroll-root--active"); - window.clearTimeout(scrollIdleTimer); - scrollIdleTimer = window.setTimeout(() => { - scrollRoot.classList.remove("sae-config-scroll-root--active"); - }, 600); - } onMounted(() => { void loadSummary(props.api).then((payload) => { runtimeSummary.value = payload; summaryState.value = payload ? "available" : "unavailable"; }); const scrollRoot = configHeaderSentinel.value?.closest(".v-card-text") ?? null; - configScrollRoot = scrollRoot; - fieldScrollRoot = fieldSurfaceHeading.value?.closest(".sae-field-surface") ?? null; - scrollRoot?.classList.add("sae-config-scroll-root"); - fieldScrollRoot?.classList.add("sae-config-scroll-root"); - scrollRoot?.addEventListener("scroll", handleConfigScroll, { passive: true }); - fieldScrollRoot?.addEventListener("scroll", handleConfigScroll, { passive: true }); headerObserver = new IntersectionObserver( ([entry]) => { headerScrolled.value = !entry?.isIntersecting; @@ -2105,11 +2094,6 @@ const _sfc_main = /* @__PURE__ */ _defineComponent({ }); onBeforeUnmount(() => { headerObserver?.disconnect(); - window.clearTimeout(scrollIdleTimer); - configScrollRoot?.removeEventListener("scroll", handleConfigScroll); - fieldScrollRoot?.removeEventListener("scroll", handleConfigScroll); - configScrollRoot?.classList.remove("sae-config-scroll-root", "sae-config-scroll-root--active"); - fieldScrollRoot?.classList.remove("sae-config-scroll-root", "sae-config-scroll-root--active"); }); function updateNumber(key, incoming) { draft[key] = normalizeFiniteNumber(draft[key], incoming); @@ -2328,12 +2312,8 @@ const _sfc_main = /* @__PURE__ */ _defineComponent({ ]) ], 8, _hoisted_11), _createElementVNode("main", _hoisted_15, [ - _createElementVNode("div", { - ref_key: "fieldSurfaceHeading", - ref: fieldSurfaceHeading, - class: "sae-field-surface__heading" - }, [ - _createElementVNode("div", _hoisted_16, [ + _createElementVNode("div", _hoisted_16, [ + _createElementVNode("div", _hoisted_17, [ _createVNode(_component_VIcon, { icon: activeGroupMeta.value.icon, color: "primary", @@ -2344,7 +2324,7 @@ const _sfc_main = /* @__PURE__ */ _defineComponent({ _createElementVNode("p", null, _toDisplayString(activeGroupMeta.value.summary), 1) ]) ]), - _createElementVNode("div", _hoisted_17, [ + _createElementVNode("div", _hoisted_18, [ _createVNode(_component_VBtn, { "aria-expanded": mobileGroupSheet.value, "aria-label": _unref(t)(locale.value, "config.selectGroup"), @@ -2391,14 +2371,14 @@ const _sfc_main = /* @__PURE__ */ _defineComponent({ _: 1 }, 8, ["aria-label"]) ]) - ], 512), + ]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(activeSections.value, (section, sectionIndex) => { return _openBlock(), _createElementBlock("section", { key: section.title, class: "sae-field-section" }, [ _createElementVNode("h3", null, _toDisplayString(sectionIndex + 1) + ". " + _toDisplayString(section.title), 1), - _createElementVNode("div", _hoisted_18, [ + _createElementVNode("div", _hoisted_19, [ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(section.fields, (field) => { return _openBlock(), _createElementBlock("div", { key: field.key, @@ -2410,8 +2390,8 @@ const _sfc_main = /* @__PURE__ */ _defineComponent({ } ]) }, [ - _createElementVNode("div", _hoisted_19, [ - _createElementVNode("div", _hoisted_20, [ + _createElementVNode("div", _hoisted_20, [ + _createElementVNode("div", _hoisted_21, [ field.key === "reset_task" ? (_openBlock(), _createBlock(_component_VIcon, { key: 0, color: "error", @@ -2420,9 +2400,9 @@ const _sfc_main = /* @__PURE__ */ _defineComponent({ })) : _createCommentVNode("", true), _createElementVNode("span", null, _toDisplayString(_unref(displayFieldLabel)(field)), 1) ]), - field.hint ? (_openBlock(), _createElementBlock("p", _hoisted_21, _toDisplayString(field.hint), 1)) : _createCommentVNode("", true) + field.hint ? (_openBlock(), _createElementBlock("p", _hoisted_22, _toDisplayString(field.hint), 1)) : _createCommentVNode("", true) ]), - _createElementVNode("div", _hoisted_22, [ + _createElementVNode("div", _hoisted_23, [ field.key === "reset_task" ? (_openBlock(), _createBlock(_component_VCheckbox, { key: 0, id: "sae-field-reset_task", @@ -2459,11 +2439,11 @@ const _sfc_main = /* @__PURE__ */ _defineComponent({ field.kind === "multi-select" ? { name: "selection", fn: _withCtx(({ item, index }) => [ - index === 0 ? (_openBlock(), _createElementBlock("span", _hoisted_23, _toDisplayString(item.title), 1)) : index === 1 ? (_openBlock(), _createElementBlock("span", _hoisted_24, " +" + _toDisplayString(selectionOverflowCount(field.key)), 1)) : _createCommentVNode("", true) + index === 0 ? (_openBlock(), _createElementBlock("span", _hoisted_24, _toDisplayString(item.title), 1)) : index === 1 ? (_openBlock(), _createElementBlock("span", _hoisted_25, " +" + _toDisplayString(selectionOverflowCount(field.key)), 1)) : _createCommentVNode("", true) ]), key: "0" } : void 0 - ]), 1032, ["modelValue", "onUpdate:modelValue", "aria-label", "items", "multiple"])) : field.kind === "number" ? (_openBlock(), _createElementBlock("div", _hoisted_25, [ + ]), 1032, ["modelValue", "onUpdate:modelValue", "aria-label", "items", "multiple"])) : field.kind === "number" ? (_openBlock(), _createElementBlock("div", _hoisted_26, [ _createVNode(_component_VBtn, { "aria-label": _unref(t)(locale.value, "config.decrease", { label: field.label }), icon: "", @@ -2499,7 +2479,7 @@ const _sfc_main = /* @__PURE__ */ _defineComponent({ ]), _: 1 }, 8, ["aria-label", "onClick"]), - fieldUnit(field) ? (_openBlock(), _createElementBlock("span", _hoisted_26, _toDisplayString(fieldUnit(field)), 1)) : _createCommentVNode("", true) + fieldUnit(field) ? (_openBlock(), _createElementBlock("span", _hoisted_27, _toDisplayString(fieldUnit(field)), 1)) : _createCommentVNode("", true) ])) : field.kind === "cron" ? (_openBlock(), _createBlock(_component_VCronField, { key: 4, modelValue: _unref(draft)[field.key], @@ -2528,8 +2508,8 @@ const _sfc_main = /* @__PURE__ */ _defineComponent({ ]) ]); }), 128)), - activeGroup.value === "cleanup" ? (_openBlock(), _createElementBlock("section", _hoisted_27, [ - _createElementVNode("div", _hoisted_28, [ + activeGroup.value === "cleanup" ? (_openBlock(), _createElementBlock("section", _hoisted_28, [ + _createElementVNode("div", _hoisted_29, [ _createVNode(_component_VIcon, { color: "primary", icon: "mdi-message-text-outline", @@ -2554,8 +2534,8 @@ const _sfc_main = /* @__PURE__ */ _defineComponent({ _: 1 }, 8, ["aria-label"]) ])) : _createCommentVNode("", true), - activeGroup.value === "recognition" ? (_openBlock(), _createElementBlock("section", _hoisted_29, [ - _createElementVNode("div", _hoisted_30, [ + activeGroup.value === "recognition" ? (_openBlock(), _createElementBlock("section", _hoisted_30, [ + _createElementVNode("div", _hoisted_31, [ _createVNode(_component_VIcon, { color: "primary", icon: "mdi-code-braces", @@ -2581,8 +2561,8 @@ const _sfc_main = /* @__PURE__ */ _defineComponent({ }, 8, ["aria-label"]) ])) : _createCommentVNode("", true) ]), - _createElementVNode("aside", _hoisted_31, [ - _createElementVNode("div", _hoisted_32, [ + _createElementVNode("aside", _hoisted_32, [ + _createElementVNode("div", _hoisted_33, [ _createVNode(_component_VIcon, { color: "primary", icon: "mdi-clock-outline", @@ -2590,7 +2570,7 @@ const _sfc_main = /* @__PURE__ */ _defineComponent({ }), _createElementVNode("h2", null, _toDisplayString(_unref(t)(locale.value, "config.cadence")), 1) ]), - _createElementVNode("ul", _hoisted_33, [ + _createElementVNode("ul", _hoisted_34, [ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(cadenceSummary.value, (item) => { return _openBlock(), _createElementBlock("li", { key: item.title, @@ -2605,8 +2585,8 @@ const _sfc_main = /* @__PURE__ */ _defineComponent({ ]); }), 128)) ]), - changedItems.value.length ? (_openBlock(), _createElementBlock("section", _hoisted_34, [ - _createElementVNode("div", _hoisted_35, [ + changedItems.value.length ? (_openBlock(), _createElementBlock("section", _hoisted_35, [ + _createElementVNode("div", _hoisted_36, [ _createVNode(_component_VIcon, { color: "warning", icon: "mdi-format-list-checks", @@ -2628,13 +2608,13 @@ const _sfc_main = /* @__PURE__ */ _defineComponent({ ]); }), 128)) ]), - hiddenChangedCount.value > 0 ? (_openBlock(), _createElementBlock("p", _hoisted_36, _toDisplayString(_unref(t)(locale.value, "config.moreChanges", { count: hiddenChangedCount.value })), 1)) : _createCommentVNode("", true) + hiddenChangedCount.value > 0 ? (_openBlock(), _createElementBlock("p", _hoisted_37, _toDisplayString(_unref(t)(locale.value, "config.moreChanges", { count: hiddenChangedCount.value })), 1)) : _createCommentVNode("", true) ])) : _createCommentVNode("", true), _createElementVNode("section", { "aria-label": _unref(t)(locale.value, "config.runtime"), class: "sae-runtime-summary" }, [ - _createElementVNode("div", _hoisted_38, [ + _createElementVNode("div", _hoisted_39, [ _createVNode(_component_VIcon, { color: "primary", icon: "mdi-chart-box-outline", @@ -2642,7 +2622,7 @@ const _sfc_main = /* @__PURE__ */ _defineComponent({ }), _createElementVNode("h3", null, _toDisplayString(_unref(t)(locale.value, "config.runtime")), 1) ]), - summaryState.value === "loading" ? (_openBlock(), _createElementBlock("div", _hoisted_39, [ + summaryState.value === "loading" ? (_openBlock(), _createElementBlock("div", _hoisted_40, [ _createVNode(_component_VProgressCircular, { color: "primary", indeterminate: "", @@ -2650,8 +2630,8 @@ const _sfc_main = /* @__PURE__ */ _defineComponent({ width: "2" }), _createElementVNode("span", null, _toDisplayString(_unref(t)(locale.value, "config.runtimeLoading")), 1) - ])) : summaryState.value === "available" && runtimeSummary.value ? (_openBlock(), _createElementBlock("div", _hoisted_40, [ - _createElementVNode("div", _hoisted_41, [ + ])) : summaryState.value === "available" && runtimeSummary.value ? (_openBlock(), _createElementBlock("div", _hoisted_41, [ + _createElementVNode("div", _hoisted_42, [ _createVNode(_component_VIcon, { icon: "mdi-timer-sand", size: "18" @@ -2659,7 +2639,7 @@ const _sfc_main = /* @__PURE__ */ _defineComponent({ _createElementVNode("span", null, _toDisplayString(_unref(t)(locale.value, "config.pendingCount")), 1), _createElementVNode("strong", null, _toDisplayString(runtimeSummary.value.pending_count), 1) ]), - _createElementVNode("div", _hoisted_42, [ + _createElementVNode("div", _hoisted_43, [ _createVNode(_component_VIcon, { icon: "mdi-download-network-outline", size: "18" @@ -2667,7 +2647,7 @@ const _sfc_main = /* @__PURE__ */ _defineComponent({ _createElementVNode("span", null, _toDisplayString(_unref(t)(locale.value, "config.monitoredCount")), 1), _createElementVNode("strong", null, _toDisplayString(runtimeSummary.value.monitored_torrents), 1) ]), - _createElementVNode("div", _hoisted_43, [ + _createElementVNode("div", _hoisted_44, [ _createVNode(_component_VIcon, { icon: "mdi-toggle-switch-outline", size: "18" @@ -2675,12 +2655,20 @@ const _sfc_main = /* @__PURE__ */ _defineComponent({ _createElementVNode("span", null, _toDisplayString(_unref(t)(locale.value, "config.activeDomains")), 1), _createElementVNode("strong", null, _toDisplayString(activeDomainCount.value.active) + " / " + _toDisplayString(activeDomainCount.value.total), 1) ]) - ])) : (_openBlock(), _createElementBlock("p", _hoisted_44, _toDisplayString(_unref(t)(locale.value, "config.runtimeUnavailable")), 1)) - ], 8, _hoisted_37) + ])) : (_openBlock(), _createElementBlock("p", _hoisted_45, _toDisplayString(_unref(t)(locale.value, "config.runtimeUnavailable")), 1)) + ], 8, _hoisted_38) ]) ]) ]), - _unref(changedCount) > 0 ? (_openBlock(), _createElementBlock("div", _hoisted_45, [ + _unref(changedCount) > 0 ? (_openBlock(), _createElementBlock("div", _hoisted_46, [ + _createElementVNode("span", _hoisted_47, [ + _createVNode(_component_VIcon, { + color: "warning", + icon: "mdi-circle", + size: "8" + }), + _createTextVNode(" " + _toDisplayString(_unref(t)(locale.value, "config.changedCount", { count: _unref(changedCount) })), 1) + ]), _createVNode(_component_VSpacer), _createVNode(_component_VBtn, { class: "sae-mobile-save-dock__save", @@ -2892,6 +2880,6 @@ const _export_sfc = (sfc, props) => { return target; }; -const Config = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-9b738b9d"]]); +const Config = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-8e03f3b2"]]); export { Config as default }; diff --git a/plugins.v2/subscribeassistantenhanced/frontend/dist/assets/__federation_expose_Config-CnHfUIf2.css b/plugins.v2/subscribeassistantenhanced/frontend/dist/assets/__federation_expose_Config-BwmkGarZ.css similarity index 63% rename from plugins.v2/subscribeassistantenhanced/frontend/dist/assets/__federation_expose_Config-CnHfUIf2.css rename to plugins.v2/subscribeassistantenhanced/frontend/dist/assets/__federation_expose_Config-BwmkGarZ.css index 591492c2..ac4b2260 100644 --- a/plugins.v2/subscribeassistantenhanced/frontend/dist/assets/__federation_expose_Config-CnHfUIf2.css +++ b/plugins.v2/subscribeassistantenhanced/frontend/dist/assets/__federation_expose_Config-BwmkGarZ.css @@ -1,44 +1,31 @@ -.sae-config[data-v-9b738b9d] { +.sae-config[data-v-8e03f3b2] { container-type: inline-size; min-inline-size: 0; color: rgb(var(--v-theme-on-surface)); letter-spacing: 0; } -.sae-config[data-v-9b738b9d], -.sae-config[data-v-9b738b9d] * { +.sae-config[data-v-8e03f3b2], +.sae-config[data-v-8e03f3b2] * { box-sizing: border-box; } -.sae-config__form[data-v-9b738b9d] { +.sae-config__form[data-v-8e03f3b2] { min-inline-size: 0; } -.sae-config-scroll-root { - scrollbar-color: transparent transparent; -} -.sae-config-scroll-root::-webkit-scrollbar-thumb { - background: transparent; - transition: background-color 160ms ease; -} -.sae-config-scroll-root.sae-config-scroll-root--active { - scrollbar-color: rgb(var(--v-theme-perfect-scrollbar-thumb)) transparent; -} -.sae-config-scroll-root.sae-config-scroll-root--active::-webkit-scrollbar-thumb { - background: rgb(var(--v-theme-perfect-scrollbar-thumb)); -} -.sae-config-header-sentinel[data-v-9b738b9d] { +.sae-config-header-sentinel[data-v-8e03f3b2] { block-size: 1px; margin-block-end: -1px; pointer-events: none; } -.sae-field-section[data-v-9b738b9d], -.sae-impact-preview[data-v-9b738b9d] { +.sae-field-section[data-v-8e03f3b2], +.sae-impact-preview[data-v-8e03f3b2] { border: var(--app-surface-border); border-radius: var(--app-surface-radius); backdrop-filter: var(--app-grouped-list-backdrop-filter); background: var(--app-grouped-list-background); box-shadow: var(--app-surface-shadow); } -.sae-config-header[data-v-9b738b9d] { +.sae-config-header[data-v-8e03f3b2] { position: sticky; z-index: 20; inset-block-start: 0; @@ -54,7 +41,7 @@ box-shadow: none; gap: 16px; } -.sae-config-header--scrolled[data-v-9b738b9d] { +.sae-config-header--scrolled[data-v-8e03f3b2] { --sae-header-background: var(--app-grouped-list-background); --sae-header-backdrop-filter: var(--app-grouped-list-backdrop-filter); @@ -70,40 +57,40 @@ html[data-theme='transparent'].transparent-blur-disabled .sae-config-header--scr --sae-header-background: rgba(var(--v-theme-surface), 0.92); --sae-header-backdrop-filter: none; } -.sae-config-header__brand[data-v-9b738b9d] { +.sae-config-header__brand[data-v-8e03f3b2] { display: flex; flex: 1 1 auto; align-items: center; min-inline-size: 0; gap: 10px; } -.sae-config-header__logo[data-v-9b738b9d] { +.sae-config-header__logo[data-v-8e03f3b2] { display: block; flex: 0 0 40px; block-size: 40px; inline-size: 40px; object-fit: contain; } -.sae-config-header__identity[data-v-9b738b9d] { +.sae-config-header__identity[data-v-8e03f3b2] { min-inline-size: 0; } -.sae-config-header__crumbs[data-v-9b738b9d], -.sae-config-header__title-row[data-v-9b738b9d] { +.sae-config-header__crumbs[data-v-8e03f3b2], +.sae-config-header__title-row[data-v-8e03f3b2] { display: flex; align-items: center; min-inline-size: 0; } -.sae-config-header__crumbs[data-v-9b738b9d] { +.sae-config-header__crumbs[data-v-8e03f3b2] { margin-block-end: 3px; color: rgba(var(--v-theme-on-surface), 0.55); font-size: 0.6875rem; line-height: 1rem; gap: 2px; } -.sae-config-header__title-row[data-v-9b738b9d] { +.sae-config-header__title-row[data-v-8e03f3b2] { gap: 8px; } -.sae-config-header__title[data-v-9b738b9d] { +.sae-config-header__title[data-v-8e03f3b2] { margin: 0; overflow-wrap: anywhere; font-size: 1.0625rem; @@ -111,21 +98,21 @@ html[data-theme='transparent'].transparent-blur-disabled .sae-config-header--scr letter-spacing: 0; line-height: 1.4rem; } -.sae-config-header__actions[data-v-9b738b9d] { +.sae-config-header__actions[data-v-8e03f3b2] { display: flex; flex: 0 0 auto; align-items: center; gap: 8px; } -.sae-config-header__run[data-v-9b738b9d] { +.sae-config-header__run[data-v-8e03f3b2] { min-inline-size: 112px; font-weight: 600; } -.sae-config-header__save[data-v-9b738b9d] { +.sae-config-header__save[data-v-8e03f3b2] { min-inline-size: 120px; font-weight: 600; } -.sae-config-header__close-action[data-v-9b738b9d] { +.sae-config-header__close-action[data-v-8e03f3b2] { min-inline-size: 96px; color: rgba(var(--v-theme-on-surface), 0.78); font-weight: 600; @@ -134,38 +121,38 @@ html[data-theme='transparent'].transparent-blur-disabled .sae-config-header--scr color 180ms ease; } @media (hover: hover) and (pointer: fine) { -.sae-config-header__close-action[data-v-9b738b9d]:hover { +.sae-config-header__close-action[data-v-8e03f3b2]:hover { color: rgb(var(--v-theme-on-surface)); } } -.sae-config-header__close-action[data-v-9b738b9d]:focus-visible { +.sae-config-header__close-action[data-v-8e03f3b2]:focus-visible { color: rgb(var(--v-theme-on-surface)); outline: 2px solid rgba(var(--v-theme-primary), 0.58); outline-offset: 2px; } -.sae-config-header__close-action[data-v-9b738b9d]:active { +.sae-config-header__close-action[data-v-8e03f3b2]:active { background-color: rgba(var(--v-theme-on-surface), 0.04); color: rgb(var(--v-theme-on-surface)); } @media (prefers-reduced-motion: reduce) { -.sae-config-header__close-action[data-v-9b738b9d], - .sae-config-header__close-action[data-v-9b738b9d] .v-btn__overlay { +.sae-config-header__close-action[data-v-8e03f3b2], + .sae-config-header__close-action[data-v-8e03f3b2] .v-btn__overlay { transition: none; } -.sae-config-header__close-action[data-v-9b738b9d] .v-ripple__container { +.sae-config-header__close-action[data-v-8e03f3b2] .v-ripple__container { display: none; } } -.sae-config-header__close-icon[data-v-9b738b9d] { +.sae-config-header__close-icon[data-v-8e03f3b2] { flex: 0 0 40px; block-size: 40px; inline-size: 40px; } -.sae-config__body[data-v-9b738b9d] { +.sae-config__body[data-v-8e03f3b2] { min-inline-size: 0; padding: 12px; } -.sae-config-layout[data-v-9b738b9d] { +.sae-config-layout[data-v-8e03f3b2] { display: grid; min-inline-size: 0; margin-block-start: 12px; @@ -175,18 +162,18 @@ html[data-theme='transparent'].transparent-blur-disabled .sae-config-header--scr 'preview'; grid-template-columns: minmax(0, 1fr); } -.sae-group-nav[data-v-9b738b9d] { +.sae-group-nav[data-v-8e03f3b2] { display: none; min-inline-size: 0; grid-area: navigation; } -.sae-group-nav__heading[data-v-9b738b9d] { +.sae-group-nav__heading[data-v-8e03f3b2] { padding: 6px 10px 10px; color: rgba(var(--v-theme-on-surface), 0.54); font-size: 0.75rem; font-weight: 600; } -.sae-group-nav > .sae-group-nav__list.v-list[data-v-9b738b9d] { +.sae-group-nav > .sae-group-nav__list.v-list[data-v-8e03f3b2] { flex: 1 1 auto; min-block-size: 0; overflow-y: auto; @@ -195,27 +182,27 @@ html[data-theme='transparent'].transparent-blur-disabled .sae-config-header--scr background: transparent; background-color: transparent; } -.sae-group-nav__list[data-v-9b738b9d] .v-list-item { +.sae-group-nav__list[data-v-8e03f3b2] .v-list-item { position: relative; min-block-size: 50px; padding-inline: 12px; margin-block: 4px; } -.sae-group-nav__list[data-v-9b738b9d] .v-list-item-title { +.sae-group-nav__list[data-v-8e03f3b2] .v-list-item-title { overflow-wrap: anywhere; font-size: 0.875rem; font-weight: 600; letter-spacing: 0; line-height: 1.2rem; } -.sae-group-nav__list[data-v-9b738b9d] .v-list-item__prepend > .v-icon { +.sae-group-nav__list[data-v-8e03f3b2] .v-list-item__prepend > .v-icon { font-size: 1.25rem; } -.sae-group-nav__list[data-v-9b738b9d] .v-list-item--active { +.sae-group-nav__list[data-v-8e03f3b2] .v-list-item--active { background: rgba(var(--v-theme-primary), 0.09); color: rgb(var(--v-theme-primary)); } -.sae-group-nav__list[data-v-9b738b9d] .v-list-item--active::before { +.sae-group-nav__list[data-v-8e03f3b2] .v-list-item--active::before { position: absolute; inset-block: 8px; inset-inline-start: 0; @@ -224,7 +211,7 @@ html[data-theme='transparent'].transparent-blur-disabled .sae-config-header--scr background: rgb(var(--v-theme-primary)); content: ''; } -.sae-group-nav__help[data-v-9b738b9d] { +.sae-group-nav__help[data-v-8e03f3b2] { flex: 0 0 auto; padding: 12px; margin-block-start: 10px; @@ -232,29 +219,29 @@ html[data-theme='transparent'].transparent-blur-disabled .sae-config-header--scr border-radius: var(--app-control-radius); background: rgba(var(--v-theme-on-surface), 0.025); } -.sae-group-nav__help-title[data-v-9b738b9d] { +.sae-group-nav__help-title[data-v-8e03f3b2] { display: block; font-size: 0.8125rem; line-height: 1.1rem; } -.sae-group-nav__help p[data-v-9b738b9d] { +.sae-group-nav__help p[data-v-8e03f3b2] { margin: 6px 0 0; color: rgba(var(--v-theme-on-surface), 0.56); font-size: 0.6875rem; line-height: 1rem; } -.sae-group-nav__help-link[data-v-9b738b9d] { +.sae-group-nav__help-link[data-v-8e03f3b2] { min-inline-size: 0; min-block-size: 28px; padding-inline: 0; margin-block-start: 7px; font-size: 0.75rem; } -.sae-field-surface[data-v-9b738b9d] { +.sae-field-surface[data-v-8e03f3b2] { min-inline-size: 0; grid-area: content; } -.sae-field-surface__heading[data-v-9b738b9d] { +.sae-field-surface__heading[data-v-8e03f3b2] { display: flex; align-items: flex-start; justify-content: space-between; @@ -262,33 +249,33 @@ html[data-theme='transparent'].transparent-blur-disabled .sae-config-header--scr padding: 2px 2px 12px; gap: 12px; } -.sae-field-surface__heading-copy[data-v-9b738b9d] { +.sae-field-surface__heading-copy[data-v-8e03f3b2] { display: flex; align-items: flex-start; min-inline-size: 0; gap: 9px; } -.sae-field-surface__mobile-actions[data-v-9b738b9d] { +.sae-field-surface__mobile-actions[data-v-8e03f3b2] { display: flex; flex: 0 0 auto; align-items: center; gap: 4px; } -.sae-mobile-group-action[data-v-9b738b9d], -.sae-mobile-help[data-v-9b738b9d] { +.sae-mobile-group-action[data-v-8e03f3b2], +.sae-mobile-help[data-v-8e03f3b2] { block-size: 36px; inline-size: 36px; } -.sae-field-surface h2[data-v-9b738b9d], -.sae-impact-preview h2[data-v-9b738b9d] { +.sae-field-surface h2[data-v-8e03f3b2], +.sae-impact-preview h2[data-v-8e03f3b2] { margin: 0; font-size: 1rem; font-weight: 700; letter-spacing: 0; line-height: 1.25rem; } -.sae-field-surface__heading p[data-v-9b738b9d], -.sae-impact-preview p[data-v-9b738b9d] { +.sae-field-surface__heading p[data-v-8e03f3b2], +.sae-impact-preview p[data-v-8e03f3b2] { margin: 3px 0 0; overflow-wrap: anywhere; color: rgba(var(--v-theme-on-surface), 0.62); @@ -296,14 +283,14 @@ html[data-theme='transparent'].transparent-blur-disabled .sae-config-header--scr letter-spacing: 0; line-height: 1.05rem; } -.sae-field-section[data-v-9b738b9d] { +.sae-field-section[data-v-8e03f3b2] { overflow: hidden; min-inline-size: 0; } -.sae-field-section + .sae-field-section[data-v-9b738b9d] { +.sae-field-section + .sae-field-section[data-v-8e03f3b2] { margin-block-start: 12px; } -.sae-field-section > h3[data-v-9b738b9d] { +.sae-field-section > h3[data-v-8e03f3b2] { padding: 14px 16px 10px; margin: 0; font-size: 0.9375rem; @@ -311,10 +298,10 @@ html[data-theme='transparent'].transparent-blur-disabled .sae-config-header--scr letter-spacing: 0; line-height: 1.25rem; } -.sae-field-section__rows[data-v-9b738b9d] { +.sae-field-section__rows[data-v-8e03f3b2] { padding-inline: 16px; } -.sae-field-row[data-v-9b738b9d] { +.sae-field-row[data-v-8e03f3b2] { display: grid; align-items: start; min-inline-size: 0; @@ -323,13 +310,13 @@ html[data-theme='transparent'].transparent-blur-disabled .sae-config-header--scr gap: 18px; grid-template-columns: minmax(200px, 1.45fr) minmax(180px, 0.75fr); } -.sae-field-row--switch[data-v-9b738b9d] { +.sae-field-row--switch[data-v-8e03f3b2] { align-items: center; } -.sae-field-row__copy[data-v-9b738b9d] { +.sae-field-row__copy[data-v-8e03f3b2] { min-inline-size: 0; } -.sae-field-row__label[data-v-9b738b9d] { +.sae-field-row__label[data-v-8e03f3b2] { display: flex; align-items: center; color: rgb(var(--v-theme-on-surface)); @@ -338,37 +325,37 @@ html[data-theme='transparent'].transparent-blur-disabled .sae-config-header--scr line-height: 1.15rem; gap: 6px; } -.sae-field-row__copy p[data-v-9b738b9d] { +.sae-field-row__copy p[data-v-8e03f3b2] { margin: 4px 0 0; color: rgba(var(--v-theme-on-surface), 0.57); font-size: 0.6875rem; line-height: 1rem; } -.sae-field-control[data-v-9b738b9d], -.sae-field-control[data-v-9b738b9d] .v-input { +.sae-field-control[data-v-8e03f3b2], +.sae-field-control[data-v-8e03f3b2] .v-input { min-inline-size: 0; max-inline-size: 100%; } -.sae-field-control[data-v-9b738b9d] .v-select__selection { +.sae-field-control[data-v-8e03f3b2] .v-select__selection { justify-content: flex-end; margin-inline-start: auto; text-align: end; } -.sae-text-control[data-v-9b738b9d] input { +.sae-text-control[data-v-8e03f3b2] input { text-align: end; } -.sae-select-summary__primary[data-v-9b738b9d] { +.sae-select-summary__primary[data-v-8e03f3b2] { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } -.sae-select-summary__count[data-v-9b738b9d] { +.sae-select-summary__count[data-v-8e03f3b2] { flex: 0 0 auto; color: rgba(var(--v-theme-on-surface), 0.58); margin-inline-start: 6px; white-space: nowrap; } -.sae-number-stepper[data-v-9b738b9d] { +.sae-number-stepper[data-v-8e03f3b2] { display: grid; align-items: center; min-block-size: 40px; @@ -378,20 +365,20 @@ html[data-theme='transparent'].transparent-blur-disabled .sae-config-header--scr border-radius: var(--app-control-radius); grid-template-columns: 40px minmax(54px, 1fr) 40px auto; } -.sae-number-stepper[data-v-9b738b9d] .v-btn { +.sae-number-stepper[data-v-8e03f3b2] .v-btn { min-inline-size: 40px; block-size: 40px; border-radius: 0; } -.sae-number-stepper[data-v-9b738b9d] .v-field__input { +.sae-number-stepper[data-v-8e03f3b2] .v-field__input { min-block-size: 40px; padding: 0 6px; text-align: center; } -.sae-number-stepper[data-v-9b738b9d] input { +.sae-number-stepper[data-v-8e03f3b2] input { text-align: center; } -.sae-number-stepper__unit[data-v-9b738b9d] { +.sae-number-stepper__unit[data-v-8e03f3b2] { min-inline-size: 38px; padding-inline: 8px; border-inline-start: 1px solid rgba(var(--v-theme-on-surface), 0.12); @@ -400,11 +387,11 @@ html[data-theme='transparent'].transparent-blur-disabled .sae-config-header--scr text-align: center; white-space: nowrap; } -.sae-field-row--switch .sae-field-control[data-v-9b738b9d] { +.sae-field-row--switch .sae-field-control[data-v-8e03f3b2] { display: flex; justify-content: flex-end; } -.sae-tracker-entry[data-v-9b738b9d] { +.sae-tracker-entry[data-v-8e03f3b2] { display: flex; align-items: center; justify-content: space-between; @@ -412,23 +399,23 @@ html[data-theme='transparent'].transparent-blur-disabled .sae-config-header--scr padding: 16px; gap: 12px; } -.sae-tracker-entry__copy[data-v-9b738b9d] { +.sae-tracker-entry__copy[data-v-8e03f3b2] { display: flex; align-items: flex-start; min-inline-size: 0; gap: 9px; } -.sae-tracker-entry__copy > div[data-v-9b738b9d] { +.sae-tracker-entry__copy > div[data-v-8e03f3b2] { min-inline-size: 0; } -.sae-tracker-entry strong[data-v-9b738b9d] { +.sae-tracker-entry strong[data-v-8e03f3b2] { display: block; overflow-wrap: anywhere; font-size: 0.875rem; letter-spacing: 0; line-height: 1.2rem; } -.sae-tracker-entry p[data-v-9b738b9d] { +.sae-tracker-entry p[data-v-8e03f3b2] { margin: 3px 0 0; overflow-wrap: anywhere; color: rgba(var(--v-theme-on-surface), 0.62); @@ -436,52 +423,52 @@ html[data-theme='transparent'].transparent-blur-disabled .sae-config-header--scr letter-spacing: 0; line-height: 1.05rem; } -.sae-tracker-entry[data-v-9b738b9d] .v-btn { +.sae-tracker-entry[data-v-8e03f3b2] .v-btn { flex: 0 1 auto; min-inline-size: 0; block-size: auto; min-block-size: 36px; padding-block: 7px; } -.sae-tracker-entry[data-v-9b738b9d] .v-btn__content { +.sae-tracker-entry[data-v-8e03f3b2] .v-btn__content { white-space: normal; overflow-wrap: anywhere; } -.sae-impact-preview[data-v-9b738b9d] { +.sae-impact-preview[data-v-8e03f3b2] { min-inline-size: 0; align-self: start; padding: 16px; grid-area: preview; } -.sae-impact-preview__title[data-v-9b738b9d] { +.sae-impact-preview__title[data-v-8e03f3b2] { display: flex; align-items: center; min-inline-size: 0; gap: 8px; } -.sae-impact-preview strong[data-v-9b738b9d] { +.sae-impact-preview strong[data-v-8e03f3b2] { display: block; overflow-wrap: anywhere; font-size: 0.875rem; letter-spacing: 0; line-height: 1.25rem; } -.sae-impact-preview__list[data-v-9b738b9d] { +.sae-impact-preview__list[data-v-8e03f3b2] { padding: 0; margin: 10px 0 0; list-style: none; } -.sae-impact-preview__item[data-v-9b738b9d], -.sae-runtime-summary__row[data-v-9b738b9d], -.sae-runtime-summary__state[data-v-9b738b9d], -.sae-runtime-summary__title[data-v-9b738b9d] { +.sae-impact-preview__item[data-v-8e03f3b2], +.sae-runtime-summary__row[data-v-8e03f3b2], +.sae-runtime-summary__state[data-v-8e03f3b2], +.sae-runtime-summary__title[data-v-8e03f3b2] { display: grid; align-items: start; min-inline-size: 0; gap: 10px; grid-template-columns: 28px minmax(0, 1fr); } -.sae-impact-preview__item[data-v-9b738b9d] { +.sae-impact-preview__item[data-v-8e03f3b2] { align-items: center; padding-block: 10px; color: rgba(var(--v-theme-on-surface), 0.72); @@ -489,49 +476,49 @@ html[data-theme='transparent'].transparent-blur-disabled .sae-config-header--scr line-height: 1.25rem; grid-template-columns: 28px minmax(0, 1fr) minmax(0, auto); } -.sae-impact-preview__item > .v-icon[data-v-9b738b9d], -.sae-runtime-summary__row > .v-icon[data-v-9b738b9d] { +.sae-impact-preview__item > .v-icon[data-v-8e03f3b2], +.sae-runtime-summary__row > .v-icon[data-v-8e03f3b2] { justify-self: center; color: rgba(var(--v-theme-on-surface), 0.54); } -.sae-impact-preview__item > span[data-v-9b738b9d], -.sae-impact-preview__item > strong[data-v-9b738b9d] { +.sae-impact-preview__item > span[data-v-8e03f3b2], +.sae-impact-preview__item > strong[data-v-8e03f3b2] { min-inline-size: 0; overflow-wrap: anywhere; } -.sae-impact-preview__item > strong[data-v-9b738b9d] { +.sae-impact-preview__item > strong[data-v-8e03f3b2] { text-align: end; } -.sae-runtime-summary[data-v-9b738b9d], -.sae-change-summary[data-v-9b738b9d] { +.sae-runtime-summary[data-v-8e03f3b2], +.sae-change-summary[data-v-8e03f3b2] { padding-block-start: 16px; margin-block-start: 16px; border-block-start: 1px solid rgba(var(--v-theme-on-surface), 0.1); } -.sae-summary-section__title[data-v-9b738b9d] { +.sae-summary-section__title[data-v-8e03f3b2] { display: grid; align-items: center; gap: 10px; grid-template-columns: 28px minmax(0, 1fr); } -.sae-summary-section__title > .v-icon[data-v-9b738b9d] { +.sae-summary-section__title > .v-icon[data-v-8e03f3b2] { block-size: 28px; inline-size: 28px; border-radius: var(--app-control-radius); background: rgba(var(--v-theme-primary), 0.1); } -.sae-change-summary .sae-summary-section__title > .v-icon[data-v-9b738b9d] { +.sae-change-summary .sae-summary-section__title > .v-icon[data-v-8e03f3b2] { background: rgba(var(--v-theme-warning), 0.12); } -.sae-summary-section__title h3[data-v-9b738b9d] { +.sae-summary-section__title h3[data-v-8e03f3b2] { margin: 0; font-size: 1rem; font-weight: 600; letter-spacing: 0; line-height: 1.25rem; } -.sae-runtime-summary__state[data-v-9b738b9d], -.sae-runtime-summary__row[data-v-9b738b9d] { +.sae-runtime-summary__state[data-v-8e03f3b2], +.sae-runtime-summary__row[data-v-8e03f3b2] { align-items: center; padding-block: 7px; color: rgba(var(--v-theme-on-surface), 0.7); @@ -539,34 +526,34 @@ html[data-theme='transparent'].transparent-blur-disabled .sae-config-header--scr letter-spacing: 0; line-height: 1.25rem; } -.sae-runtime-summary__state[data-v-9b738b9d] { +.sae-runtime-summary__state[data-v-8e03f3b2] { margin-block-start: 6px; } -.sae-runtime-summary__metrics[data-v-9b738b9d] { +.sae-runtime-summary__metrics[data-v-8e03f3b2] { margin-block-start: 10px; } -.sae-runtime-summary__row[data-v-9b738b9d] { +.sae-runtime-summary__row[data-v-8e03f3b2] { grid-template-columns: 28px minmax(0, 1fr) minmax(0, auto); } -.sae-runtime-summary__row span[data-v-9b738b9d], -.sae-runtime-summary__row strong[data-v-9b738b9d] { +.sae-runtime-summary__row span[data-v-8e03f3b2], +.sae-runtime-summary__row strong[data-v-8e03f3b2] { min-inline-size: 0; overflow-wrap: anywhere; } -.sae-runtime-summary__row strong[data-v-9b738b9d] { +.sae-runtime-summary__row strong[data-v-8e03f3b2] { color: rgb(var(--v-theme-on-surface)); font-weight: 600; text-align: end; } -.sae-runtime-summary__unavailable[data-v-9b738b9d] { +.sae-runtime-summary__unavailable[data-v-8e03f3b2] { margin-block-start: 9px; } -.sae-change-summary ul[data-v-9b738b9d] { +.sae-change-summary ul[data-v-8e03f3b2] { padding: 0; margin: 8px 0 0; list-style: none; } -.sae-change-summary li[data-v-9b738b9d] { +.sae-change-summary li[data-v-8e03f3b2] { display: grid; align-items: center; min-inline-size: 0; @@ -577,31 +564,31 @@ html[data-theme='transparent'].transparent-blur-disabled .sae-config-header--scr gap: 8px; grid-template-columns: 12px minmax(0, 1fr); } -.sae-change-summary li span[data-v-9b738b9d] { +.sae-change-summary li span[data-v-8e03f3b2] { min-inline-size: 0; overflow-wrap: anywhere; } -.sae-change-summary > p[data-v-9b738b9d] { +.sae-change-summary > p[data-v-8e03f3b2] { margin: 4px 0 0 20px; color: rgb(var(--v-theme-warning)); font-size: 0.75rem; } -.sae-tracker-dialog__title[data-v-9b738b9d] { +.sae-tracker-dialog__title[data-v-8e03f3b2] { display: flex; align-items: center; justify-content: space-between; min-inline-size: 0; gap: 12px; } -.sae-tracker-dialog__title > span[data-v-9b738b9d] { +.sae-tracker-dialog__title > span[data-v-8e03f3b2] { min-inline-size: 0; overflow-wrap: anywhere; white-space: normal; } -.sae-tracker-dialog__actions[data-v-9b738b9d] { +.sae-tracker-dialog__actions[data-v-8e03f3b2] { flex-wrap: wrap; } -.sae-mobile-save-dock[data-v-9b738b9d] { +.sae-mobile-save-dock[data-v-8e03f3b2] { position: sticky; z-index: 20; inset-block-end: calc(12px + env(safe-area-inset-bottom)); @@ -619,7 +606,16 @@ html[data-theme='transparent'].transparent-blur-disabled .sae-config-header--scr box-shadow: 0 -8px 24px rgba(var(--v-theme-on-surface), 0.06); gap: 12px; } -.sae-mobile-save-dock__save[data-v-9b738b9d] { +.sae-mobile-save-dock__state[data-v-8e03f3b2] { + display: inline-flex; + align-items: center; + color: rgb(var(--v-theme-warning)); + font-size: 0.8125rem; + font-weight: 600; + white-space: nowrap; + gap: 8px; +} +.sae-mobile-save-dock__save[data-v-8e03f3b2] { min-inline-size: 128px; font-weight: 600; } @@ -631,142 +627,142 @@ html[data-theme='transparent'].transparent-blur-disabled .sae-mobile-save-dock { background: rgba(var(--v-theme-surface), 0.98); backdrop-filter: none; } -.sae-yaml-dialog__content[data-v-9b738b9d] { +.sae-yaml-dialog__content[data-v-8e03f3b2] { min-block-size: min(60dvh, 560px); padding: 0 !important; } -.sae-yaml-editor[data-v-9b738b9d] { +.sae-yaml-editor[data-v-8e03f3b2] { block-size: min(60dvh, 560px); inline-size: 100%; } -.sae-mobile-group-sheet[data-v-9b738b9d] .v-bottom-sheet__content { +.sae-mobile-group-sheet[data-v-8e03f3b2] .v-bottom-sheet__content { max-block-size: min(82dvh, 680px); } @container (width <= 480px) { -.sae-config-header[data-v-9b738b9d] { +.sae-config-header[data-v-8e03f3b2] { min-block-size: 64px; padding-inline: 10px; gap: 8px; } -.sae-config-header__logo[data-v-9b738b9d] { +.sae-config-header__logo[data-v-8e03f3b2] { flex-basis: 34px; block-size: 34px; inline-size: 34px; } -.sae-config-header__crumbs[data-v-9b738b9d] { +.sae-config-header__crumbs[data-v-8e03f3b2] { display: none; } -.sae-config-header__title[data-v-9b738b9d] { +.sae-config-header__title[data-v-8e03f3b2] { font-size: 0.875rem; line-height: 1.1rem; } -.sae-config-header__title-row[data-v-9b738b9d] { +.sae-config-header__title-row[data-v-8e03f3b2] { gap: 5px; } -.sae-tracker-entry[data-v-9b738b9d] { +.sae-tracker-entry[data-v-8e03f3b2] { align-items: stretch; flex-direction: column; } -.sae-tracker-entry[data-v-9b738b9d] .v-btn { +.sae-tracker-entry[data-v-8e03f3b2] .v-btn { inline-size: 100%; } } @container (width < 720px) { -.sae-config-header__run[data-v-9b738b9d], - .sae-config-header__save[data-v-9b738b9d], - .sae-config-header__close-action[data-v-9b738b9d], - .sae-change-summary[data-v-9b738b9d] { +.sae-config-header__run[data-v-8e03f3b2], + .sae-config-header__save[data-v-8e03f3b2], + .sae-config-header__close-action[data-v-8e03f3b2], + .sae-change-summary[data-v-8e03f3b2] { display: none; } -.sae-field-row[data-v-9b738b9d] { +.sae-field-row[data-v-8e03f3b2] { align-items: center; gap: 12px; grid-template-columns: minmax(0, 1fr) minmax(180px, 0.9fr); } -.sae-field-row--switch[data-v-9b738b9d] { +.sae-field-row--switch[data-v-8e03f3b2] { grid-template-columns: minmax(0, 1fr) auto; } -.sae-field-row--switch .sae-field-control[data-v-9b738b9d] { +.sae-field-row--switch .sae-field-control[data-v-8e03f3b2] { align-self: center; } } @container (width <= 30rem) { -.sae-field-row[data-v-9b738b9d] { +.sae-field-row[data-v-8e03f3b2] { align-items: center; padding-block: 0.625rem; column-gap: 0.75rem; row-gap: 0; grid-template-columns: minmax(0, 1fr) minmax(8.5rem, 10rem); } -.sae-field-row__copy[data-v-9b738b9d] { +.sae-field-row__copy[data-v-8e03f3b2] { display: contents; } -.sae-field-row__label[data-v-9b738b9d] { +.sae-field-row__label[data-v-8e03f3b2] { grid-column: 1; grid-row: 1; } -.sae-field-row__copy p[data-v-9b738b9d] { +.sae-field-row__copy p[data-v-8e03f3b2] { grid-column: 1 / -1; grid-row: 2; margin-block-start: 1px; line-height: 0.9375rem; } -.sae-field-control[data-v-9b738b9d] { +.sae-field-control[data-v-8e03f3b2] { grid-column: 2; grid-row: 1; justify-self: end; inline-size: 100%; } -.sae-field-row--switch .sae-field-control[data-v-9b738b9d] { +.sae-field-row--switch .sae-field-control[data-v-8e03f3b2] { justify-self: end; inline-size: auto; } -.sae-field-control[data-v-9b738b9d] .v-field { +.sae-field-control[data-v-8e03f3b2] .v-field { min-block-size: 1.75rem; border-radius: 0; background: transparent; box-shadow: none; } -.sae-field-control[data-v-9b738b9d] .v-field__outline { +.sae-field-control[data-v-8e03f3b2] .v-field__outline { display: none; } -.sae-field-control[data-v-9b738b9d] .v-field__input { +.sae-field-control[data-v-8e03f3b2] .v-field__input { min-block-size: 1.75rem; padding-block: 0; padding-inline: 0; } -.sae-field-control[data-v-9b738b9d] .v-field__append-inner { +.sae-field-control[data-v-8e03f3b2] .v-field__append-inner { padding-block-start: 0.25rem; padding-inline-start: 0.25rem; } -.sae-field-control[data-v-9b738b9d] .v-select__selection { +.sae-field-control[data-v-8e03f3b2] .v-select__selection { justify-content: flex-end; } -.sae-number-stepper[data-v-9b738b9d] { +.sae-number-stepper[data-v-8e03f3b2] { min-block-size: 1.75rem; border: 0; border-radius: 0; grid-template-columns: minmax(2.625rem, 1fr) auto; } -.sae-number-stepper[data-v-9b738b9d] .v-btn { +.sae-number-stepper[data-v-8e03f3b2] .v-btn { display: none; } -.sae-number-stepper[data-v-9b738b9d] .v-field__input, - .sae-number-stepper[data-v-9b738b9d] input { +.sae-number-stepper[data-v-8e03f3b2] .v-field__input, + .sae-number-stepper[data-v-8e03f3b2] input { min-block-size: 1.75rem; text-align: end; } -.sae-number-stepper__unit[data-v-9b738b9d] { +.sae-number-stepper__unit[data-v-8e03f3b2] { min-inline-size: auto; padding-inline-end: 0; border-inline-start: 0; } } @container (width >= 720px) { -.sae-config__body[data-v-9b738b9d] { +.sae-config__body[data-v-8e03f3b2] { padding: 14px; } -.sae-config-layout[data-v-9b738b9d] { +.sae-config-layout[data-v-8e03f3b2] { padding-block-end: 14px; gap: 14px; grid-template-areas: @@ -774,13 +770,13 @@ html[data-theme='transparent'].transparent-blur-disabled .sae-mobile-save-dock { 'navigation preview'; grid-template-columns: 168px minmax(0, 1fr); } -.sae-config-header__close-icon[data-v-9b738b9d], - .sae-field-row--mobile-only[data-v-9b738b9d], - .sae-field-surface__mobile-actions[data-v-9b738b9d], - .sae-mobile-save-dock[data-v-9b738b9d] { +.sae-config-header__close-icon[data-v-8e03f3b2], + .sae-field-row--mobile-only[data-v-8e03f3b2], + .sae-field-surface__mobile-actions[data-v-8e03f3b2], + .sae-mobile-save-dock[data-v-8e03f3b2] { display: none; } -.sae-group-nav[data-v-9b738b9d] { +.sae-group-nav[data-v-8e03f3b2] { position: sticky; inset-block-start: 86px; display: flex; @@ -791,47 +787,47 @@ html[data-theme='transparent'].transparent-blur-disabled .sae-mobile-save-dock { border-inline-end: 1px solid rgba(var(--v-theme-on-surface), 0.1); padding-inline-end: 10px; } -.sae-impact-preview[data-v-9b738b9d] { +.sae-impact-preview[data-v-8e03f3b2] { align-self: start; } } @container (width >= 880px) { -.sae-config__form[data-v-9b738b9d] { +.sae-config__form[data-v-8e03f3b2] { display: grid; overflow: hidden; block-size: min(90dvh, 820px); grid-template-rows: 1px auto minmax(0, 1fr); } -.sae-config__body[data-v-9b738b9d], - .sae-config-layout[data-v-9b738b9d] { +.sae-config__body[data-v-8e03f3b2], + .sae-config-layout[data-v-8e03f3b2] { min-block-size: 0; block-size: 100%; } -.sae-config__body[data-v-9b738b9d] { +.sae-config__body[data-v-8e03f3b2] { overflow: hidden; } -.sae-config-layout[data-v-9b738b9d] { +.sae-config-layout[data-v-8e03f3b2] { align-items: stretch; grid-template-areas: 'navigation content preview'; grid-template-columns: 168px minmax(0, 1fr) 232px; } -.sae-group-nav[data-v-9b738b9d] { +.sae-group-nav[data-v-8e03f3b2] { position: static; overflow: hidden; block-size: 100%; } -.sae-impact-preview[data-v-9b738b9d] { +.sae-impact-preview[data-v-8e03f3b2] { position: static; overflow: hidden; block-size: 100%; } -.sae-field-surface[data-v-9b738b9d] { +.sae-field-surface[data-v-8e03f3b2] { overflow-x: hidden; overflow-y: auto; min-block-size: 0; padding-inline-end: 4px; } -.sae-impact-preview[data-v-9b738b9d] { +.sae-impact-preview[data-v-8e03f3b2] { align-self: stretch; } } diff --git a/plugins.v2/subscribeassistantenhanced/frontend/dist/assets/index-C5Qd1Rsy.js b/plugins.v2/subscribeassistantenhanced/frontend/dist/assets/index-1I3GDuAv.js similarity index 82% rename from plugins.v2/subscribeassistantenhanced/frontend/dist/assets/index-C5Qd1Rsy.js rename to plugins.v2/subscribeassistantenhanced/frontend/dist/assets/index-1I3GDuAv.js index 50798b42..1cd6b167 100644 --- a/plugins.v2/subscribeassistantenhanced/frontend/dist/assets/index-C5Qd1Rsy.js +++ b/plugins.v2/subscribeassistantenhanced/frontend/dist/assets/index-1I3GDuAv.js @@ -1 +1 @@ -export { default as Config } from './__federation_expose_Config-C8q1BGHX.js'; +export { default as Config } from './__federation_expose_Config-BnxwDL9k.js'; diff --git a/plugins.v2/subscribeassistantenhanced/frontend/dist/assets/remoteEntry.js b/plugins.v2/subscribeassistantenhanced/frontend/dist/assets/remoteEntry.js index 8207d257..53c0467e 100644 --- a/plugins.v2/subscribeassistantenhanced/frontend/dist/assets/remoteEntry.js +++ b/plugins.v2/subscribeassistantenhanced/frontend/dist/assets/remoteEntry.js @@ -2,8 +2,8 @@ const currentImports = {}; const exportSet = new Set(['Module', '__esModule', 'default', '_export_sfc']); let moduleMap = { "./Config":()=>{ - dynamicLoadingCss(["__federation_expose_Config-CnHfUIf2.css"], false, './Config'); - return __federation_import('./__federation_expose_Config-C8q1BGHX.js').then(module =>Object.keys(module).every(item => exportSet.has(item)) ? () => module.default : () => module)},}; + dynamicLoadingCss(["__federation_expose_Config-BwmkGarZ.css"], false, './Config'); + return __federation_import('./__federation_expose_Config-BnxwDL9k.js').then(module =>Object.keys(module).every(item => exportSet.has(item)) ? () => module.default : () => module)},}; const seen = {}; const dynamicLoadingCss = (cssFilePaths, dontAppendStylesToHead, exposeItemName) => { const metaUrl = import.meta.url; diff --git a/plugins.v2/subscribeassistantenhanced/frontend/src/components/Config.vue b/plugins.v2/subscribeassistantenhanced/frontend/src/components/Config.vue index 75627d21..d389959e 100644 --- a/plugins.v2/subscribeassistantenhanced/frontend/src/components/Config.vue +++ b/plugins.v2/subscribeassistantenhanced/frontend/src/components/Config.vue @@ -61,14 +61,10 @@ const trackerDialogOpen = ref(false) const yamlDialogOpen = ref(false) const mobileGroupSheet = ref(false) const configHeaderSentinel = ref(null) -const fieldSurfaceHeading = ref(null) const headerScrolled = ref(false) const theme = useTheme() const aceTheme = computed(() => (theme.current.value.dark ? 'github_dark' : 'github')) let headerObserver: IntersectionObserver | undefined -let configScrollRoot: HTMLElement | null = null -let fieldScrollRoot: HTMLElement | null = null -let scrollIdleTimer: number | undefined interface SectionDefinition { /** 当前业务分组内的稳定章节翻译键。 */ @@ -250,16 +246,6 @@ const activeDomainCount = computed(() => { } }) -function handleConfigScroll(event: Event): void { - const scrollRoot = event.currentTarget as HTMLElement | null - if (!scrollRoot) return - scrollRoot.classList.add('sae-config-scroll-root--active') - window.clearTimeout(scrollIdleTimer) - scrollIdleTimer = window.setTimeout(() => { - scrollRoot.classList.remove('sae-config-scroll-root--active') - }, 600) -} - onMounted(() => { void loadSummary(props.api).then(payload => { runtimeSummary.value = payload @@ -267,12 +253,6 @@ onMounted(() => { }) const scrollRoot = configHeaderSentinel.value?.closest('.v-card-text') ?? null - configScrollRoot = scrollRoot - fieldScrollRoot = fieldSurfaceHeading.value?.closest('.sae-field-surface') ?? null - scrollRoot?.classList.add('sae-config-scroll-root') - fieldScrollRoot?.classList.add('sae-config-scroll-root') - scrollRoot?.addEventListener('scroll', handleConfigScroll, { passive: true }) - fieldScrollRoot?.addEventListener('scroll', handleConfigScroll, { passive: true }) headerObserver = new IntersectionObserver( ([entry]) => { headerScrolled.value = !entry?.isIntersecting @@ -284,11 +264,6 @@ onMounted(() => { onBeforeUnmount(() => { headerObserver?.disconnect() - window.clearTimeout(scrollIdleTimer) - configScrollRoot?.removeEventListener('scroll', handleConfigScroll) - fieldScrollRoot?.removeEventListener('scroll', handleConfigScroll) - configScrollRoot?.classList.remove('sae-config-scroll-root', 'sae-config-scroll-root--active') - fieldScrollRoot?.classList.remove('sae-config-scroll-root', 'sae-config-scroll-root--active') }) /** 数值字段只接受有限 number,避免动态输入污染完整保存 payload。 */ @@ -439,7 +414,7 @@ function runOnce(): void {
-
+
@@ -708,6 +683,10 @@ function runOnce(): void {
+ + + {{ t(locale, 'config.changedCount', { count: changedCount }) }} + > = { 'zh-CN': { + 'config.changedCount': '{count} 项待保存', 'config.changes': '本次修改', 'config.moreChanges': '另有 {count} 项', 'config.runOnce': '运行一次', @@ -93,6 +94,7 @@ const messages: Record> = { 'section.custom': '自定义规则', }, 'zh-TW': { + 'config.changedCount': '{count} 項待儲存', 'config.changes': '本次修改', 'config.moreChanges': '另有 {count} 項', 'config.runOnce': '執行一次', @@ -160,6 +162,7 @@ const messages: Record> = { 'section.custom': '自訂規則', }, 'en-US': { + 'config.changedCount': '{count} to save', 'config.changes': 'Changes', 'config.moreChanges': '{count} more', 'config.runOnce': 'Run once', diff --git a/tests/v2/subscribeassistantenhanced/frontend/src/components/__tests__/Config.spec.ts b/tests/v2/subscribeassistantenhanced/frontend/src/components/__tests__/Config.spec.ts index c54f482e..e3fd82b4 100644 --- a/tests/v2/subscribeassistantenhanced/frontend/src/components/__tests__/Config.spec.ts +++ b/tests/v2/subscribeassistantenhanced/frontend/src/components/__tests__/Config.spec.ts @@ -69,7 +69,7 @@ describe('SubscribeAssistantEnhanced config', () => { await user.click(notify) expect(saveButton).toBeEnabled() expect(screen.getByText('本次修改')).toBeInTheDocument() - expect(screen.queryByText(/项待保存/)).not.toBeInTheDocument() + expect(screen.getByText('1 项待保存')).toBeInTheDocument() await user.click(saveButton) @@ -233,10 +233,9 @@ describe('SubscribeAssistantEnhanced config', () => { expect(document.body).not.toHaveTextContent('private request details') }) - it('removes scroll listeners and disconnects observers when unmounted', async () => { + it('inherits Host scrollbars and disconnects the header observer when unmounted', async () => { const disconnect = vi.fn() const observerCallbacks: IntersectionObserverCallback[] = [] - const removeEventListener = vi.spyOn(HTMLElement.prototype, 'removeEventListener') vi.stubGlobal( 'IntersectionObserver', class { @@ -254,15 +253,16 @@ describe('SubscribeAssistantEnhanced config', () => { const { unmount } = await renderConfig() const fieldSurface = document.querySelector('.sae-field-surface') as HTMLElement const header = document.querySelector('.sae-config-header') as HTMLElement + const removeEventListener = vi.spyOn(fieldSurface, 'removeEventListener') await fireEvent.scroll(fieldSurface) - expect(fieldSurface).toHaveClass('sae-config-scroll-root--active') + expect(document.querySelector('.sae-config-scroll-root')).toBeNull() observerCallbacks.at(-1)?.([{ isIntersecting: false } as IntersectionObserverEntry], {} as IntersectionObserver) await waitFor(() => expect(header).toHaveClass('sae-config-header--scrolled')) unmount() expect(disconnect).toHaveBeenCalled() - expect(removeEventListener).toHaveBeenCalledWith('scroll', expect.any(Function)) + expect(removeEventListener).not.toHaveBeenCalledWith('scroll', expect.any(Function)) }) }) diff --git a/tests/v2/subscribeassistantenhanced/frontend/src/config/__tests__/i18n.spec.ts b/tests/v2/subscribeassistantenhanced/frontend/src/config/__tests__/i18n.spec.ts index ff3a7527..dc76cb26 100644 --- a/tests/v2/subscribeassistantenhanced/frontend/src/config/__tests__/i18n.spec.ts +++ b/tests/v2/subscribeassistantenhanced/frontend/src/config/__tests__/i18n.spec.ts @@ -19,6 +19,9 @@ describe('SAE i18n adapter', () => { }) it('translates stable UI keys and interpolates named parameters', () => { + expect(t('zh-CN', 'config.changedCount', { count: 1 })).toBe('1 项待保存') + expect(t('zh-TW', 'config.changedCount', { count: 2 })).toBe('2 項待儲存') + expect(t('en-US', 'config.changedCount', { count: 3 })).toBe('3 to save') expect(t('zh-CN', 'config.changes')).toBe('本次修改') expect(t('zh-TW', 'config.moreChanges', { count: 2 })).toBe('另有 2 項') expect(t('en-US', 'config.moreChanges', { count: 2 })).toBe('2 more')