diff options
| author | 2021-08-14 00:58:00 +0000 | |
|---|---|---|
| committer | 2021-08-26 12:15:33 -0700 | |
| commit | b7ada11ddbabe4dd2f0798e140e5b280de4d6952 (patch) | |
| tree | c01ff3eee4f770fc108c19d126dce31d9cbe5e51 /examples/docs/src/components/Header/Search.tsx | |
| parent | 59cc62f7bd53dbcb6ad8051fa501b7b797614178 (diff) | |
| download | astro-b7ada11ddbabe4dd2f0798e140e5b280de4d6952.tar.gz astro-b7ada11ddbabe4dd2f0798e140e5b280de4d6952.tar.zst astro-b7ada11ddbabe4dd2f0798e140e5b280de4d6952.zip | |
WIP update examples/docs/
Diffstat (limited to 'examples/docs/src/components/Header/Search.tsx')
| -rw-r--r-- | examples/docs/src/components/Header/Search.tsx | 76 | 
1 files changed, 76 insertions, 0 deletions
| diff --git a/examples/docs/src/components/Header/Search.tsx b/examples/docs/src/components/Header/Search.tsx new file mode 100644 index 000000000..d842e007f --- /dev/null +++ b/examples/docs/src/components/Header/Search.tsx @@ -0,0 +1,76 @@ +/* jsxImportSource: react */ +import { useState, useCallback, useRef } from 'react'; +import { createPortal } from 'react-dom'; +import { DocSearchModal, useDocSearchKeyboardEvents } from '@docsearch/react'; +import '@docsearch/css//dist/style.css'; +import './Search.css'; + +export default function Search() { +  const [isOpen, setIsOpen] = useState(false); +  const searchButtonRef = useRef(); +  const [initialQuery, setInitialQuery] = useState(null); + +  const onOpen = useCallback(() => { +    setIsOpen(true); +  }, [setIsOpen]); + +  const onClose = useCallback(() => { +    setIsOpen(false); +  }, [setIsOpen]); + +  const onInput = useCallback( +    (e) => { +      setIsOpen(true); +      setInitialQuery(e.key); +    }, +    [setIsOpen, setInitialQuery] +  ); + +  useDocSearchKeyboardEvents({ +    isOpen, +    onOpen, +    onClose, +    onInput, +    searchButtonRef, +  }); + +  return ( +    <> +      <button type="button" ref={searchButtonRef} onClick={onOpen} className="search-input"> +        <svg width="24" height="24" fill="none"> +          <path d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" /> +        </svg> +        <span>Search</span> +        <span className="search-hint"> +          <span className="sr-only">Press </span> +          <kbd>/</kbd> +          <span className="sr-only"> to search</span> +        </span> +      </button> +      {isOpen && +        createPortal( +          <DocSearchModal +            initialQuery={initialQuery} +            initialScrollY={window.scrollY} +            onClose={onClose} +            indexName="astro" +            apiKey="0f387260ad74f9cbf4353facd29c919c" +            transformItems={(items) => { +              return items.map((item) => { +                // We transform the absolute URL into a relative URL to +                // work better on localhost, preview URLS. +                const a = document.createElement('a'); +                a.href = item.url; +                const hash = a.hash === '#overview' ? '' : a.hash; +                return { +                  ...item, +                  url: `${a.pathname}${hash}`, +                }; +              }); +            }} +          />, +          document.body +        )} +    </> +  ); +} | 
