/** * Image-based custom frames: * - frame_image_url: full-card frame artwork (PNG with transparent * windows for art/text) rendered as the card base layer. * - layout: art/text window zones as 0-1 fractions of the card * ({ art: {x,y,w,h}, text: {x,y,w,h} }) so windows align with the * uploaded image regardless of render size. */ export const up = (pgm) => { pgm.sql(` ALTER TABLE custom_frames ADD COLUMN IF NOT EXISTS frame_image_url TEXT, ADD COLUMN IF NOT EXISTS layout JSONB `); }; export const down = (pgm) => { pgm.sql(` ALTER TABLE custom_frames DROP COLUMN IF EXISTS layout, DROP COLUMN IF EXISTS frame_image_url `); };