Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: enhance search modal with smooth opening and closing transition #3647

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 44 additions & 23 deletions components/AlgoliaSearch.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -112,31 +112,52 @@ function Hit({ hit, children }: IHitProps) {
*/
function AlgoliaModal({ onClose, initialQuery, indexName }: AlgoliaModalProps) {
const router = useRouter();
const [isVisible, setIsVisible] = useState(false);

useEffect(() => {
const timer = setTimeout(() => setIsVisible(true), 10); // Small delay for smooth entry

return () => clearTimeout(timer); // Cleanup function
}, []);

const handleClose = () => {
setIsVisible(false);
const timer = setTimeout(onClose, 300); // Delay closing to allow animation to finish

return () => clearTimeout(timer); // Cleanup function
};

return createPortal(
<DocSearchModal
initialQuery={initialQuery}
initialScrollY={window.scrollY}
searchParameters={{
distinct: 1
}}
placeholder={indexName === DOCS_INDEX_NAME ? 'Search documentation' : 'Search resources'}
onClose={onClose}
indexName={indexName}
apiKey={API_KEY}
appId={APP_ID}
navigator={{
navigate({ itemUrl }) {
onClose();
router.push(itemUrl);
}
}}
hitComponent={Hit}
transformItems={transformItems}
getMissingResultsUrl={({ query }) => {
return `https://github.com/asyncapi/website/issues/new?title=Cannot%20search%20given%20query:%20${query}`;
}}
/>,
<div
className={`fixed inset-0 z-50 bg-black/50 transition-all duration-200 ${
isVisible ? 'scale-100 opacity-100' : 'scale-95 opacity-0'
}`}
onClick={handleClose}
>
<div
className='rounded-lg bg-transparent p-6 shadow-lg transition-all duration-300'
onClick={(e) => e.stopPropagation()}
>
<DocSearchModal
initialQuery={initialQuery}
initialScrollY={window.scrollY}
searchParameters={{ distinct: 1 }}
placeholder={indexName === DOCS_INDEX_NAME ? 'Search documentation' : 'Search resources'}
onClose={handleClose}
indexName={indexName}
apiKey={API_KEY}
appId={APP_ID}
navigator={{
navigate({ itemUrl }) {
handleClose();
router.push(itemUrl);
}
}}
hitComponent={Hit}
transformItems={transformItems}
/>
</div>
</div>,
Comment on lines +131 to +160
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Enhance modal accessibility.

The modal implementation should include proper accessibility features:

  1. Add role="dialog" and aria-modal="true" to the modal wrapper.
  2. Add aria-label to describe the modal's purpose.
  3. Trap focus within the modal when open.
 <div
   className={`fixed inset-0 z-50 bg-black/50 transition-all duration-200 ${
     isVisible ? 'scale-100 opacity-100' : 'scale-95 opacity-0'
   }`}
+  role="dialog"
+  aria-modal="true"
+  aria-label="Search documentation"
   onClick={handleClose}
 >

Consider using a focus trap library like focus-trap-react to manage keyboard focus:

import { FocusTrap } from 'focus-trap-react';

// Wrap modal content
<FocusTrap active={isVisible}>
  <div className="rounded-lg bg-transparent p-6 shadow-lg transition-all duration-300">
    {/* ... */}
  </div>
</FocusTrap>

document.body
);
}
Expand Down
Loading