Skip to content

Commit 6f59ff5

Browse files
committed
Search Click Fixed
1 parent 352daab commit 6f59ff5

4 files changed

Lines changed: 300 additions & 224 deletions

File tree

layouts/partials/home/search-palette.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
{{- if not (.Scratch.Get "searchPaletteLoaded") -}}
2-
{{- .Scratch.Set "searchPaletteLoaded" true -}}
32
<div id="search-palette" class="search-palette" hidden aria-hidden="true">
43
<div class="search-palette__backdrop" data-search-close tabindex="-1" aria-hidden="true"></div>
54
<div class="search-palette__dialog" role="dialog" aria-modal="true" aria-labelledby="search-palette-title">
@@ -79,4 +78,5 @@
7978
| jsonify | safeJS -}};
8079
</script>
8180
<script src="/js/search-palette.js" defer></script>
81+
{{- .Scratch.Set "searchPaletteLoaded" true -}}
8282
{{- end -}}

static/js/search-palette.js

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
var isEmbedded = false;
77
var isOpen = false;
88
var triggersBound = false;
9+
var initialized = false;
10+
var pendingOpen = false;
11+
var openedAt = 0;
12+
var OPEN_GUARD_MS = 350;
913

1014
function $(sel, root) {
1115
return (root || document).querySelector(sel);
@@ -193,35 +197,45 @@
193197
}
194198
}
195199

200+
function isPaletteVisible() {
201+
return !!(palette && palette.classList.contains('is-visible'));
202+
}
203+
196204
function open(query) {
197-
if (!palette) return;
205+
if (!palette) {
206+
pendingOpen = true;
207+
return;
208+
}
198209
if (isEmbedded) {
199210
if (input) {
200211
input.focus();
201212
runSearch(query || input.value || '');
202213
}
203214
return;
204215
}
205-
if (isOpen) return;
216+
if (isOpen && isPaletteVisible()) {
217+
close({ force: true });
218+
return;
219+
}
206220

207221
closeMobileMenu();
208222
isOpen = true;
223+
openedAt = Date.now();
209224
palette.removeAttribute('hidden');
210225
palette.hidden = false;
211226
palette.setAttribute('aria-hidden', 'false');
212227
document.body.classList.add('search-palette-open');
213-
requestAnimationFrame(function () {
214-
palette.classList.add('is-visible');
215-
});
228+
palette.classList.add('is-visible');
216229
if (input) {
217230
input.value = query || '';
218231
input.focus();
219232
runSearch(input.value);
220233
}
221234
}
222235

223-
function close() {
236+
function close(opts) {
224237
if (!palette || !isOpen || isEmbedded) return;
238+
if (!(opts && opts.force) && Date.now() - openedAt < OPEN_GUARD_MS) return;
225239
isOpen = false;
226240
palette.classList.remove('is-visible');
227241
palette.setAttribute('aria-hidden', 'true');
@@ -238,7 +252,7 @@
238252
var nodes = getInteractives();
239253
if (activeIndex >= 0 && nodes[activeIndex]) {
240254
nodes[activeIndex].click();
241-
close();
255+
close({ force: true });
242256
}
243257
}
244258

@@ -262,7 +276,11 @@
262276
if (openBtn) {
263277
e.preventDefault();
264278
e.stopPropagation();
265-
open('');
279+
if (isOpen && isPaletteVisible()) {
280+
close({ force: true });
281+
} else {
282+
open('');
283+
}
266284
return;
267285
}
268286
if (e.target.closest('[data-search-close]')) {
@@ -309,13 +327,14 @@
309327
openSelected();
310328
} else if (e.key === 'Escape') {
311329
e.preventDefault();
312-
close();
330+
close({ force: true });
313331
}
314332
});
315333
}
316334
}
317335

318336
function init() {
337+
if (initialized) return true;
319338
if (!window.CFD_SEARCH || !window.CFD_SEARCH.data) {
320339
return false;
321340
}
@@ -324,6 +343,7 @@
324343
if (!palette) {
325344
return false;
326345
}
346+
initialized = true;
327347

328348
backdrop = $('.search-palette__backdrop', palette);
329349
dialog = $('.search-palette__dialog', palette);
@@ -343,11 +363,11 @@
343363
document.addEventListener('keydown', function (e) {
344364
if ((e.metaKey || e.ctrlKey) && e.key === 'k') {
345365
e.preventDefault();
346-
if (isOpen && !isEmbedded) close();
366+
if (isOpen && !isEmbedded) close({ force: true });
347367
else open('');
348368
return;
349369
}
350-
if (e.key === 'Escape' && isOpen && !isEmbedded) close();
370+
if (e.key === 'Escape' && isOpen && !isEmbedded) close({ force: true });
351371
});
352372

353373
if (isEmbedded) {
@@ -364,6 +384,10 @@
364384
}
365385

366386
window.cfdSearchPalette = { open: open, close: close };
387+
if (pendingOpen) {
388+
pendingOpen = false;
389+
open('');
390+
}
367391
return true;
368392
}
369393

0 commit comments

Comments
 (0)