@prodbirdy/mockup-generator
Version:
Serverless-optimized TypeScript SDK for generating high-quality product mockups from PSD templates
90 lines (82 loc) • 2.23 kB
text/typescript
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;
}