diff --git a/src/popover/utils.spec.ts b/src/popover/utils.spec.ts index cd7a117..a18137c 100644 --- a/src/popover/utils.spec.ts +++ b/src/popover/utils.spec.ts @@ -3,6 +3,13 @@ import { describe, expect, it } from 'vitest'; import { calculateWindowAdjustment, getIndexOfItem, getNextItem, getPopoverPosition, getPrevItem } from './utils.js'; describe('popover utilities', () => { + it.each(['left', 'right', 'start', 'end'] as const)('preserves the vertical anchor alignment for side=%s', (side) => { + const position = calculateWindowAdjustment(side, 120, 100, 5, 440, 636, 200, 52, 8, 'right', 'center'); + expect(position.top).toBe(120); + expect(calculateWindowAdjustment(side, -4, 100, 5, 440, 636, 200, 52, 8, 'right', 'center').top).toBe(5); + expect(calculateWindowAdjustment(side, 620, 100, 5, 440, 636, 200, 52, 8, 'right', 'center').top).toBe(579); + }); + it('navigates only relative to ion-item elements', () => { const items = [document.createElement('ion-item'), document.createElement('ion-item')] as HTMLIonItemElement[]; diff --git a/src/popover/utils.ts b/src/popover/utils.ts index ed30ce9..5700079 100644 --- a/src/popover/utils.ts +++ b/src/popover/utils.ts @@ -616,7 +616,9 @@ export const calculateWindowAdjustment = ( const triggerTop = triggerCoordinates ? triggerCoordinates.top + triggerCoordinates.height : bodyHeight / 2 - contentHeight / 2; const triggerHeight = triggerCoordinates ? triggerCoordinates.height : 0; let left = coordLeft; - let top = !isReplace ? coordTop + POPOVER_IOS_BODY_MARGIN : coordTop - triggerHeight; + const horizontal = side === 'left' || side === 'right' || side === 'start' || side === 'end'; + let top = !isReplace ? coordTop + (horizontal ? 0 : POPOVER_IOS_BODY_MARGIN) : coordTop - triggerHeight; + if (horizontal && !isReplace) top = Math.max(bodyPadding, Math.min(top, bodyHeight - bodyPadding - contentHeight)); let bottom; let originX = contentOriginX; let originY = contentOriginY;