react-display-scale-engine 0.1.1 → 0.1.3
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.
- package/README.md +25 -4
- package/dist/{chunk-AGM7V7PR.js → chunk-5MGGPTIJ.js} +55 -23
- package/dist/chunk-5MGGPTIJ.js.map +1 -0
- package/dist/{chunk-6UB65SJB.js → chunk-64EBQUAW.js} +3 -3
- package/dist/{chunk-6UB65SJB.js.map → chunk-64EBQUAW.js.map} +1 -1
- package/dist/{chunk-R5CTLLUS.js → chunk-F5AFPMQC.js} +8 -5
- package/dist/chunk-F5AFPMQC.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +3 -3
- package/dist/mui.d.ts +37 -7
- package/dist/mui.js +2 -2
- package/dist/react.js +2 -2
- package/package.json +5 -3
- package/dist/chunk-AGM7V7PR.js.map +0 -1
- package/dist/chunk-R5CTLLUS.js.map +0 -1
package/README.md
CHANGED
|
@@ -33,7 +33,7 @@ export function AppRoot() {
|
|
|
33
33
|
}
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
For MUI overlays whose placement must account for the compensated coordinate space, choose either the wrapper or hook adapter API.
|
|
37
37
|
|
|
38
38
|
```tsx
|
|
39
39
|
import { DisplayScaleMenu } from "react-display-scale-engine/mui";
|
|
@@ -43,6 +43,27 @@ import { DisplayScaleMenu } from "react-display-scale-engine/mui";
|
|
|
43
43
|
</DisplayScaleMenu>;
|
|
44
44
|
```
|
|
45
45
|
|
|
46
|
+
Or retain MUI's native component and spread engine-owned props from a hook:
|
|
47
|
+
|
|
48
|
+
```tsx
|
|
49
|
+
import { Menu } from "@mui/material";
|
|
50
|
+
import { useMuiDisplayScaleMenu } from "react-display-scale-engine/mui";
|
|
51
|
+
|
|
52
|
+
const { menuProps } = useMuiDisplayScaleMenu({
|
|
53
|
+
anchorEl,
|
|
54
|
+
open,
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
<Menu {...menuProps} onClose={close}>
|
|
58
|
+
<MenuItem onClick={close}>Action</MenuItem>
|
|
59
|
+
</Menu>;
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
The same pattern is available through `useMuiDisplayScalePopover`,
|
|
63
|
+
`useMuiDisplayScalePopper`, and `useMuiDisplayScaleSelect`. The wrappers and
|
|
64
|
+
hook adapters share the same engine implementation, so their placement and
|
|
65
|
+
scale behavior are equivalent.
|
|
66
|
+
|
|
46
67
|
See [the engine guide](docs/display-scale-engine.md) for policy, limitations, and migration guidance.
|
|
47
68
|
|
|
48
69
|
## Development
|
|
@@ -58,14 +79,14 @@ Public entry points:
|
|
|
58
79
|
|
|
59
80
|
| Import | Purpose |
|
|
60
81
|
| --- | --- |
|
|
61
|
-
| `react-display-scale-engine` |
|
|
82
|
+
| `react-display-scale-engine` | Compatibility entry with all public exports |
|
|
62
83
|
| `…/core` | Framework-independent detection and compensation math |
|
|
63
84
|
| `…/react` | Provider and React hooks |
|
|
64
|
-
| `…/mui` | MUI
|
|
85
|
+
| `…/mui` | MUI 7 wrappers, hook adapters, theme adapter and layout tokens |
|
|
65
86
|
|
|
66
87
|
## Publishing
|
|
67
88
|
|
|
68
|
-
Before first publishing, make sure the `name` in `package.json` is
|
|
89
|
+
Before first publishing, make sure the `name` in `package.json` is available to your npm account, then run `npm login`.
|
|
69
90
|
|
|
70
91
|
```bash
|
|
71
92
|
npm run release:check
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useDisplayScaleCompensation, useDisplayScaleAnchor } from './chunk-
|
|
1
|
+
import { useDisplayScaleCompensation, useDisplayScaleAnchor } from './chunk-F5AFPMQC.js';
|
|
2
2
|
import { Menu, Popover, Popper, Select } from '@mui/material';
|
|
3
3
|
import { useTheme } from '@mui/material/styles';
|
|
4
4
|
import { useCallback, useLayoutEffect, useRef, useMemo, useId, useState } from 'react';
|
|
@@ -160,7 +160,10 @@ function useDisplayScalePopoverPosition({
|
|
|
160
160
|
};
|
|
161
161
|
}, [correctPosition, open]);
|
|
162
162
|
}
|
|
163
|
-
function
|
|
163
|
+
function useMuiDisplayScaleMenu({
|
|
164
|
+
anchorEl,
|
|
165
|
+
...props
|
|
166
|
+
}) {
|
|
164
167
|
const displayScaleAnchor = useDisplayScaleAnchor(anchorEl ?? null);
|
|
165
168
|
const { compensation, rootRef } = useDisplayScaleCompensation();
|
|
166
169
|
const theme = useTheme();
|
|
@@ -194,9 +197,8 @@ function DisplayScaleMenu({ anchorEl, ...props }) {
|
|
|
194
197
|
transformOrigin,
|
|
195
198
|
marginThreshold: props.marginThreshold
|
|
196
199
|
});
|
|
197
|
-
return
|
|
198
|
-
|
|
199
|
-
{
|
|
200
|
+
return {
|
|
201
|
+
menuProps: {
|
|
200
202
|
...props,
|
|
201
203
|
ref: overlayRootRef,
|
|
202
204
|
anchorEl: displayScaleAnchor,
|
|
@@ -205,9 +207,13 @@ function DisplayScaleMenu({ anchorEl, ...props }) {
|
|
|
205
207
|
container: rootRef.current ?? document.body,
|
|
206
208
|
transformOrigin
|
|
207
209
|
}
|
|
208
|
-
|
|
210
|
+
};
|
|
209
211
|
}
|
|
210
|
-
function
|
|
212
|
+
function DisplayScaleMenu(props) {
|
|
213
|
+
const { menuProps } = useMuiDisplayScaleMenu(props);
|
|
214
|
+
return /* @__PURE__ */ jsx(Menu, { ...menuProps });
|
|
215
|
+
}
|
|
216
|
+
function useMuiDisplayScalePopover({
|
|
211
217
|
anchorEl,
|
|
212
218
|
...props
|
|
213
219
|
}) {
|
|
@@ -224,15 +230,18 @@ function DisplayScalePopover({
|
|
|
224
230
|
transformOrigin: props.transformOrigin,
|
|
225
231
|
marginThreshold: props.marginThreshold
|
|
226
232
|
});
|
|
227
|
-
return
|
|
228
|
-
|
|
229
|
-
{
|
|
233
|
+
return {
|
|
234
|
+
popoverProps: {
|
|
230
235
|
...props,
|
|
231
236
|
ref: overlayRootRef,
|
|
232
237
|
anchorEl: displayScaleAnchor,
|
|
233
238
|
container: rootRef.current ?? document.body
|
|
234
239
|
}
|
|
235
|
-
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
function DisplayScalePopover(props) {
|
|
243
|
+
const { popoverProps } = useMuiDisplayScalePopover(props);
|
|
244
|
+
return /* @__PURE__ */ jsx(Popover, { ...popoverProps });
|
|
236
245
|
}
|
|
237
246
|
var defaultDisplayScalePopperModifiers = [
|
|
238
247
|
{
|
|
@@ -255,25 +264,31 @@ function scalePopperOffsets(modifiers, zoom) {
|
|
|
255
264
|
return { ...modifier, options: { ...options, offset } };
|
|
256
265
|
});
|
|
257
266
|
}
|
|
258
|
-
function
|
|
267
|
+
function useMuiDisplayScalePopper({
|
|
268
|
+
anchorEl,
|
|
269
|
+
...props
|
|
270
|
+
}) {
|
|
259
271
|
const displayScaleAnchor = useDisplayScaleAnchor(anchorEl ?? null);
|
|
260
272
|
const { compensation, rootRef } = useDisplayScaleCompensation();
|
|
261
273
|
const modifiers = useMemo(
|
|
262
274
|
() => scalePopperOffsets(props.modifiers ?? defaultDisplayScalePopperModifiers, compensation.zoom),
|
|
263
275
|
[compensation.zoom, props.modifiers]
|
|
264
276
|
);
|
|
265
|
-
return
|
|
266
|
-
|
|
267
|
-
{
|
|
277
|
+
return {
|
|
278
|
+
popperProps: {
|
|
268
279
|
...props,
|
|
269
280
|
anchorEl: displayScaleAnchor,
|
|
270
281
|
container: rootRef.current ?? document.body,
|
|
271
282
|
modifiers,
|
|
272
283
|
style: { ...props.style, zoom: 1 }
|
|
273
284
|
}
|
|
274
|
-
|
|
285
|
+
};
|
|
275
286
|
}
|
|
276
|
-
function
|
|
287
|
+
function DisplayScalePopper(props) {
|
|
288
|
+
const { popperProps } = useMuiDisplayScalePopper(props);
|
|
289
|
+
return /* @__PURE__ */ jsx(Popper, { ...popperProps });
|
|
290
|
+
}
|
|
291
|
+
function useMuiDisplayScaleSelect(props) {
|
|
277
292
|
const {
|
|
278
293
|
MenuProps,
|
|
279
294
|
SelectDisplayProps,
|
|
@@ -335,9 +350,8 @@ function DisplayScaleSelect(props) {
|
|
|
335
350
|
}
|
|
336
351
|
};
|
|
337
352
|
}, [MenuProps, rootRef]);
|
|
338
|
-
return
|
|
339
|
-
|
|
340
|
-
{
|
|
353
|
+
return {
|
|
354
|
+
selectProps: {
|
|
341
355
|
...selectProps,
|
|
342
356
|
open,
|
|
343
357
|
onOpen: handleOpen,
|
|
@@ -348,6 +362,24 @@ function DisplayScaleSelect(props) {
|
|
|
348
362
|
"data-ep-display-scale-select": selectId
|
|
349
363
|
}
|
|
350
364
|
}
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
function DisplayScaleSelect(props) {
|
|
368
|
+
const { selectProps } = useMuiDisplayScaleSelect(props);
|
|
369
|
+
return /* @__PURE__ */ jsx(Select, { ...selectProps });
|
|
370
|
+
}
|
|
371
|
+
function useMuiDisplayScaleComponents() {
|
|
372
|
+
const { compensation, overlayStrategy, rootRef } = useDisplayScaleCompensation();
|
|
373
|
+
const getPortalContainer = useCallback(() => {
|
|
374
|
+
if (overlayStrategy === "document-body") return document.body;
|
|
375
|
+
return rootRef.current ?? document.body;
|
|
376
|
+
}, [overlayStrategy, rootRef]);
|
|
377
|
+
return useMemo(
|
|
378
|
+
() => createMuiDisplayScaleComponents({
|
|
379
|
+
getPortalContainer,
|
|
380
|
+
overlayZoom: overlayStrategy === "document-body" ? compensation.zoom : 1
|
|
381
|
+
}),
|
|
382
|
+
[compensation.zoom, getPortalContainer, overlayStrategy]
|
|
351
383
|
);
|
|
352
384
|
}
|
|
353
385
|
function useDisplayScaleTabsIndicator(tabsRef, value) {
|
|
@@ -408,6 +440,6 @@ var signinSplitColumnSx = {
|
|
|
408
440
|
boxSizing: "border-box"
|
|
409
441
|
};
|
|
410
442
|
|
|
411
|
-
export { DisplayScaleMenu, DisplayScalePopover, DisplayScalePopper, DisplayScaleSelect, createMuiDisplayScaleComponents, displayScalePageFillSx, signinSplitColumnSx, signinViewportShellSx, useDisplayScalePopoverPosition, useDisplayScaleTabsIndicator };
|
|
412
|
-
//# sourceMappingURL=chunk-
|
|
413
|
-
//# sourceMappingURL=chunk-
|
|
443
|
+
export { DisplayScaleMenu, DisplayScalePopover, DisplayScalePopper, DisplayScaleSelect, createMuiDisplayScaleComponents, displayScalePageFillSx, signinSplitColumnSx, signinViewportShellSx, useDisplayScalePopoverPosition, useDisplayScaleTabsIndicator, useMuiDisplayScaleComponents, useMuiDisplayScaleMenu, useMuiDisplayScalePopover, useMuiDisplayScalePopper, useMuiDisplayScaleSelect };
|
|
444
|
+
//# sourceMappingURL=chunk-5MGGPTIJ.js.map
|
|
445
|
+
//# sourceMappingURL=chunk-5MGGPTIJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/createMuiDisplayScaleComponents.ts","../src/useDisplayScalePopoverPosition.ts","../src/DisplayScaleMuiOverlays.tsx","../src/DisplayScaleSelect.tsx","../src/useMuiDisplayScaleComponents.ts","../src/useDisplayScaleTabsIndicator.ts","../src/displayScaleLayoutTokens.ts"],"names":["useRef","useLayoutEffect","useCallback","useMemo","jsx"],"mappings":"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","file":"chunk-5MGGPTIJ.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\nexport type MuiDisplayScaleMenuAdapter = {\n /** Spread these props onto MUI's native `<Menu />`. */\n menuProps: MenuProps;\n};\n\n/** Non-wrapper display-scale adapter for MUI's native `<Menu />`. */\nexport function useMuiDisplayScaleMenu({\n anchorEl,\n ...props\n}: DisplayScaleMenuProps): MuiDisplayScaleMenuAdapter {\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 menuProps: {\n ...props,\n ref: overlayRootRef,\n anchorEl: displayScaleAnchor,\n anchorPosition,\n anchorOrigin,\n container: rootRef.current ?? document.body,\n transformOrigin,\n },\n };\n}\n\n/** MUI Menu wrapper — prefer `useMuiDisplayScaleMenu` when retaining `<Menu />`. */\nexport function DisplayScaleMenu(props: DisplayScaleMenuProps): ReactElement {\n const { menuProps } = useMuiDisplayScaleMenu(props);\n return <Menu {...menuProps} />;\n}\n\nexport type DisplayScalePopoverProps = Omit<PopoverProps, \"anchorEl\"> & NativeAnchorProps;\n\nexport type MuiDisplayScalePopoverAdapter = {\n /** Spread these props onto MUI's native `<Popover />`. */\n popoverProps: PopoverProps;\n};\n\n/** Non-wrapper display-scale adapter for MUI's native `<Popover />`. */\nexport function useMuiDisplayScalePopover({\n anchorEl,\n ...props\n}: DisplayScalePopoverProps): MuiDisplayScalePopoverAdapter {\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 popoverProps: {\n ...props,\n ref: overlayRootRef,\n anchorEl: displayScaleAnchor,\n container: rootRef.current ?? document.body,\n },\n };\n}\n\n/** MUI Popover wrapper — prefer `useMuiDisplayScalePopover` when retaining `<Popover />`. */\nexport function DisplayScalePopover(props: DisplayScalePopoverProps): ReactElement {\n const { popoverProps } = useMuiDisplayScalePopover(props);\n return <Popover {...popoverProps} />;\n}\n\nexport type DisplayScalePopperProps = Omit<PopperProps, \"anchorEl\"> & NativeAnchorProps;\n\nexport type MuiDisplayScalePopperAdapter = {\n /** Spread these props onto MUI's native `<Popper />`. */\n popperProps: PopperProps;\n};\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/** Non-wrapper display-scale adapter for MUI's native `<Popper />`. */\nexport function useMuiDisplayScalePopper({\n anchorEl,\n ...props\n}: DisplayScalePopperProps): MuiDisplayScalePopperAdapter {\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 popperProps: {\n ...props,\n anchorEl: displayScaleAnchor,\n container: rootRef.current ?? document.body,\n modifiers,\n style: { ...props.style, zoom: 1 },\n },\n };\n}\n\n/** MUI Popper wrapper — prefer `useMuiDisplayScalePopper` when retaining `<Popper />`. */\nexport function DisplayScalePopper(props: DisplayScalePopperProps): ReactElement {\n const { popperProps } = useMuiDisplayScalePopper(props);\n return <Popper {...popperProps} />;\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\nexport type MuiDisplayScaleSelectAdapter<Value = unknown> = {\n /** Spread these props onto MUI's native `<Select />`. */\n selectProps: SelectProps<Value>;\n};\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 useMuiDisplayScaleSelect<Value = unknown>(\n props: SelectProps<Value>,\n): MuiDisplayScaleSelectAdapter<Value> {\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 selectProps: {\n ...selectProps,\n open,\n onOpen: handleOpen,\n onClose: handleClose,\n MenuProps: menuProps,\n SelectDisplayProps: {\n ...SelectDisplayProps,\n \"data-ep-display-scale-select\": selectId,\n } as SelectProps<Value>[\"SelectDisplayProps\"],\n },\n };\n}\n\n/** MUI Select wrapper — prefer `useMuiDisplayScaleSelect` when retaining `<Select />`. */\nexport function DisplayScaleSelect<Value = unknown>(props: SelectProps<Value>): ReactElement {\n const { selectProps } = useMuiDisplayScaleSelect(props);\n return <Select<Value> {...selectProps} />;\n}\n","import type { Components, Theme } from \"@mui/material/styles\";\nimport { useCallback, useMemo } from \"react\";\nimport { useDisplayScaleCompensation } from \"./DisplayScaleCompensationProvider\";\nimport { createMuiDisplayScaleComponents } from \"./createMuiDisplayScaleComponents\";\n\n/**\n * React adapter for global MUI overlay defaults. Use inside an existing\n * `DisplayScaleProvider`, then pass the result to `createTheme`.\n */\nexport function useMuiDisplayScaleComponents(): Components<Theme> {\n const { compensation, overlayStrategy, rootRef } = useDisplayScaleCompensation();\n\n const getPortalContainer = useCallback((): HTMLElement => {\n if (overlayStrategy === \"document-body\") return document.body;\n return rootRef.current ?? document.body;\n }, [overlayStrategy, rootRef]);\n\n return useMemo(\n () =>\n createMuiDisplayScaleComponents({\n getPortalContainer,\n overlayZoom: overlayStrategy === \"document-body\" ? compensation.zoom : 1,\n }),\n [compensation.zoom, getPortalContainer, overlayStrategy],\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"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { toDisplayScaleLogicalPixels, getDisplayScaleOverlayMaxHeight, getDisplayScaleLogicalViewport } from './chunk-U3ZWHUJG.js';
|
|
2
|
-
import { useDisplayScaleCompensation, useDisplayScale } from './chunk-
|
|
2
|
+
import { useDisplayScaleCompensation, useDisplayScale } from './chunk-F5AFPMQC.js';
|
|
3
3
|
import { useCallback, useMemo } from 'react';
|
|
4
4
|
|
|
5
5
|
function useDisplayScaleOverlay() {
|
|
@@ -64,5 +64,5 @@ function useLogicalMaxWidth(maxWidth) {
|
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
export { useDisplayScaleOverlay, useLogicalMaxWidth, useLogicalMinWidth };
|
|
67
|
-
//# sourceMappingURL=chunk-
|
|
68
|
-
//# sourceMappingURL=chunk-
|
|
67
|
+
//# sourceMappingURL=chunk-64EBQUAW.js.map
|
|
68
|
+
//# sourceMappingURL=chunk-64EBQUAW.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/useDisplayScaleOverlay.ts","../src/useLogicalBreakpoint.ts"],"names":["useMemo"],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/useDisplayScaleOverlay.ts","../src/useLogicalBreakpoint.ts"],"names":["useMemo"],"mappings":"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","file":"chunk-64EBQUAW.js","sourcesContent":["import { useCallback, useMemo } from \"react\";\nimport { useDisplayScaleCompensation } from \"./DisplayScaleCompensationProvider\";\nimport {\n type DisplayScaleOverlayBoundsOptions,\n getDisplayScaleLogicalViewport,\n getDisplayScaleOverlayMaxHeight,\n toDisplayScaleLogicalPixels,\n} from \"./displayScaleLogicalViewport\";\n\nexport type DisplayScaleOverlay = {\n /** MUI portal target selected by the engine strategy. */\n portalContainer: HTMLElement | null;\n logicalViewport: ReturnType<typeof getDisplayScaleLogicalViewport>;\n toLogicalPixels: (value: number) => number;\n /** Converts a visible size to the CSS size required by density-zoomed content. */\n toOverlayContentPixels: (value: number) => number;\n getMaxHeightBelowAnchor: (\n anchor: HTMLElement,\n options?: DisplayScaleOverlayBoundsOptions,\n ) => number;\n};\n\n/**\n * Overlay geometry adapter. Use this instead of dividing coordinates by the\n * display-scale zoom in feature code.\n */\nexport function useDisplayScaleOverlay(): DisplayScaleOverlay {\n const { compensation, overlayStrategy, rootRef } = useDisplayScaleCompensation();\n\n // A density-zoomed portal consumes positioning values in its logical\n // coordinate space, even when it is hosted by document.body.\n const toLogicalPixels = useCallback(\n (value: number) => toDisplayScaleLogicalPixels(value, compensation),\n [compensation],\n );\n\n const toOverlayContentPixels = useCallback(\n (value: number) => toDisplayScaleLogicalPixels(value, compensation),\n [compensation],\n );\n\n const getMaxHeightBelowAnchor = useCallback(\n (anchor: HTMLElement, options?: DisplayScaleOverlayBoundsOptions) => {\n if (overlayStrategy === \"document-body\") {\n const { offset = 8, viewportInset = 16 } = options ?? {};\n const viewportHeight = window.visualViewport?.height ?? window.innerHeight;\n const visibleHeight = Math.max(\n 0,\n viewportHeight - anchor.getBoundingClientRect().bottom - offset - viewportInset,\n );\n\n // The portal is positioned in browser-visible pixels, but its content\n // inherits MUI's density zoom. Convert only a content dimension back\n // to logical pixels so its visible height reaches this boundary.\n const zoom = compensation.zoom > 0 ? compensation.zoom : 1;\n return Math.floor(visibleHeight / zoom);\n }\n return getDisplayScaleOverlayMaxHeight(anchor.getBoundingClientRect(), compensation, options);\n },\n [compensation, overlayStrategy],\n );\n\n return useMemo(\n () => ({\n portalContainer:\n overlayStrategy === \"document-body\"\n ? typeof document === \"undefined\"\n ? null\n : document.body\n : rootRef.current,\n logicalViewport: getDisplayScaleLogicalViewport(compensation),\n toLogicalPixels,\n toOverlayContentPixels,\n getMaxHeightBelowAnchor,\n }),\n [\n compensation,\n getMaxHeightBelowAnchor,\n overlayStrategy,\n rootRef,\n toLogicalPixels,\n toOverlayContentPixels,\n ],\n );\n}\n","import { useMemo } from \"react\";\nimport { useDisplayScaleCompensation } from \"./DisplayScaleCompensationProvider\";\nimport { useDisplayScale } from \"./useDisplayScale\";\n\n/**\n * Tests a breakpoint against the compensated root width rather than the raw\n * browser viewport. Use for app-shell decisions that must preserve the same\n * layout at Windows 100% and compensated 150%.\n */\nexport function useLogicalMinWidth(minWidth: number): boolean {\n const { snapshot } = useDisplayScale();\n const { compensation } = useDisplayScaleCompensation();\n\n return useMemo(() => {\n const zoom = compensation.zoom > 0 ? compensation.zoom : 1;\n return snapshot.viewport.width / zoom >= minWidth;\n }, [compensation.zoom, minWidth, snapshot.viewport.width]);\n}\n\n/** Logical counterpart to a max-width media query. */\nexport function useLogicalMaxWidth(maxWidth: number): boolean {\n const { snapshot } = useDisplayScale();\n const { compensation } = useDisplayScaleCompensation();\n\n return useMemo(() => {\n const zoom = compensation.zoom > 0 ? compensation.zoom : 1;\n return snapshot.viewport.width / zoom <= maxWidth;\n }, [compensation.zoom, maxWidth, snapshot.viewport.width]);\n}\n"]}
|
|
@@ -17,9 +17,9 @@ function useDisplayScale(options) {
|
|
|
17
17
|
);
|
|
18
18
|
return { snapshot, evaluate };
|
|
19
19
|
}
|
|
20
|
-
var
|
|
21
|
-
|
|
22
|
-
);
|
|
20
|
+
var DISPLAY_SCALE_CONTEXT_KEY = /* @__PURE__ */ Symbol.for("react-display-scale-engine/compensation-context");
|
|
21
|
+
var displayScaleContextRegistry = globalThis;
|
|
22
|
+
var DisplayScaleCompensationContext = displayScaleContextRegistry[DISPLAY_SCALE_CONTEXT_KEY] ?? (displayScaleContextRegistry[DISPLAY_SCALE_CONTEXT_KEY] = createContext(null));
|
|
23
23
|
function applyCompensationToNode(node, compensation, layoutExtents, snapshot) {
|
|
24
24
|
applyDisplayScaleCompensationStyles(node, compensation, layoutExtents);
|
|
25
25
|
syncDisplayScaleCompensationMetadata(compensation, layoutExtents, snapshot);
|
|
@@ -125,6 +125,9 @@ function DisplayScaleCompensationProvider({
|
|
|
125
125
|
}),
|
|
126
126
|
[compensation, layoutExtents, overlayStrategy]
|
|
127
127
|
);
|
|
128
|
+
if (!compensation.active) {
|
|
129
|
+
return /* @__PURE__ */ jsx(DisplayScaleCompensationContext.Provider, { value, children });
|
|
130
|
+
}
|
|
128
131
|
return /* @__PURE__ */ jsx(DisplayScaleCompensationContext.Provider, { value, children: /* @__PURE__ */ jsx(
|
|
129
132
|
"div",
|
|
130
133
|
{
|
|
@@ -215,5 +218,5 @@ function useDisplayScaleAnchor(anchorElement) {
|
|
|
215
218
|
}
|
|
216
219
|
|
|
217
220
|
export { DisplayScaleCompensationProvider, DisplayScaleProvider, useDisplayScale, useDisplayScaleAnchor, useDisplayScaleCompensation, useDisplayScalePortalContainer };
|
|
218
|
-
//# sourceMappingURL=chunk-
|
|
219
|
-
//# sourceMappingURL=chunk-
|
|
221
|
+
//# sourceMappingURL=chunk-F5AFPMQC.js.map
|
|
222
|
+
//# sourceMappingURL=chunk-F5AFPMQC.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-F5AFPMQC.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 Context,\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\n/**\n * Vite and other optimizers may prebundle `/react` and `/mui` independently.\n * Keep one context per browser realm even if a consumer's optimizer evaluates\n * these package entry points through separate module graphs.\n */\nconst DISPLAY_SCALE_CONTEXT_KEY = Symbol.for(\"react-display-scale-engine/compensation-context\");\ntype DisplayScaleContextRegistry = typeof globalThis & {\n [DISPLAY_SCALE_CONTEXT_KEY]?: Context<DisplayScaleCompensationContextValue | null>;\n};\n\nconst displayScaleContextRegistry = globalThis as DisplayScaleContextRegistry;\nconst DisplayScaleCompensationContext =\n displayScaleContextRegistry[DISPLAY_SCALE_CONTEXT_KEY] ??\n (displayScaleContextRegistry[DISPLAY_SCALE_CONTEXT_KEY] =\n createContext<DisplayScaleCompensationContextValue | null>(null));\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 // At a normal display scale, do not add an extra layout container. This\n // makes the provider observational only: consumers can use its hooks, but\n // the app's size, overflow and flex layout remain completely untouched.\n if (!compensation.active) {\n return (\n <DisplayScaleCompensationContext.Provider value={value}>\n {children}\n </DisplayScaleCompensationContext.Provider>\n );\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"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { DEFAULT_DISPLAY_SCALE_THRESHOLDS, clearDisplayScaleBaseline, detectDisplayScale, evaluateDisplayScale, readDisplayScaleBaseline, recalibrateDisplayScale, resetDisplayScaleEngine, shouldApplyOsScaleCompensation, snapToWindowsOsScale, subscribeDisplayScale, writeDisplayScaleBaseline } from './core.js';
|
|
2
2
|
export { C as ComputeDisplayScaleCompensationOptions, D as DEFAULT_DISPLAY_SCALE_COMPENSATION_CONFIG, a as DetectDisplayScaleOptions, b as DisplayScaleBaseline, c as DisplayScaleCalibration, d as DisplayScaleCompensation, e as DisplayScaleCompensationConfig, f as DisplayScaleConfidence, g as DisplayScaleDetectionMethod, h as DisplayScaleEvaluation, i as DisplayScaleIssue, j as DisplayScaleLayoutExtents, k as DisplayScaleLogicalViewport, l as DisplayScaleOverlayBoundsOptions, m as DisplayScaleScreen, n as DisplayScaleSnapshot, o as DisplayScaleThresholds, p as DisplayScaleViewport, S as SubscribeDisplayScaleOptions, q as applyDisplayScaleCompensationStyles, r as applyDisplayScaleCompensationToDocument, s as clearDisplayScaleCompensationFromDocument, t as clearDisplayScaleCompensationStyles, u as computeDisplayScaleCompensation, v as getDisplayScaleLogicalViewport, w as getDisplayScaleOverlayMaxHeight, x as measureDisplayScaleLayoutExtents, y as primeDisplayScaleCompensation, z as readDisplayScaleViewportSize, A as supportsCssZoom, B as syncDisplayScaleCompensationMetadata, E as toDisplayScaleLogicalPixels } from './displayScaleLogicalViewport-Ikf-DtkQ.js';
|
|
3
3
|
export { DisplayScaleCompensationProvider, DisplayScaleOverlay, DisplayScaleOverlayStrategy, DisplayScaleProvider, DisplayScaleProviderProps, DisplayScaleVirtualAnchor, useDisplayScale, useDisplayScaleAnchor, useDisplayScaleCompensation, useDisplayScaleOverlay, useDisplayScalePortalContainer, useLogicalMaxWidth, useLogicalMinWidth } from './react.js';
|
|
4
|
-
export { DisplayScaleMenu, DisplayScaleMenuProps, DisplayScalePopover, DisplayScalePopoverProps, DisplayScalePopper, DisplayScalePopperProps, DisplayScaleSelect, createMuiDisplayScaleComponents, displayScalePageFillSx, signinSplitColumnSx, signinViewportShellSx, useDisplayScalePopoverPosition, useDisplayScaleTabsIndicator } from './mui.js';
|
|
4
|
+
export { DisplayScaleMenu, DisplayScaleMenuProps, DisplayScalePopover, DisplayScalePopoverProps, DisplayScalePopper, DisplayScalePopperProps, DisplayScaleSelect, MuiDisplayScaleMenuAdapter, MuiDisplayScalePopoverAdapter, MuiDisplayScalePopperAdapter, MuiDisplayScaleSelectAdapter, createMuiDisplayScaleComponents, displayScalePageFillSx, signinSplitColumnSx, signinViewportShellSx, useDisplayScalePopoverPosition, useDisplayScaleTabsIndicator, useMuiDisplayScaleComponents, useMuiDisplayScaleMenu, useMuiDisplayScalePopover, useMuiDisplayScalePopper, useMuiDisplayScaleSelect } from './mui.js';
|
|
5
5
|
import 'react';
|
|
6
6
|
import '@mui/material/styles';
|
|
7
7
|
import '@mui/material';
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import './chunk-SLNYXBHU.js';
|
|
2
|
-
export { useDisplayScaleOverlay, useLogicalMaxWidth, useLogicalMinWidth } from './chunk-
|
|
2
|
+
export { useDisplayScaleOverlay, useLogicalMaxWidth, useLogicalMinWidth } from './chunk-64EBQUAW.js';
|
|
3
3
|
export { getDisplayScaleLogicalViewport, getDisplayScaleOverlayMaxHeight, toDisplayScaleLogicalPixels } from './chunk-U3ZWHUJG.js';
|
|
4
|
-
export { DisplayScaleMenu, DisplayScalePopover, DisplayScalePopper, DisplayScaleSelect, createMuiDisplayScaleComponents, displayScalePageFillSx, signinSplitColumnSx, signinViewportShellSx, useDisplayScalePopoverPosition, useDisplayScaleTabsIndicator } from './chunk-
|
|
5
|
-
export { DisplayScaleCompensationProvider, DisplayScaleProvider, useDisplayScale, useDisplayScaleAnchor, useDisplayScaleCompensation, useDisplayScalePortalContainer } from './chunk-
|
|
4
|
+
export { DisplayScaleMenu, DisplayScalePopover, DisplayScalePopper, DisplayScaleSelect, createMuiDisplayScaleComponents, displayScalePageFillSx, signinSplitColumnSx, signinViewportShellSx, useDisplayScalePopoverPosition, useDisplayScaleTabsIndicator, useMuiDisplayScaleComponents, useMuiDisplayScaleMenu, useMuiDisplayScalePopover, useMuiDisplayScalePopper, useMuiDisplayScaleSelect } from './chunk-5MGGPTIJ.js';
|
|
5
|
+
export { DisplayScaleCompensationProvider, DisplayScaleProvider, useDisplayScale, useDisplayScaleAnchor, useDisplayScaleCompensation, useDisplayScalePortalContainer } from './chunk-F5AFPMQC.js';
|
|
6
6
|
export { DEFAULT_DISPLAY_SCALE_COMPENSATION_CONFIG, DEFAULT_DISPLAY_SCALE_THRESHOLDS, applyDisplayScaleCompensationStyles, applyDisplayScaleCompensationToDocument, clearDisplayScaleBaseline, clearDisplayScaleCompensationFromDocument, clearDisplayScaleCompensationStyles, computeDisplayScaleCompensation, detectDisplayScale, evaluateDisplayScale, measureDisplayScaleLayoutExtents, primeDisplayScaleCompensation, readDisplayScaleBaseline, readDisplayScaleViewportSize, recalibrateDisplayScale, resetDisplayScaleEngine, shouldApplyOsScaleCompensation, snapToWindowsOsScale, subscribeDisplayScale, supportsCssZoom, syncDisplayScaleCompensationMetadata, writeDisplayScaleBaseline } from './chunk-VWJNHWMD.js';
|
|
7
7
|
//# sourceMappingURL=index.js.map
|
|
8
8
|
//# sourceMappingURL=index.js.map
|
package/dist/mui.d.ts
CHANGED
|
@@ -23,21 +23,51 @@ type NativeAnchorProps = {
|
|
|
23
23
|
anchorEl?: HTMLElement | null;
|
|
24
24
|
};
|
|
25
25
|
type DisplayScaleMenuProps = Omit<MenuProps, "anchorEl"> & NativeAnchorProps;
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
type MuiDisplayScaleMenuAdapter = {
|
|
27
|
+
/** Spread these props onto MUI's native `<Menu />`. */
|
|
28
|
+
menuProps: MenuProps;
|
|
29
|
+
};
|
|
30
|
+
/** Non-wrapper display-scale adapter for MUI's native `<Menu />`. */
|
|
31
|
+
declare function useMuiDisplayScaleMenu({ anchorEl, ...props }: DisplayScaleMenuProps): MuiDisplayScaleMenuAdapter;
|
|
32
|
+
/** MUI Menu wrapper — prefer `useMuiDisplayScaleMenu` when retaining `<Menu />`. */
|
|
33
|
+
declare function DisplayScaleMenu(props: DisplayScaleMenuProps): ReactElement;
|
|
28
34
|
type DisplayScalePopoverProps = Omit<PopoverProps, "anchorEl"> & NativeAnchorProps;
|
|
29
|
-
|
|
30
|
-
|
|
35
|
+
type MuiDisplayScalePopoverAdapter = {
|
|
36
|
+
/** Spread these props onto MUI's native `<Popover />`. */
|
|
37
|
+
popoverProps: PopoverProps;
|
|
38
|
+
};
|
|
39
|
+
/** Non-wrapper display-scale adapter for MUI's native `<Popover />`. */
|
|
40
|
+
declare function useMuiDisplayScalePopover({ anchorEl, ...props }: DisplayScalePopoverProps): MuiDisplayScalePopoverAdapter;
|
|
41
|
+
/** MUI Popover wrapper — prefer `useMuiDisplayScalePopover` when retaining `<Popover />`. */
|
|
42
|
+
declare function DisplayScalePopover(props: DisplayScalePopoverProps): ReactElement;
|
|
31
43
|
type DisplayScalePopperProps = Omit<PopperProps, "anchorEl"> & NativeAnchorProps;
|
|
32
|
-
|
|
33
|
-
|
|
44
|
+
type MuiDisplayScalePopperAdapter = {
|
|
45
|
+
/** Spread these props onto MUI's native `<Popper />`. */
|
|
46
|
+
popperProps: PopperProps;
|
|
47
|
+
};
|
|
48
|
+
/** Non-wrapper display-scale adapter for MUI's native `<Popper />`. */
|
|
49
|
+
declare function useMuiDisplayScalePopper({ anchorEl, ...props }: DisplayScalePopperProps): MuiDisplayScalePopperAdapter;
|
|
50
|
+
/** MUI Popper wrapper — prefer `useMuiDisplayScalePopper` when retaining `<Popper />`. */
|
|
51
|
+
declare function DisplayScalePopper(props: DisplayScalePopperProps): ReactElement;
|
|
34
52
|
|
|
53
|
+
type MuiDisplayScaleSelectAdapter<Value = unknown> = {
|
|
54
|
+
/** Spread these props onto MUI's native `<Select />`. */
|
|
55
|
+
selectProps: SelectProps<Value>;
|
|
56
|
+
};
|
|
35
57
|
/**
|
|
36
58
|
* MUI Select adapter for the display-scale engine. Select creates its Menu
|
|
37
59
|
* internally, so it cannot use DisplayScaleMenu directly.
|
|
38
60
|
*/
|
|
61
|
+
declare function useMuiDisplayScaleSelect<Value = unknown>(props: SelectProps<Value>): MuiDisplayScaleSelectAdapter<Value>;
|
|
62
|
+
/** MUI Select wrapper — prefer `useMuiDisplayScaleSelect` when retaining `<Select />`. */
|
|
39
63
|
declare function DisplayScaleSelect<Value = unknown>(props: SelectProps<Value>): ReactElement;
|
|
40
64
|
|
|
65
|
+
/**
|
|
66
|
+
* React adapter for global MUI overlay defaults. Use inside an existing
|
|
67
|
+
* `DisplayScaleProvider`, then pass the result to `createTheme`.
|
|
68
|
+
*/
|
|
69
|
+
declare function useMuiDisplayScaleComponents(): Components<Theme>;
|
|
70
|
+
|
|
41
71
|
type DisplayScalePopoverPositionOptions = {
|
|
42
72
|
open: boolean;
|
|
43
73
|
overlayRootRef: RefObject<HTMLDivElement | null>;
|
|
@@ -69,4 +99,4 @@ declare const signinViewportShellSx: SxProps<Theme>;
|
|
|
69
99
|
/** 50/50 desktop columns — avoids flex min-content overflow at OS display scale. */
|
|
70
100
|
declare const signinSplitColumnSx: SxProps<Theme>;
|
|
71
101
|
|
|
72
|
-
export { DisplayScaleMenu, type DisplayScaleMenuProps, DisplayScalePopover, type DisplayScalePopoverProps, DisplayScalePopper, type DisplayScalePopperProps, DisplayScaleSelect, createMuiDisplayScaleComponents, displayScalePageFillSx, signinSplitColumnSx, signinViewportShellSx, useDisplayScalePopoverPosition, useDisplayScaleTabsIndicator };
|
|
102
|
+
export { DisplayScaleMenu, type DisplayScaleMenuProps, DisplayScalePopover, type DisplayScalePopoverProps, DisplayScalePopper, type DisplayScalePopperProps, DisplayScaleSelect, type MuiDisplayScaleMenuAdapter, type MuiDisplayScalePopoverAdapter, type MuiDisplayScalePopperAdapter, type MuiDisplayScaleSelectAdapter, createMuiDisplayScaleComponents, displayScalePageFillSx, signinSplitColumnSx, signinViewportShellSx, useDisplayScalePopoverPosition, useDisplayScaleTabsIndicator, useMuiDisplayScaleComponents, useMuiDisplayScaleMenu, useMuiDisplayScalePopover, useMuiDisplayScalePopper, useMuiDisplayScaleSelect };
|
package/dist/mui.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { DisplayScaleMenu, DisplayScalePopover, DisplayScalePopper, DisplayScaleSelect, createMuiDisplayScaleComponents, displayScalePageFillSx, signinSplitColumnSx, signinViewportShellSx, useDisplayScalePopoverPosition, useDisplayScaleTabsIndicator } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { DisplayScaleMenu, DisplayScalePopover, DisplayScalePopper, DisplayScaleSelect, createMuiDisplayScaleComponents, displayScalePageFillSx, signinSplitColumnSx, signinViewportShellSx, useDisplayScalePopoverPosition, useDisplayScaleTabsIndicator, useMuiDisplayScaleComponents, useMuiDisplayScaleMenu, useMuiDisplayScalePopover, useMuiDisplayScalePopper, useMuiDisplayScaleSelect } from './chunk-5MGGPTIJ.js';
|
|
2
|
+
import './chunk-F5AFPMQC.js';
|
|
3
3
|
import './chunk-VWJNHWMD.js';
|
|
4
4
|
//# sourceMappingURL=mui.js.map
|
|
5
5
|
//# sourceMappingURL=mui.js.map
|
package/dist/react.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { useDisplayScaleOverlay, useLogicalMaxWidth, useLogicalMinWidth } from './chunk-
|
|
1
|
+
export { useDisplayScaleOverlay, useLogicalMaxWidth, useLogicalMinWidth } from './chunk-64EBQUAW.js';
|
|
2
2
|
import './chunk-U3ZWHUJG.js';
|
|
3
|
-
export { DisplayScaleCompensationProvider, DisplayScaleProvider, useDisplayScale, useDisplayScaleAnchor, useDisplayScaleCompensation, useDisplayScalePortalContainer } from './chunk-
|
|
3
|
+
export { DisplayScaleCompensationProvider, DisplayScaleProvider, useDisplayScale, useDisplayScaleAnchor, useDisplayScaleCompensation, useDisplayScalePortalContainer } from './chunk-F5AFPMQC.js';
|
|
4
4
|
import './chunk-VWJNHWMD.js';
|
|
5
5
|
//# sourceMappingURL=react.js.map
|
|
6
6
|
//# sourceMappingURL=react.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-display-scale-engine",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "React and Material UI utilities for consistent Windows display-scale rendering.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -40,7 +40,8 @@
|
|
|
40
40
|
"scripts": {
|
|
41
41
|
"build": "tsup",
|
|
42
42
|
"typecheck": "tsc --noEmit",
|
|
43
|
-
"check": "npm run typecheck && npm run build",
|
|
43
|
+
"check": "npm run typecheck && npm run build && npm run test:consumer",
|
|
44
|
+
"test:consumer": "node ./scripts/verify-consumer-runtime.mjs",
|
|
44
45
|
"pack:check": "npm pack --dry-run",
|
|
45
46
|
"release:check": "node ./bin/rds-engine.mjs check",
|
|
46
47
|
"release:dry-run": "node ./bin/rds-engine.mjs publish --dry-run",
|
|
@@ -58,7 +59,7 @@
|
|
|
58
59
|
"peerDependencies": {
|
|
59
60
|
"@emotion/react": ">=11.0.0",
|
|
60
61
|
"@emotion/styled": ">=11.0.0",
|
|
61
|
-
"@mui/material": ">=
|
|
62
|
+
"@mui/material": ">=7.0.0 <8.0.0",
|
|
62
63
|
"@popperjs/core": ">=2.0.0",
|
|
63
64
|
"react": ">=18.0.0",
|
|
64
65
|
"react-dom": ">=18.0.0"
|
|
@@ -71,6 +72,7 @@
|
|
|
71
72
|
"@types/node": "^22.10.0",
|
|
72
73
|
"@types/react": "^19.0.0",
|
|
73
74
|
"@types/react-dom": "^19.0.0",
|
|
75
|
+
"jsdom": "^26.1.0",
|
|
74
76
|
"react": "^19.0.0",
|
|
75
77
|
"react-dom": "^19.0.0",
|
|
76
78
|
"tsup": "^8.5.1",
|
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
|
@@ -1 +0,0 @@
|
|
|
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"]}
|