mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
feat(beautify): add Zod schema, shadow presets, social dimensions
This commit is contained in:
@@ -0,0 +1,110 @@
|
|||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
export const SHADOW_PRESETS = {
|
||||||
|
none: { blur: 0, offsetX: 0, offsetY: 0, color: "#000000", opacity: 0 },
|
||||||
|
subtle: { blur: 20, offsetX: 0, offsetY: 4, color: "#000000", opacity: 20 },
|
||||||
|
medium: { blur: 40, offsetX: 0, offsetY: 10, color: "#000000", opacity: 35 },
|
||||||
|
dramatic: { blur: 80, offsetX: 0, offsetY: 20, color: "#000000", opacity: 50 },
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
export const SOCIAL_PRESETS = {
|
||||||
|
none: null,
|
||||||
|
twitter: { width: 1600, height: 900 },
|
||||||
|
linkedin: { width: 1200, height: 627 },
|
||||||
|
"instagram-square": { width: 1080, height: 1080 },
|
||||||
|
"instagram-story": { width: 1080, height: 1920 },
|
||||||
|
facebook: { width: 1200, height: 630 },
|
||||||
|
producthunt: { width: 1270, height: 760 },
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
export const DEVICE_FRAMES = new Set([
|
||||||
|
"iphone",
|
||||||
|
"iphone-dark",
|
||||||
|
"macbook",
|
||||||
|
"macbook-dark",
|
||||||
|
"ipad",
|
||||||
|
"ipad-dark",
|
||||||
|
]);
|
||||||
|
|
||||||
|
export const SVG_FRAMES = new Set([
|
||||||
|
"macos-light",
|
||||||
|
"macos-dark",
|
||||||
|
"windows-light",
|
||||||
|
"windows-dark",
|
||||||
|
"browser-light",
|
||||||
|
"browser-dark",
|
||||||
|
]);
|
||||||
|
|
||||||
|
export const gradientStopSchema = z.object({
|
||||||
|
color: z.string().regex(/^#[0-9a-fA-F]{6}$/),
|
||||||
|
position: z.number().min(0).max(100),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const settingsSchema = z.object({
|
||||||
|
backgroundType: z
|
||||||
|
.enum(["solid", "linear-gradient", "radial-gradient", "image", "transparent"])
|
||||||
|
.default("linear-gradient"),
|
||||||
|
backgroundColor: z.string().default("#667eea"),
|
||||||
|
gradientStops: z
|
||||||
|
.array(gradientStopSchema)
|
||||||
|
.min(2)
|
||||||
|
.default([
|
||||||
|
{ color: "#667eea", position: 0 },
|
||||||
|
{ color: "#764ba2", position: 100 },
|
||||||
|
]),
|
||||||
|
gradientAngle: z.number().min(0).max(360).default(135),
|
||||||
|
padding: z.number().min(0).max(256).default(64),
|
||||||
|
borderRadius: z.number().min(0).max(64).default(12),
|
||||||
|
shadowPreset: z.enum(["none", "subtle", "medium", "dramatic", "custom"]).default("subtle"),
|
||||||
|
shadowBlur: z.number().min(0).max(100).default(20),
|
||||||
|
shadowOffsetX: z.number().min(-50).max(50).default(0),
|
||||||
|
shadowOffsetY: z.number().min(-50).max(50).default(10),
|
||||||
|
shadowColor: z.string().default("#000000"),
|
||||||
|
shadowOpacity: z.number().min(0).max(100).default(30),
|
||||||
|
frame: z
|
||||||
|
.enum([
|
||||||
|
"none",
|
||||||
|
"macos-light",
|
||||||
|
"macos-dark",
|
||||||
|
"windows-light",
|
||||||
|
"windows-dark",
|
||||||
|
"browser-light",
|
||||||
|
"browser-dark",
|
||||||
|
"iphone",
|
||||||
|
"iphone-dark",
|
||||||
|
"macbook",
|
||||||
|
"macbook-dark",
|
||||||
|
"ipad",
|
||||||
|
"ipad-dark",
|
||||||
|
])
|
||||||
|
.default("none"),
|
||||||
|
frameTitle: z.string().optional(),
|
||||||
|
socialPreset: z
|
||||||
|
.enum([
|
||||||
|
"none",
|
||||||
|
"twitter",
|
||||||
|
"linkedin",
|
||||||
|
"instagram-square",
|
||||||
|
"instagram-story",
|
||||||
|
"facebook",
|
||||||
|
"producthunt",
|
||||||
|
])
|
||||||
|
.default("none"),
|
||||||
|
watermarkText: z.string().optional(),
|
||||||
|
watermarkPosition: z
|
||||||
|
.enum(["top-left", "top-right", "bottom-left", "bottom-right", "center"])
|
||||||
|
.default("bottom-right"),
|
||||||
|
watermarkOpacity: z.number().min(0).max(100).default(50),
|
||||||
|
outputFormat: z.enum(["png", "jpeg", "webp"]).default("png"),
|
||||||
|
});
|
||||||
|
|
||||||
|
export type BeautifySettings = z.infer<typeof settingsSchema>;
|
||||||
|
|
||||||
|
export function parseHex(hex: string): { r: number; g: number; b: number } {
|
||||||
|
const h = hex.replace("#", "");
|
||||||
|
return {
|
||||||
|
r: parseInt(h.slice(0, 2), 16),
|
||||||
|
g: parseInt(h.slice(2, 4), 16),
|
||||||
|
b: parseInt(h.slice(4, 6), 16),
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user