diff --git a/packages/sn-filter-pane/src/components/ListboxGrid/ListboxGrid.tsx b/packages/sn-filter-pane/src/components/ListboxGrid/ListboxGrid.tsx index 8579081f..c9eed08f 100644 --- a/packages/sn-filter-pane/src/components/ListboxGrid/ListboxGrid.tsx +++ b/packages/sn-filter-pane/src/components/ListboxGrid/ListboxGrid.tsx @@ -24,6 +24,7 @@ import { RenderTrackerService } from '../../services/render-tracker'; import useFocusListener from '../../hooks/use-focus-listener'; import findNextIndex from './find-next-index'; import { IEnv } from '../../types/types'; +import resetZoom from '../../utils/reset-zoom'; const prepareRenderTracker = (listboxCount: number, renderTracker?: RenderTrackerService) => { renderTracker?.setNumberOfListboxes(listboxCount); @@ -117,6 +118,8 @@ function ListboxGrid({ stores }: { stores: IStores }) { preventDefaultBehavior(event); }; + const handleFocus = sense?.isSmallDevice?.() ? () => resetZoom() : undefined; + useFocusListener(gridRef, keyboard); const isRtl = options.direction === 'rtl'; @@ -146,6 +149,7 @@ function ListboxGrid({ stores }: { stores: IStores }) { className="filter-pane-container" container onKeyDown={handleKeyDown} + onFocus={handleFocus} sx={{ flexDirection: isRtl ? 'row-reverse' : 'row' }} columns={columns?.length} ref={gridRef as unknown as () => HTMLDivElement} diff --git a/packages/sn-filter-pane/src/components/ListboxPopoverContainer.tsx b/packages/sn-filter-pane/src/components/ListboxPopoverContainer.tsx index 6e7cb73c..39b5905d 100644 --- a/packages/sn-filter-pane/src/components/ListboxPopoverContainer.tsx +++ b/packages/sn-filter-pane/src/components/ListboxPopoverContainer.tsx @@ -68,13 +68,6 @@ const StyledPopover = styled(Popover, { shouldForwardProp: (p: string) => !['isS } : {}, })); -function resetZoom() { - const viewportMetaTag = document.querySelector('meta[name="viewport"]'); - if (viewportMetaTag instanceof HTMLMetaElement) { - viewportMetaTag.content = 'width=device-width, minimum-scale=1.0, maximum-scale=1.0, initial-scale=1.0'; - } -} - /** * If a single resource is passed to this component a FoldedListbox is rendered. * When the FoldedListbox is clicked, a Listbox is rendered in a Popover. @@ -95,10 +88,6 @@ export const ListboxPopoverContainer = ({ resources, stores }: FoldedPopoverProp const handleOpen = ({ event }: FoldedListboxClickEvent | { event: React.MouseEvent }) => { if (event.currentTarget.contains(event.target as Node) && !constraints?.active) { setPopoverOpen(true); - if (isSmallDevice) { - // Autofocus can cause the browser to zoom so we need to reset zoom. - resetZoom(); - } } }; const handleClose = () => { diff --git a/packages/sn-filter-pane/src/utils/reset-zoom.ts b/packages/sn-filter-pane/src/utils/reset-zoom.ts new file mode 100644 index 00000000..ac713cdb --- /dev/null +++ b/packages/sn-filter-pane/src/utils/reset-zoom.ts @@ -0,0 +1,11 @@ +/** + * Run this on small devices to reset the zoom. Required when focusing + * an input field and the browser auto zooms the page. Browsers do not + * expose any API for handling this currently. + */ +export default function resetZoom() { + const viewportMetaTag = document.querySelector('meta[name="viewport"]'); + if (viewportMetaTag instanceof HTMLMetaElement) { + viewportMetaTag.content = 'width=device-width, minimum-scale=1.0, maximum-scale=1.0, initial-scale=1.0'; + } +}