mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-07 18:26:17 +00:00
40 lines
1.4 KiB
TypeScript
40 lines
1.4 KiB
TypeScript
import type { DomEditSelection } from "./domEditing";
|
|
|
|
export interface DomEditSelectionShapeStyles {
|
|
borderRadius: string | number;
|
|
clipPath?: string;
|
|
}
|
|
|
|
export function readDomEditSelectionShapeStyles(
|
|
selection: DomEditSelection | null,
|
|
): DomEditSelectionShapeStyles {
|
|
const fallback = {
|
|
borderRadius: 8,
|
|
clipPath: undefined,
|
|
};
|
|
if (!selection?.element) return fallback;
|
|
try {
|
|
const tag = selection.element.tagName.toLowerCase();
|
|
if (tag === "svg" || tag === "img" || tag === "video" || tag === "canvas") return fallback;
|
|
const win = selection.element.ownerDocument.defaultView;
|
|
if (!win) return fallback;
|
|
const cs = win.getComputedStyle(selection.element);
|
|
const borderRadius = cs.borderRadius;
|
|
const clipPath = cs.clipPath;
|
|
return {
|
|
borderRadius: borderRadius && borderRadius !== "0px" ? borderRadius : 4,
|
|
clipPath: clipPath && clipPath !== "none" ? clipPath : undefined,
|
|
};
|
|
} catch {
|
|
return fallback;
|
|
}
|
|
}
|
|
|
|
/** Selection-box chrome: none when the crop-outline child draws it, inset
|
|
* shadow for clip-mirrored shapes, plain border otherwise. */
|
|
export function resolveBoxChromeClass(hasCropOutline: boolean, boxClipPath?: string): string {
|
|
if (hasCropOutline) return "";
|
|
if (boxClipPath) return "shadow-[inset_0_0_0_2px_rgba(60,230,172,0.6)]";
|
|
return "border border-studio-accent/80 shadow-[0_0_0_1px_rgba(60,230,172,0.25)]";
|
|
}
|