mirror of
https://github.com/excalidraw/excalidraw.git
synced 2025-10-23 08:00:32 +02:00
popover positioning relative to container
This commit is contained in:
@@ -8,7 +8,7 @@ import { atom, useAtom } from "../editor-jotai";
|
||||
import { getLanguage, t } from "../i18n";
|
||||
|
||||
import Collapsible from "./Stats/Collapsible";
|
||||
import { useDevice } from "./App";
|
||||
import { useDevice, useExcalidrawContainer } from "./App";
|
||||
|
||||
import "./IconPicker.scss";
|
||||
|
||||
@@ -39,6 +39,7 @@ function Picker<T>({
|
||||
numberOfOptionsToAlwaysShow?: number;
|
||||
}) {
|
||||
const device = useDevice();
|
||||
const { container } = useExcalidrawContainer();
|
||||
|
||||
const handleKeyDown = (event: React.KeyboardEvent) => {
|
||||
const pressedOption = options.find(
|
||||
@@ -161,6 +162,7 @@ function Picker<T>({
|
||||
sideOffset={isMobile ? 8 : 12}
|
||||
style={{ zIndex: "var(--zIndex-ui-styles-popup)" }}
|
||||
onKeyDown={handleKeyDown}
|
||||
collisionBoundary={container ?? undefined}
|
||||
>
|
||||
<div
|
||||
className={`picker`}
|
||||
|
@@ -40,17 +40,8 @@ export const PropertiesPopover = React.forwardRef<
|
||||
ref,
|
||||
) => {
|
||||
const device = useDevice();
|
||||
const collisionPadding = container
|
||||
? (() => {
|
||||
const rect = container.getBoundingClientRect();
|
||||
return {
|
||||
top: 8,
|
||||
right: Math.max(8, window.innerWidth - rect.right),
|
||||
bottom: Math.max(8, window.innerHeight - rect.bottom),
|
||||
left: 8,
|
||||
};
|
||||
})()
|
||||
: 8;
|
||||
const isMobilePortrait =
|
||||
device.editor.isMobile && !device.viewport.isLandscape;
|
||||
|
||||
return (
|
||||
<Popover.Portal container={container}>
|
||||
@@ -58,20 +49,11 @@ export const PropertiesPopover = React.forwardRef<
|
||||
ref={ref}
|
||||
className={clsx("focus-visible-none", className)}
|
||||
data-prevent-outside-click
|
||||
side={
|
||||
device.editor.isMobile && !device.viewport.isLandscape
|
||||
? "bottom"
|
||||
: "right"
|
||||
}
|
||||
align={
|
||||
device.editor.isMobile && !device.viewport.isLandscape
|
||||
? "center"
|
||||
: "start"
|
||||
}
|
||||
side={isMobilePortrait ? "bottom" : "right"}
|
||||
align={isMobilePortrait ? "center" : "start"}
|
||||
alignOffset={-16}
|
||||
sideOffset={20}
|
||||
collisionBoundary={container ?? undefined}
|
||||
collisionPadding={collisionPadding}
|
||||
style={{
|
||||
zIndex: "var(--zIndex-ui-styles-popup)",
|
||||
marginLeft: device.editor.isMobile ? "0.5rem" : undefined,
|
||||
|
@@ -11,6 +11,8 @@ import { ToolButton } from "./ToolButton";
|
||||
|
||||
import "./ToolPopover.scss";
|
||||
|
||||
import { useExcalidrawContainer } from "./App";
|
||||
|
||||
import type { AppClassProperties } from "../types";
|
||||
|
||||
type ToolOption = {
|
||||
@@ -50,6 +52,7 @@ export const ToolPopover = ({
|
||||
const currentType = activeTool.type;
|
||||
const isActive = displayedOption.type === currentType;
|
||||
const SIDE_OFFSET = 32 / 2 + 10;
|
||||
const { container } = useExcalidrawContainer();
|
||||
|
||||
// if currentType is not in options, close popup
|
||||
if (!options.some((o) => o.type === currentType) && isPopupOpen) {
|
||||
@@ -90,6 +93,7 @@ export const ToolPopover = ({
|
||||
<Popover.Content
|
||||
className="tool-popover-content"
|
||||
sideOffset={SIDE_OFFSET}
|
||||
collisionBoundary={container ?? undefined}
|
||||
>
|
||||
{options.map(({ type, icon, title }) => (
|
||||
<ToolButton
|
||||
|
Reference in New Issue
Block a user