From c46d28891fee62ca2d3132da876af6411a41d9da Mon Sep 17 00:00:00 2001 From: Maze Winther Date: Wed, 15 Apr 2026 15:45:50 +0200 Subject: feat: text / custom masks, fix preview pan, refactor selection --- apps/web/src/lib/masks/registry.ts | 60 +++++++++++++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 4 deletions(-) (limited to 'apps/web/src/lib/masks/registry.ts') diff --git a/apps/web/src/lib/masks/registry.ts b/apps/web/src/lib/masks/registry.ts index 0aa38d87..ae8ddd20 100644 --- a/apps/web/src/lib/masks/registry.ts +++ b/apps/web/src/lib/masks/registry.ts @@ -1,6 +1,14 @@ import { MAX_FEATHER } from "@/lib/masks/feather"; import type { ParamDefinition } from "@/lib/params"; -import type { BaseMaskParams, MaskDefinition, MaskType } from "@/lib/masks/types"; +import type { + BaseMaskParams, + MaskDefaultContext, + MaskDefinition, + MaskInteractionResult, + MaskSnapArgs, + MaskSnapResult, + MaskType, +} from "@/lib/masks/types"; import type { HugeiconsIconProps } from "@hugeicons/react"; import { DefinitionRegistry } from "@/lib/registry"; @@ -39,9 +47,33 @@ const BASE_MASK_PARAM_DEFINITIONS: ParamDefinition< }, ]; -export type RegisteredMaskDefinition = MaskDefinition & { +export interface RegisteredMaskDefinition { + type: MaskType; + name: string; + features: MaskDefinition["features"]; + params: ParamDefinition[]; + renderer: MaskDefinition["renderer"]; + interaction: { + getInteraction(args: { + params: BaseMaskParams; + bounds: Parameters< + MaskDefinition["interaction"]["getInteraction"] + >[0]["bounds"]; + displayScale: number; + scaleX: number; + scaleY: number; + }): MaskInteractionResult; + snap?(args: MaskSnapArgs): MaskSnapResult; + }; + isActive?: (params: BaseMaskParams) => boolean; + buildDefault( + context: MaskDefaultContext, + ): ReturnType["buildDefault"]>; + computeParamUpdate( + args: Parameters["computeParamUpdate"]>[0], + ): ReturnType["computeParamUpdate"]>; icon: MaskIconProps; -}; +} export class MasksRegistry extends DefinitionRegistry< MaskType, @@ -59,8 +91,28 @@ export class MasksRegistry extends DefinitionRegistry< icon: MaskIconProps; }): void { const withBaseParams: RegisteredMaskDefinition = { - ...definition, + type: definition.type, + name: definition.name, + features: definition.features, params: [...definition.params, ...BASE_MASK_PARAM_DEFINITIONS], + renderer: definition.renderer, + interaction: { + getInteraction(args) { + return definition.interaction.getInteraction(args as never); + }, + snap: definition.interaction.snap + ? (args) => definition.interaction.snap?.(args as never) as never + : undefined, + }, + isActive: definition.isActive + ? (params) => definition.isActive?.(params as TParams) ?? true + : undefined, + buildDefault(context) { + return definition.buildDefault(context); + }, + computeParamUpdate(args) { + return definition.computeParamUpdate(args as never); + }, icon, }; this.register(definition.type, withBaseParams); -- cgit v1.3.1