From 2a907f99e993b653354e02dcd7d4b1f9f5e1a1b3 Mon Sep 17 00:00:00 2001 From: arathunku Date: Thu, 4 Apr 2024 16:52:20 +0200 Subject: [PATCH] Autocomplete preview: handle tab and arrow keys, fix lost focus on iframe load --- assets/css/icons.css | 12 +- assets/fonts/RemixIconCollection.remixicon | 1 + assets/fonts/remixicon.woff2 | Bin 1956 -> 2276 bytes assets/js/autocomplete/autocomplete-list.js | 38 ++-- assets/js/content.js | 10 +- assets/js/entry/html.js | 5 +- .../autocomplete-suggestions.handlebars | 14 +- assets/js/search-bar.js | 41 ++++- ...NV.js => handlebars.templates-QRJZ6GQT.js} | 170 +++++++++--------- formatters/html/dist/html-E3BEM6GV.js | 56 ++++++ formatters/html/dist/html-QJRGK6VM.js | 56 ------ formatters/html/dist/html-elixir-FC2LLHIZ.css | 6 - formatters/html/dist/html-elixir-SHJGNRYP.css | 6 + formatters/html/dist/html-erlang-BT3F65P3.css | 6 - formatters/html/dist/html-erlang-MQ772ZAV.css | 6 + formatters/html/dist/remixicon-JZDGNA3K.woff2 | Bin 0 -> 2276 bytes formatters/html/dist/remixicon-NKANDIL5.woff2 | Bin 1956 -> 0 bytes 17 files changed, 240 insertions(+), 187 deletions(-) create mode 100644 assets/fonts/RemixIconCollection.remixicon rename formatters/html/dist/{handlebars.templates-YQ7HIJNV.js => handlebars.templates-QRJZ6GQT.js} (60%) create mode 100644 formatters/html/dist/html-E3BEM6GV.js delete mode 100644 formatters/html/dist/html-QJRGK6VM.js delete mode 100644 formatters/html/dist/html-elixir-FC2LLHIZ.css create mode 100644 formatters/html/dist/html-elixir-SHJGNRYP.css delete mode 100644 formatters/html/dist/html-erlang-BT3F65P3.css create mode 100644 formatters/html/dist/html-erlang-MQ772ZAV.css create mode 100644 formatters/html/dist/remixicon-JZDGNA3K.woff2 delete mode 100644 formatters/html/dist/remixicon-NKANDIL5.woff2 diff --git a/assets/css/icons.css b/assets/css/icons.css index 77fba8d23..5b92694fc 100644 --- a/assets/css/icons.css +++ b/assets/css/icons.css @@ -1,3 +1,9 @@ +/* +* Only used icons are included in the font +* Icons can be generated at https://remixicon.com/ +* In assets/fonts/RemixIconCollection.remixicon there's easy to import on website list of icons +*/ + @font-face { font-family: 'remixicon'; src: url('../fonts/remixicon.woff2') format('woff2'); @@ -28,6 +34,8 @@ --icon-search-2-line: "\f0cd"; --icon-settings-3-line: "\f0e6"; --icon-printer-line: "\f029"; + --icon-eye-line: "\ecb5"; + --icon-eye-line-off: "\ecb7"; } .ri-lg { font-size: 1.3333em; line-height: .75em; vertical-align: -.0667em; } @@ -47,4 +55,6 @@ .ri-information-line:before { content: var(--icon-information); } .ri-alert-line:before { content: var(--icon-alert); } .ri-double-quotes-l:before { content: var(--icon-double-quotes-l); } -.ri-printer-line:before { content: var(--icon-printer-line); } \ No newline at end of file +.ri-printer-line:before { content: var(--icon-printer-line); } +.ri-eye-line:before { content: var(--icon-eye-line); } +.ri-eye-off-line:before { content: var(--icon-eye-line-off); } diff --git a/assets/fonts/RemixIconCollection.remixicon b/assets/fonts/RemixIconCollection.remixicon new file mode 100644 index 000000000..2a4d6c365 --- /dev/null +++ b/assets/fonts/RemixIconCollection.remixicon @@ -0,0 +1 @@ +eye-off-line,eye-line,settings-3-line,add-line,subtract-line,arrow-up-s-line,arrow-down-s-line,arrow-right-s-line,search-2-line,menu-line,close-line,link-m,code-s-slash-line,error-warning-line,information-line,alert-line,double-quotes-l,printer-line \ No newline at end of file diff --git a/assets/fonts/remixicon.woff2 b/assets/fonts/remixicon.woff2 index 57e6c7c12cabbcbff5522fa19a129dc751277cc8..68a42cc32afe686028927f8762837eec740edd73 100644 GIT binary patch delta 2272 zcmV<62p{*P59ARTcTYw#00961000Q&01E&B000uO000P=kr*C-W(tvfk9+|(0we=W z3n%~tAO(gh2ZBW#zz`!5wu+LHA^YnC+gSQ!y+VhcQ3PZarN$8%w2R|lTDZOheQC3t zP_e%-zi^NHK6v2o_nw=t@|Ud}*VY7U;Sp>&@Zoqkii+X!w0~(jrJBr4O7bS87=YY4 zJrdn#@If8}APEM4Xo=Y7z0DjHgGmfU7>t#{V33QONvwgxx2v@|%|~4eAOYh1Xi)(x zom{cy#8+8LCH+D`@zP1>k87{?r-;H3#hKQrclr1Ny{3G<5?ujttQhpB2*_<()anWC zXJt;kQV0Yl64kj7zC8UJ1mH7dlAP~zQ?8x=QACCUKe#Hg8&D{CI_dtnZ77nb zbbt}aee?pMb~9mqIaA15g-V3R%ScRSU9C;6teTsDLJ<<8Fq2D-MWT(3)RNoV*CM43 zOh;Ivf6mp_TdI^wCpdz`SV|BmQG^s6BZdte!Sf_9(?iODv4VgwStPXy%-)`p>6~v8 zDo1L83K<|Mt(q8sB&~r16jamH&4ARi#M;Gw0?HY<29z<>8o+1WGrLHFny>)oKpO-| zv_ZOHU_$Ae;zemLxnBJ)6dzE3p5V#|;;n=|q(%XXm7!JFI9@nn8muKx%IQIO93=^j zmaNAnWL>NmXYQpCA2B;8W4a}EA&pQ5uq)ez*Z|Tqjlx>kc;*VDLuh8D#bdk}JCwzRmgIL!a|J5ALe*ne2G0qhmsU7ywK-3?#FMFbu>f zr`HIETqtu?CPRj{$$_HLTv7=|sM8NHWWeyzai7Jd`{&sd+LSFAO6pD6Vz8Z7L2^ra z($;M`IVoR$!hhPcXCc|csw~^q>76xyLG>ZJVNC+9Zplc|BqwW9GJJpharf?p_MY~P znzK`f=SJjOk$z*-c9oPg`m~V_vz@YPFfkc)o)Y-X*BArS2^7%S+;n-rEO%XfNKMf6 zPTN+>P2WPPc9JeIt{^qXi>b-2o{W9AJ(Hb`2L}%SBhL)ZrTD`#JtwPceF;f_exP50 z{iM4L*k@2(HbUZiJ*~_BlFx#N6LNpZ%K9Nbw=A?)ak=65&w*@E9iR7xoxI$vC=GQK zULIOA?m8Ke?dO+W!5}p&iZ1_F8$+NR1&R-*gZU%C|9rVd1Nh!Q?|4p%fMkCFyK524 z_D1F4fQJB&FL#aWQq+k_>SW!2UkcI=b&@XmF913c)hW8a0C>1MQI}$}*S)bktRy6) zB&_@f0L3LC_04ZApJ|LPUxwq$mIJfa=mqqGXW9brhf^OE|L33NW*{!Y4$r}H(orL= zq9RSINxTKD|E6N=LaQRHq_Mx>x;PIM;xLwS@0#4+iw+MQ)DcZhHvxrz$Ua9$9OvGZ zkW_~=PE&Lgz+Q6E`gZI23)%rJ)ztY``LL`{m2aIv0WW6R`l0K54ThVlTf6FFtD~c< zW9vTPz%O1MT^IX7rz-J(TKt25(ZMuv$x<2y9_=4h?ecEIs)LRPl$UJgtd%v5Tdp2= zxZrp;SiW#iggjvTl6?q-Doksy-Ndzpt#JyG=*vA|R9v4sIlc0NS%RMQRGAWo zJX7J(AUd=q(-6>qn`!Zw$n@D!+MNOl2MVF_I*KC4E$OAjVM*gZK>Dum%->sA^Ei+ayP81eDUS4#aei zFdtx!Sl-v`s`7^)U>&md)hG3K`p7EQ32n@MWz(L~TuU(WYnjg&yENd4HJR%GsvRO zu|QO3A}C#d-lo$jyF?*wW)_FR9?l#%%&j?O>hf;QNR*s}1&QH?RsVH;|7(^If2l|i zC0S85-7qcNak=y4&6nRDohfOpiJQ<>jpcWHbc$#)d3x!uIo;+FS>6(GOHgOFX9P*sXu2eG@#2FeP;TF u4%N@n5ltW_-0`VNRqGf{W!ZCsOm=CvEV>_=(*ItAmQ(H)YZ7FZlGO^_pG6-4 delta 1949 zcmV;O2V(f-5u^_ocTYw#00961000N101E&B000nl000M9kr*C-Itq>yj6nf50we=O z3nTypAO(gh2ZAdbw+<22q!p5Vfo;Pc#WG1kDx3{mV5$OO^8)HZgNwsD0RR9Xcp^LA zH#2+My^jDwCAm#Wm1$FS5T<`Gdj*sVPNkqi3V64mPSi^>)4zkZX9PeR6(#RG&EEqc z0pfHnTspa8D>=V^+EOa%7KH`802h7&|4(zT7JwbmIawzz)Zced;4}pU2Mj{iVN&2R zx!D;p8gYp5}B#d-n~;fb`-SRV4ty!Ak{_*0Oj(ZUzt?r{ENK zA&rkK?sN-e1Vo_!Ef~P1Ad+^+O&oV7GWgcvIe`@L;VFE7+$VS$z+z7}R{$_-h5?Na zCrv(7YOjDr&^VyJs-xpJP?PHTd#oQ6c)GkuUJ0*mV|HWDo0vDN?-Jhad++tZ^xK_p zFTU^l|6lJ5uSKXSZvqiHN-;(u2?Yc^87V~<4&3lRFNSFD@h2Hld}Cw>A%YLO2swO+ zL{RupBDH0Ib%0>-aTcKvKJGzC;8RQz1p!+HgaBU>lJLOx0YU~}y%19PW|~A1use{1 z0DA!lF?`>ryg0OkcSlX20cZg01@mn|jv?adFiZCciVz`X$_NU_E^pFEN(=;2%a;}` zN{(GgtEf~-(x7l%989ITs%d*F*KF{#W)pf3Gy7fAp_`v5#%G1#p!)-h{0$KyAR9S zv2i4horW}bVZF&DoFYn3+M=Bdo+N2I-4Th?KSF5|z!TKBHYd&P3D>Tkwl`1a=mT zvc&s#^4aEH5<%QZ1$%b@LL}X^UEBkC-5@FNV8xn-l+1S?c1Zw!Olo2j0c?5BbYtg)6$@@6U4$in2_UzLEOzMRhy{^B;dqJw4l~CN=HO z5T*gf#sRU2{e;-4$|OtawwdUFLHzN56%iDLk1XtE*>Kef5XN|~uE_$$_KpG|HtSsn z)$z;G1MOPeLIY70M{*=7Jls_g9L-_$pN>!ntBFu7FIS9p>fxh6v}fLI-n0m&KJ97L zZNIo}j$L}XJ|MGtD*em+{L1_*Wo_)^c=<|y*@A9&R&laZf`dbXQ}Q}t!i3X*!>>=X z+xAgs6 zVBcIk1mOM+W%L~lnE#(rx~=qo#YvmG9wuBb*ihDXC)rUWIwRM5r$(lRsiR@a6g35o zjQegxxwoIG^*;x|O?D9gu#*C10?X=NH~IHq=>h-;rK6hyo|j!kuZs3g$+96POz1gp z#>MtxYR>_??EoqAgD^o^BNgyQ5RSPT2~7t>rc*ZyJH) zODF^8NCtyTz^fGsc$ozMOL-;vw_BdI7Cp#BPC}K0lA%UM1#@RzGc+R5C^ROcZK!9- z^J#%n{21c0UGiTr7wf-JrI2@E3;rL>oU^2%5oM(!#8uYKLp`s=@1{Uqtvixxp1nk2 z4b5}gSL(+FHEV+MPg2W&uo=#*92*Kqpsy}u0|X-n>Fie>h=a*kBLUOc6-zLm7Xq7` zQ}sVdZKW7c!B!NV${eC%=airmg+!Kn-dX`5r;IwGV(uEX2J+m8yJPDd;SL{Aq=`}& zUa98UOBB|Ebr$vg_2Yu7^?>G|s@h1zy#dZ>xHKwL0_+-KVQv+F2pEBrCY=WZsT`=G zj5Pwl7-#{G8WyF>=Vb&Ii6rhqUZ}MNTFg^A9Wg8RqYlAyAkuCO323Lf1F6b#zdNpn zNLd%F>7=(zq5{oW9k~P!cN~jGIPXMkMVk}m^_7kN`|W{0V+m0)aS}-^iKLQ=mms+m zNTC!-v6PUK>@FpI)Hn)fmPMKA5LIOwlB033g4KT7co=ovwQ=i;(MQD_m{OBdjNCK# z7S64T!zhWGS6M+D6{aNR`e`9OFE+MG|(_bWh2t0dJ79F8t*3= jw}ry@Sey={$yO|4w9MQY6f`Ftv7^1M(cF)Gn!K<8QiX{R diff --git a/assets/js/autocomplete/autocomplete-list.js b/assets/js/autocomplete/autocomplete-list.js index 0bd6151ec..6b078d1e8 100644 --- a/assets/js/autocomplete/autocomplete-list.js +++ b/assets/js/autocomplete/autocomplete-list.js @@ -88,9 +88,12 @@ export function moveAutocompleteSelection (offset) { selectedElement.classList.remove('selected') } + if (state.previewOpen) { + showPreview(elementToSelect) + } + if (elementToSelect) { elementToSelect.classList.add('selected') - showPreview(elementToSelect) elementToSelect.scrollIntoView({ block: 'nearest' }) } else { @@ -103,32 +106,37 @@ export function moveAutocompleteSelection (offset) { * Toggles the preview state of the autocomplete list */ export function togglePreview () { - state.previewOpen = !state.previewOpen - const suggestionList = qs(AUTOCOMPLETE_SUGGESTION_LIST_SELECTOR) if (state.previewOpen) { - suggestionList.classList.add('previewing') - const elementToSelect = qs(`${AUTOCOMPLETE_SUGGESTION_SELECTOR}[data-index="${state.selectedIdx}"]`) - showPreview(elementToSelect) + hidePreview() } else { - suggestionList.classList.remove('previewing') - const container = previewContainer() - - if (container) { - container.remove() - }; + showPreview() } } -function showPreview (elementToSelect) { +/** + * Hides the preview state of the autocomplete list + */ +export function hidePreview () { + state.previewOpen = false + const suggestionList = qs(AUTOCOMPLETE_SUGGESTION_LIST_SELECTOR) + suggestionList.classList.remove('previewing') const container = previewContainer() if (container) { container.remove() }; +} +/** + * Shows the preview state of the autocomplete list + */ +export function showPreview (elementToSelect) { + hidePreview() + state.previewOpen = true const suggestionList = qs(AUTOCOMPLETE_SUGGESTION_LIST_SELECTOR) + elementToSelect = elementToSelect || qs(`${AUTOCOMPLETE_SUGGESTION_SELECTOR}[data-index="${state.selectedIdx}"]`) - if (state.previewOpen && elementToSelect) { + if (elementToSelect) { suggestionList.classList.add('previewing') const newContainer = document.createElement('div') newContainer.classList.add('autocomplete-preview') @@ -139,8 +147,6 @@ function showPreview (elementToSelect) { iframe.setAttribute('src', previewHref) newContainer.replaceChildren(iframe) elementToSelect.parentNode.insertBefore(newContainer, elementToSelect.nextSibling) - } else { - suggestionList.classList.remove('previewing') } } diff --git a/assets/js/content.js b/assets/js/content.js index 6945097da..6e20f4c3a 100644 --- a/assets/js/content.js +++ b/assets/js/content.js @@ -8,10 +8,14 @@ const LIVEBOOK_BADGE_ANCHOR_SELECTOR = '.livebook-badge' /** * Runs some general modifiers on the documentation content. */ -export function initialize () { - fixLinks() - fixSpacebar() +export function initialize (isPreview) { + // Disabled on autocomplete preview because it moves the focus to inner iframe + if (!isPreview) { + fixSpacebar() + } + setLivebookBadgeUrl() + fixLinks() fixBlockquotes() } diff --git a/assets/js/entry/html.js b/assets/js/entry/html.js index 8b18075f3..a6be7ec75 100644 --- a/assets/js/entry/html.js +++ b/assets/js/entry/html.js @@ -23,9 +23,10 @@ import { initialize as initPreview} from '../preview' onDocumentReady(() => { const params = new URLSearchParams(window.location.search) + const isPreview = params.has('preview') initTheme() - initContent() + initContent(isPreview) initMakeup() initTooltips() initHintsPage() @@ -33,7 +34,7 @@ onDocumentReady(() => { initOs() initTabsets() - if (params.has('preview')) { + if (isPreview) { initPreview() } else { initVersions() diff --git a/assets/js/handlebars/templates/autocomplete-suggestions.handlebars b/assets/js/handlebars/templates/autocomplete-suggestions.handlebars index 1a90869da..fdfbc6fed 100644 --- a/assets/js/handlebars/templates/autocomplete-suggestions.handlebars +++ b/assets/js/handlebars/templates/autocomplete-suggestions.handlebars @@ -22,14 +22,16 @@ {{#each labels}} {{this}} {{/each}} -
-
-
-
diff --git a/assets/js/search-bar.js b/assets/js/search-bar.js index 83293f0d4..160fa9bd1 100644 --- a/assets/js/search-bar.js +++ b/assets/js/search-bar.js @@ -4,6 +4,8 @@ import { moveAutocompleteSelection, selectedAutocompleteSuggestion, togglePreview, + showPreview, + hidePreview, updateAutocompleteList, AUTOCOMPLETE_CONTAINER_SELECTOR, AUTOCOMPLETE_SUGGESTION_SELECTOR @@ -18,6 +20,17 @@ const SEARCH_CLOSE_BUTTON_SELECTOR = 'form.search-bar .search-close-button' */ export function initialize () { addEventListeners() + + window.onTogglePreviewClick = function onTogglePreviewClick (event) { + event.preventDefault() + event.stopImmediatePropagation() + + // Keep the focus on the input instead of the button when the user clicked to open the preview + // Maintains consistent keyboard navigation and look + focusSearchInput() + + togglePreview() + } } /** @@ -67,9 +80,15 @@ function addEventListeners () { } else if (event.key === 'ArrowDown' || (macOS && event.ctrlKey && event.key === 'n')) { moveAutocompleteSelection(1) event.preventDefault() - } else if (event.key === 'ArrowRight' || event.key === 'ArrowLeft') { + } else if (event.key === 'Tab') { togglePreview() event.preventDefault() + } else if (event.key === 'ArrowRight') { + showPreview() + event.preventDefault() + } else if (event.key === 'ArrowLeft') { + hidePreview() + event.preventDefault() } }) @@ -78,8 +97,10 @@ function addEventListeners () { }) searchInput.addEventListener('focus', event => { - document.body.classList.add('search-focused') - updateAutocompleteList(event.target.value) + if (!document.body.classList.contains('search-focused')) { + document.body.classList.add('search-focused') + updateAutocompleteList(event.target.value) + } }) searchInput.addEventListener('blur', event => { @@ -97,11 +118,11 @@ function addEventListeners () { } }, 1000) return null + } else { + hideAutocomplete() } - - if (relatedTarget.matches(SEARCH_CLOSE_BUTTON_SELECTOR)) { - clearSearch() - } + } else { + hideAutocomplete() } }) @@ -114,6 +135,11 @@ function addEventListeners () { hideAutocomplete() } }) + + qs(SEARCH_CLOSE_BUTTON_SELECTOR).addEventListener('click', _event => { + clearSearch() + hideAutocomplete() + }) } function handleAutocompleteFormSubmission (event) { @@ -150,6 +176,7 @@ function clearSearch () { } function hideAutocomplete () { + hidePreview() document.body.classList.remove('search-focused') hideAutocompleteList() } diff --git a/formatters/html/dist/handlebars.templates-YQ7HIJNV.js b/formatters/html/dist/handlebars.templates-QRJZ6GQT.js similarity index 60% rename from formatters/html/dist/handlebars.templates-YQ7HIJNV.js rename to formatters/html/dist/handlebars.templates-QRJZ6GQT.js index df6a4eb9f..be04c8244 100644 --- a/formatters/html/dist/handlebars.templates-YQ7HIJNV.js +++ b/formatters/html/dist/handlebars.templates-QRJZ6GQT.js @@ -1,38 +1,40 @@ -(()=>{(function(){var d=Handlebars.template,y=Handlebars.templates=Handlebars.templates||{};y["autocomplete-suggestions"]=d({1:function(e,l,a,p,r){var o,n,u=l??(e.nullContext||{}),s=e.hooks.helperMissing,i="function",c=e.escapeExpression,t=e.lookupProperty||function(f,m){if(Object.prototype.hasOwnProperty.call(f,m))return f[m]};return' +(()=>{(function(){var d=Handlebars.template,y=Handlebars.templates=Handlebars.templates||{};y["autocomplete-suggestions"]=d({1:function(e,l,a,p,r){var o,n,s=l??(e.nullContext||{}),u=e.hooks.helperMissing,i="function",c=e.escapeExpression,t=e.lookupProperty||function(f,m){if(Object.prototype.hasOwnProperty.call(f,m))return f[m]};return'
-`+((o=t(a,"if").call(u,l!=null?t(l,"deprecated"):l,{name:"if",hash:{},fn:e.program(2,r,0),inverse:e.program(4,r,0),data:r,loc:{start:{line:16,column:10},end:{line:20,column:17}}}))!=null?o:"")+` -`+((o=t(a,"each").call(u,l!=null?t(l,"labels"):l,{name:"each",hash:{},fn:e.program(6,r,0),inverse:e.noop,data:r,loc:{start:{line:22,column:10},end:{line:24,column:19}}}))!=null?o:"")+`
-
-
-
-`+((o=t(a,"if").call(u,l!=null?t(l,"description"):l,{name:"if",hash:{},fn:e.program(8,r,0),inverse:e.noop,data:r,loc:{start:{line:37,column:8},end:{line:41,column:15}}}))!=null?o:"")+`
-`},2:function(e,l,a,p,r){var o,n,u=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return' '+((o=(n=(n=u(a,"title")||(l!=null?u(l,"title"):l))!=null?n:e.hooks.helperMissing,typeof n=="function"?n.call(l??(e.nullContext||{}),{name:"title",hash:{},data:r,loc:{start:{line:17,column:49},end:{line:17,column:60}}}):n))!=null?o:"")+` -`},4:function(e,l,a,p,r){var o,n,u=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return' '+((o=(n=(n=u(a,"title")||(l!=null?u(l,"title"):l))!=null?n:e.hooks.helperMissing,typeof n=="function"?n.call(l??(e.nullContext||{}),{name:"title",hash:{},data:r,loc:{start:{line:19,column:46},end:{line:19,column:57}}}):n))!=null?o:"")+` +`+((o=t(a,"if").call(s,l!=null?t(l,"description"):l,{name:"if",hash:{},fn:e.program(8,r,0),inverse:e.noop,data:r,loc:{start:{line:39,column:8},end:{line:43,column:15}}}))!=null?o:"")+` +`},2:function(e,l,a,p,r){var o,n,s=e.lookupProperty||function(u,i){if(Object.prototype.hasOwnProperty.call(u,i))return u[i]};return' '+((o=(n=(n=s(a,"title")||(l!=null?s(l,"title"):l))!=null?n:e.hooks.helperMissing,typeof n=="function"?n.call(l??(e.nullContext||{}),{name:"title",hash:{},data:r,loc:{start:{line:17,column:49},end:{line:17,column:60}}}):n))!=null?o:"")+` +`},4:function(e,l,a,p,r){var o,n,s=e.lookupProperty||function(u,i){if(Object.prototype.hasOwnProperty.call(u,i))return u[i]};return' '+((o=(n=(n=s(a,"title")||(l!=null?s(l,"title"):l))!=null?n:e.hooks.helperMissing,typeof n=="function"?n.call(l??(e.nullContext||{}),{name:"title",hash:{},data:r,loc:{start:{line:19,column:46},end:{line:19,column:57}}}):n))!=null?o:"")+` `},6:function(e,l,a,p,r){return' '+e.escapeExpression(e.lambda(l,l))+` -`},8:function(e,l,a,p,r){var o,n,u=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return`
- `+((o=(n=(n=u(a,"description")||(l!=null?u(l,"description"):l))!=null?n:e.hooks.helperMissing,typeof n=="function"?n.call(l??(e.nullContext||{}),{name:"description",hash:{},data:r,loc:{start:{line:39,column:10},end:{line:39,column:27}}}):n))!=null?o:"")+` +`},8:function(e,l,a,p,r){var o,n,s=e.lookupProperty||function(u,i){if(Object.prototype.hasOwnProperty.call(u,i))return u[i]};return`
+ `+((o=(n=(n=s(a,"description")||(l!=null?s(l,"description"):l))!=null?n:e.hooks.helperMissing,typeof n=="function"?n.call(l??(e.nullContext||{}),{name:"description",hash:{},data:r,loc:{start:{line:41,column:10},end:{line:41,column:27}}}):n))!=null?o:"")+`
-`},compiler:[8,">= 4.3.0"],main:function(e,l,a,p,r){var o,n,u=l??(e.nullContext||{}),s=e.lookupProperty||function(i,c){if(Object.prototype.hasOwnProperty.call(i,c))return i[c]};return`
+`},compiler:[8,">= 4.3.0"],main:function(e,l,a,p,r){var o,n,s=l??(e.nullContext||{}),u=e.lookupProperty||function(i,c){if(Object.prototype.hasOwnProperty.call(i,c))return i[c]};return`
- Autocompletion results for "`+e.escapeExpression((n=(n=s(a,"term")||(l!=null?s(l,"term"):l))!=null?n:e.hooks.helperMissing,typeof n=="function"?n.call(u,{name:"term",hash:{},data:r,loc:{start:{line:6,column:55},end:{line:6,column:63}}}):n))+`" + Autocompletion results for "`+e.escapeExpression((n=(n=u(a,"term")||(l!=null?u(l,"term"):l))!=null?n:e.hooks.helperMissing,typeof n=="function"?n.call(s,{name:"term",hash:{},data:r,loc:{start:{line:6,column:55},end:{line:6,column:63}}}):n))+`" Press RETURN for full-text search, TAB for previews
-`+((o=s(a,"each").call(u,l!=null?s(l,"suggestions"):l,{name:"each",hash:{},fn:e.program(1,r,0),inverse:e.noop,data:r,loc:{start:{line:13,column:6},end:{line:43,column:15}}}))!=null?o:"")+`
+`+((o=u(a,"each").call(s,l!=null?u(l,"suggestions"):l,{name:"each",hash:{},fn:e.program(1,r,0),inverse:e.noop,data:r,loc:{start:{line:13,column:6},end:{line:45,column:15}}}))!=null?o:"")+`
`},useData:!0}),y["modal-layout"]=d({compiler:[8,">= 4.3.0"],main:function(e,l,a,p,r){return` -`},useData:!0}),y["quick-switch-results"]=d({1:function(e,l,a,p,r){var o,n=l??(e.nullContext||{}),u=e.hooks.helperMissing,s="function",i=e.escapeExpression,c=e.lookupProperty||function(t,f){if(Object.prototype.hasOwnProperty.call(t,f))return t[f]};return'
- `+i((o=(o=c(a,"name")||(l!=null?c(l,"name"):l))!=null?o:u,typeof o===s?o.call(n,{name:"name",hash:{},data:r,loc:{start:{line:3,column:4},end:{line:3,column:12}}}):o))+` +`},useData:!0}),y["quick-switch-results"]=d({1:function(e,l,a,p,r){var o,n=l??(e.nullContext||{}),s=e.hooks.helperMissing,u="function",i=e.escapeExpression,c=e.lookupProperty||function(t,f){if(Object.prototype.hasOwnProperty.call(t,f))return t[f]};return'
+ `+i((o=(o=c(a,"name")||(l!=null?c(l,"name"):l))!=null?o:s,typeof o===u?o.call(n,{name:"name",hash:{},data:r,loc:{start:{line:3,column:4},end:{line:3,column:12}}}):o))+`
-`},compiler:[8,">= 4.3.0"],main:function(e,l,a,p,r){var o,n=e.lookupProperty||function(u,s){if(Object.prototype.hasOwnProperty.call(u,s))return u[s]};return(o=n(a,"each").call(l??(e.nullContext||{}),l!=null?n(l,"results"):l,{name:"each",hash:{},fn:e.program(1,r,0),inverse:e.noop,data:r,loc:{start:{line:1,column:0},end:{line:5,column:9}}}))!=null?o:""},useData:!0}),y["search-results"]=d({1:function(e,l,a,p,r){var o,n=e.lookupProperty||function(u,s){if(Object.prototype.hasOwnProperty.call(u,s))return u[s]};return" Search results for "+e.escapeExpression((o=(o=n(a,"value")||(l!=null?n(l,"value"):l))!=null?o:e.hooks.helperMissing,typeof o=="function"?o.call(l??(e.nullContext||{}),{name:"value",hash:{},data:r,loc:{start:{line:3,column:27},end:{line:3,column:36}}}):o))+` +`},compiler:[8,">= 4.3.0"],main:function(e,l,a,p,r){var o,n=e.lookupProperty||function(s,u){if(Object.prototype.hasOwnProperty.call(s,u))return s[u]};return(o=n(a,"each").call(l??(e.nullContext||{}),l!=null?n(l,"results"):l,{name:"each",hash:{},fn:e.program(1,r,0),inverse:e.noop,data:r,loc:{start:{line:1,column:0},end:{line:5,column:9}}}))!=null?o:""},useData:!0}),y["search-results"]=d({1:function(e,l,a,p,r){var o,n=e.lookupProperty||function(s,u){if(Object.prototype.hasOwnProperty.call(s,u))return s[u]};return" Search results for "+e.escapeExpression((o=(o=n(a,"value")||(l!=null?n(l,"value"):l))!=null?o:e.hooks.helperMissing,typeof o=="function"?o.call(l??(e.nullContext||{}),{name:"value",hash:{},data:r,loc:{start:{line:3,column:27},end:{line:3,column:36}}}):o))+` `},3:function(e,l,a,p,r){return` Invalid search -`},5:function(e,l,a,p,r){var o,n=e.lookupProperty||function(u,s){if(Object.prototype.hasOwnProperty.call(u,s))return u[s]};return(o=n(a,"each").call(l??(e.nullContext||{}),l!=null?n(l,"results"):l,{name:"each",hash:{},fn:e.program(6,r,0),inverse:e.noop,data:r,loc:{start:{line:10,column:2},end:{line:21,column:11}}}))!=null?o:""},6:function(e,l,a,p,r){var o,n=e.lambda,u=e.escapeExpression,s=e.lookupProperty||function(i,c){if(Object.prototype.hasOwnProperty.call(i,c))return i[c]};return`
+`},5:function(e,l,a,p,r){var o,n=e.lookupProperty||function(s,u){if(Object.prototype.hasOwnProperty.call(s,u))return s[u]};return(o=n(a,"each").call(l??(e.nullContext||{}),l!=null?n(l,"results"):l,{name:"each",hash:{},fn:e.program(6,r,0),inverse:e.noop,data:r,loc:{start:{line:10,column:2},end:{line:21,column:11}}}))!=null?o:""},6:function(e,l,a,p,r){var o,n=e.lambda,s=e.escapeExpression,u=e.lookupProperty||function(i,c){if(Object.prototype.hasOwnProperty.call(i,c))return i[c]};return`

- - `+u(n(l!=null?s(l,"title"):l,l))+" ("+u(n(l!=null?s(l,"type"):l,l))+`) + + `+s(n(l!=null?u(l,"title"):l,l))+" ("+s(n(l!=null?u(l,"type"):l,l))+`)

-`+((o=s(a,"each").call(l??(e.nullContext||{}),l!=null?s(l,"excerpts"):l,{name:"each",hash:{},fn:e.program(7,r,0),inverse:e.noop,data:r,loc:{start:{line:17,column:8},end:{line:19,column:17}}}))!=null?o:"")+`
+`+((o=u(a,"each").call(l??(e.nullContext||{}),l!=null?u(l,"excerpts"):l,{name:"each",hash:{},fn:e.program(7,r,0),inverse:e.noop,data:r,loc:{start:{line:17,column:8},end:{line:19,column:17}}}))!=null?o:"")+`
`},7:function(e,l,a,p,r){var o;return'

'+((o=e.lambda(l,l))!=null?o:"")+`

-`},9:function(e,l,a,p,r){var o,n=e.lookupProperty||function(u,s){if(Object.prototype.hasOwnProperty.call(u,s))return u[s]};return((o=(n(a,"isArray")||l&&n(l,"isArray")||e.hooks.helperMissing).call(l??(e.nullContext||{}),l!=null?n(l,"results"):l,{name:"isArray",hash:{},fn:e.program(10,r,0),inverse:e.program(12,r,0),data:r,loc:{start:{line:23,column:2},end:{line:29,column:14}}}))!=null?o:"")+` +`},9:function(e,l,a,p,r){var o,n=e.lookupProperty||function(s,u){if(Object.prototype.hasOwnProperty.call(s,u))return s[u]};return((o=(n(a,"isArray")||l&&n(l,"isArray")||e.hooks.helperMissing).call(l??(e.nullContext||{}),l!=null?n(l,"results"):l,{name:"isArray",hash:{},fn:e.program(10,r,0),inverse:e.program(12,r,0),data:r,loc:{start:{line:23,column:2},end:{line:29,column:14}}}))!=null?o:"")+`

The search functionality is full-text based. Here are some tips:

    @@ -77,22 +79,22 @@

To quickly go to a module, type, or function, use the autocompletion feature in the sidebar search.

-`},10:function(e,l,a,p,r){var o,n=e.lookupProperty||function(u,s){if(Object.prototype.hasOwnProperty.call(u,s))return u[s]};return"

Sorry, we couldn't find anything for "+e.escapeExpression((o=(o=n(a,"value")||(l!=null?n(l,"value"):l))!=null?o:e.hooks.helperMissing,typeof o=="function"?o.call(l??(e.nullContext||{}),{name:"value",hash:{},data:r,loc:{start:{line:24,column:48},end:{line:24,column:57}}}):o))+`.

-`},12:function(e,l,a,p,r){var o,n=e.lookupProperty||function(u,s){if(Object.prototype.hasOwnProperty.call(u,s))return u[s]};return(o=n(a,"if").call(l??(e.nullContext||{}),l!=null?n(l,"value"):l,{name:"if",hash:{},fn:e.program(13,r,0),inverse:e.program(15,r,0),data:r,loc:{start:{line:25,column:2},end:{line:29,column:2}}}))!=null?o:""},13:function(e,l,a,p,r){var o,n=e.lookupProperty||function(u,s){if(Object.prototype.hasOwnProperty.call(u,s))return u[s]};return"

Invalid search: "+e.escapeExpression((o=(o=n(a,"errorMessage")||(l!=null?n(l,"errorMessage"):l))!=null?o:e.hooks.helperMissing,typeof o=="function"?o.call(l??(e.nullContext||{}),{name:"errorMessage",hash:{},data:r,loc:{start:{line:26,column:23},end:{line:26,column:39}}}):o))+`.

+`},10:function(e,l,a,p,r){var o,n=e.lookupProperty||function(s,u){if(Object.prototype.hasOwnProperty.call(s,u))return s[u]};return"

Sorry, we couldn't find anything for "+e.escapeExpression((o=(o=n(a,"value")||(l!=null?n(l,"value"):l))!=null?o:e.hooks.helperMissing,typeof o=="function"?o.call(l??(e.nullContext||{}),{name:"value",hash:{},data:r,loc:{start:{line:24,column:48},end:{line:24,column:57}}}):o))+`.

+`},12:function(e,l,a,p,r){var o,n=e.lookupProperty||function(s,u){if(Object.prototype.hasOwnProperty.call(s,u))return s[u]};return(o=n(a,"if").call(l??(e.nullContext||{}),l!=null?n(l,"value"):l,{name:"if",hash:{},fn:e.program(13,r,0),inverse:e.program(15,r,0),data:r,loc:{start:{line:25,column:2},end:{line:29,column:2}}}))!=null?o:""},13:function(e,l,a,p,r){var o,n=e.lookupProperty||function(s,u){if(Object.prototype.hasOwnProperty.call(s,u))return s[u]};return"

Invalid search: "+e.escapeExpression((o=(o=n(a,"errorMessage")||(l!=null?n(l,"errorMessage"):l))!=null?o:e.hooks.helperMissing,typeof o=="function"?o.call(l??(e.nullContext||{}),{name:"errorMessage",hash:{},data:r,loc:{start:{line:26,column:23},end:{line:26,column:39}}}):o))+`.

`},15:function(e,l,a,p,r){return`

Please type something into the search bar to perform a search.

- `},compiler:[8,">= 4.3.0"],main:function(e,l,a,p,r){var o,n=l??(e.nullContext||{}),u=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return`

-`+((o=u(a,"if").call(n,l!=null?u(l,"value"):l,{name:"if",hash:{},fn:e.program(1,r,0),inverse:e.program(3,r,0),data:r,loc:{start:{line:2,column:2},end:{line:6,column:9}}}))!=null?o:"")+`

+ `},compiler:[8,">= 4.3.0"],main:function(e,l,a,p,r){var o,n=l??(e.nullContext||{}),s=e.lookupProperty||function(u,i){if(Object.prototype.hasOwnProperty.call(u,i))return u[i]};return`

+`+((o=s(a,"if").call(n,l!=null?s(l,"value"):l,{name:"if",hash:{},fn:e.program(1,r,0),inverse:e.program(3,r,0),data:r,loc:{start:{line:2,column:2},end:{line:6,column:9}}}))!=null?o:"")+`

-`+((o=(u(a,"isNonEmptyArray")||l&&u(l,"isNonEmptyArray")||e.hooks.helperMissing).call(n,l!=null?u(l,"results"):l,{name:"isNonEmptyArray",hash:{},fn:e.program(5,r,0),inverse:e.program(9,r,0),data:r,loc:{start:{line:9,column:0},end:{line:44,column:20}}}))!=null?o:"")},useData:!0}),y["settings-modal-body"]=d({1:function(e,l,a,p,r){var o,n=e.lookupProperty||function(u,s){if(Object.prototype.hasOwnProperty.call(u,s))return u[s]};return(o=n(a,"if").call(l??(e.nullContext||{}),l!=null?n(l,"description"):l,{name:"if",hash:{},fn:e.program(2,r,0),inverse:e.noop,data:r,loc:{start:{line:40,column:6},end:{line:53,column:13}}}))!=null?o:""},2:function(e,l,a,p,r){var o,n=e.lookupProperty||function(u,s){if(Object.prototype.hasOwnProperty.call(u,s))return u[s]};return`
+`+((o=(s(a,"isNonEmptyArray")||l&&s(l,"isNonEmptyArray")||e.hooks.helperMissing).call(n,l!=null?s(l,"results"):l,{name:"isNonEmptyArray",hash:{},fn:e.program(5,r,0),inverse:e.program(9,r,0),data:r,loc:{start:{line:9,column:0},end:{line:44,column:20}}}))!=null?o:"")},useData:!0}),y["settings-modal-body"]=d({1:function(e,l,a,p,r){var o,n=e.lookupProperty||function(s,u){if(Object.prototype.hasOwnProperty.call(s,u))return s[u]};return(o=n(a,"if").call(l??(e.nullContext||{}),l!=null?n(l,"description"):l,{name:"if",hash:{},fn:e.program(2,r,0),inverse:e.noop,data:r,loc:{start:{line:40,column:6},end:{line:53,column:13}}}))!=null?o:""},2:function(e,l,a,p,r){var o,n=e.lookupProperty||function(s,u){if(Object.prototype.hasOwnProperty.call(s,u))return s[u]};return`
`+e.escapeExpression(e.lambda(l!=null?n(l,"description"):l,l))+`
`+((o=n(a,"if").call(l??(e.nullContext||{}),l!=null?n(l,"displayAs"):l,{name:"if",hash:{},fn:e.program(3,r,0),inverse:e.program(5,r,0),data:r,loc:{start:{line:46,column:12},end:{line:50,column:19}}}))!=null?o:"")+`
-`},3:function(e,l,a,p,r){var o,n=e.lookupProperty||function(u,s){if(Object.prototype.hasOwnProperty.call(u,s))return u[s]};return" "+((o=e.lambda(l!=null?n(l,"displayAs"):l,l))!=null?o:"")+` -`},5:function(e,l,a,p,r){var o=e.lookupProperty||function(n,u){if(Object.prototype.hasOwnProperty.call(n,u))return n[u]};return" "+e.escapeExpression(e.lambda(l!=null?o(l,"key"):l,l))+` -`},compiler:[8,">= 4.3.0"],main:function(e,l,a,p,r){var o,n=e.lookupProperty||function(u,s){if(Object.prototype.hasOwnProperty.call(u,s))return u[s]};return`
+`},3:function(e,l,a,p,r){var o,n=e.lookupProperty||function(s,u){if(Object.prototype.hasOwnProperty.call(s,u))return s[u]};return" "+((o=e.lambda(l!=null?n(l,"displayAs"):l,l))!=null?o:"")+` +`},5:function(e,l,a,p,r){var o=e.lookupProperty||function(n,s){if(Object.prototype.hasOwnProperty.call(n,s))return n[s]};return" "+e.escapeExpression(e.lambda(l!=null?o(l,"key"):l,l))+` +`},compiler:[8,">= 4.3.0"],main:function(e,l,a,p,r){var o,n=e.lookupProperty||function(s,u){if(Object.prototype.hasOwnProperty.call(s,u))return s[u]};return`