diff --git a/packages/react/package.json b/packages/react/package.json index d4ae30e6638..21c1ee30aa9 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -78,7 +78,6 @@ "@github/relative-time-element": "^4.5.0", "@github/tab-container-element": "^4.8.2", "@lit-labs/react": "1.2.1", - "@oddbird/css-anchor-positioning": "^0.9.0", "@oddbird/popover-polyfill": "^0.5.2", "@primer/behaviors": "^1.10.2", "@primer/live-region-element": "^0.7.1", diff --git a/packages/react/src/AnchoredOverlay/AnchoredOverlay.module.css b/packages/react/src/AnchoredOverlay/AnchoredOverlay.module.css index 5edbdb0a043..a20a216393a 100644 --- a/packages/react/src/AnchoredOverlay/AnchoredOverlay.module.css +++ b/packages/react/src/AnchoredOverlay/AnchoredOverlay.module.css @@ -19,6 +19,7 @@ flip-inline, flip-block flip-inline; position-visibility: anchors-visible; + position-try-order: most-inline-size; z-index: 100; position: fixed !important; @@ -35,23 +36,37 @@ /* stylelint-disable primer/spacing */ top: calc(anchor(bottom) + var(--base-size-4)); left: anchor(left); + max-height: calc(100dvh - anchor(bottom) - var(--base-size-4)); + + &[data-align='left'] { + left: auto; + right: anchor(right); + } } &[data-side='outside-top'] { margin-bottom: var(--base-size-4); bottom: anchor(top); left: anchor(left); + max-height: calc(anchor(top) - var(--base-size-4)); + + &[data-align='left'] { + left: auto; + right: anchor(right); + } } &[data-side='outside-left'] { right: anchor(left); top: anchor(top); margin-right: var(--base-size-4); + max-height: calc(100dvh - anchor(top)); } &[data-side='outside-right'] { left: anchor(right); top: anchor(top); margin-left: var(--base-size-4); + max-height: calc(100dvh - anchor(top)); } } diff --git a/packages/react/src/AnchoredOverlay/AnchoredOverlay.tsx b/packages/react/src/AnchoredOverlay/AnchoredOverlay.tsx index 65af71b83dd..810b4d9ec2c 100644 --- a/packages/react/src/AnchoredOverlay/AnchoredOverlay.tsx +++ b/packages/react/src/AnchoredOverlay/AnchoredOverlay.tsx @@ -125,17 +125,6 @@ export type AnchoredOverlayProps = AnchoredOverlayBaseProps & (AnchoredOverlayPropsWithAnchor | AnchoredOverlayPropsWithoutAnchor) & Partial> -const applyAnchorPositioningPolyfill = async () => { - if (typeof window !== 'undefined' && !('anchorName' in document.documentElement.style)) { - try { - await import('@oddbird/css-anchor-positioning') - } catch (e) { - // eslint-disable-next-line no-console - console.warn('Failed to load CSS anchor positioning polyfill:', e) - } - } -} - const defaultVariant = { regular: 'anchored', narrow: 'anchored', @@ -173,7 +162,9 @@ export const AnchoredOverlay: React.FC { - const cssAnchorPositioning = useFeatureFlag('primer_react_css_anchor_positioning') + const cssAnchorPositioningFlag = useFeatureFlag('primer_react_css_anchor_positioning') + const supportsNativeCSSAnchorPositioning = useRef(false) + const cssAnchorPositioning = cssAnchorPositioningFlag && supportsNativeCSSAnchorPositioning.current const anchorRef = useProvidedRefOrCreate(externalAnchorRef) const [overlayRef, updateOverlayRef] = useRenderForcingRef() const anchorId = useId(externalAnchorId) @@ -232,19 +223,14 @@ export const AnchoredOverlay: React.FC { + supportsNativeCSSAnchorPositioning.current = 'anchorName' in document.documentElement.style + // ensure overlay ref gets cleared when closed, so position can reset between closing/re-opening if (!open && overlayRef.current) { updateOverlayRef(null) } - - if (cssAnchorPositioning && !hasLoadedAnchorPositioningPolyfill.current) { - applyAnchorPositioningPolyfill() - hasLoadedAnchorPositioningPolyfill.current = true - } - }, [open, overlayRef, updateOverlayRef, cssAnchorPositioning]) + }, [open, overlayRef, updateOverlayRef]) useFocusZone({ containerRef: overlayRef, @@ -282,6 +268,13 @@ export const AnchoredOverlay: React.FC= space.top ? 'bottom' : 'top' + const horizontal = space.right >= space.left ? 'right' : 'left' + + return {vertical, horizontal} +} + function assignRef( ref: React.MutableRefObject | ((instance: T | null) => void) | null | undefined, value: T | null,