react-display-scale-engine 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/createMuiDisplayScaleComponents.ts","../src/useDisplayScalePopoverPosition.ts","../src/DisplayScaleMuiOverlays.tsx","../src/DisplayScaleSelect.tsx","../src/useDisplayScaleTabsIndicator.ts","../src/displayScaleLayoutTokens.ts"],"names":["useRef","useLayoutEffect","useCallback","useMemo","jsx"],"mappings":"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","file":"chunk-AGM7V7PR.js","sourcesContent":["import type { Components, Theme } from \"@mui/material/styles\";\n\ntype PortalContainerGetter = () => HTMLElement;\n\ntype MuiDisplayScaleComponentsOptions = {\n getPortalContainer: PortalContainerGetter;\n /**\n * Overlay content is portalled outside the zoomed app root, so it needs the\n * same density correction independently.\n */\n overlayZoom?: number;\n};\n\n/**\n * MUI adapter for a compensated app root.\n *\n * Centralizing these defaults gives every MUI overlay the portal strategy and\n * density correction chosen by the display-scale engine.\n */\nexport function createMuiDisplayScaleComponents({\n getPortalContainer,\n overlayZoom = 1,\n}: MuiDisplayScaleComponentsOptions): Components<Theme> {\n const zoom = overlayZoom > 0 ? overlayZoom : 1;\n const resolveContainerZoom = (container: unknown): number => {\n if (typeof document === \"undefined\") return zoom;\n const resolvedContainer =\n typeof container === \"function\" ? (container as PortalContainerGetter)() : container;\n // MUI does not always expose the resolved portal node through ownerState.\n // Missing means the component will use its default (document.body).\n return resolvedContainer == null || resolvedContainer === document.body ? zoom : 1;\n };\n\n return {\n MuiModal: {\n defaultProps: {\n container: getPortalContainer,\n },\n },\n MuiDialog: {\n defaultProps: {\n container: getPortalContainer,\n },\n styleOverrides: {\n paper: ({ ownerState }) => ({ zoom: resolveContainerZoom(ownerState?.container) }),\n },\n },\n MuiPopover: {\n defaultProps: {\n container: getPortalContainer,\n },\n styleOverrides: {\n paper: ({ ownerState }) => ({ zoom: resolveContainerZoom(ownerState?.container) }),\n },\n },\n MuiPopper: {\n defaultProps: {\n container: getPortalContainer,\n },\n styleOverrides: {\n root: ({ ownerState }) => ({ zoom: resolveContainerZoom(ownerState?.container) }),\n },\n },\n MuiDrawer: {\n defaultProps: {\n // Drawer inherits Modal props. Supplying the portal host here (rather\n // than only through MuiModal) also covers Drawer internals directly.\n container: getPortalContainer,\n },\n styleOverrides: {\n paper: ({ ownerState }) => {\n // Permanent/persistent drawers live inside the compensated root and\n // must not be zoomed a second time. Temporary drawers are portalled\n // to document.body, so their paper needs the overlay density zoom.\n if (ownerState.variant !== \"temporary\") return {};\n\n const isVertical = ownerState.anchor === \"left\" || ownerState.anchor === \"right\";\n return isVertical\n ? {\n zoom,\n height: \"var(--ep-display-scale-overlay-viewport-height, 100dvh)\",\n maxHeight: \"var(--ep-display-scale-overlay-viewport-height, 100dvh)\",\n }\n : {\n zoom,\n width: \"var(--ep-display-scale-overlay-viewport-width, 100dvw)\",\n maxWidth: \"var(--ep-display-scale-overlay-viewport-width, 100dvw)\",\n };\n },\n },\n },\n };\n}\n","import type { PopoverOrigin, PopoverProps } from \"@mui/material\";\nimport { type RefObject, useCallback, useLayoutEffect } from \"react\";\nimport { useDisplayScaleCompensation } from \"./DisplayScaleCompensationProvider\";\n\ntype DisplayScalePopoverPositionOptions = {\n open: boolean;\n overlayRootRef: RefObject<HTMLDivElement | null>;\n anchorElement: HTMLElement | null;\n anchorReference?: PopoverProps[\"anchorReference\"];\n anchorPosition?: PopoverProps[\"anchorPosition\"];\n anchorOrigin?: PopoverProps[\"anchorOrigin\"];\n transformOrigin?: PopoverProps[\"transformOrigin\"];\n marginThreshold?: PopoverProps[\"marginThreshold\"];\n};\n\nfunction resolveOffset(\n origin: number | \"top\" | \"center\" | \"bottom\" | \"left\" | \"right\" | undefined,\n size: number,\n): number {\n if (typeof origin === \"number\") return origin;\n if (origin === \"center\") return size / 2;\n if (origin === \"bottom\" || origin === \"right\") return size;\n return 0;\n}\n\nfunction resolveOrigins(\n anchorOrigin: PopoverOrigin | undefined,\n transformOrigin: PopoverOrigin | undefined,\n anchorWidth: number,\n anchorHeight: number,\n paperWidth: number,\n paperHeight: number,\n): { anchorX: number; anchorY: number; transformX: number; transformY: number } {\n const resolvedAnchorOrigin = anchorOrigin ?? { vertical: \"top\", horizontal: \"left\" };\n const resolvedTransformOrigin = transformOrigin ?? { vertical: \"top\", horizontal: \"left\" };\n\n return {\n anchorX: resolveOffset(resolvedAnchorOrigin.horizontal, anchorWidth),\n anchorY: resolveOffset(resolvedAnchorOrigin.vertical, anchorHeight),\n transformX: resolveOffset(resolvedTransformOrigin.horizontal, paperWidth),\n transformY: resolveOffset(resolvedTransformOrigin.vertical, paperHeight),\n };\n}\n\n/**\n * Replaces only MUI Popover's physical-viewport collision pass. MUI still\n * owns focus, transition and anchor semantics; this writes the final logical\n * top/left inside the compensated portal root.\n */\nexport function useDisplayScalePopoverPosition({\n open,\n overlayRootRef,\n anchorElement,\n anchorReference,\n anchorPosition,\n anchorOrigin,\n transformOrigin,\n marginThreshold = 16,\n}: DisplayScalePopoverPositionOptions): void {\n const { compensation, layoutExtents, rootRef } = useDisplayScaleCompensation();\n\n const correctPosition = useCallback(() => {\n if (!open || !compensation.active || !layoutExtents) return;\n\n const overlayRoot = overlayRootRef.current;\n const paper = overlayRoot?.querySelector<HTMLElement>(\".MuiPopover-paper\");\n if (!paper) return;\n\n const zoom = compensation.zoom > 0 ? compensation.zoom : 1;\n const rootRect = rootRef.current?.getBoundingClientRect();\n const rootLeft = rootRect?.left ?? 0;\n const rootTop = rootRect?.top ?? 0;\n const anchorRect = anchorElement?.getBoundingClientRect();\n const anchorX =\n anchorReference === \"anchorPosition\" && anchorPosition\n ? (anchorPosition.left - rootLeft) / zoom\n : anchorRect\n ? (anchorRect.left - rootLeft) / zoom\n : null;\n const anchorY =\n anchorReference === \"anchorPosition\" && anchorPosition\n ? (anchorPosition.top - rootTop) / zoom\n : anchorRect\n ? (anchorRect.top - rootTop) / zoom\n : null;\n if (anchorX == null || anchorY == null) return;\n\n const paperWidth = paper.offsetWidth;\n const paperHeight = paper.offsetHeight;\n const {\n anchorX: originX,\n anchorY: originY,\n transformX,\n transformY,\n } = resolveOrigins(\n anchorOrigin,\n transformOrigin,\n anchorRect ? anchorRect.width / zoom : 0,\n anchorRect ? anchorRect.height / zoom : 0,\n paperWidth,\n paperHeight,\n );\n const margin = typeof marginThreshold === \"number\" ? marginThreshold : 16;\n const maxLeft = Math.max(margin, layoutExtents.layoutWidthPx - margin - paperWidth);\n const maxTop = Math.max(margin, layoutExtents.layoutHeightPx - margin - paperHeight);\n const left = Math.min(maxLeft, Math.max(margin, anchorX + originX - transformX));\n const top = Math.min(maxTop, Math.max(margin, anchorY + originY - transformY));\n\n paper.style.left = `${Math.round(left)}px`;\n paper.style.top = `${Math.round(top)}px`;\n }, [\n anchorElement,\n anchorOrigin,\n anchorPosition,\n anchorReference,\n compensation.active,\n compensation.zoom,\n layoutExtents,\n marginThreshold,\n open,\n overlayRootRef,\n rootRef,\n transformOrigin,\n ]);\n\n useLayoutEffect(() => {\n if (!open) return;\n\n const firstFrame = window.requestAnimationFrame(() => {\n correctPosition();\n window.requestAnimationFrame(correctPosition);\n });\n window.addEventListener(\"resize\", correctPosition);\n window.addEventListener(\"scroll\", correctPosition, true);\n\n return () => {\n window.cancelAnimationFrame(firstFrame);\n window.removeEventListener(\"resize\", correctPosition);\n window.removeEventListener(\"scroll\", correctPosition, true);\n };\n }, [correctPosition, open]);\n}\n","import type { MenuProps, PopoverProps, PopperProps } from \"@mui/material\";\nimport { Menu, Popover, Popper } from \"@mui/material\";\nimport { useTheme } from \"@mui/material/styles\";\nimport type {\n OffsetsFunction,\n Options as PopperOffsetOptions,\n} from \"@popperjs/core/lib/modifiers/offset\";\nimport { type ReactElement, useMemo, useRef } from \"react\";\nimport { useDisplayScaleCompensation } from \"./DisplayScaleCompensationProvider\";\nimport { useDisplayScaleAnchor } from \"./useDisplayScaleAnchor\";\nimport { useDisplayScalePopoverPosition } from \"./useDisplayScalePopoverPosition\";\n\ntype NativeAnchorProps = {\n anchorEl?: HTMLElement | null;\n};\n\nexport type DisplayScaleMenuProps = Omit<MenuProps, \"anchorEl\"> & NativeAnchorProps;\n\n/** MUI Menu with an anchor adapted to the active portal strategy. */\nexport function DisplayScaleMenu({ anchorEl, ...props }: DisplayScaleMenuProps): ReactElement {\n const displayScaleAnchor = useDisplayScaleAnchor(anchorEl ?? null);\n const { compensation, rootRef } = useDisplayScaleCompensation();\n const theme = useTheme();\n const overlayRootRef = useRef<HTMLDivElement>(null);\n const horizontalOrigin = theme.direction === \"rtl\" ? \"right\" : \"left\";\n const anchorOrigin = props.anchorOrigin ?? {\n vertical: \"bottom\",\n horizontal: horizontalOrigin,\n };\n const transformOrigin = props.transformOrigin ?? {\n vertical: \"top\",\n horizontal: horizontalOrigin,\n };\n const anchorPosition = useMemo(() => {\n if (props.anchorReference !== \"anchorPosition\" || !props.anchorPosition) {\n return props.anchorPosition;\n }\n const zoom = compensation.zoom > 0 ? compensation.zoom : 1;\n return {\n top: props.anchorPosition.top / zoom,\n left: props.anchorPosition.left / zoom,\n };\n }, [compensation.zoom, props.anchorPosition, props.anchorReference]);\n useDisplayScalePopoverPosition({\n open: props.open,\n overlayRootRef,\n anchorElement: anchorEl ?? null,\n anchorReference: props.anchorReference,\n anchorPosition: props.anchorPosition,\n anchorOrigin,\n transformOrigin,\n marginThreshold: props.marginThreshold,\n });\n\n return (\n <Menu\n {...props}\n ref={overlayRootRef}\n anchorEl={displayScaleAnchor}\n anchorPosition={anchorPosition}\n anchorOrigin={anchorOrigin}\n container={rootRef.current ?? document.body}\n transformOrigin={transformOrigin}\n />\n );\n}\n\nexport type DisplayScalePopoverProps = Omit<PopoverProps, \"anchorEl\"> & NativeAnchorProps;\n\n/** MUI Popover with an anchor adapted to the active portal strategy. */\nexport function DisplayScalePopover({\n anchorEl,\n ...props\n}: DisplayScalePopoverProps): ReactElement {\n const displayScaleAnchor = useDisplayScaleAnchor(anchorEl ?? null);\n const { rootRef } = useDisplayScaleCompensation();\n const overlayRootRef = useRef<HTMLDivElement>(null);\n useDisplayScalePopoverPosition({\n open: props.open,\n overlayRootRef,\n anchorElement: anchorEl ?? null,\n anchorReference: props.anchorReference,\n anchorPosition: props.anchorPosition,\n anchorOrigin: props.anchorOrigin,\n transformOrigin: props.transformOrigin,\n marginThreshold: props.marginThreshold,\n });\n return (\n <Popover\n {...props}\n ref={overlayRootRef}\n anchorEl={displayScaleAnchor}\n container={rootRef.current ?? document.body}\n />\n );\n}\n\nexport type DisplayScalePopperProps = Omit<PopperProps, \"anchorEl\"> & NativeAnchorProps;\n\nconst defaultDisplayScalePopperModifiers: PopperProps[\"modifiers\"] = [\n {\n name: \"offset\",\n options: { offset: [0, 8] },\n },\n];\n\nfunction scalePopperOffsets(\n modifiers: PopperProps[\"modifiers\"],\n zoom: number,\n): PopperProps[\"modifiers\"] {\n if (!modifiers || zoom === 1) return modifiers;\n\n return modifiers.map((modifier) => {\n if (modifier.name !== \"offset\") return modifier;\n\n const options = modifier.options as Partial<PopperOffsetOptions> | undefined;\n const rawOffset = options?.offset;\n if (!rawOffset) return modifier;\n\n const scaleValue = (value: number | null | undefined) => (value == null ? value : value / zoom);\n const offset: PopperOffsetOptions[\"offset\"] =\n typeof rawOffset === \"function\"\n ? (args: Parameters<OffsetsFunction>[0]) => {\n const [skidding, distance] = rawOffset(args);\n return [scaleValue(skidding), scaleValue(distance)];\n }\n : [scaleValue(rawOffset[0]), scaleValue(rawOffset[1])];\n\n return { ...modifier, options: { ...options, offset } };\n });\n}\n\n/** MUI Popper with an anchor adapted to the active portal strategy. */\nexport function DisplayScalePopper({ anchorEl, ...props }: DisplayScalePopperProps): ReactElement {\n const displayScaleAnchor = useDisplayScaleAnchor(anchorEl ?? null);\n const { compensation, rootRef } = useDisplayScaleCompensation();\n const modifiers = useMemo(\n () =>\n scalePopperOffsets(props.modifiers ?? defaultDisplayScalePopperModifiers, compensation.zoom),\n [compensation.zoom, props.modifiers],\n );\n return (\n <Popper\n {...props}\n anchorEl={displayScaleAnchor}\n container={rootRef.current ?? document.body}\n modifiers={modifiers}\n style={{ ...props.style, zoom: 1 }}\n />\n );\n}\n","import type { MenuProps, SelectProps } from \"@mui/material\";\nimport { Select } from \"@mui/material\";\nimport type { ReactElement, SyntheticEvent } from \"react\";\nimport { useCallback, useId, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { useDisplayScaleCompensation } from \"./DisplayScaleCompensationProvider\";\nimport { useDisplayScalePopoverPosition } from \"./useDisplayScalePopoverPosition\";\n\n/**\n * MUI Select adapter for the display-scale engine. Select creates its Menu\n * internally, so it cannot use DisplayScaleMenu directly.\n */\nexport function DisplayScaleSelect<Value = unknown>(props: SelectProps<Value>): ReactElement {\n const {\n MenuProps,\n SelectDisplayProps,\n defaultOpen,\n onClose,\n onOpen,\n open: openProp,\n ...selectProps\n } = props;\n const { rootRef } = useDisplayScaleCompensation();\n const menuRootRef = useRef<HTMLDivElement>(null);\n const selectId = useId();\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\n const [uncontrolledOpen, setUncontrolledOpen] = useState(Boolean(defaultOpen));\n const open = openProp ?? uncontrolledOpen;\n\n useLayoutEffect(() => {\n if (!open) {\n setAnchorElement(null);\n return;\n }\n setAnchorElement(\n document.querySelector<HTMLElement>(`[data-ep-display-scale-select=\"${selectId}\"]`),\n );\n }, [open, selectId]);\n\n const handleOpen = useCallback(\n (event: SyntheticEvent) => {\n if (openProp === undefined) setUncontrolledOpen(true);\n onOpen?.(event);\n },\n [onOpen, openProp],\n );\n const handleClose = useCallback(\n (event: SyntheticEvent) => {\n if (openProp === undefined) setUncontrolledOpen(false);\n onClose?.(event);\n },\n [onClose, openProp],\n );\n\n useDisplayScalePopoverPosition({\n open,\n overlayRootRef: menuRootRef,\n anchorElement,\n anchorOrigin: { vertical: \"bottom\", horizontal: \"center\" },\n transformOrigin: { vertical: \"top\", horizontal: \"center\" },\n });\n\n const menuProps = useMemo((): Partial<MenuProps> => {\n const paperSlot = MenuProps?.slotProps?.paper;\n const resolvedPaperSlot = typeof paperSlot === \"function\" ? undefined : paperSlot;\n\n return {\n ...MenuProps,\n container: rootRef.current ?? document.body,\n ref: menuRootRef,\n slotProps: {\n ...MenuProps?.slotProps,\n paper: {\n ...resolvedPaperSlot,\n style: { ...resolvedPaperSlot?.style, zoom: 1 },\n },\n },\n };\n }, [MenuProps, rootRef]);\n\n return (\n <Select<Value>\n {...selectProps}\n open={open}\n onOpen={handleOpen}\n onClose={handleClose}\n MenuProps={menuProps}\n SelectDisplayProps={\n {\n ...SelectDisplayProps,\n \"data-ep-display-scale-select\": selectId,\n } as SelectProps<Value>[\"SelectDisplayProps\"]\n }\n />\n );\n}\n","import { type RefObject, useLayoutEffect } from \"react\";\nimport { useDisplayScaleCompensation } from \"./DisplayScaleCompensationProvider\";\n\n/**\n * Keeps MUI Tabs' indicator in the compensated root's logical coordinate\n * space. MUI normally uses getBoundingClientRect(), whose values are already\n * zoomed and therefore too small for a logical layout container.\n */\nexport function useDisplayScaleTabsIndicator(\n tabsRef: RefObject<HTMLDivElement | null>,\n value: unknown,\n): void {\n const { compensation } = useDisplayScaleCompensation();\n\n useLayoutEffect(() => {\n if (!compensation.active) return;\n // Re-run after the selected Tabs value changes.\n void value;\n\n const updateIndicator = (): void => {\n const tabs = tabsRef.current;\n const indicator = tabs?.querySelector<HTMLElement>(\".MuiTabs-indicator\");\n const selectedTab = tabs?.querySelector<HTMLElement>(\".MuiTab-root.Mui-selected\");\n if (!tabs || !indicator || !selectedTab) return;\n\n const isRtl = getComputedStyle(tabs).direction === \"rtl\";\n const left = selectedTab.offsetLeft;\n const width = selectedTab.offsetWidth;\n\n indicator.style.width = `${width}px`;\n if (isRtl) {\n indicator.style.left = \"auto\";\n indicator.style.right = `${tabs.offsetWidth - left - width}px`;\n } else {\n indicator.style.right = \"auto\";\n indicator.style.left = `${left}px`;\n }\n };\n\n const frame = window.requestAnimationFrame(updateIndicator);\n const observer = new ResizeObserver(updateIndicator);\n if (tabsRef.current) observer.observe(tabsRef.current);\n window.addEventListener(\"resize\", updateIndicator);\n\n return () => {\n window.cancelAnimationFrame(frame);\n observer.disconnect();\n window.removeEventListener(\"resize\", updateIndicator);\n };\n }, [compensation.active, tabsRef, value]);\n}\n","import type { SxProps, Theme } from \"@mui/material/styles\";\n\n/** Fill the compensated app tree — prefer over raw `100vh` inside `#root`. */\nexport const displayScalePageFillSx: SxProps<Theme> = {\n flex: 1,\n minHeight: 0,\n minWidth: 0,\n width: \"100%\",\n height: \"100%\",\n};\n\n/** Full-viewport auth split layout — fills the compensated app root (not `position: fixed`). */\nexport const signinViewportShellSx: SxProps<Theme> = {\n flex: 1,\n minHeight: 0,\n minWidth: 0,\n width: \"100%\",\n height: \"100%\",\n overflow: \"hidden\",\n boxSizing: \"border-box\",\n};\n\n/** 50/50 desktop columns — avoids flex min-content overflow at OS display scale. */\nexport const signinSplitColumnSx: SxProps<Theme> = {\n flex: { xs: \"0 0 auto\", md: \"1 1 0\" },\n width: { xs: \"100%\", md: \"50%\" },\n maxWidth: { xs: \"100%\", md: \"50%\" },\n minWidth: 0,\n boxSizing: \"border-box\",\n};\n"]}
@@ -0,0 +1,219 @@
1
+ import { subscribeDisplayScale, getDisplayScaleSnapshot, getServerDisplayScaleSnapshot, evaluateDisplayScale, computeDisplayScaleCompensation, measureDisplayScaleLayoutExtents, clearDisplayScaleCompensationStyles, syncDisplayScaleCompensationMetadata, clearDisplayScaleCompensationFromDocument, applyDisplayScaleCompensationStyles } from './chunk-VWJNHWMD.js';
2
+ import { createContext, useCallback, useSyncExternalStore, useRef, useMemo, useState, useLayoutEffect, useEffect, useContext } from 'react';
3
+ import { jsx } from 'react/jsx-runtime';
4
+
5
+ function useDisplayScale(options) {
6
+ const autoBaseline = options?.autoBaseline ?? true;
7
+ const debounceMs = options?.debounceMs ?? 100;
8
+ const subscribe = useCallback(
9
+ (onStoreChange) => subscribeDisplayScale(onStoreChange, { autoBaseline, debounceMs }),
10
+ [autoBaseline, debounceMs]
11
+ );
12
+ const getSnapshot = useCallback(() => getDisplayScaleSnapshot({ autoBaseline }), [autoBaseline]);
13
+ const snapshot = useSyncExternalStore(subscribe, getSnapshot, getServerDisplayScaleSnapshot);
14
+ const evaluate = useCallback(
15
+ (thresholds) => evaluateDisplayScale(snapshot, thresholds),
16
+ [snapshot]
17
+ );
18
+ return { snapshot, evaluate };
19
+ }
20
+ var DisplayScaleCompensationContext = createContext(
21
+ null
22
+ );
23
+ function applyCompensationToNode(node, compensation, layoutExtents, snapshot) {
24
+ applyDisplayScaleCompensationStyles(node, compensation, layoutExtents);
25
+ syncDisplayScaleCompensationMetadata(compensation, layoutExtents, snapshot);
26
+ node.dataset.displayScaleCompensated = "true";
27
+ node.dataset.osDisplayScale = String(compensation.osDisplayScale);
28
+ }
29
+ function syncOverlayViewportVariables(zoom) {
30
+ const resolvedZoom = zoom > 0 ? zoom : 1;
31
+ const viewportWidth = window.visualViewport?.width ?? window.innerWidth;
32
+ const viewportHeight = window.visualViewport?.height ?? window.innerHeight;
33
+ document.documentElement.style.setProperty(
34
+ "--ep-display-scale-overlay-viewport-width",
35
+ `${viewportWidth / resolvedZoom}px`
36
+ );
37
+ document.documentElement.style.setProperty(
38
+ "--ep-display-scale-overlay-viewport-height",
39
+ `${viewportHeight / resolvedZoom}px`
40
+ );
41
+ }
42
+ function clearOverlayViewportVariables() {
43
+ document.documentElement.style.removeProperty("--ep-display-scale-overlay-viewport-width");
44
+ document.documentElement.style.removeProperty("--ep-display-scale-overlay-viewport-height");
45
+ }
46
+ function DisplayScaleCompensationProvider({
47
+ children,
48
+ config,
49
+ overlayStrategy = "document-body"
50
+ }) {
51
+ const rootRef = useRef(null);
52
+ const { snapshot } = useDisplayScale();
53
+ const compensation = useMemo(
54
+ () => computeDisplayScaleCompensation(snapshot, config),
55
+ [config, snapshot]
56
+ );
57
+ const [layoutExtents, setLayoutExtents] = useState(
58
+ () => compensation.active ? measureDisplayScaleLayoutExtents(compensation.zoom) : null
59
+ );
60
+ const syncNode = useCallback(
61
+ (node) => {
62
+ rootRef.current = node;
63
+ if (!node) return;
64
+ if (compensation.active && layoutExtents) {
65
+ applyCompensationToNode(node, compensation, layoutExtents, snapshot);
66
+ return;
67
+ }
68
+ clearDisplayScaleCompensationStyles(node);
69
+ syncDisplayScaleCompensationMetadata(compensation, void 0, snapshot);
70
+ delete node.dataset.displayScaleCompensated;
71
+ delete node.dataset.osDisplayScale;
72
+ },
73
+ [compensation, layoutExtents, snapshot]
74
+ );
75
+ useLayoutEffect(() => {
76
+ syncNode(rootRef.current);
77
+ }, [syncNode]);
78
+ useEffect(() => {
79
+ clearDisplayScaleCompensationFromDocument();
80
+ const root = document.getElementById("root");
81
+ root?.style.removeProperty("zoom");
82
+ root?.style.removeProperty("transform");
83
+ root?.style.removeProperty("transform-origin");
84
+ root?.style.removeProperty("width");
85
+ root?.style.removeProperty("height");
86
+ root?.style.removeProperty("max-width");
87
+ root?.style.removeProperty("max-height");
88
+ clearOverlayViewportVariables();
89
+ }, []);
90
+ useEffect(() => {
91
+ if (!compensation.active) {
92
+ setLayoutExtents(null);
93
+ clearOverlayViewportVariables();
94
+ return;
95
+ }
96
+ const updateExtents = () => {
97
+ setLayoutExtents(measureDisplayScaleLayoutExtents(compensation.zoom));
98
+ syncOverlayViewportVariables(compensation.zoom);
99
+ };
100
+ updateExtents();
101
+ window.addEventListener("resize", updateExtents);
102
+ window.visualViewport?.addEventListener("resize", updateExtents);
103
+ window.addEventListener("pageshow", updateExtents);
104
+ return () => {
105
+ window.removeEventListener("resize", updateExtents);
106
+ window.visualViewport?.removeEventListener("resize", updateExtents);
107
+ window.removeEventListener("pageshow", updateExtents);
108
+ };
109
+ }, [compensation.active, compensation.zoom]);
110
+ useEffect(
111
+ () => () => {
112
+ const node = rootRef.current;
113
+ if (node) clearDisplayScaleCompensationStyles(node);
114
+ clearDisplayScaleCompensationFromDocument();
115
+ clearOverlayViewportVariables();
116
+ },
117
+ []
118
+ );
119
+ const value = useMemo(
120
+ () => ({
121
+ rootRef,
122
+ compensation,
123
+ layoutExtents,
124
+ overlayStrategy
125
+ }),
126
+ [compensation, layoutExtents, overlayStrategy]
127
+ );
128
+ return /* @__PURE__ */ jsx(DisplayScaleCompensationContext.Provider, { value, children: /* @__PURE__ */ jsx(
129
+ "div",
130
+ {
131
+ ref: syncNode,
132
+ id: "app-compensation-root",
133
+ "data-display-scale-compensated": compensation.active || void 0,
134
+ "data-os-display-scale": compensation.active ? compensation.osDisplayScale : void 0,
135
+ style: {
136
+ flex: "0 0 auto",
137
+ minHeight: 0,
138
+ minWidth: 0,
139
+ display: "flex",
140
+ flexDirection: "column",
141
+ // MUI portal children are appended here. Keeping this layer visible
142
+ // prevents the compensated layout box from becoming an artificial
143
+ // Popper/Popover clipping boundary.
144
+ overflow: "visible",
145
+ boxSizing: "border-box",
146
+ ...compensation.active && layoutExtents ? {
147
+ width: `${layoutExtents.layoutWidthPx}px`,
148
+ height: `${layoutExtents.layoutHeightPx}px`,
149
+ maxWidth: `${layoutExtents.layoutWidthPx}px`,
150
+ maxHeight: `${layoutExtents.layoutHeightPx}px`
151
+ } : {
152
+ width: "100%",
153
+ height: "100%"
154
+ }
155
+ },
156
+ children: /* @__PURE__ */ jsx(
157
+ "div",
158
+ {
159
+ style: {
160
+ flex: 1,
161
+ minHeight: 0,
162
+ minWidth: 0,
163
+ display: "flex",
164
+ flexDirection: "column",
165
+ overflow: "hidden"
166
+ },
167
+ children
168
+ }
169
+ )
170
+ }
171
+ ) });
172
+ }
173
+ var DisplayScaleProvider = DisplayScaleCompensationProvider;
174
+ function useDisplayScaleCompensation() {
175
+ const context = useContext(DisplayScaleCompensationContext);
176
+ if (!context) {
177
+ throw new Error(
178
+ "useDisplayScaleCompensation must be used within DisplayScaleCompensationProvider"
179
+ );
180
+ }
181
+ return context;
182
+ }
183
+ function useDisplayScalePortalContainer() {
184
+ const { overlayStrategy, rootRef } = useDisplayScaleCompensation();
185
+ if (overlayStrategy === "document-body") {
186
+ return typeof document === "undefined" ? null : document.body;
187
+ }
188
+ return rootRef.current;
189
+ }
190
+ function useDisplayScaleAnchor(anchorElement) {
191
+ const { compensation, rootRef } = useDisplayScaleCompensation();
192
+ return useMemo(() => {
193
+ if (!anchorElement) return null;
194
+ if (!compensation.active || compensation.zoom === 1) {
195
+ return anchorElement;
196
+ }
197
+ return {
198
+ contextElement: anchorElement,
199
+ nodeType: 1,
200
+ getBoundingClientRect: () => {
201
+ const rect = anchorElement.getBoundingClientRect();
202
+ const rootRect = rootRef.current?.getBoundingClientRect();
203
+ const zoom = compensation.zoom > 0 ? compensation.zoom : 1;
204
+ const rootLeft = rootRect?.left ?? 0;
205
+ const rootTop = rootRect?.top ?? 0;
206
+ return new DOMRect(
207
+ (rect.x - rootLeft) / zoom,
208
+ (rect.y - rootTop) / zoom,
209
+ rect.width / zoom,
210
+ rect.height / zoom
211
+ );
212
+ }
213
+ };
214
+ }, [anchorElement, compensation.active, compensation.zoom, rootRef]);
215
+ }
216
+
217
+ export { DisplayScaleCompensationProvider, DisplayScaleProvider, useDisplayScale, useDisplayScaleAnchor, useDisplayScaleCompensation, useDisplayScalePortalContainer };
218
+ //# sourceMappingURL=chunk-R5CTLLUS.js.map
219
+ //# sourceMappingURL=chunk-R5CTLLUS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/useDisplayScale.ts","../src/DisplayScaleCompensationProvider.tsx","../src/useDisplayScaleAnchor.ts"],"names":["useCallback","useMemo"],"mappings":"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","file":"chunk-R5CTLLUS.js","sourcesContent":["import { useCallback, useSyncExternalStore } from \"react\";\nimport { getDisplayScaleSnapshot, getServerDisplayScaleSnapshot } from \"./displayScaleStore\";\nimport { evaluateDisplayScale } from \"./evaluateDisplayScale\";\nimport { subscribeDisplayScale } from \"./subscribeDisplayScale\";\nimport type {\n DetectDisplayScaleOptions,\n DisplayScaleEvaluation,\n DisplayScaleSnapshot,\n DisplayScaleThresholds,\n SubscribeDisplayScaleOptions,\n} from \"./types\";\n\ntype UseDisplayScaleOptions = DetectDisplayScaleOptions &\n Pick<SubscribeDisplayScaleOptions, \"debounceMs\">;\n\ntype UseDisplayScaleResult = {\n snapshot: DisplayScaleSnapshot;\n evaluate: (thresholds?: DisplayScaleThresholds) => DisplayScaleEvaluation;\n};\n\n/**\n * React hook — reactive display zoom / scale readings for UI guards or telemetry.\n */\nexport function useDisplayScale(options?: UseDisplayScaleOptions): UseDisplayScaleResult {\n const autoBaseline = options?.autoBaseline ?? true;\n const debounceMs = options?.debounceMs ?? 100;\n\n const subscribe = useCallback(\n (onStoreChange: () => void) =>\n subscribeDisplayScale(onStoreChange, { autoBaseline, debounceMs }),\n [autoBaseline, debounceMs],\n );\n\n const getSnapshot = useCallback(() => getDisplayScaleSnapshot({ autoBaseline }), [autoBaseline]);\n\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getServerDisplayScaleSnapshot);\n\n const evaluate = useCallback(\n (thresholds?: DisplayScaleThresholds) => evaluateDisplayScale(snapshot, thresholds),\n [snapshot],\n );\n\n return { snapshot, evaluate };\n}\n","import {\n createContext,\n type PropsWithChildren,\n type ReactElement,\n type RefObject,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n applyDisplayScaleCompensationStyles,\n type ComputeDisplayScaleCompensationOptions,\n clearDisplayScaleCompensationFromDocument,\n clearDisplayScaleCompensationStyles,\n computeDisplayScaleCompensation,\n type DisplayScaleCompensation,\n type DisplayScaleLayoutExtents,\n measureDisplayScaleLayoutExtents,\n syncDisplayScaleCompensationMetadata,\n} from \"./displayScaleCompensation\";\nimport type { DisplayScaleSnapshot } from \"./types\";\nimport { useDisplayScale } from \"./useDisplayScale\";\n\ntype DisplayScaleCompensationContextValue = {\n rootRef: RefObject<HTMLDivElement | null>;\n compensation: DisplayScaleCompensation;\n layoutExtents: DisplayScaleLayoutExtents | null;\n overlayStrategy: DisplayScaleOverlayStrategy;\n};\n\nconst DisplayScaleCompensationContext = createContext<DisplayScaleCompensationContextValue | null>(\n null,\n);\n\nfunction applyCompensationToNode(\n node: HTMLDivElement,\n compensation: DisplayScaleCompensation,\n layoutExtents: DisplayScaleLayoutExtents,\n snapshot: DisplayScaleSnapshot,\n): void {\n applyDisplayScaleCompensationStyles(node, compensation, layoutExtents);\n syncDisplayScaleCompensationMetadata(compensation, layoutExtents, snapshot);\n node.dataset.displayScaleCompensated = \"true\";\n node.dataset.osDisplayScale = String(compensation.osDisplayScale);\n}\n\nfunction syncOverlayViewportVariables(zoom: number): void {\n const resolvedZoom = zoom > 0 ? zoom : 1;\n const viewportWidth = window.visualViewport?.width ?? window.innerWidth;\n const viewportHeight = window.visualViewport?.height ?? window.innerHeight;\n\n document.documentElement.style.setProperty(\n \"--ep-display-scale-overlay-viewport-width\",\n `${viewportWidth / resolvedZoom}px`,\n );\n document.documentElement.style.setProperty(\n \"--ep-display-scale-overlay-viewport-height\",\n `${viewportHeight / resolvedZoom}px`,\n );\n}\n\nfunction clearOverlayViewportVariables(): void {\n document.documentElement.style.removeProperty(\"--ep-display-scale-overlay-viewport-width\");\n document.documentElement.style.removeProperty(\"--ep-display-scale-overlay-viewport-height\");\n}\n\nexport type DisplayScaleOverlayStrategy = \"compensated-root\" | \"document-body\";\n\nexport type DisplayScaleProviderProps = PropsWithChildren & {\n /**\n * Visual-density policy for this app. The default keeps the existing\n * Windows-to-100% compensation behavior.\n */\n config?: ComputeDisplayScaleCompensationOptions;\n /**\n * Where overlay portals render. document-body keeps MUI anchor coordinates in\n * browser-visible pixels; this is the preferred strategy for CSS zoom roots.\n */\n overlayStrategy?: DisplayScaleOverlayStrategy;\n};\n\nexport function DisplayScaleCompensationProvider({\n children,\n config,\n overlayStrategy = \"document-body\",\n}: DisplayScaleProviderProps): ReactElement {\n const rootRef = useRef<HTMLDivElement>(null);\n const { snapshot } = useDisplayScale();\n const compensation = useMemo(\n () => computeDisplayScaleCompensation(snapshot, config),\n [config, snapshot],\n );\n\n const [layoutExtents, setLayoutExtents] = useState<DisplayScaleLayoutExtents | null>(() =>\n compensation.active ? measureDisplayScaleLayoutExtents(compensation.zoom) : null,\n );\n\n const syncNode = useCallback(\n (node: HTMLDivElement | null) => {\n rootRef.current = node;\n if (!node) return;\n\n if (compensation.active && layoutExtents) {\n applyCompensationToNode(node, compensation, layoutExtents, snapshot);\n return;\n }\n\n clearDisplayScaleCompensationStyles(node);\n syncDisplayScaleCompensationMetadata(compensation, undefined, snapshot);\n delete node.dataset.displayScaleCompensated;\n delete node.dataset.osDisplayScale;\n },\n [compensation, layoutExtents, snapshot],\n );\n\n useLayoutEffect(() => {\n syncNode(rootRef.current);\n }, [syncNode]);\n\n useEffect(() => {\n clearDisplayScaleCompensationFromDocument();\n\n const root = document.getElementById(\"root\");\n root?.style.removeProperty(\"zoom\");\n root?.style.removeProperty(\"transform\");\n root?.style.removeProperty(\"transform-origin\");\n root?.style.removeProperty(\"width\");\n root?.style.removeProperty(\"height\");\n root?.style.removeProperty(\"max-width\");\n root?.style.removeProperty(\"max-height\");\n clearOverlayViewportVariables();\n }, []);\n\n useEffect(() => {\n if (!compensation.active) {\n setLayoutExtents(null);\n clearOverlayViewportVariables();\n return;\n }\n\n const updateExtents = (): void => {\n setLayoutExtents(measureDisplayScaleLayoutExtents(compensation.zoom));\n syncOverlayViewportVariables(compensation.zoom);\n };\n\n updateExtents();\n window.addEventListener(\"resize\", updateExtents);\n window.visualViewport?.addEventListener(\"resize\", updateExtents);\n window.addEventListener(\"pageshow\", updateExtents);\n\n return () => {\n window.removeEventListener(\"resize\", updateExtents);\n window.visualViewport?.removeEventListener(\"resize\", updateExtents);\n window.removeEventListener(\"pageshow\", updateExtents);\n };\n }, [compensation.active, compensation.zoom]);\n\n useEffect(\n () => () => {\n const node = rootRef.current;\n if (node) clearDisplayScaleCompensationStyles(node);\n clearDisplayScaleCompensationFromDocument();\n clearOverlayViewportVariables();\n },\n [],\n );\n\n const value = useMemo(\n () => ({\n rootRef,\n compensation,\n layoutExtents,\n overlayStrategy,\n }),\n [compensation, layoutExtents, overlayStrategy],\n );\n\n return (\n <DisplayScaleCompensationContext.Provider value={value}>\n <div\n ref={syncNode}\n id=\"app-compensation-root\"\n data-display-scale-compensated={compensation.active || undefined}\n data-os-display-scale={compensation.active ? compensation.osDisplayScale : undefined}\n style={{\n flex: \"0 0 auto\",\n minHeight: 0,\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\",\n // MUI portal children are appended here. Keeping this layer visible\n // prevents the compensated layout box from becoming an artificial\n // Popper/Popover clipping boundary.\n overflow: \"visible\",\n boxSizing: \"border-box\",\n ...(compensation.active && layoutExtents\n ? {\n width: `${layoutExtents.layoutWidthPx}px`,\n height: `${layoutExtents.layoutHeightPx}px`,\n maxWidth: `${layoutExtents.layoutWidthPx}px`,\n maxHeight: `${layoutExtents.layoutHeightPx}px`,\n }\n : {\n width: \"100%\",\n height: \"100%\",\n }),\n }}\n >\n <div\n style={{\n flex: 1,\n minHeight: 0,\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n }}\n >\n {children}\n </div>\n </div>\n </DisplayScaleCompensationContext.Provider>\n );\n}\n\n/** Package-friendly name for the display-scale root provider. */\nexport const DisplayScaleProvider = DisplayScaleCompensationProvider;\n\nexport function useDisplayScaleCompensation(): DisplayScaleCompensationContextValue {\n const context = useContext(DisplayScaleCompensationContext);\n\n if (!context) {\n throw new Error(\n \"useDisplayScaleCompensation must be used within DisplayScaleCompensationProvider\",\n );\n }\n\n return context;\n}\n\n/**\n * Portal target selected by the display-scale strategy.\n *\n * `document-body` is the default because it shares browser-visible coordinates\n * with a native anchor; the MUI theme adapter corrects the overlay density.\n */\nexport function useDisplayScalePortalContainer(): HTMLElement | null {\n const { overlayStrategy, rootRef } = useDisplayScaleCompensation();\n if (overlayStrategy === \"document-body\") {\n return typeof document === \"undefined\" ? null : document.body;\n }\n return rootRef.current;\n}\n","import { useMemo } from \"react\";\nimport { useDisplayScaleCompensation } from \"./DisplayScaleCompensationProvider\";\n\nexport type DisplayScaleVirtualAnchor = {\n contextElement: HTMLElement;\n getBoundingClientRect: () => DOMRect;\n nodeType: 1;\n};\n\n/**\n * Converts an anchor rectangle from visible browser pixels to the coordinate\n * space of the compensated engine root. The return value is accepted by MUI\n * Menu, Popover and Popper as a virtual anchor.\n */\nexport function useDisplayScaleAnchor(\n anchorElement: HTMLElement | null,\n): HTMLElement | DisplayScaleVirtualAnchor | null {\n const { compensation, rootRef } = useDisplayScaleCompensation();\n\n return useMemo(() => {\n if (!anchorElement) return null;\n if (!compensation.active || compensation.zoom === 1) {\n return anchorElement;\n }\n\n return {\n contextElement: anchorElement,\n nodeType: 1,\n getBoundingClientRect: () => {\n const rect = anchorElement.getBoundingClientRect();\n const rootRect = rootRef.current?.getBoundingClientRect();\n const zoom = compensation.zoom > 0 ? compensation.zoom : 1;\n const rootLeft = rootRect?.left ?? 0;\n const rootTop = rootRect?.top ?? 0;\n return new DOMRect(\n (rect.x - rootLeft) / zoom,\n (rect.y - rootTop) / zoom,\n rect.width / zoom,\n rect.height / zoom,\n );\n },\n };\n }, [anchorElement, compensation.active, compensation.zoom, rootRef]);\n}\n"]}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-SLNYXBHU.js.map
3
+ //# sourceMappingURL=chunk-SLNYXBHU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-SLNYXBHU.js"}
@@ -0,0 +1,28 @@
1
+ import { readDisplayScaleViewportSize } from './chunk-VWJNHWMD.js';
2
+
3
+ // src/displayScaleLogicalViewport.ts
4
+ function getDisplayScaleLogicalViewport(compensation) {
5
+ const { width, height } = readDisplayScaleViewportSize();
6
+ const zoom = compensation.zoom > 0 ? compensation.zoom : 1;
7
+ return {
8
+ viewportWidth: width,
9
+ viewportHeight: height,
10
+ logicalWidth: width / zoom,
11
+ logicalHeight: height / zoom,
12
+ zoom
13
+ };
14
+ }
15
+ function toDisplayScaleLogicalPixels(value, compensation) {
16
+ const zoom = compensation.zoom > 0 ? compensation.zoom : 1;
17
+ return value / zoom;
18
+ }
19
+ function getDisplayScaleOverlayMaxHeight(anchorRect, compensation, options = {}) {
20
+ const { offset = 8, viewportInset = 16 } = options;
21
+ const { height } = readDisplayScaleViewportSize();
22
+ const visibleHeight = Math.max(0, height - anchorRect.bottom - offset - viewportInset);
23
+ return Math.floor(toDisplayScaleLogicalPixels(visibleHeight, compensation));
24
+ }
25
+
26
+ export { getDisplayScaleLogicalViewport, getDisplayScaleOverlayMaxHeight, toDisplayScaleLogicalPixels };
27
+ //# sourceMappingURL=chunk-U3ZWHUJG.js.map
28
+ //# sourceMappingURL=chunk-U3ZWHUJG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/displayScaleLogicalViewport.ts"],"names":[],"mappings":";;;AAwBO,SAAS,+BACd,YAAA,EAC6B;AAC7B,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,4BAAA,EAA6B;AACvD,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,GAAO,CAAA,GAAI,aAAa,IAAA,GAAO,CAAA;AAEzD,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,KAAA;AAAA,IACf,cAAA,EAAgB,MAAA;AAAA,IAChB,cAAc,KAAA,GAAQ,IAAA;AAAA,IACtB,eAAe,MAAA,GAAS,IAAA;AAAA,IACxB;AAAA,GACF;AACF;AAGO,SAAS,2BAAA,CACd,OACA,YAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,GAAO,CAAA,GAAI,aAAa,IAAA,GAAO,CAAA;AACzD,EAAA,OAAO,KAAA,GAAQ,IAAA;AACjB;AAMO,SAAS,+BAAA,CACd,UAAA,EACA,YAAA,EACA,OAAA,GAA4C,EAAC,EACrC;AACR,EAAA,MAAM,EAAE,MAAA,GAAS,CAAA,EAAG,aAAA,GAAgB,IAAG,GAAI,OAAA;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,4BAAA,EAA6B;AAChD,EAAA,MAAM,aAAA,GAAgB,KAAK,GAAA,CAAI,CAAA,EAAG,SAAS,UAAA,CAAW,MAAA,GAAS,SAAS,aAAa,CAAA;AAErF,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,2BAAA,CAA4B,aAAA,EAAe,YAAY,CAAC,CAAA;AAC5E","file":"chunk-U3ZWHUJG.js","sourcesContent":["import type { DisplayScaleCompensation } from \"./displayScaleCompensation\";\nimport { readDisplayScaleViewportSize } from \"./displayScaleCompensation\";\n\nexport type DisplayScaleLogicalViewport = {\n /** Visible viewport in browser CSS pixels. */\n viewportWidth: number;\n viewportHeight: number;\n /** Visible viewport in the compensated root's coordinate space. */\n logicalWidth: number;\n logicalHeight: number;\n zoom: number;\n};\n\nexport type DisplayScaleOverlayBoundsOptions = {\n /** Space between the anchor and the overlay, in visible CSS pixels. */\n offset?: number;\n /** Minimum safe space at the viewport edge, in visible CSS pixels. */\n viewportInset?: number;\n};\n\n/**\n * Returns viewport dimensions in both browser and compensated-root coordinates.\n * Use the logical dimensions for content that is rendered inside the compensated root.\n */\nexport function getDisplayScaleLogicalViewport(\n compensation: Pick<DisplayScaleCompensation, \"zoom\">,\n): DisplayScaleLogicalViewport {\n const { width, height } = readDisplayScaleViewportSize();\n const zoom = compensation.zoom > 0 ? compensation.zoom : 1;\n\n return {\n viewportWidth: width,\n viewportHeight: height,\n logicalWidth: width / zoom,\n logicalHeight: height / zoom,\n zoom,\n };\n}\n\n/** Convert a visible browser CSS-pixel measurement to the compensated root coordinate space. */\nexport function toDisplayScaleLogicalPixels(\n value: number,\n compensation: Pick<DisplayScaleCompensation, \"zoom\">,\n): number {\n const zoom = compensation.zoom > 0 ? compensation.zoom : 1;\n return value / zoom;\n}\n\n/**\n * Maximum height for an overlay positioned below an anchor.\n * The return value is suitable for an element rendered in the compensated root.\n */\nexport function getDisplayScaleOverlayMaxHeight(\n anchorRect: Pick<DOMRect, \"bottom\">,\n compensation: Pick<DisplayScaleCompensation, \"zoom\">,\n options: DisplayScaleOverlayBoundsOptions = {},\n): number {\n const { offset = 8, viewportInset = 16 } = options;\n const { height } = readDisplayScaleViewportSize();\n const visibleHeight = Math.max(0, height - anchorRect.bottom - offset - viewportInset);\n\n return Math.floor(toDisplayScaleLogicalPixels(visibleHeight, compensation));\n}\n"]}