fix: keep aspect ratio flow

This commit is contained in:
2026-10-04 20:52:47 +05:00
parent e73986fefd
commit 4d9cd2cfcb
7 changed files with 87 additions and 9 deletions
+21
View File
@@ -70,6 +70,11 @@ export interface DimensionSpec extends FieldSpecBase {
width: number;
height: number;
defaultFromSource?: boolean;
/**
* Id checkbox-поля «сохранять пропорции»: пока оно включено, правка одной
* оси пересчитывает вторую по аспекту текущего исходника.
*/
lockAspectWith?: string;
}
export interface SchemaContext {
@@ -276,6 +281,7 @@ export const field = {
width: number;
height: number;
defaultFromSource?: boolean;
lockAspectWith?: string;
}): Field<Dimension> => ({
spec: { kind: "dimension", ...s },
}),
@@ -382,6 +388,21 @@ function clamp(value: number, min?: number, max?: number): number {
return value;
}
/**
* Пересчёт при включённом lockAspect: ведущая ось (последняя правка
* пользователя) сохраняется, вторая подгоняется под аспект исходника.
*/
export function withAspectLock(
next: Dimension,
leading: "width" | "height",
aspect: number,
): Dimension {
if (leading === "width") {
return { ...next, height: Math.max(1, Math.round(next.width / aspect)) };
}
return { ...next, width: Math.max(1, Math.round(next.height * aspect)) };
}
function resolveDimensionDefaults(
spec: DimensionSpec,
context?: SchemaContext,