summaryrefslogtreecommitdiff
path: root/apps/web/src/lib/masks/registry.ts
diff options
context:
space:
mode:
Diffstat (limited to 'apps/web/src/lib/masks/registry.ts')
-rw-r--r--apps/web/src/lib/masks/registry.ts60
1 files changed, 56 insertions, 4 deletions
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<BaseMaskParams> & {
+export interface RegisteredMaskDefinition {
+ type: MaskType;
+ name: string;
+ features: MaskDefinition<BaseMaskParams>["features"];
+ params: ParamDefinition<string>[];
+ renderer: MaskDefinition<BaseMaskParams>["renderer"];
+ interaction: {
+ getInteraction(args: {
+ params: BaseMaskParams;
+ bounds: Parameters<
+ MaskDefinition<BaseMaskParams>["interaction"]["getInteraction"]
+ >[0]["bounds"];
+ displayScale: number;
+ scaleX: number;
+ scaleY: number;
+ }): MaskInteractionResult;
+ snap?(args: MaskSnapArgs<BaseMaskParams>): MaskSnapResult<BaseMaskParams>;
+ };
+ isActive?: (params: BaseMaskParams) => boolean;
+ buildDefault(
+ context: MaskDefaultContext,
+ ): ReturnType<MaskDefinition<BaseMaskParams>["buildDefault"]>;
+ computeParamUpdate(
+ args: Parameters<MaskDefinition<BaseMaskParams>["computeParamUpdate"]>[0],
+ ): ReturnType<MaskDefinition<BaseMaskParams>["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);