From 02d957582b565914bda502495c4c7aa4702a46a4 Mon Sep 17 00:00:00 2001 From: Maze Winther Date: Sun, 3 May 2026 04:20:00 +0200 Subject: [PATCH] refactor: move rendering primitives into model Co-authored-by: Cursor --- apps/web/src/model/elements/graphic.ts | 2 +- apps/web/src/model/elements/image.ts | 2 +- apps/web/src/model/elements/index.ts | 2 +- apps/web/src/model/elements/sticker.ts | 2 +- apps/web/src/model/elements/text.ts | 2 +- apps/web/src/model/elements/video.ts | 2 +- apps/web/src/model/index.ts | 1 + apps/web/src/{ => model}/rendering/index.ts | 56 +++++++++---------- .../preview-interaction-controller.ts | 2 +- .../transform-handle-controller.ts | 2 +- apps/web/src/rendering/animation-values.ts | 2 +- .../src/rendering/components/blending-tab.tsx | 2 +- .../src/services/renderer/compositor/types.ts | 2 +- .../src/services/renderer/nodes/text-node.ts | 2 +- .../services/renderer/nodes/visual-node.ts | 2 +- apps/web/src/timeline/defaults.ts | 2 +- .../placement/__tests__/resolve.test.ts | 2 +- 17 files changed, 44 insertions(+), 43 deletions(-) rename apps/web/src/{ => model}/rendering/index.ts (93%) diff --git a/apps/web/src/model/elements/graphic.ts b/apps/web/src/model/elements/graphic.ts index b917bcce..3ca81c78 100644 --- a/apps/web/src/model/elements/graphic.ts +++ b/apps/web/src/model/elements/graphic.ts @@ -1,7 +1,7 @@ import type { Effect } from "@/model/decorations/effect"; import type { Mask } from "@/model/decorations/mask"; import type { ParamValues } from "@/model/decorations/param-values"; -import type { BlendMode, Transform } from "@/rendering"; +import type { BlendMode, Transform } from "@/model/rendering"; import type { BaseTimelineElement } from "./base"; export interface GraphicElement extends BaseTimelineElement { diff --git a/apps/web/src/model/elements/image.ts b/apps/web/src/model/elements/image.ts index dc53cb8b..b2a9db62 100644 --- a/apps/web/src/model/elements/image.ts +++ b/apps/web/src/model/elements/image.ts @@ -1,6 +1,6 @@ import type { Effect } from "@/model/decorations/effect"; import type { Mask } from "@/model/decorations/mask"; -import type { BlendMode, Transform } from "@/rendering"; +import type { BlendMode, Transform } from "@/model/rendering"; import type { BaseTimelineElement } from "./base"; export interface ImageElement extends BaseTimelineElement { diff --git a/apps/web/src/model/elements/index.ts b/apps/web/src/model/elements/index.ts index 83cf2abf..446ecb9c 100644 --- a/apps/web/src/model/elements/index.ts +++ b/apps/web/src/model/elements/index.ts @@ -5,7 +5,7 @@ import type { ImageElement } from "./image"; import type { StickerElement } from "./sticker"; import type { TextElement } from "./text"; import type { VideoElement } from "./video"; -import type { Transform } from "@/rendering"; +import type { Transform } from "@/model/rendering"; export * from "./audio"; export * from "./base"; diff --git a/apps/web/src/model/elements/sticker.ts b/apps/web/src/model/elements/sticker.ts index f0188be3..ac55b5d7 100644 --- a/apps/web/src/model/elements/sticker.ts +++ b/apps/web/src/model/elements/sticker.ts @@ -1,5 +1,5 @@ import type { Effect } from "@/model/decorations/effect"; -import type { BlendMode, Transform } from "@/rendering"; +import type { BlendMode, Transform } from "@/model/rendering"; import type { BaseTimelineElement } from "./base"; export interface StickerElement extends BaseTimelineElement { diff --git a/apps/web/src/model/elements/text.ts b/apps/web/src/model/elements/text.ts index 0dd8f71e..de1412c0 100644 --- a/apps/web/src/model/elements/text.ts +++ b/apps/web/src/model/elements/text.ts @@ -1,5 +1,5 @@ import type { Effect } from "@/model/decorations/effect"; -import type { BlendMode, Transform } from "@/rendering"; +import type { BlendMode, Transform } from "@/model/rendering"; import type { BaseTimelineElement } from "./base"; export interface TextBackground { diff --git a/apps/web/src/model/elements/video.ts b/apps/web/src/model/elements/video.ts index 2bf58141..acc31711 100644 --- a/apps/web/src/model/elements/video.ts +++ b/apps/web/src/model/elements/video.ts @@ -1,6 +1,6 @@ import type { Effect } from "@/model/decorations/effect"; import type { Mask } from "@/model/decorations/mask"; -import type { BlendMode, Transform } from "@/rendering"; +import type { BlendMode, Transform } from "@/model/rendering"; import type { BaseTimelineElement, RetimeConfig } from "./base"; export interface VideoElement extends BaseTimelineElement { diff --git a/apps/web/src/model/index.ts b/apps/web/src/model/index.ts index 2afcb00c..62511e6d 100644 --- a/apps/web/src/model/index.ts +++ b/apps/web/src/model/index.ts @@ -3,6 +3,7 @@ export * from "./decorations"; export * from "./element-ref"; export * from "./elements"; export * from "./ids"; +export * from "./rendering"; export * from "./scene"; export * from "./time"; export * from "./track"; diff --git a/apps/web/src/rendering/index.ts b/apps/web/src/model/rendering/index.ts similarity index 93% rename from apps/web/src/rendering/index.ts rename to apps/web/src/model/rendering/index.ts index c5555371..d16296e2 100644 --- a/apps/web/src/rendering/index.ts +++ b/apps/web/src/model/rendering/index.ts @@ -1,28 +1,28 @@ -export interface Transform { - scaleX: number; - scaleY: number; - position: { - x: number; - y: number; - }; - rotate: number; -} - -export type BlendMode = - | "normal" - | "darken" - | "multiply" - | "color-burn" - | "lighten" - | "screen" - | "plus-lighter" - | "color-dodge" - | "overlay" - | "soft-light" - | "hard-light" - | "difference" - | "exclusion" - | "hue" - | "saturation" - | "color" - | "luminosity"; +export interface Transform { + scaleX: number; + scaleY: number; + position: { + x: number; + y: number; + }; + rotate: number; +} + +export type BlendMode = + | "normal" + | "darken" + | "multiply" + | "color-burn" + | "lighten" + | "screen" + | "plus-lighter" + | "color-dodge" + | "overlay" + | "soft-light" + | "hard-light" + | "difference" + | "exclusion" + | "hue" + | "saturation" + | "color" + | "luminosity"; diff --git a/apps/web/src/preview/controllers/preview-interaction-controller.ts b/apps/web/src/preview/controllers/preview-interaction-controller.ts index 394acbb1..57f7bd43 100644 --- a/apps/web/src/preview/controllers/preview-interaction-controller.ts +++ b/apps/web/src/preview/controllers/preview-interaction-controller.ts @@ -18,7 +18,7 @@ import { type PreviewSnapLine, } from "@/preview/preview-snap"; import type { TCanvasSize } from "@/project/types"; -import type { Transform } from "@/rendering"; +import type { Transform } from "@/model/rendering"; import { isVisualElement } from "@/timeline/element-utils"; import type { ElementRef, SceneTracks, TextElement, TimelineElement, TimelineTrack, VisualElement } from "@/model"; diff --git a/apps/web/src/preview/controllers/transform-handle-controller.ts b/apps/web/src/preview/controllers/transform-handle-controller.ts index 43fecd2d..52a7f8cb 100644 --- a/apps/web/src/preview/controllers/transform-handle-controller.ts +++ b/apps/web/src/preview/controllers/transform-handle-controller.ts @@ -23,7 +23,7 @@ import { setChannel, } from "@/animation"; import type { ElementAnimations } from "@/model/decorations/animations"; -import type { Transform } from "@/rendering"; +import type { Transform } from "@/model/rendering"; import { resolveTransformAtTime } from "@/rendering/animation-values"; import type { ElementRef, SceneTracks, TimelineElement, VisualElement } from "@/model"; diff --git a/apps/web/src/rendering/animation-values.ts b/apps/web/src/rendering/animation-values.ts index 5717a201..2b6ddbfd 100644 --- a/apps/web/src/rendering/animation-values.ts +++ b/apps/web/src/rendering/animation-values.ts @@ -1,6 +1,6 @@ import type { ElementAnimations } from "@/model/decorations/animations"; import { resolveAnimationPathValueAtTime } from "@/animation"; -import type { Transform } from "./index"; +import type { Transform } from "@/model/rendering"; export function resolveTransformAtTime({ baseTransform, diff --git a/apps/web/src/rendering/components/blending-tab.tsx b/apps/web/src/rendering/components/blending-tab.tsx index 1b40751d..b5341035 100644 --- a/apps/web/src/rendering/components/blending-tab.tsx +++ b/apps/web/src/rendering/components/blending-tab.tsx @@ -19,7 +19,7 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; -import type { BlendMode } from "@/rendering"; +import type { BlendMode } from "@/model/rendering"; import type { ElementType } from "@/model"; import type { ElementAnimations } from "@/model/decorations/animations"; import { HugeiconsIcon } from "@hugeicons/react"; diff --git a/apps/web/src/services/renderer/compositor/types.ts b/apps/web/src/services/renderer/compositor/types.ts index d75a37dd..ea9b4a2b 100644 --- a/apps/web/src/services/renderer/compositor/types.ts +++ b/apps/web/src/services/renderer/compositor/types.ts @@ -1,4 +1,4 @@ -import type { BlendMode } from "@/rendering"; +import type { BlendMode } from "@/model/rendering"; import type { EffectPass } from "@/model/decorations/effect"; export type FrameDescriptor = { diff --git a/apps/web/src/services/renderer/nodes/text-node.ts b/apps/web/src/services/renderer/nodes/text-node.ts index 02ff27a0..b5b338fc 100644 --- a/apps/web/src/services/renderer/nodes/text-node.ts +++ b/apps/web/src/services/renderer/nodes/text-node.ts @@ -1,7 +1,7 @@ import { BaseNode } from "./base-node"; import type { TextElement } from "@/model"; import type { EffectPass } from "@/model/decorations/effect"; -import type { Transform } from "@/rendering"; +import type { Transform } from "@/model/rendering"; import { drawMeasuredTextLayout } from "@/text/primitives"; import type { MeasuredTextElement } from "@/text/measure-element"; diff --git a/apps/web/src/services/renderer/nodes/visual-node.ts b/apps/web/src/services/renderer/nodes/visual-node.ts index df14cf23..b3ade305 100644 --- a/apps/web/src/services/renderer/nodes/visual-node.ts +++ b/apps/web/src/services/renderer/nodes/visual-node.ts @@ -1,7 +1,7 @@ import { BaseNode } from "./base-node"; import type { Effect, EffectPass } from "@/model/decorations/effect"; import type { Mask } from "@/model/decorations/mask"; -import type { BlendMode, Transform } from "@/rendering"; +import type { BlendMode, Transform } from "@/model/rendering"; import type { RetimeConfig, VisualElement } from "@/model"; export interface VisualNodeParams { diff --git a/apps/web/src/timeline/defaults.ts b/apps/web/src/timeline/defaults.ts index 0cac6a4d..56a07f06 100644 --- a/apps/web/src/timeline/defaults.ts +++ b/apps/web/src/timeline/defaults.ts @@ -1,6 +1,6 @@ import { DEFAULT_NEW_ELEMENT_DURATION } from "@/timeline/creation"; import type { TTimelineViewState } from "@/project/types"; -import type { BlendMode, Transform } from "@/rendering"; +import type { BlendMode, Transform } from "@/model/rendering"; import type { TextElement } from "@/model"; const defaultTransform: Transform = { diff --git a/apps/web/src/timeline/placement/__tests__/resolve.test.ts b/apps/web/src/timeline/placement/__tests__/resolve.test.ts index e83d1d9f..f4ad8d15 100644 --- a/apps/web/src/timeline/placement/__tests__/resolve.test.ts +++ b/apps/web/src/timeline/placement/__tests__/resolve.test.ts @@ -13,7 +13,7 @@ import { type VideoElement, type VideoTrack, } from "@/model"; -import type { Transform } from "@/rendering"; +import type { Transform } from "@/model/rendering"; import { resolveTrackPlacement } from "@/timeline/placement"; function buildTransform(): Transform {