UNPKG

@prodbirdy/mockup-generator

Version:

Serverless-optimized TypeScript SDK for generating high-quality product mockups from PSD templates

90 lines (82 loc) 2.23 kB
import type { Layer, Psd } from "ag-psd"; import { LAYER_TYPES, type LayerType, type SmartObjectInfo, } from "../constants"; export function getLayerType(layer: Layer): LayerType { if (layer.children) return LAYER_TYPES.GROUP; if (layer.placedLayer) return LAYER_TYPES.SMART_OBJECT; if (layer.text) return LAYER_TYPES.TEXT; if (layer.vectorMask || layer.vectorStroke) return LAYER_TYPES.SHAPE; if (layer.adjustment) return LAYER_TYPES.ADJUSTMENT; return LAYER_TYPES.PIXEL; } export interface LayerDimensions { width: number; height: number; } export function getLayerDimensions(layer: Layer): LayerDimensions { const width = (layer.right || 0) - (layer.left || 0); const height = (layer.bottom || 0) - (layer.top || 0); return { width, height }; } export function countLayers(layers: Layer[]): number { let count = layers.length; for (const layer of layers) { if (layer.children) { count += countLayers(layer.children); } } return count; } export function findLayerByName(layers: Layer[], name: string): Layer | null { for (const layer of layers) { if (layer.name === name) return layer; if (layer.children) { const found = findLayerByName(layer.children, name); if (found) return found; } } return null; } export function findAllSmartObjects( layers: Layer[], results: SmartObjectInfo[] = [] ): SmartObjectInfo[] { for (const layer of layers) { if (layer.placedLayer) { const { width, height } = getLayerDimensions(layer); results.push({ name: layer.name, width, height, layer: layer, path: getLayerPath(layer, layers) || [], }); } if (layer.children) { findAllSmartObjects(layer.children, results); } } return results; } function getLayerPath( targetLayer: Layer, layers: Layer[], path: string[] = [] ): string[] | null { for (const layer of layers) { if (layer === targetLayer) { return [...path, layer.name || "unnamed"]; } if (layer.children) { const found = getLayerPath(targetLayer, layer.children, [ ...path, layer.name || "unnamed", ]); if (found) return found; } } return null; }