@@ -1184,6 +1184,7 @@ function createConfigEphemeralState(): ConfigEphemeralState {
|
1184 | 1184 | |
1185 | 1185 | const cvs = createConfigEphemeralState(); |
1186 | 1186 | let lastConfigContextKey: string | null = null; |
| 1187 | +let lastFormModeForScroll: ConfigProps["formMode"] | null = null; |
1187 | 1188 | |
1188 | 1189 | function resetConfigEphemeralState() { |
1189 | 1190 | Object.assign(cvs, createConfigEphemeralState()); |
@@ -1222,6 +1223,7 @@ function toggleSensitivePathReveal(path: Array<string | number>) {
|
1222 | 1223 | export function resetConfigViewStateForTests() { |
1223 | 1224 | resetConfigEphemeralState(); |
1224 | 1225 | lastConfigContextKey = null; |
| 1226 | +lastFormModeForScroll = null; |
1225 | 1227 | } |
1226 | 1228 | |
1227 | 1229 | export function renderConfig(props: ConfigProps) { |
@@ -1237,6 +1239,31 @@ export function renderConfig(props: ConfigProps) {
|
1237 | 1239 | const rawAvailable = props.rawAvailable ?? true; |
1238 | 1240 | const formMode = showModeToggle && rawAvailable ? props.formMode : "form"; |
1239 | 1241 | const requestUpdate = props.onRequestUpdate ?? (() => {}); |
| 1242 | +// Scroll helper: target-based (nav clicks) with global fallback (form/raw toggle) |
| 1243 | +const resetContentScroll = (target: EventTarget | null) => { |
| 1244 | +queueMicrotask(() => { |
| 1245 | +const origin = target instanceof Element ? target : null; |
| 1246 | +const content = |
| 1247 | +origin?.closest(".config-main")?.querySelector<HTMLElement>(".config-content") ?? |
| 1248 | +globalThis.document?.querySelector<HTMLElement>(".config-content"); |
| 1249 | +if (!content) { |
| 1250 | +return; |
| 1251 | +} |
| 1252 | +if (typeof content.scrollTo === "function") { |
| 1253 | +content.scrollTo({ top: 0, left: 0, behavior: "auto" }); |
| 1254 | +return; |
| 1255 | +} |
| 1256 | +content.scrollTop = 0; |
| 1257 | +content.scrollLeft = 0; |
| 1258 | +}); |
| 1259 | +}; |
| 1260 | + |
| 1261 | +// Reset scroll position when switching between form and raw mode |
| 1262 | +if (lastFormModeForScroll !== null && lastFormModeForScroll !== formMode) { |
| 1263 | +resetContentScroll(null); |
| 1264 | +} |
| 1265 | +lastFormModeForScroll = formMode; |
| 1266 | + |
1240 | 1267 | const currentContextKey = configContextKey(props); |
1241 | 1268 | if (lastConfigContextKey !== currentContextKey) { |
1242 | 1269 | resetConfigEphemeralState(); |
@@ -1301,24 +1328,6 @@ export function renderConfig(props: ConfigProps) {
|
1301 | 1328 | const settingsLayout = props.settingsLayout ?? "tabs"; |
1302 | 1329 | const allCategories = [...visibleCategories, ...(otherCategory ? [otherCategory] : [])]; |
1303 | 1330 | |
1304 | | -const resetContentScroll = (target: EventTarget | null) => { |
1305 | | -queueMicrotask(() => { |
1306 | | -const origin = target instanceof Element ? target : null; |
1307 | | -const content = origin |
1308 | | -?.closest(".config-main") |
1309 | | -?.querySelector<HTMLElement>(".config-content"); |
1310 | | -if (!content) { |
1311 | | -return; |
1312 | | -} |
1313 | | -if (typeof content.scrollTo === "function") { |
1314 | | -content.scrollTo({ top: 0, left: 0, behavior: "auto" }); |
1315 | | -return; |
1316 | | -} |
1317 | | -content.scrollTop = 0; |
1318 | | -content.scrollLeft = 0; |
1319 | | -}); |
1320 | | -}; |
1321 | | - |
1322 | 1331 | function renderAccordionNav() { |
1323 | 1332 | return html` |
1324 | 1333 | <div class="config-accordion-nav"> |
|