|
246 | 246 | } |
247 | 247 | } |
248 | 248 |
|
| 249 | + function setBodyScrollLocked(locked) { |
| 250 | + if (isEmbedded) return; |
| 251 | + document.body.classList.toggle('search-palette-open', locked); |
| 252 | + } |
| 253 | + |
249 | 254 | function closeMobileMenu() { |
250 | | - var menuBtn = document.getElementById('mobile-menu-btn'); |
251 | | - var menu = document.getElementById('mobile-menu'); |
252 | | - if (menuBtn && menu && menuBtn.getAttribute('aria-expanded') === 'true') { |
253 | | - menuBtn.click(); |
| 255 | + if (window.cfdMobileMenu && typeof window.cfdMobileMenu.close === 'function') { |
| 256 | + window.cfdMobileMenu.close(); |
254 | 257 | } |
255 | 258 | } |
256 | 259 |
|
|
286 | 289 | } |
287 | 290 | if (isOpen && !isPaletteVisible()) { |
288 | 291 | isOpen = false; |
| 292 | + setBodyScrollLocked(false); |
289 | 293 | } |
290 | 294 |
|
291 | 295 | closeMobileMenu(); |
|
294 | 298 | palette.removeAttribute('hidden'); |
295 | 299 | palette.hidden = false; |
296 | 300 | palette.setAttribute('aria-hidden', 'false'); |
297 | | - document.body.classList.add('search-palette-open'); |
| 301 | + setBodyScrollLocked(true); |
298 | 302 | palette.classList.add('is-visible'); |
299 | 303 | if (input) { |
300 | 304 | input.value = query || ''; |
|
304 | 308 | } |
305 | 309 |
|
306 | 310 | function close(opts) { |
307 | | - if (!palette || !isOpen || isEmbedded) return; |
| 311 | + if (isEmbedded) return; |
| 312 | + setBodyScrollLocked(false); |
| 313 | + if (!palette || !isOpen) return; |
308 | 314 | if (!(opts && opts.force) && Date.now() - openedAt < OPEN_GUARD_MS) return; |
309 | 315 | isOpen = false; |
310 | 316 | activeCategory = null; |
311 | 317 | activeCategorySlug = null; |
312 | 318 | palette.classList.remove('is-visible'); |
313 | 319 | palette.setAttribute('aria-hidden', 'true'); |
314 | | - document.body.classList.remove('search-palette-open'); |
315 | 320 | setTimeout(function () { |
316 | 321 | palette.hidden = true; |
317 | 322 | palette.setAttribute('hidden', ''); |
|
320 | 325 | }, 200); |
321 | 326 | } |
322 | 327 |
|
| 328 | + function unlockBodyOnExit() { |
| 329 | + setBodyScrollLocked(false); |
| 330 | + } |
| 331 | + |
323 | 332 | function openSelected() { |
324 | 333 | var nodes = getInteractives(); |
325 | 334 | if (activeIndex >= 0 && nodes[activeIndex]) { |
|
354 | 363 | } |
355 | 364 | if (e.target.closest('[data-search-close]')) { |
356 | 365 | e.preventDefault(); |
357 | | - close(); |
| 366 | + close({ force: true }); |
358 | 367 | } |
359 | 368 | }, |
360 | 369 | true |
|
365 | 374 | if (!palette) return; |
366 | 375 |
|
367 | 376 | document.querySelectorAll('[data-search-close]').forEach(function (el) { |
368 | | - el.addEventListener('click', close); |
| 377 | + el.addEventListener('click', function () { |
| 378 | + close({ force: true }); |
| 379 | + }); |
| 380 | + }); |
| 381 | + |
| 382 | + window.addEventListener('pagehide', unlockBodyOnExit); |
| 383 | + document.addEventListener('visibilitychange', function () { |
| 384 | + if (document.visibilityState === 'hidden') unlockBodyOnExit(); |
369 | 385 | }); |
370 | 386 |
|
371 | 387 | if (input) { |
|
0 commit comments