@dloizides/poster-render 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dist/index.d.mts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +84 -15
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +84 -15
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/enums/BackgroundStyle.ts","../src/enums/FontSetId.ts","../src/enums/FormatId.ts","../src/enums/LayoutId.ts","../src/enums/PaletteId.ts","../src/enums/PictureAnchor.ts","../src/formats.ts","../src/palettes.ts","../src/fontSets.ts","../src/schema/flierDocSchema.ts","../src/schema/validate.ts","../src/schema/validateFlierDoc.ts","../src/layout/blockGroups.ts","../src/layout/layoutSpecs.ts","../src/layout/geometry.ts","../src/layout/textFlow.ts","../src/render/render.ts","../src/exportPng.ts","../src/layoutCatalogue.ts","../src/examples/kizombaWorkshop.ts"],"names":["BackgroundStyle","FontSetId","FormatId","LayoutId","PaletteId","PictureAnchor","text","bottom","r","split","top"],"mappings":"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","file":"index.mjs","sourcesContent":["export enum BackgroundStyle {\n Solid = 'solid',\n Tint = 'tint',\n}\n","export enum FontSetId {\n Classic = 'classic',\n Modern = 'modern',\n Elegant = 'elegant',\n}\n","export enum FormatId {\n Story = 'story',\n Post = 'post',\n Square = 'square',\n Phone = 'phone',\n Desktop = 'desktop',\n}\n","export enum LayoutId {\n PictureRight = 'picture-right',\n PictureLeft = 'picture-left',\n PictureBottom = 'picture-bottom',\n List = 'list',\n Arch = 'arch',\n PhoneClockSafe = 'phone-clock-safe',\n PhoneArch = 'phone-arch',\n DesktopSafe = 'desktop-safe',\n DesktopArch = 'desktop-arch',\n}\n","export enum PaletteId {\n Sand = 'sand',\n Night = 'night',\n Sea = 'sea',\n Rose = 'rose',\n}\n","export enum PictureAnchor {\n Top = 'top',\n Center = 'center',\n Bottom = 'bottom',\n}\n","import { FormatId } from './enums/FormatId';\n\nexport interface FormatSize {\n width: number;\n height: number;\n}\n\nexport const FORMAT_SIZES: Readonly<Record<FormatId, FormatSize>> = {\n [FormatId.Story]: { width: 1080, height: 1920 },\n [FormatId.Post]: { width: 1080, height: 1350 },\n [FormatId.Square]: { width: 1080, height: 1080 },\n [FormatId.Phone]: { width: 1170, height: 2532 },\n [FormatId.Desktop]: { width: 2560, height: 1440 },\n};\n","import { PaletteId } from './enums/PaletteId';\nimport type { Palette } from './types';\n\nexport const PALETTES: Readonly<Record<PaletteId, Palette>> = {\n [PaletteId.Sand]: { background: '#f5f4f2', tint: '#ece8e3', title: '#958a80', accent: '#e9b47f', ink: '#5f564f', soft: '#b3a89e', card: '#ffffff', arch: '#ede8e2' },\n [PaletteId.Night]: { background: '#1c1a17', tint: '#25221e', title: '#e8dccb', accent: '#e9b47f', ink: '#f4efe8', soft: '#9c9284', card: '#2c2824', arch: '#25221f' },\n [PaletteId.Sea]: { background: '#eef4f3', tint: '#e1ecea', title: '#4f7d7a', accent: '#e07a5f', ink: '#2f3e46', soft: '#8aa3a1', card: '#ffffff', arch: '#e4ecea' },\n [PaletteId.Rose]: { background: '#f8efec', tint: '#f1e2dd', title: '#9b6b63', accent: '#c9846f', ink: '#4a3934', soft: '#b39a92', card: '#ffffff', arch: '#f1e5e1' },\n};\n","import { FontSetId } from './enums/FontSetId';\nimport type { FontSet } from './types';\n\nexport const FONT_SETS: Readonly<Record<FontSetId, FontSet>> = {\n [FontSetId.Classic]: { display: '\"Oswald\", \"Arial Narrow\", sans-serif', script: '\"Sacramento\", cursive', body: '\"Fredoka\", sans-serif' },\n [FontSetId.Modern]: { display: '\"Bebas Neue\", \"Arial Narrow\", sans-serif', script: '\"Great Vibes\", cursive', body: '\"Montserrat\", sans-serif' },\n [FontSetId.Elegant]: { display: '\"Playfair Display\", serif', script: '\"Allura\", cursive', body: '\"Lato\", sans-serif' },\n};\n","import { BackgroundStyle } from '../enums/BackgroundStyle';\nimport { FontSetId } from '../enums/FontSetId';\nimport { FormatId } from '../enums/FormatId';\nimport { LayoutId } from '../enums/LayoutId';\nimport { PaletteId } from '../enums/PaletteId';\nimport { PictureAnchor } from '../enums/PictureAnchor';\nimport type { JsonSchema } from './jsonSchemaTypes';\n\nconst SHORT = 60;\nconst LINE = 120;\nconst MAX_ROWS = 6;\nconst MAX_ITEMS = 8;\nconst MAX_PRICES = 4;\nconst MAX_VENUE = 3;\nconst MIN_SCALE = 0.3;\n\nconst text = (maxLength: number): JsonSchema => ({ type: 'string', minLength: 1, maxLength });\n\nconst scheduleRow: JsonSchema = {\n type: 'object',\n required: ['label', 'time'],\n additionalProperties: false,\n properties: { label: text(SHORT), time: text(SHORT) },\n};\n\nconst scheduleList: JsonSchema = { type: 'array', items: scheduleRow, minItems: 1, maxItems: MAX_ROWS };\n\nconst blocks: JsonSchema = {\n type: 'object',\n required: ['title'],\n additionalProperties: false,\n properties: {\n title: text(SHORT),\n titleBottom: text(SHORT),\n script: text(SHORT),\n venue: { type: 'array', items: text(SHORT), minItems: 1, maxItems: MAX_VENUE },\n schedule: scheduleList,\n prices: {\n type: 'array',\n minItems: 1,\n maxItems: MAX_PRICES,\n items: {\n type: 'object',\n required: ['amount', 'label'],\n additionalProperties: false,\n properties: { amount: text(SHORT), label: text(SHORT) },\n },\n },\n includes: {\n type: 'object',\n required: ['heading', 'items'],\n additionalProperties: false,\n properties: { heading: text(SHORT), items: { type: 'array', items: text(LINE), minItems: 1, maxItems: MAX_ROWS } },\n },\n footer: text(LINE),\n },\n};\n\nexport const flierDocSchema: JsonSchema = {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n $id: 'https://dloizides.com/schemas/flier-doc-v1.json',\n title: 'FlierDoc',\n description: 'One poster or wallpaper: format, layout, palette, fonts, picture slot and text blocks.',\n type: 'object',\n required: ['version', 'format', 'layout', 'palette', 'fonts', 'background', 'blocks'],\n additionalProperties: false,\n properties: {\n version: { const: 1 },\n format: { type: 'string', enum: Object.values(FormatId) },\n layout: { type: 'string', enum: Object.values(LayoutId) },\n palette: { type: 'string', enum: Object.values(PaletteId) },\n fonts: { type: 'string', enum: Object.values(FontSetId) },\n background: { type: 'string', enum: Object.values(BackgroundStyle) },\n picture: {\n type: 'object',\n required: ['imageId', 'anchor', 'scale'],\n additionalProperties: false,\n properties: {\n imageId: text(SHORT),\n anchor: { type: 'string', enum: Object.values(PictureAnchor) },\n scale: { type: 'number', minimum: MIN_SCALE, maximum: 1 },\n },\n },\n logo: { type: 'object', required: ['imageId'], additionalProperties: false, properties: { imageId: text(SHORT) } },\n blocks,\n items: {\n type: 'array',\n minItems: 1,\n maxItems: MAX_ITEMS,\n items: {\n type: 'object',\n required: ['date', 'schedule'],\n additionalProperties: false,\n properties: { date: text(SHORT), schedule: scheduleList, price: text(SHORT) },\n },\n },\n },\n};\n","import type { JsonSchema } from './jsonSchemaTypes';\n\nexport const typeName = (v: unknown): string => {\n if (v === null) {\n return 'null';\n }\n return Array.isArray(v) ? 'array' : typeof v;\n};\n\nconst join = (path: string, key: string): string => (path === '' ? key : `${path}.${key}`);\nconst show = (v: unknown): string => JSON.stringify(v) ?? typeName(v);\n\nconst ARTICLE: Record<string, string> = { object: 'an object', array: 'an array', string: 'a string', number: 'a number', integer: 'an integer' };\n\nfunction matchesType(schema: JsonSchema, value: unknown): boolean {\n switch (schema.type) {\n case undefined:\n return true;\n case 'integer':\n return Number.isInteger(value);\n case 'number':\n return typeof value === 'number' && Number.isFinite(value);\n default:\n return typeName(value) === schema.type;\n }\n}\n\nfunction checkString(schema: JsonSchema, value: string, path: string, errors: string[]): void {\n if (schema.minLength !== undefined && value.trim().length < schema.minLength) {\n errors.push(`${path}: must not be empty`);\n }\n if (schema.maxLength !== undefined && value.length > schema.maxLength) {\n errors.push(`${path}: must be at most ${schema.maxLength} characters (got ${value.length})`);\n }\n}\n\nfunction checkNumber(schema: JsonSchema, value: number, path: string, errors: string[]): void {\n if (schema.minimum !== undefined && value < schema.minimum) {\n errors.push(`${path}: must be at least ${schema.minimum} (got ${value})`);\n }\n if (schema.maximum !== undefined && value > schema.maximum) {\n errors.push(`${path}: must be at most ${schema.maximum} (got ${value})`);\n }\n}\n\nfunction checkArray(schema: JsonSchema, value: unknown[], path: string, errors: string[]): void {\n if (schema.minItems !== undefined && value.length < schema.minItems) {\n errors.push(`${path}: must have at least ${schema.minItems} entries (got ${value.length})`);\n }\n if (schema.maxItems !== undefined && value.length > schema.maxItems) {\n errors.push(`${path}: must have at most ${schema.maxItems} entries (got ${value.length})`);\n return;\n }\n const itemSchema = schema.items;\n if (itemSchema) {\n value.forEach((item, i) => validateAgainst(itemSchema, item, `${path}[${i}]`, errors));\n }\n}\n\nfunction checkObject(schema: JsonSchema, value: Record<string, unknown>, path: string, errors: string[]): void {\n const props = schema.properties ?? {};\n for (const key of schema.required ?? []) {\n if (value[key] === undefined) {\n errors.push(`${join(path, key)}: is required`);\n }\n }\n for (const [key, child] of Object.entries(value)) {\n const childSchema = props[key];\n if (childSchema === undefined) {\n if (schema.additionalProperties === false) {\n errors.push(`${join(path, key)}: is not allowed`);\n }\n } else if (child !== undefined) {\n validateAgainst(childSchema, child, join(path, key), errors);\n }\n }\n}\n\nexport function validateAgainst(schema: JsonSchema, value: unknown, path: string, errors: string[]): void {\n if (schema.const !== undefined) {\n if (value !== schema.const) {\n errors.push(`${path}: must be ${schema.const} (got ${show(value)})`);\n }\n return;\n }\n if (!matchesType(schema, value)) {\n errors.push(`${path}: must be ${ARTICLE[schema.type ?? 'object']} (got ${typeName(value)})`);\n return;\n }\n if (schema.enum && !schema.enum.includes(value as string)) {\n errors.push(`${path}: must be one of ${schema.enum.join(', ')} (got ${show(value)})`);\n return;\n }\n if (typeof value === 'string') {\n checkString(schema, value, path, errors);\n } else if (typeof value === 'number') {\n checkNumber(schema, value, path, errors);\n } else if (Array.isArray(value)) {\n checkArray(schema, value, path, errors);\n } else if (typeName(value) === 'object') {\n checkObject(schema, value as Record<string, unknown>, path, errors);\n }\n}\n","import { LayoutId } from '../enums/LayoutId';\nimport type { FlierDoc, PosterAssets } from '../types';\nimport { flierDocSchema } from './flierDocSchema';\nimport { typeName, validateAgainst } from './validate';\n\nexport type FlierDocResult = { ok: true; doc: FlierDoc } | { ok: false; errors: string[] };\n\nexport class FlierDocError extends Error {\n public readonly errors: string[];\n\n public constructor(errors: string[]) {\n super(`Invalid flier: ${errors.join('; ')}`);\n this.name = 'FlierDocError';\n this.errors = errors;\n }\n}\n\n/** Checks any input (form, preset file, LLM output) against the FlierDoc schema; errors read \"path: problem\". */\nexport function validateFlierDoc(input: unknown): FlierDocResult {\n if (typeName(input) !== 'object') {\n return { ok: false, errors: ['doc: must be an object'] };\n }\n const errors: string[] = [];\n validateAgainst(flierDocSchema, input, '', errors);\n const doc = input as FlierDoc;\n if (doc.layout === LayoutId.List && (doc.items === undefined || doc.items.length === 0)) {\n errors.push('items: layout \"list\" needs at least one item');\n }\n return errors.length === 0 ? { ok: true, doc } : { ok: false, errors };\n}\n\nexport function missingAssets(doc: FlierDoc, assets: PosterAssets): string[] {\n const errors: string[] = [];\n if (doc.picture && assets[doc.picture.imageId] === undefined) {\n errors.push(`picture.imageId: no asset named \"${doc.picture.imageId}\"`);\n }\n if (doc.logo && assets[doc.logo.imageId] === undefined) {\n errors.push(`logo.imageId: no asset named \"${doc.logo.imageId}\"`);\n }\n return errors;\n}\n","import { LayoutId } from '../enums/LayoutId';\nimport type { FlierDoc, ListItem, Palette } from '../types';\nimport type { FlowGroup, FlowLine } from './textFlow';\n\nconst BOLD = 700;\nconst SEMI = 600;\nconst MEDIUM = 500;\nconst SCRIPT = 400;\n\ntype Line = (text: string, size: number) => FlowLine;\n\nconst makers = (p: Palette, u: number): Record<string, Line> => ({\n display: (text, size) => ({ text, role: 'display', weight: BOLD, size: size * u, color: p.title }),\n venue: (text, size) => ({ text, role: 'display', weight: MEDIUM, size: size * u, color: p.ink }),\n script: (text, size) => ({ text, role: 'script', weight: SCRIPT, size: size * u, color: p.accent }),\n strong: (text, size) => ({ text, role: 'body', weight: BOLD, size: size * u, color: p.ink }),\n accent: (text, size) => ({ text, role: 'body', weight: SEMI, size: size * u, color: p.accent }),\n item: (text, size) => ({ text, role: 'body', weight: SEMI, size: size * u, color: p.ink, bullet: p.accent }),\n soft: (text, size) => ({ text, role: 'body', weight: MEDIUM, size: size * u, color: p.soft }),\n});\n\nexport function headerGroups(doc: FlierDoc, p: Palette, u: number): FlowGroup[] {\n const l = makers(p, u);\n const b = doc.blocks;\n const lines = [l.display?.(b.title, 250), b.script ? l.script?.(b.script, 120) : undefined, b.titleBottom ? l.display?.(b.titleBottom, 250) : undefined];\n return [{ lines: lines.filter((x): x is FlowLine => x !== undefined), gapAfter: 0 }];\n}\n\nfunction itemGroup(item: ListItem, l: Record<string, Line>, u: number): FlowGroup {\n const lines: FlowLine[] = [l.script?.(item.date, 96) as FlowLine];\n item.schedule.forEach((row) => lines.push(l.strong?.(`${row.label} ${row.time}`, 42) as FlowLine));\n if (item.price) {\n lines.push(l.accent?.(item.price, 42) as FlowLine);\n }\n return { lines, gapAfter: 26 * u };\n}\n\nfunction eventGroups(doc: FlierDoc, l: Record<string, Line>, u: number, withPrices: boolean): FlowGroup[] {\n const b = doc.blocks;\n const groups: FlowGroup[] = [];\n b.schedule?.forEach((row) => groups.push({ lines: [l.strong?.(row.label, 66) as FlowLine, l.accent?.(row.time, 60) as FlowLine], gapAfter: 30 * u }));\n (withPrices ? b.prices : undefined)?.forEach((row) => groups.push({ lines: [l.strong?.(row.amount, 66) as FlowLine, l.accent?.(row.label, 52) as FlowLine], gapAfter: 30 * u }));\n return groups;\n}\n\nfunction listGroups(doc: FlierDoc, l: Record<string, Line>, u: number): FlowGroup[] {\n const groups = (doc.items ?? []).map((item) => itemGroup(item, l, u));\n const prices = doc.blocks.prices?.map((row) => l.strong?.(`${row.amount} ${row.label}`, 58) as FlowLine) ?? [];\n if (prices.length > 0) {\n groups.push({ lines: prices, gapAfter: 30 * u });\n }\n return groups;\n}\n\n/** Price groups set large for the flank zones beside an arch. */\nexport function flankPriceGroups(doc: FlierDoc, p: Palette, u: number): FlowGroup[] {\n const l = makers(p, u);\n return (doc.blocks.prices ?? []).map((row) => ({ lines: [l.strong?.(row.amount, 110) as FlowLine, l.accent?.(row.label, 48) as FlowLine], gapAfter: 30 * u }));\n}\n\n/** Turns the doc's body blocks into flow groups: venue, schedule or list items, prices, includes card, footer. */\nexport function bodyGroups(doc: FlierDoc, p: Palette, u: number, withPrices = true): FlowGroup[] {\n const l = makers(p, u);\n const b = doc.blocks;\n const groups: FlowGroup[] = [];\n const isList = doc.layout === LayoutId.List;\n if (b.venue) {\n groups.push({ lines: b.venue.map((v) => l.venue?.(v, isList ? 48 : 58) as FlowLine), gapAfter: 40 * u, rule: { color: p.accent, height: 8 * u } });\n }\n groups.push(...(isList ? listGroups(doc, l, u) : eventGroups(doc, l, u, withPrices)));\n if (b.includes) {\n const lines = [l.accent?.(b.includes.heading, 38) as FlowLine, ...b.includes.items.map((i) => l.item?.(i, 38) as FlowLine)];\n groups.push({ lines, gapAfter: 24 * u, card: { color: p.card, pad: 28 * u }, uniform: true });\n }\n if (b.footer) {\n groups.push({ lines: [l.soft?.(b.footer, 34) as FlowLine], gapAfter: 0 });\n }\n return groups;\n}\n","import { LayoutId } from '../enums/LayoutId';\nimport type { Rect } from '../types';\n\ntype Frac = [number, number, number, number];\n\nexport interface LayoutSpec {\n header: Frac;\n body: Frac;\n picture: Frac;\n alignX: number;\n flanks?: [Frac, Frac];\n logo?: Frac;\n arch?: number;\n}\n\ninterface OrientedSpec {\n portrait: LayoutSpec;\n landscape: LayoutSpec;\n}\n\nconst flanksBeside = (pic: Frac, top: number, bottom: number, m: number): [Frac, Frac] => [\n [m, top, pic[0] - 2 * m, bottom - top],\n [pic[0] + pic[2] + m, top, 1 - pic[0] - pic[2] - 2 * m, bottom - top],\n];\n\nconst ARCH_PIC: Frac = [0.22, 0.42, 0.56, 0.58];\nconst PHONE_ARCH_PIC: Frac = [0.2, 0.6, 0.6, 0.4];\nconst DESK_ARCH_PIC: Frac = [0.355, 0.07, 0.32, 0.93];\n\nconst ARCH_LANDSCAPE: LayoutSpec = {\n header: [0.04, 0.06, 0.3, 0.5],\n body: [0.04, 0.58, 0.3, 0.36],\n picture: [0.36, 0.08, 0.3, 0.92],\n alignX: 0.5,\n flanks: [[0.68, 0.08, 0.28, 0.42], [0.68, 0.52, 0.28, 0.42]],\n arch: 0.06,\n};\n\nexport const LAYOUT_SPECS: Partial<Record<LayoutId, OrientedSpec>> = {\n [LayoutId.Arch]: {\n portrait: { header: [0.045, 0.025, 0.91, 0.18], body: [0.045, 0.215, 0.91, 0.19], picture: ARCH_PIC, alignX: 0.5, flanks: flanksBeside(ARCH_PIC, 0.44, 0.97, 0.03), arch: 0.04 },\n landscape: ARCH_LANDSCAPE,\n },\n [LayoutId.PhoneClockSafe]: {\n portrait: { header: [0.045, 0.28, 0.91, 0.2], body: [0.045, 0.5, 0.42, 0.44], picture: [0.48, 0.5, 0.52, 0.5], alignX: 1 },\n landscape: { header: [0.04, 0.2, 0.52, 0.3], body: [0.04, 0.52, 0.52, 0.42], picture: [0.6, 0.12, 0.4, 0.88], alignX: 1 },\n },\n [LayoutId.PhoneArch]: {\n portrait: { header: [0.045, 0.3, 0.91, 0.13], body: [0.045, 0.44, 0.91, 0.14], picture: PHONE_ARCH_PIC, alignX: 0.5, flanks: flanksBeside(PHONE_ARCH_PIC, 0.63, 0.94, 0.03), arch: 0.08 },\n landscape: { ...ARCH_LANDSCAPE, header: [0.04, 0.16, 0.3, 0.42], picture: [0.36, 0.16, 0.3, 0.84] },\n },\n [LayoutId.DesktopSafe]: {\n portrait: { header: [0.08, 0.06, 0.84, 0.24], body: [0.08, 0.31, 0.46, 0.58], picture: [0.56, 0.36, 0.44, 0.64], alignX: 1 },\n landscape: { header: [0.0625, 0.05, 0.58, 0.44], body: [0.0625, 0.5, 0.58, 0.38], picture: [0.67, 0.0972, 0.29, 0.9028], alignX: 1 },\n },\n [LayoutId.DesktopArch]: {\n portrait: { header: [0.08, 0.06, 0.84, 0.2], body: [0.08, 0.27, 0.84, 0.2], picture: [0.14, 0.48, 0.72, 0.52], alignX: 0.5, arch: 0.05 },\n landscape: { header: [0.07, 0.3, 0.26, 0.45], body: [0.7, 0.25, 0.27, 0.65], picture: DESK_ARCH_PIC, alignX: 0.5, logo: [0.88, 0.04, 0.09, 0.14], arch: 0.05 },\n },\n};\n\nconst r = Math.round;\n\nexport const toRect = (f: Frac, w: number, h: number): Rect => {\n const x = r(f[0] * w);\n const y = r(f[1] * h);\n return { x, y, w: r((f[0] + f[2]) * w) - x, h: r((f[1] + f[3]) * h) - y };\n};\n","import { LayoutId } from '../enums/LayoutId';\r\nimport { PictureAnchor } from '../enums/PictureAnchor';\r\nimport type { PosterImage, Rect } from '../types';\r\nimport { LAYOUT_SPECS, toRect } from './layoutSpecs';\r\n\r\nexport interface LayoutGeometry {\r\n header: Rect;\r\n body: Rect;\r\n picture: Rect;\r\n alignX: number;\r\n flanks?: Rect[];\r\n logo?: Rect;\r\n arch?: number;\r\n}\r\n\r\nconst MARGIN = 0.045;\r\nconst HEADER_PORTRAIT = 0.3;\r\nconst HEADER_LANDSCAPE = 0.36;\r\nconst BOTTOM_HEADER = 0.2;\r\nconst BOTTOM_PICTURE = 0.52;\r\nconst PICTURE_SIDE: Record<string, [number, number]> = {\r\n [LayoutId.PictureRight]: [0.6, 0.42],\r\n [LayoutId.PictureLeft]: [0.6, 0.42],\r\n [LayoutId.List]: [0.5, 0.36],\r\n};\r\nconst ANCHOR_Y: Record<PictureAnchor, number> = { [PictureAnchor.Top]: 0, [PictureAnchor.Center]: 0.5, [PictureAnchor.Bottom]: 1 };\r\n\r\nconst r = Math.round;\r\n\r\nfunction side(w: number, h: number, fraction: [number, number]): LayoutGeometry {\r\n const m = r(Math.min(w, h) * MARGIN);\r\n if (h >= w) {\r\n const split = r(w * (1 - fraction[0]));\r\n const top = r(h * HEADER_PORTRAIT);\r\n return {\r\n header: { x: m, y: m, w: w - 2 * m, h: top - 2 * m },\r\n picture: { x: split, y: top, w: w - split, h: h - top },\r\n body: { x: m, y: top, w: split - 2 * m, h: h - top - m },\r\n alignX: 1,\r\n };\r\n }\r\n const split = r(w * (1 - fraction[1]));\r\n const top = r(h * HEADER_LANDSCAPE);\r\n return {\r\n header: { x: m, y: m, w: split - 2 * m, h: top - m },\r\n picture: { x: split, y: 0, w: w - split, h },\r\n body: { x: m, y: top + r(m / 2), w: split - 2 * m, h: h - top - r(m / 2) - m },\r\n alignX: 1,\r\n };\r\n}\r\n\r\nfunction bottom(w: number, h: number): LayoutGeometry {\r\n const m = r(Math.min(w, h) * MARGIN);\r\n const top = r(h * BOTTOM_HEADER);\r\n const pic = r(h * BOTTOM_PICTURE);\r\n return {\r\n header: { x: m, y: m, w: w - 2 * m, h: top - 2 * m },\r\n body: { x: m, y: top, w: w - 2 * m, h: pic - top - m },\r\n picture: { x: 0, y: pic, w, h: h - pic },\r\n alignX: 0.5,\r\n };\r\n}\r\n\r\nfunction fromSpec(spec: NonNullable<(typeof LAYOUT_SPECS)[LayoutId]>['portrait'], w: number, h: number): LayoutGeometry {\r\n return {\r\n header: toRect(spec.header, w, h),\r\n body: toRect(spec.body, w, h),\r\n picture: toRect(spec.picture, w, h),\r\n alignX: spec.alignX,\r\n flanks: spec.flanks?.map((f) => toRect(f, w, h)),\r\n logo: spec.logo ? toRect(spec.logo, w, h) : undefined,\r\n arch: spec.arch,\r\n };\r\n}\r\n\r\nconst mirror = (rect: Rect, w: number): Rect => ({ ...rect, x: w - rect.x - rect.w });\r\n\r\n/** Splits the canvas into header, body and picture regions that never overlap. */\r\nexport function geometry(layout: LayoutId, w: number, h: number): LayoutGeometry {\r\n const oriented = LAYOUT_SPECS[layout];\r\n if (oriented) {\r\n return fromSpec(h >= w ? oriented.portrait : oriented.landscape, w, h);\r\n }\r\n if (layout === LayoutId.PictureBottom) {\r\n return bottom(w, h);\r\n }\r\n const g = side(w, h, PICTURE_SIDE[layout] ?? [0.6, 0.42]);\r\n if (layout !== LayoutId.PictureLeft) {\r\n return g;\r\n }\r\n return { header: mirror(g.header, w), body: mirror(g.body, w), picture: mirror(g.picture, w), alignX: 1 - g.alignX };\r\n}\r\n\r\n/** Fits the whole image inside the region (contain), scaled and anchored; never crops it. */\r\nexport function placeContain(image: PosterImage, region: Rect, anchor: PictureAnchor, alignX: number, scale: number): Rect {\r\n const s = Math.min(region.w / image.width, region.h / image.height) * scale;\r\n const w = Math.floor(image.width * s);\r\n const h = Math.floor(image.height * s);\r\n return {\r\n x: region.x + Math.floor((region.w - w) * alignX),\r\n y: region.y + Math.floor((region.h - h) * ANCHOR_Y[anchor]),\r\n w,\r\n h,\r\n };\r\n}\r\n","import type { FontSet, PosterContext, Rect } from '../types';\n\nexport interface FlowLine {\n text: string;\n role: keyof FontSet;\n weight: number;\n size: number;\n color: string;\n bullet?: string;\n}\n\nexport interface FlowGroup {\n lines: FlowLine[];\n gapAfter: number;\n card?: { color: string; pad: number };\n rule?: { color: string; height: number };\n uniform?: boolean;\n}\n\nexport interface FlowZone extends Rect {\n right?: boolean;\n}\n\nexport interface TextOp {\n text: string;\n font: string;\n color: string;\n box: Rect;\n}\n\nexport interface FlowResult {\n texts: TextOp[];\n cards: { rect: Rect; color: string }[];\n rules: { rect: Rect; color: string }[];\n bullets: { x: number; y: number; r: number; color: string }[];\n}\n\ninterface Measured {\n group: FlowGroup;\n widths: number[];\n}\n\nconst LINE_HEIGHT = 1.2;\nconst BULLET_INDENT = 1.1;\nconst BULLET_RADIUS = 0.2;\nconst RULE_GAP = 2.5;\nconst RULE_WIDTH = 0.9;\nconst WIDE = 1.6;\nconst MIN_K = 0.02;\nconst STEPS = 22;\n\nexport const fontOf = (line: FlowLine, size: number, fonts: FontSet): string => `${line.weight} ${size}px ${fonts[line.role]}`;\n\nexport const emptyFlow = (): FlowResult => ({ texts: [], cards: [], rules: [], bullets: [] });\n\nfunction lineSize(line: FlowLine, width: number, k: number, avail: number): number {\n const indent = line.bullet ? line.size * k * BULLET_INDENT : 0;\n return Math.max(0, Math.min(line.size * k, (line.size * (avail - indent)) / Math.max(width, 1)));\n}\n\nfunction groupRatio(m: Measured, k: number, avail: number): number | null {\n if (!m.group.uniform) {\n return null;\n }\n return Math.min(...m.group.lines.map((line, i) => lineSize(line, m.widths[i] ?? 1, k, avail) / line.size));\n}\n\nfunction placeGroup(m: Measured, k: number, col: FlowZone, y0: number, out: FlowResult | null): number {\n const { group } = m;\n let y = y0;\n if (group.rule) {\n out?.rules.push({ rect: { x: col.x, y, w: col.w * RULE_WIDTH, h: group.rule.height * k }, color: group.rule.color });\n y += group.rule.height * k * RULE_GAP;\n }\n const pad = group.card ? group.card.pad * k : 0;\n const top = y;\n y += pad;\n const ratio = groupRatio(m, k, col.w - 2 * pad);\n group.lines.forEach((line, i) => {\n const size = ratio === null ? lineSize(line, m.widths[i] ?? 1, k, col.w - 2 * pad) : line.size * ratio;\n const indent = line.bullet ? line.size * k * BULLET_INDENT : 0;\n const w = ((m.widths[i] ?? 0) * size) / line.size;\n const x = col.right ? col.x + col.w - pad - w : col.x + pad + indent;\n out?.texts.push({ text: line.text, font: '', color: line.color, box: { x, y, w, h: size * LINE_HEIGHT } });\n if (line.bullet && out) {\n out.bullets.push({ x: col.x + pad + size * BULLET_RADIUS, y: y + (size * LINE_HEIGHT) / 2, r: size * BULLET_RADIUS, color: line.bullet });\n }\n y += size * LINE_HEIGHT;\n });\n y += pad;\n if (group.card) {\n out?.cards.unshift({ rect: { x: col.x, y: top, w: col.w, h: y - top }, color: group.card.color });\n }\n return y + group.gapAfter * k - y0;\n}\n\nfunction placeColumn(groups: Measured[], k: number, col: FlowZone, out: FlowResult | null): number {\n let h = 0;\n for (const g of groups) {\n h += placeGroup(g, k, col, col.y + h, out);\n }\n return h;\n}\n\nfunction splitColumns(groups: Measured[], zone: FlowZone): { col: FlowZone; groups: Measured[] }[] {\n if (zone.w / Math.max(zone.h, 1) <= WIDE || groups.length < 2) {\n return [{ col: zone, groups }];\n }\n const heights = groups.map((g) => placeGroup(g, 1, zone, 0, null));\n const half = heights.reduce((a, b) => a + b, 0) / 2;\n let acc = 0;\n let cut = 1;\n heights.forEach((h, i) => {\n if (acc < half) {\n cut = i + 1;\n }\n acc += h;\n });\n cut = Math.min(cut, groups.length - 1);\n const gap = Math.round(zone.w * 0.04);\n const w = (zone.w - gap) / 2;\n return [\n { col: { ...zone, w }, groups: groups.slice(0, cut) },\n { col: { ...zone, x: zone.x + w + gap, w }, groups: groups.slice(cut) },\n ];\n}\n\n/** Lays groups out in the zone, shrinking every size by one factor until all text fits; never overflows. */\nexport function flow(ctx: PosterContext, groups: FlowGroup[], zone: FlowZone, fonts: FontSet): FlowResult {\n const measured = groups.map((group) => ({\n group,\n widths: group.lines.map((line) => {\n ctx.font = fontOf(line, line.size, fonts);\n return ctx.measureText(line.text).width;\n }),\n }));\n const columns = splitColumns(measured, zone);\n const fits = (k: number): boolean => columns.every((c) => placeColumn(c.groups, k, c.col, null) <= zone.h);\n let lo = MIN_K;\n let hi = 1;\n if (fits(1)) {\n lo = 1;\n }\n for (let i = 0; i < STEPS && lo < hi; i++) {\n const mid = (lo + hi) / 2;\n if (fits(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n const out = emptyFlow();\n columns.forEach((c) => placeColumn(c.groups, lo, c.col, out));\n const lines = groups.flatMap((g) => g.lines);\n out.texts.forEach((t, i) => {\n const line = lines[i];\n t.font = line ? fontOf(line, t.box.h / LINE_HEIGHT, fonts) : t.font;\n });\n return out;\n}\n","import { BackgroundStyle } from '../enums/BackgroundStyle';\nimport { PictureAnchor } from '../enums/PictureAnchor';\nimport { FONT_SETS } from '../fontSets';\nimport { FORMAT_SIZES } from '../formats';\nimport { bodyGroups, flankPriceGroups, headerGroups } from '../layout/blockGroups';\nimport { geometry, placeContain, type LayoutGeometry } from '../layout/geometry';\nimport { emptyFlow, flow, type FlowGroup, type FlowResult } from '../layout/textFlow';\nimport { PALETTES } from '../palettes';\nimport { FlierDocError, missingAssets, validateFlierDoc } from '../schema/validateFlierDoc';\nimport type { FlierDoc, FontSet, PosterAssets, PosterCanvas, PosterContext, Rect, RenderReport } from '../types';\n\nconst BASE = 1080;\nconst LOGO_SHARE = 0.26;\nconst CARD_RADIUS = 0.035;\nconst CAP_TOP = 0.15;\n\nfunction roundRect(ctx: PosterContext, r: Rect, radius: number): void {\n const rad = Math.min(radius, r.w / 2, r.h / 2);\n ctx.beginPath();\n ctx.moveTo(r.x + rad, r.y);\n ctx.arcTo(r.x + r.w, r.y, r.x + r.w, r.y + r.h, rad);\n ctx.arcTo(r.x + r.w, r.y + r.h, r.x, r.y + r.h, rad);\n ctx.arcTo(r.x, r.y + r.h, r.x, r.y, rad);\n ctx.arcTo(r.x, r.y, r.x + r.w, r.y, rad);\n ctx.closePath();\n ctx.fill();\n}\n\nfunction drawFlow(ctx: PosterContext, f: FlowResult, radius: number): void {\n f.rules.forEach((r) => {\n ctx.fillStyle = r.color;\n ctx.fillRect(r.rect.x, r.rect.y, r.rect.w, r.rect.h);\n });\n f.cards.forEach((c) => {\n ctx.fillStyle = c.color;\n roundRect(ctx, c.rect, radius);\n });\n f.bullets.forEach((b) => {\n ctx.fillStyle = b.color;\n ctx.beginPath();\n ctx.arc(b.x, b.y, b.r, 0, Math.PI * 2);\n ctx.fill();\n });\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n f.texts.forEach((t) => {\n ctx.font = t.font;\n ctx.fillStyle = t.color;\n ctx.fillText(t.text, t.box.x, t.box.y);\n });\n}\n\nfunction checked(input: unknown, assets: PosterAssets): FlierDoc {\n const result = validateFlierDoc(input);\n if (!result.ok) {\n throw new FlierDocError(result.errors);\n }\n const missing = missingAssets(result.doc, assets);\n if (missing.length > 0) {\n throw new FlierDocError(missing);\n }\n return result.doc;\n}\n\nfunction archRect(geo: LayoutGeometry): Rect | null {\n if (geo.arch === undefined) {\n return null;\n }\n const top = geo.picture.y + Math.round(geo.picture.h * geo.arch);\n return { x: geo.picture.x, y: top, w: geo.picture.w, h: geo.picture.y + geo.picture.h - top };\n}\n\nfunction drawArch(ctx: PosterContext, r: Rect, color: string): void {\n const rad = r.w / 2;\n ctx.fillStyle = color;\n ctx.fillRect(r.x, r.y + rad, r.w, r.h - rad);\n ctx.beginPath();\n ctx.arc(r.x + rad, r.y + rad, rad, Math.PI, Math.PI * 2);\n ctx.fill();\n}\n\nfunction flankFlows(ctx: PosterContext, groups: FlowGroup[], flanks: Rect[], fonts: FontSet): FlowResult[] {\n const half = Math.ceil(groups.length / 2);\n return flanks.map((zone, i) => (i === 0 ? flow(ctx, groups.slice(0, half), zone, fonts) : flow(ctx, groups.slice(half), { ...zone, right: true }, fonts)));\n}\n\nfunction capAligned(zone: Rect, head: FlowResult): Rect {\n const first = head.texts[0]?.box;\n const shift = first ? Math.min(Math.max(0, Math.round(first.y + first.h * CAP_TOP) - zone.y), Math.round(zone.h / 2)) : 0;\n return { ...zone, y: zone.y + shift, h: zone.h - shift };\n}\n\nfunction splitHeader(header: Rect, hasLogo: boolean): { text: Rect; logo: Rect } {\n const logoW = hasLogo ? Math.round(header.w * LOGO_SHARE) : 0;\n return { text: { ...header, w: header.w - logoW * 1.1 }, logo: { ...header, x: header.x + header.w - logoW, w: logoW } };\n}\n\n/** Validates the doc, then draws it on the canvas (resized to the format); throws FlierDocError before touching the canvas. */\nexport function render(input: unknown, assets: PosterAssets, canvas: PosterCanvas): RenderReport {\n const doc = checked(input, assets);\n const { width, height } = FORMAT_SIZES[doc.format];\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('poster-render: the canvas has no 2d context');\n }\n const palette = PALETTES[doc.palette];\n const fonts = FONT_SETS[doc.fonts];\n const geo = geometry(doc.layout, width, height);\n const u = Math.min(width, height) / BASE;\n ctx.globalAlpha = 1;\n ctx.fillStyle = palette.background;\n ctx.fillRect(0, 0, width, height);\n if (doc.background === BackgroundStyle.Tint) {\n ctx.fillStyle = palette.tint;\n [geo.header, geo.body].forEach((r) => ctx.fillRect(r.x, r.y, r.w, r.h));\n }\n const zones = geo.logo ? { text: geo.header, logo: geo.logo } : splitHeader(geo.header, doc.logo !== undefined);\n const head = flow(ctx, headerGroups(doc, palette, u), zones.text, fonts);\n const flanks = geo.flanks ?? [];\n const body = flow(ctx, bodyGroups(doc, palette, u, flanks.length === 0), geo.body, fonts);\n const sides = flanks.length > 0 ? flankFlows(ctx, flankPriceGroups(doc, palette, u), flanks, fonts) : [emptyFlow()];\n const radius = Math.min(width, height) * CARD_RADIUS;\n [head, body, ...sides].forEach((f) => drawFlow(ctx, f, radius));\n const logoImage = doc.logo ? assets[doc.logo.imageId] : undefined;\n if (logoImage) {\n const r = placeContain(logoImage, capAligned(zones.logo, head), PictureAnchor.Top, 1, 1);\n ctx.drawImage(logoImage, r.x, r.y, r.w, r.h);\n }\n const image = doc.picture ? assets[doc.picture.imageId] : undefined;\n const backdrop = image ? archRect(geo) : null;\n if (backdrop) {\n drawArch(ctx, backdrop, palette.arch);\n }\n const picture = image && doc.picture ? placeContain(image, geo.picture, doc.picture.anchor, geo.alignX, doc.picture.scale) : null;\n if (image && picture) {\n ctx.drawImage(image, picture.x, picture.y, picture.w, picture.h);\n }\n return {\n width,\n height,\n picture,\n pictureRegion: geo.picture,\n textBoxes: [head, body, ...sides].flatMap((f) => f.texts.map((t) => t.box)),\n cardBoxes: body.cards.map((c) => c.rect),\n backdrop,\n };\n}\n","export interface DataUrlCanvas {\n toDataURL(type: string): string;\n}\n\nconst PREFIX = 'data:image/png;base64,';\n\n/** Encodes the canvas as a PNG Blob of the canvas's exact pixel size. */\nexport function exportPng(canvas: DataUrlCanvas): Blob {\n const url = canvas.toDataURL('image/png');\n if (!url.startsWith(PREFIX)) {\n throw new Error('poster-render: the canvas did not return a PNG data URL');\n }\n const binary = atob(url.slice(PREFIX.length));\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return new Blob([bytes], { type: 'image/png' });\n}\n","import { FormatId } from './enums/FormatId';\nimport { LayoutId } from './enums/LayoutId';\n\nexport interface LayoutCatalogueEntry {\n id: LayoutId;\n designId: string;\n label: string;\n description: string;\n formats: readonly FormatId[];\n}\n\nconst POSTERS = [FormatId.Story, FormatId.Post, FormatId.Square];\n\nexport const LAYOUT_CATALOGUE: readonly LayoutCatalogueEntry[] = [\n { id: LayoutId.PictureRight, designId: 'E-A', label: 'Picture right', description: 'Titles across the top, details on the left, the picture on the right standing on the bottom edge.', formats: POSTERS },\n { id: LayoutId.PictureLeft, designId: 'E-B', label: 'Picture left', description: 'Titles across the top, the picture on the left standing on the bottom edge, details on the right.', formats: POSTERS },\n { id: LayoutId.Arch, designId: 'E-C', label: 'Arch', description: 'Titles and details on top, the picture centred in a soft arch at the bottom, prices either side.', formats: POSTERS },\n { id: LayoutId.PictureBottom, designId: 'picture-bottom', label: 'Picture bottom', description: 'Titles and details on top, the picture across the bottom half.', formats: POSTERS },\n { id: LayoutId.List, designId: 'list', label: 'Upcoming list', description: 'Several dated events as a list beside the picture.', formats: POSTERS },\n { id: LayoutId.PhoneClockSafe, designId: 'P-A', label: 'Phone, clock clear', description: 'Lock-screen wallpaper: top kept clear for the clock, details on the left, picture on the right.', formats: [FormatId.Phone] },\n { id: LayoutId.PhoneArch, designId: 'P-B', label: 'Phone arch', description: 'Lock-screen wallpaper: top kept clear for the clock, details in the middle, the picture in an arch at the bottom.', formats: [FormatId.Phone] },\n { id: LayoutId.DesktopSafe, designId: 'D-A', label: 'Desktop, icons clear', description: 'Desktop wallpaper: text on the left clear of desktop icons and the taskbar, the picture on the right.', formats: [FormatId.Desktop] },\n { id: LayoutId.DesktopArch, designId: 'D-B', label: 'Desktop arch', description: 'Desktop wallpaper: titles left, the picture in a centred arch, details right.', formats: [FormatId.Desktop] },\n];\n\nconst DEFAULTS: Readonly<Record<FormatId, LayoutId>> = {\n [FormatId.Story]: LayoutId.PictureRight,\n [FormatId.Post]: LayoutId.PictureRight,\n [FormatId.Square]: LayoutId.PictureRight,\n [FormatId.Phone]: LayoutId.PhoneClockSafe,\n [FormatId.Desktop]: LayoutId.DesktopSafe,\n};\n\n/** The default layout for a format (D4: E-A for posters, P-A for phone, D-A for desktop). */\nexport function defaultLayoutFor(format: FormatId): LayoutId {\n return DEFAULTS[format];\n}\n","import { BackgroundStyle } from '../enums/BackgroundStyle';\nimport { FontSetId } from '../enums/FontSetId';\nimport { FormatId } from '../enums/FormatId';\nimport { LayoutId } from '../enums/LayoutId';\nimport { PaletteId } from '../enums/PaletteId';\nimport { PictureAnchor } from '../enums/PictureAnchor';\nimport type { FlierBlocks, FlierDoc, ScheduleRow } from '../types';\n\ninterface Workshop {\n script: string;\n date: string;\n first: string;\n second: string;\n party: string;\n}\n\nconst WORKSHOPS: Workshop[] = [\n { script: 'Saturday 31 October', date: 'Sat 31 Oct', first: '20:00 - 21:00', second: '21:00 - 22:00', party: '20€' },\n { script: 'Saturday 7 November', date: 'Sat 7 Nov', first: '20:00 - 21:00', second: '21:00 - 22:00', party: '15€' },\n { script: 'Sunday 29 November', date: 'Sun 29 Nov', first: '17:00 - 18:00', second: '18:00 - 19:00', party: '10€' },\n];\n\nconst INCLUDES = { heading: 'Party pass includes', items: ['Salsa & Bachata room', 'Kizomba dedicated room', '2 drinks'] };\n\nconst schedule = (w: Workshop): ScheduleRow[] => [\n { label: 'Level 1', time: w.first },\n { label: 'Level 2', time: w.second },\n];\n\nconst base = {\n version: 1 as const,\n format: FormatId.Story,\n palette: PaletteId.Sand,\n fonts: FontSetId.Classic,\n background: BackgroundStyle.Solid,\n picture: { imageId: 'dancers', anchor: PictureAnchor.Bottom, scale: 1 },\n logo: { imageId: 'logo' },\n};\n\nconst shared: Omit<FlierBlocks, 'title'> = {\n venue: ['Bailemos', 'Dance School'],\n includes: INCLUDES,\n footer: 'with Jimmy & Ismini',\n};\n\nconst workshopDoc = (w: Workshop): FlierDoc => ({\n ...base,\n layout: LayoutId.PictureRight,\n blocks: {\n ...shared,\n title: 'KIZOMBA',\n titleBottom: 'WORKSHOP',\n script: w.script,\n schedule: schedule(w),\n prices: [{ amount: '5€', label: 'per hour' }, { amount: w.party, label: 'Party pass' }],\n },\n});\n\nexport const kizombaWorkshop: FlierDoc = {\n ...base,\n layout: LayoutId.List,\n blocks: {\n ...shared,\n title: 'UPCOMING',\n titleBottom: 'WORKSHOPS',\n script: 'Kizomba',\n prices: [{ amount: '5€', label: 'per hour' }],\n },\n items: WORKSHOPS.map((w) => ({ date: w.date, schedule: schedule(w), price: `Party pass ${w.party}` })),\n};\n\nexport const kizombaWorkshopDocs: FlierDoc[] = [...WORKSHOPS.map(workshopDoc), kizombaWorkshop];\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/enums/BackgroundStyle.ts","../src/enums/FontSetId.ts","../src/enums/FormatId.ts","../src/enums/LayoutId.ts","../src/enums/PaletteId.ts","../src/enums/PictureAnchor.ts","../src/formats.ts","../src/palettes.ts","../src/fontSets.ts","../src/schema/flierDocSchema.ts","../src/schema/validate.ts","../src/schema/validateFlierDoc.ts","../src/layout/blockGroups.ts","../src/layout/layoutSpecs.ts","../src/layout/geometry.ts","../src/layout/textFlow.ts","../src/render/render.ts","../src/exportPng.ts","../src/layoutCatalogue.ts","../src/examples/kizombaWorkshop.ts"],"names":["BackgroundStyle","FontSetId","FormatId","LayoutId","PaletteId","PictureAnchor","text","bottom","r","split","top"],"mappings":"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","file":"index.mjs","sourcesContent":["export enum BackgroundStyle {\n Solid = 'solid',\n Tint = 'tint',\n}\n","export enum FontSetId {\n Classic = 'classic',\n Modern = 'modern',\n Elegant = 'elegant',\n}\n","export enum FormatId {\n Story = 'story',\n Post = 'post',\n Square = 'square',\n Phone = 'phone',\n Desktop = 'desktop',\n}\n","export enum LayoutId {\n PictureRight = 'picture-right',\n PictureLeft = 'picture-left',\n PictureBottom = 'picture-bottom',\n List = 'list',\n Arch = 'arch',\n PhoneClockSafe = 'phone-clock-safe',\n PhoneArch = 'phone-arch',\n DesktopSafe = 'desktop-safe',\n DesktopArch = 'desktop-arch',\n}\n","export enum PaletteId {\n Sand = 'sand',\n Night = 'night',\n Sea = 'sea',\n Rose = 'rose',\n}\n","export enum PictureAnchor {\n Top = 'top',\n Center = 'center',\n Bottom = 'bottom',\n}\n","import { FormatId } from './enums/FormatId';\n\nexport interface FormatSize {\n width: number;\n height: number;\n}\n\nexport const FORMAT_SIZES: Readonly<Record<FormatId, FormatSize>> = {\n [FormatId.Story]: { width: 1080, height: 1920 },\n [FormatId.Post]: { width: 1080, height: 1350 },\n [FormatId.Square]: { width: 1080, height: 1080 },\n [FormatId.Phone]: { width: 1170, height: 2532 },\n [FormatId.Desktop]: { width: 2560, height: 1440 },\n};\n","import { PaletteId } from './enums/PaletteId';\nimport type { Palette } from './types';\n\nexport const PALETTES: Readonly<Record<PaletteId, Palette>> = {\n [PaletteId.Sand]: { background: '#f5f4f2', tint: '#ece8e3', title: '#958a80', accent: '#e9b47f', ink: '#5f564f', soft: '#b3a89e', card: '#ffffff', arch: '#ede8e2' },\n [PaletteId.Night]: { background: '#1c1a17', tint: '#25221e', title: '#e8dccb', accent: '#e9b47f', ink: '#f4efe8', soft: '#9c9284', card: '#2c2824', arch: '#25221f' },\n [PaletteId.Sea]: { background: '#eef4f3', tint: '#e1ecea', title: '#4f7d7a', accent: '#e07a5f', ink: '#2f3e46', soft: '#8aa3a1', card: '#ffffff', arch: '#e4ecea' },\n [PaletteId.Rose]: { background: '#f8efec', tint: '#f1e2dd', title: '#9b6b63', accent: '#c9846f', ink: '#4a3934', soft: '#b39a92', card: '#ffffff', arch: '#f1e5e1' },\n};\n","import { FontSetId } from './enums/FontSetId';\nimport type { FontSet } from './types';\n\nexport const FONT_SETS: Readonly<Record<FontSetId, FontSet>> = {\n [FontSetId.Classic]: { display: '\"Oswald\", \"Arial Narrow\", sans-serif', script: '\"Sacramento\", cursive', body: '\"Fredoka\", sans-serif' },\n [FontSetId.Modern]: { display: '\"Bebas Neue\", \"Arial Narrow\", sans-serif', script: '\"Great Vibes\", cursive', body: '\"Montserrat\", sans-serif' },\n [FontSetId.Elegant]: { display: '\"Playfair Display\", serif', script: '\"Allura\", cursive', body: '\"Lato\", sans-serif' },\n};\n","import { BackgroundStyle } from '../enums/BackgroundStyle';\nimport { FontSetId } from '../enums/FontSetId';\nimport { FormatId } from '../enums/FormatId';\nimport { LayoutId } from '../enums/LayoutId';\nimport { PaletteId } from '../enums/PaletteId';\nimport { PictureAnchor } from '../enums/PictureAnchor';\nimport type { JsonSchema } from './jsonSchemaTypes';\n\nconst SHORT = 60;\nconst LINE = 120;\nconst MAX_ROWS = 6;\nconst MAX_ITEMS = 8;\nconst MAX_PRICES = 4;\nconst MAX_VENUE = 3;\nconst MIN_SCALE = 0.3;\n\nconst text = (maxLength: number): JsonSchema => ({ type: 'string', minLength: 1, maxLength });\n\nconst scheduleRow: JsonSchema = {\n type: 'object',\n required: ['label', 'time'],\n additionalProperties: false,\n properties: { label: text(SHORT), time: text(SHORT) },\n};\n\nconst scheduleList: JsonSchema = { type: 'array', items: scheduleRow, minItems: 1, maxItems: MAX_ROWS };\n\nconst blocks: JsonSchema = {\n type: 'object',\n required: ['title'],\n additionalProperties: false,\n properties: {\n title: text(SHORT),\n titleBottom: text(SHORT),\n script: text(SHORT),\n venue: { type: 'array', items: text(SHORT), minItems: 1, maxItems: MAX_VENUE },\n schedule: scheduleList,\n prices: {\n type: 'array',\n minItems: 1,\n maxItems: MAX_PRICES,\n items: {\n type: 'object',\n required: ['amount', 'label'],\n additionalProperties: false,\n properties: { amount: text(SHORT), label: text(SHORT) },\n },\n },\n includes: {\n type: 'object',\n required: ['heading', 'items'],\n additionalProperties: false,\n properties: { heading: text(SHORT), items: { type: 'array', items: text(LINE), minItems: 1, maxItems: MAX_ROWS } },\n },\n footer: text(LINE),\n },\n};\n\nexport const flierDocSchema: JsonSchema = {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n $id: 'https://dloizides.com/schemas/flier-doc-v1.json',\n title: 'FlierDoc',\n description: 'One poster or wallpaper: format, layout, palette, fonts, picture slot and text blocks.',\n type: 'object',\n required: ['version', 'format', 'layout', 'palette', 'fonts', 'background', 'blocks'],\n additionalProperties: false,\n properties: {\n version: { const: 1 },\n format: { type: 'string', enum: Object.values(FormatId) },\n layout: { type: 'string', enum: Object.values(LayoutId) },\n palette: { type: 'string', enum: Object.values(PaletteId) },\n fonts: { type: 'string', enum: Object.values(FontSetId) },\n background: { type: 'string', enum: Object.values(BackgroundStyle) },\n picture: {\n type: 'object',\n required: ['imageId', 'anchor', 'scale'],\n additionalProperties: false,\n properties: {\n imageId: text(SHORT),\n anchor: { type: 'string', enum: Object.values(PictureAnchor) },\n scale: { type: 'number', minimum: MIN_SCALE, maximum: 1 },\n },\n },\n logo: { type: 'object', required: ['imageId'], additionalProperties: false, properties: { imageId: text(SHORT) } },\n blocks,\n items: {\n type: 'array',\n minItems: 1,\n maxItems: MAX_ITEMS,\n items: {\n type: 'object',\n required: ['date', 'schedule'],\n additionalProperties: false,\n properties: { date: text(SHORT), schedule: scheduleList, price: text(SHORT) },\n },\n },\n },\n};\n","import type { JsonSchema } from './jsonSchemaTypes';\n\nexport const typeName = (v: unknown): string => {\n if (v === null) {\n return 'null';\n }\n return Array.isArray(v) ? 'array' : typeof v;\n};\n\nconst join = (path: string, key: string): string => (path === '' ? key : `${path}.${key}`);\nconst show = (v: unknown): string => JSON.stringify(v) ?? typeName(v);\n\nconst ARTICLE: Record<string, string> = { object: 'an object', array: 'an array', string: 'a string', number: 'a number', integer: 'an integer' };\n\nfunction matchesType(schema: JsonSchema, value: unknown): boolean {\n switch (schema.type) {\n case undefined:\n return true;\n case 'integer':\n return Number.isInteger(value);\n case 'number':\n return typeof value === 'number' && Number.isFinite(value);\n default:\n return typeName(value) === schema.type;\n }\n}\n\nfunction checkString(schema: JsonSchema, value: string, path: string, errors: string[]): void {\n if (schema.minLength !== undefined && value.trim().length < schema.minLength) {\n errors.push(`${path}: must not be empty`);\n }\n if (schema.maxLength !== undefined && value.length > schema.maxLength) {\n errors.push(`${path}: must be at most ${schema.maxLength} characters (got ${value.length})`);\n }\n}\n\nfunction checkNumber(schema: JsonSchema, value: number, path: string, errors: string[]): void {\n if (schema.minimum !== undefined && value < schema.minimum) {\n errors.push(`${path}: must be at least ${schema.minimum} (got ${value})`);\n }\n if (schema.maximum !== undefined && value > schema.maximum) {\n errors.push(`${path}: must be at most ${schema.maximum} (got ${value})`);\n }\n}\n\nfunction checkArray(schema: JsonSchema, value: unknown[], path: string, errors: string[]): void {\n if (schema.minItems !== undefined && value.length < schema.minItems) {\n errors.push(`${path}: must have at least ${schema.minItems} entries (got ${value.length})`);\n }\n if (schema.maxItems !== undefined && value.length > schema.maxItems) {\n errors.push(`${path}: must have at most ${schema.maxItems} entries (got ${value.length})`);\n return;\n }\n const itemSchema = schema.items;\n if (itemSchema) {\n value.forEach((item, i) => validateAgainst(itemSchema, item, `${path}[${i}]`, errors));\n }\n}\n\nfunction checkObject(schema: JsonSchema, value: Record<string, unknown>, path: string, errors: string[]): void {\n const props = schema.properties ?? {};\n for (const key of schema.required ?? []) {\n if (value[key] === undefined) {\n errors.push(`${join(path, key)}: is required`);\n }\n }\n for (const [key, child] of Object.entries(value)) {\n const childSchema = props[key];\n if (childSchema === undefined) {\n if (schema.additionalProperties === false) {\n errors.push(`${join(path, key)}: is not allowed`);\n }\n } else if (child !== undefined) {\n validateAgainst(childSchema, child, join(path, key), errors);\n }\n }\n}\n\nexport function validateAgainst(schema: JsonSchema, value: unknown, path: string, errors: string[]): void {\n if (schema.const !== undefined) {\n if (value !== schema.const) {\n errors.push(`${path}: must be ${schema.const} (got ${show(value)})`);\n }\n return;\n }\n if (!matchesType(schema, value)) {\n errors.push(`${path}: must be ${ARTICLE[schema.type ?? 'object']} (got ${typeName(value)})`);\n return;\n }\n if (schema.enum && !schema.enum.includes(value as string)) {\n errors.push(`${path}: must be one of ${schema.enum.join(', ')} (got ${show(value)})`);\n return;\n }\n if (typeof value === 'string') {\n checkString(schema, value, path, errors);\n } else if (typeof value === 'number') {\n checkNumber(schema, value, path, errors);\n } else if (Array.isArray(value)) {\n checkArray(schema, value, path, errors);\n } else if (typeName(value) === 'object') {\n checkObject(schema, value as Record<string, unknown>, path, errors);\n }\n}\n","import { LayoutId } from '../enums/LayoutId';\nimport type { FlierDoc, PosterAssets } from '../types';\nimport { flierDocSchema } from './flierDocSchema';\nimport { typeName, validateAgainst } from './validate';\n\nexport type FlierDocResult = { ok: true; doc: FlierDoc } | { ok: false; errors: string[] };\n\nexport class FlierDocError extends Error {\n public readonly errors: string[];\n\n public constructor(errors: string[]) {\n super(`Invalid flier: ${errors.join('; ')}`);\n this.name = 'FlierDocError';\n this.errors = errors;\n }\n}\n\n/** Checks any input (form, preset file, LLM output) against the FlierDoc schema; errors read \"path: problem\". */\nexport function validateFlierDoc(input: unknown): FlierDocResult {\n if (typeName(input) !== 'object') {\n return { ok: false, errors: ['doc: must be an object'] };\n }\n const errors: string[] = [];\n validateAgainst(flierDocSchema, input, '', errors);\n const doc = input as FlierDoc;\n if (doc.layout === LayoutId.List && (doc.items === undefined || doc.items.length === 0)) {\n errors.push('items: layout \"list\" needs at least one item');\n }\n return errors.length === 0 ? { ok: true, doc } : { ok: false, errors };\n}\n\nexport function missingAssets(doc: FlierDoc, assets: PosterAssets): string[] {\n const errors: string[] = [];\n if (doc.picture && assets[doc.picture.imageId] === undefined) {\n errors.push(`picture.imageId: no asset named \"${doc.picture.imageId}\"`);\n }\n if (doc.logo && assets[doc.logo.imageId] === undefined) {\n errors.push(`logo.imageId: no asset named \"${doc.logo.imageId}\"`);\n }\n return errors;\n}\n","import { LayoutId } from '../enums/LayoutId';\nimport type { FlierDoc, ListItem, Palette } from '../types';\nimport type { FlowGroup, FlowLine } from './textFlow';\n\nconst BOLD = 700;\nconst SEMI = 600;\nconst MEDIUM = 500;\nconst SCRIPT = 400;\n\ntype Line = (text: string, size: number) => FlowLine;\n\nconst makers = (p: Palette, u: number): Record<string, Line> => ({\n display: (text, size) => ({ text, role: 'display', weight: BOLD, size: size * u, color: p.title }),\n venue: (text, size) => ({ text, role: 'display', weight: MEDIUM, size: size * u, color: p.ink }),\n script: (text, size) => ({ text, role: 'script', weight: SCRIPT, size: size * u, color: p.accent }),\n strong: (text, size) => ({ text, role: 'body', weight: BOLD, size: size * u, color: p.ink }),\n accent: (text, size) => ({ text, role: 'body', weight: SEMI, size: size * u, color: p.accent }),\n item: (text, size) => ({ text, role: 'body', weight: SEMI, size: size * u, color: p.ink, bullet: p.accent }),\n soft: (text, size) => ({ text, role: 'body', weight: MEDIUM, size: size * u, color: p.soft }),\n});\n\nexport function headerGroups(doc: FlierDoc, p: Palette, u: number): FlowGroup[] {\n const l = makers(p, u);\n const b = doc.blocks;\n const lines = [l.display?.(b.title, 250), b.script ? l.script?.(b.script, 120) : undefined, b.titleBottom ? l.display?.(b.titleBottom, 250) : undefined];\n return [{ lines: lines.filter((x): x is FlowLine => x !== undefined), gapAfter: 0 }];\n}\n\nfunction itemGroup(item: ListItem, l: Record<string, Line>, u: number): FlowGroup {\n const lines: FlowLine[] = [l.script?.(item.date, 67) as FlowLine];\n item.schedule.forEach((row) => lines.push(l.strong?.(`${row.label} ${row.time}`, 42) as FlowLine));\n if (item.price) {\n lines.push(l.accent?.(item.price, 42) as FlowLine);\n }\n return { lines, gapAfter: 48 * u };\n}\n\nfunction eventGroups(doc: FlierDoc, l: Record<string, Line>, u: number, withPrices: boolean): FlowGroup[] {\n const b = doc.blocks;\n const groups: FlowGroup[] = [];\n b.schedule?.forEach((row) => groups.push({ lines: [l.strong?.(row.label, 66) as FlowLine, l.accent?.(row.time, 60) as FlowLine], gapAfter: 30 * u }));\n const prices = (withPrices ? b.prices : undefined) ?? [];\n prices.forEach((row, i) => groups.push({ lines: [l.strong?.(row.amount, 66) as FlowLine, l.accent?.(row.label, 52) as FlowLine], gapAfter: 30 * u, keepWithNext: i < prices.length - 1 }));\n return groups;\n}\n\nfunction listGroups(doc: FlierDoc, l: Record<string, Line>, u: number): FlowGroup[] {\n const groups = (doc.items ?? []).map((item) => itemGroup(item, l, u));\n const prices = doc.blocks.prices?.map((row) => l.strong?.(`${row.amount} ${row.label}`, 58) as FlowLine) ?? [];\n if (prices.length > 0) {\n groups.push({ lines: prices, gapAfter: 30 * u });\n }\n return groups;\n}\n\n/** Price groups set large for the flank zones beside an arch. */\nexport function flankPriceGroups(doc: FlierDoc, p: Palette, u: number): FlowGroup[] {\n const l = makers(p, u);\n return (doc.blocks.prices ?? []).map((row) => ({ lines: [l.strong?.(row.amount, 110) as FlowLine, l.accent?.(row.label, 48) as FlowLine], gapAfter: 30 * u }));\n}\n\n/** Turns the doc's body blocks into flow groups: venue with its pin, schedule or list items, prices, includes, footer. */\nexport function bodyGroups(doc: FlierDoc, p: Palette, u: number, withPrices = true): FlowGroup[] {\n const l = makers(p, u);\n const b = doc.blocks;\n const groups: FlowGroup[] = [];\n const isList = doc.layout === LayoutId.List;\n if (b.venue) {\n groups.push({ lines: b.venue.map((v) => l.venue?.(v, isList ? 48 : 58) as FlowLine), gapAfter: 40 * u, rule: { color: p.accent, height: 8 * u }, icon: { color: p.accent, glyph: p.background } });\n }\n groups.push(...(isList ? listGroups(doc, l, u) : eventGroups(doc, l, u, withPrices)));\n if (b.includes) {\n const lines = [l.accent?.(b.includes.heading, 38) as FlowLine, ...b.includes.items.map((i) => l.item?.(i, 38) as FlowLine)];\n groups.push({ lines, gapAfter: 24 * u, uniform: true });\n }\n if (b.footer) {\n groups.push({ lines: [l.soft?.(b.footer, 34) as FlowLine], gapAfter: 0 });\n }\n return groups;\n}\n","import { LayoutId } from '../enums/LayoutId';\nimport type { Rect } from '../types';\n\ntype Frac = [number, number, number, number];\n\nexport interface LayoutSpec {\n header: Frac;\n body: Frac;\n picture: Frac;\n alignX: number;\n flanks?: [Frac, Frac];\n logo?: Frac;\n arch?: number;\n}\n\ninterface OrientedSpec {\n portrait: LayoutSpec;\n landscape: LayoutSpec;\n}\n\nconst flanksBeside = (pic: Frac, top: number, bottom: number, m: number): [Frac, Frac] => [\n [m, top, pic[0] - 2 * m, bottom - top],\n [pic[0] + pic[2] + m, top, 1 - pic[0] - pic[2] - 2 * m, bottom - top],\n];\n\nconst ARCH_PIC: Frac = [0.22, 0.42, 0.56, 0.58];\nconst PHONE_ARCH_PIC: Frac = [0.2, 0.6, 0.6, 0.4];\nconst DESK_ARCH_PIC: Frac = [0.355, 0.07, 0.32, 0.93];\n\nconst ARCH_LANDSCAPE: LayoutSpec = {\n header: [0.04, 0.06, 0.3, 0.5],\n body: [0.04, 0.58, 0.3, 0.36],\n picture: [0.36, 0.08, 0.3, 0.92],\n alignX: 0.5,\n flanks: [[0.68, 0.08, 0.28, 0.42], [0.68, 0.52, 0.28, 0.42]],\n arch: 0.06,\n};\n\nexport const LAYOUT_SPECS: Partial<Record<LayoutId, OrientedSpec>> = {\n [LayoutId.Arch]: {\n portrait: { header: [0.045, 0.025, 0.91, 0.18], body: [0.045, 0.215, 0.91, 0.19], picture: ARCH_PIC, alignX: 0.5, flanks: flanksBeside(ARCH_PIC, 0.44, 0.97, 0.03), arch: 0.04 },\n landscape: ARCH_LANDSCAPE,\n },\n [LayoutId.PhoneClockSafe]: {\n portrait: { header: [0.045, 0.28, 0.91, 0.2], body: [0.045, 0.5, 0.42, 0.44], picture: [0.48, 0.5, 0.52, 0.5], alignX: 1 },\n landscape: { header: [0.04, 0.2, 0.52, 0.3], body: [0.04, 0.52, 0.52, 0.42], picture: [0.6, 0.12, 0.4, 0.88], alignX: 1 },\n },\n [LayoutId.PhoneArch]: {\n portrait: { header: [0.045, 0.3, 0.91, 0.13], body: [0.045, 0.44, 0.91, 0.14], picture: PHONE_ARCH_PIC, alignX: 0.5, flanks: flanksBeside(PHONE_ARCH_PIC, 0.63, 0.94, 0.03), arch: 0.08 },\n landscape: { ...ARCH_LANDSCAPE, header: [0.04, 0.16, 0.3, 0.42], picture: [0.36, 0.16, 0.3, 0.84] },\n },\n [LayoutId.DesktopSafe]: {\n portrait: { header: [0.08, 0.06, 0.84, 0.24], body: [0.08, 0.31, 0.46, 0.58], picture: [0.56, 0.36, 0.44, 0.64], alignX: 1 },\n landscape: { header: [0.0625, 0.05, 0.58, 0.44], body: [0.0625, 0.5, 0.58, 0.38], picture: [0.67, 0.0972, 0.29, 0.9028], alignX: 1, logo: [0.4, 0.045, 0.09, 0.17] },\n },\n [LayoutId.DesktopArch]: {\n portrait: { header: [0.08, 0.06, 0.84, 0.2], body: [0.08, 0.27, 0.84, 0.2], picture: [0.14, 0.48, 0.72, 0.52], alignX: 0.5, arch: 0.05 },\n landscape: { header: [0.07, 0.3, 0.26, 0.45], body: [0.7, 0.25, 0.27, 0.65], picture: DESK_ARCH_PIC, alignX: 0.5, logo: [0.86, 0.03, 0.11, 0.18], arch: 0.05 },\n },\n};\n\nconst r = Math.round;\n\nexport const toRect = (f: Frac, w: number, h: number): Rect => {\n const x = r(f[0] * w);\n const y = r(f[1] * h);\n return { x, y, w: r((f[0] + f[2]) * w) - x, h: r((f[1] + f[3]) * h) - y };\n};\n","import { LayoutId } from '../enums/LayoutId';\r\nimport { PictureAnchor } from '../enums/PictureAnchor';\r\nimport type { PosterImage, Rect } from '../types';\r\nimport { LAYOUT_SPECS, toRect } from './layoutSpecs';\r\n\r\nexport interface LayoutGeometry {\r\n header: Rect;\r\n body: Rect;\r\n picture: Rect;\r\n alignX: number;\r\n flanks?: Rect[];\r\n logo?: Rect;\r\n arch?: number;\r\n}\r\n\r\nconst MARGIN = 0.045;\r\nconst HEADER_PORTRAIT = 0.3;\r\nconst HEADER_LANDSCAPE = 0.36;\r\nconst BOTTOM_HEADER = 0.2;\r\nconst BOTTOM_PICTURE = 0.52;\r\nconst PICTURE_SIDE: Record<string, [number, number]> = {\r\n [LayoutId.PictureRight]: [0.6, 0.42],\r\n [LayoutId.PictureLeft]: [0.6, 0.42],\r\n [LayoutId.List]: [0.5, 0.36],\r\n};\r\nconst ANCHOR_Y: Record<PictureAnchor, number> = { [PictureAnchor.Top]: 0, [PictureAnchor.Center]: 0.5, [PictureAnchor.Bottom]: 1 };\r\n\r\nconst r = Math.round;\r\n\r\nfunction side(w: number, h: number, fraction: [number, number]): LayoutGeometry {\r\n const m = r(Math.min(w, h) * MARGIN);\r\n if (h >= w) {\r\n const split = r(w * (1 - fraction[0]));\r\n const top = r(h * HEADER_PORTRAIT);\r\n return {\r\n header: { x: m, y: m, w: w - 2 * m, h: top - 2 * m },\r\n picture: { x: split, y: top, w: w - split, h: h - top },\r\n body: { x: m, y: top, w: split - 2 * m, h: h - top - m },\r\n alignX: 1,\r\n };\r\n }\r\n const split = r(w * (1 - fraction[1]));\r\n const top = r(h * HEADER_LANDSCAPE);\r\n return {\r\n header: { x: m, y: m, w: split - 2 * m, h: top - m },\r\n picture: { x: split, y: 0, w: w - split, h },\r\n body: { x: m, y: top + r(m / 2), w: split - 2 * m, h: h - top - r(m / 2) - m },\r\n alignX: 1,\r\n };\r\n}\r\n\r\nfunction bottom(w: number, h: number): LayoutGeometry {\r\n const m = r(Math.min(w, h) * MARGIN);\r\n const top = r(h * BOTTOM_HEADER);\r\n const pic = r(h * BOTTOM_PICTURE);\r\n return {\r\n header: { x: m, y: m, w: w - 2 * m, h: top - 2 * m },\r\n body: { x: m, y: top, w: w - 2 * m, h: pic - top - m },\r\n picture: { x: 0, y: pic, w, h: h - pic },\r\n alignX: 0.5,\r\n };\r\n}\r\n\r\nfunction fromSpec(spec: NonNullable<(typeof LAYOUT_SPECS)[LayoutId]>['portrait'], w: number, h: number): LayoutGeometry {\r\n return {\r\n header: toRect(spec.header, w, h),\r\n body: toRect(spec.body, w, h),\r\n picture: toRect(spec.picture, w, h),\r\n alignX: spec.alignX,\r\n flanks: spec.flanks?.map((f) => toRect(f, w, h)),\r\n logo: spec.logo ? toRect(spec.logo, w, h) : undefined,\r\n arch: spec.arch,\r\n };\r\n}\r\n\r\nconst mirror = (rect: Rect, w: number): Rect => ({ ...rect, x: w - rect.x - rect.w });\r\n\r\n/** Splits the canvas into header, body and picture regions that never overlap. */\r\nexport function geometry(layout: LayoutId, w: number, h: number): LayoutGeometry {\r\n const oriented = LAYOUT_SPECS[layout];\r\n if (oriented) {\r\n return fromSpec(h >= w ? oriented.portrait : oriented.landscape, w, h);\r\n }\r\n if (layout === LayoutId.PictureBottom) {\r\n return bottom(w, h);\r\n }\r\n const g = side(w, h, PICTURE_SIDE[layout] ?? [0.6, 0.42]);\r\n if (layout !== LayoutId.PictureLeft) {\r\n return g;\r\n }\r\n return { header: mirror(g.header, w), body: mirror(g.body, w), picture: mirror(g.picture, w), alignX: 1 - g.alignX };\r\n}\r\n\r\n/** Fits the whole image inside the region (contain), scaled and anchored; never crops it. */\r\nexport function placeContain(image: PosterImage, region: Rect, anchor: PictureAnchor, alignX: number, scale: number): Rect {\r\n const s = Math.min(region.w / image.width, region.h / image.height) * scale;\r\n const w = Math.floor(image.width * s);\r\n const h = Math.floor(image.height * s);\r\n return {\r\n x: region.x + Math.floor((region.w - w) * alignX),\r\n y: region.y + Math.floor((region.h - h) * ANCHOR_Y[anchor]),\r\n w,\r\n h,\r\n };\r\n}\r\n","import type { FontSet, PosterContext, Rect } from '../types';\n\nexport interface FlowLine {\n text: string;\n role: keyof FontSet;\n weight: number;\n size: number;\n color: string;\n bullet?: string;\n}\n\nexport interface FlowGroup {\n lines: FlowLine[];\n gapAfter: number;\n card?: { color: string; pad: number };\n rule?: { color: string; height: number };\n uniform?: boolean;\n icon?: { color: string; glyph: string };\n keepWithNext?: boolean;\n}\n\nexport interface FlowZone extends Rect {\n right?: boolean;\n}\n\nexport interface TextOp {\n text: string;\n font: string;\n color: string;\n box: Rect;\n}\n\nexport interface FlowResult {\n texts: TextOp[];\n cards: { rect: Rect; color: string }[];\n rules: { rect: Rect; color: string }[];\n bullets: { x: number; y: number; r: number; color: string }[];\n icons: { rect: Rect; color: string; glyph: string }[];\n}\n\ninterface Measured {\n group: FlowGroup;\n widths: number[];\n}\n\nconst LINE_HEIGHT = 1.2;\nconst BULLET_INDENT = 1.1;\nconst BULLET_RADIUS = 0.2;\nconst RULE_GAP = 2.5;\nconst RULE_WIDTH = 0.9;\nconst WIDE = 1.6;\nconst MIN_K = 0.02;\nconst STEPS = 22;\nconst ICON_SCALE = 1.6;\nconst ICON_GAP = 0.35;\n\nexport const fontOf = (line: FlowLine, size: number, fonts: FontSet): string => `${line.weight} ${size}px ${fonts[line.role]}`;\n\nexport const emptyFlow = (): FlowResult => ({ texts: [], cards: [], rules: [], bullets: [], icons: [] });\n\nconst iconSize = (group: FlowGroup, k: number): number => {\n const first = group.lines[0];\n return group.icon && first ? first.size * k * LINE_HEIGHT * ICON_SCALE : 0;\n};\n\nfunction lineSize(line: FlowLine, width: number, k: number, avail: number): number {\n const indent = line.bullet ? line.size * k * BULLET_INDENT : 0;\n return Math.max(0, Math.min(line.size * k, (line.size * (avail - indent)) / Math.max(width, 1)));\n}\n\nfunction groupRatio(m: Measured, k: number, avail: number): number | null {\n if (!m.group.uniform) {\n return null;\n }\n return Math.min(...m.group.lines.map((line, i) => lineSize(line, m.widths[i] ?? 1, k, avail) / line.size));\n}\n\nfunction placeIcon(group: FlowGroup, d: number, x: number, textTop: number, textBottom: number, out: FlowResult | null): number {\n if (!group.icon || d <= 0) {\n return textBottom;\n }\n const textH = textBottom - textTop;\n out?.icons.push({ rect: { x, y: textTop + Math.max(0, (textH - d) / 2), w: d, h: d }, color: group.icon.color, glyph: group.icon.glyph });\n return textTop + Math.max(textH, d);\n}\n\nfunction placeGroup(m: Measured, k: number, col: FlowZone, y0: number, out: FlowResult | null): number {\n const { group } = m;\n let y = y0;\n if (group.rule) {\n out?.rules.push({ rect: { x: col.x, y, w: col.w * RULE_WIDTH, h: group.rule.height * k }, color: group.rule.color });\n y += group.rule.height * k * RULE_GAP;\n }\n const pad = group.card ? group.card.pad * k : 0;\n const top = y;\n y += pad;\n const d = iconSize(group, k);\n const iconIndent = d > 0 ? d * (1 + ICON_GAP) : 0;\n const avail = col.w - 2 * pad - iconIndent;\n const ratio = groupRatio(m, k, avail);\n group.lines.forEach((line, i) => {\n const size = ratio === null ? lineSize(line, m.widths[i] ?? 1, k, avail) : line.size * ratio;\n const indent = (line.bullet ? line.size * k * BULLET_INDENT : 0) + iconIndent;\n const w = ((m.widths[i] ?? 0) * size) / line.size;\n const x = col.right ? col.x + col.w - pad - w : col.x + pad + indent;\n out?.texts.push({ text: line.text, font: '', color: line.color, box: { x, y, w, h: size * LINE_HEIGHT } });\n if (line.bullet && out) {\n out.bullets.push({ x: col.x + pad + size * BULLET_RADIUS, y: y + (size * LINE_HEIGHT) / 2, r: size * BULLET_RADIUS, color: line.bullet });\n }\n y += size * LINE_HEIGHT;\n });\n y = placeIcon(group, d, col.x + pad, top + pad, y, out);\n y += pad;\n if (group.card) {\n out?.cards.unshift({ rect: { x: col.x, y: top, w: col.w, h: y - top }, color: group.card.color });\n }\n return y + group.gapAfter * k - y0;\n}\n\nfunction placeColumn(groups: Measured[], k: number, col: FlowZone, out: FlowResult | null): number {\n let h = 0;\n for (const g of groups) {\n h += placeGroup(g, k, col, col.y + h, out);\n }\n return h;\n}\n\nconst tallest = (heights: number[], cut: number): number => {\n const left = heights.slice(0, cut).reduce((a, b) => a + b, 0);\n const right = heights.slice(cut).reduce((a, b) => a + b, 0);\n return Math.max(left, right);\n};\n\nfunction keepTogether(groups: Measured[], heights: number[], cut: number): number {\n const breaks = (c: number): boolean => groups[c - 1]?.group.keepWithNext === true;\n let back = cut;\n while (back > 1 && breaks(back)) {back--;}\n let fwd = cut;\n while (fwd < groups.length - 1 && breaks(fwd)) {fwd++;}\n const candidates = [back, fwd].filter((c) => !breaks(c));\n if (candidates.length === 0) {\n return cut;\n }\n return candidates.reduce((best, c) => (tallest(heights, c) < tallest(heights, best) ? c : best));\n}\n\nfunction splitColumns(groups: Measured[], zone: FlowZone): { col: FlowZone; groups: Measured[] }[] {\n if (zone.w / Math.max(zone.h, 1) <= WIDE || groups.length < 2) {\n return [{ col: zone, groups }];\n }\n const heights = groups.map((g) => placeGroup(g, 1, zone, 0, null));\n const half = heights.reduce((a, b) => a + b, 0) / 2;\n let acc = 0;\n let cut = 1;\n heights.forEach((h, i) => {\n if (acc < half) {\n cut = i + 1;\n }\n acc += h;\n });\n cut = keepTogether(groups, heights, Math.min(cut, groups.length - 1));\n const gap = Math.round(zone.w * 0.04);\n const w = (zone.w - gap) / 2;\n return [\n { col: { ...zone, w }, groups: groups.slice(0, cut) },\n { col: { ...zone, x: zone.x + w + gap, w }, groups: groups.slice(cut) },\n ];\n}\n\n/** Lays groups out in the zone, shrinking every size by one factor until all text fits; never overflows. */\nexport function flow(ctx: PosterContext, groups: FlowGroup[], zone: FlowZone, fonts: FontSet): FlowResult {\n const measured = groups.map((group) => ({\n group,\n widths: group.lines.map((line) => {\n ctx.font = fontOf(line, line.size, fonts);\n return ctx.measureText(line.text).width;\n }),\n }));\n const columns = splitColumns(measured, zone);\n const fits = (k: number): boolean => columns.every((c) => placeColumn(c.groups, k, c.col, null) <= zone.h);\n let lo = MIN_K;\n let hi = 1;\n if (fits(1)) {\n lo = 1;\n }\n for (let i = 0; i < STEPS && lo < hi; i++) {\n const mid = (lo + hi) / 2;\n if (fits(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n const out = emptyFlow();\n columns.forEach((c) => placeColumn(c.groups, lo, c.col, out));\n const lines = groups.flatMap((g) => g.lines);\n out.texts.forEach((t, i) => {\n const line = lines[i];\n t.font = line ? fontOf(line, t.box.h / LINE_HEIGHT, fonts) : t.font;\n });\n return out;\n}\n","import { BackgroundStyle } from '../enums/BackgroundStyle';\nimport { PictureAnchor } from '../enums/PictureAnchor';\nimport { FONT_SETS } from '../fontSets';\nimport { FORMAT_SIZES } from '../formats';\nimport { bodyGroups, flankPriceGroups, headerGroups } from '../layout/blockGroups';\nimport { geometry, placeContain, type LayoutGeometry } from '../layout/geometry';\nimport { emptyFlow, flow, type FlowGroup, type FlowResult } from '../layout/textFlow';\nimport { PALETTES } from '../palettes';\nimport { FlierDocError, missingAssets, validateFlierDoc } from '../schema/validateFlierDoc';\nimport type { FlierDoc, FontSet, PosterAssets, PosterCanvas, PosterContext, Rect, RenderReport } from '../types';\n\nconst BASE = 1080;\nconst LOGO_SHARE = 0.26;\nconst CARD_RADIUS = 0.035;\nconst CAP_TOP = 0.15;\nconst PIN_HEAD_Y = 0.08;\nconst PIN_HEAD_R = 0.19;\nconst PIN_TIP_Y = 0.28;\nconst PIN_HOLE = 0.42;\nconst ARC_START = 0.75;\nconst ARC_END = 2.25;\n\nfunction drawPin(ctx: PosterContext, r: Rect, color: string, glyph: string): void {\n const cx = r.x + r.w / 2;\n const cy = r.y + r.h / 2;\n const hy = cy - r.w * PIN_HEAD_Y;\n const rad = r.w * PIN_HEAD_R;\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.arc(cx, cy, r.w / 2, 0, Math.PI * 2);\n ctx.fill();\n ctx.fillStyle = glyph;\n ctx.beginPath();\n ctx.moveTo(cx, cy + r.w * PIN_TIP_Y);\n ctx.arc(cx, hy, rad, Math.PI * ARC_START, Math.PI * ARC_END);\n ctx.closePath();\n ctx.fill();\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.arc(cx, hy, rad * PIN_HOLE, 0, Math.PI * 2);\n ctx.fill();\n}\n\nfunction roundRect(ctx: PosterContext, r: Rect, radius: number): void {\n const rad = Math.min(radius, r.w / 2, r.h / 2);\n ctx.beginPath();\n ctx.moveTo(r.x + rad, r.y);\n ctx.arcTo(r.x + r.w, r.y, r.x + r.w, r.y + r.h, rad);\n ctx.arcTo(r.x + r.w, r.y + r.h, r.x, r.y + r.h, rad);\n ctx.arcTo(r.x, r.y + r.h, r.x, r.y, rad);\n ctx.arcTo(r.x, r.y, r.x + r.w, r.y, rad);\n ctx.closePath();\n ctx.fill();\n}\n\nfunction drawFlow(ctx: PosterContext, f: FlowResult, radius: number): void {\n f.rules.forEach((r) => {\n ctx.fillStyle = r.color;\n ctx.fillRect(r.rect.x, r.rect.y, r.rect.w, r.rect.h);\n });\n f.cards.forEach((c) => {\n ctx.fillStyle = c.color;\n roundRect(ctx, c.rect, radius);\n });\n f.bullets.forEach((b) => {\n ctx.fillStyle = b.color;\n ctx.beginPath();\n ctx.arc(b.x, b.y, b.r, 0, Math.PI * 2);\n ctx.fill();\n });\n f.icons.forEach((i) => drawPin(ctx, i.rect, i.color, i.glyph));\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n f.texts.forEach((t) => {\n ctx.font = t.font;\n ctx.fillStyle = t.color;\n ctx.fillText(t.text, t.box.x, t.box.y);\n });\n}\n\nfunction checked(input: unknown, assets: PosterAssets): FlierDoc {\n const result = validateFlierDoc(input);\n if (!result.ok) {\n throw new FlierDocError(result.errors);\n }\n const missing = missingAssets(result.doc, assets);\n if (missing.length > 0) {\n throw new FlierDocError(missing);\n }\n return result.doc;\n}\n\nfunction archRect(geo: LayoutGeometry): Rect | null {\n if (geo.arch === undefined) {\n return null;\n }\n const top = geo.picture.y + Math.round(geo.picture.h * geo.arch);\n return { x: geo.picture.x, y: top, w: geo.picture.w, h: geo.picture.y + geo.picture.h - top };\n}\n\nfunction drawArch(ctx: PosterContext, r: Rect, color: string): void {\n const rad = r.w / 2;\n ctx.fillStyle = color;\n ctx.fillRect(r.x, r.y + rad, r.w, r.h - rad);\n ctx.beginPath();\n ctx.arc(r.x + rad, r.y + rad, rad, Math.PI, Math.PI * 2);\n ctx.fill();\n}\n\nfunction flankFlows(ctx: PosterContext, groups: FlowGroup[], flanks: Rect[], fonts: FontSet): FlowResult[] {\n const half = Math.ceil(groups.length / 2);\n return flanks.map((zone, i) => (i === 0 ? flow(ctx, groups.slice(0, half), zone, fonts) : flow(ctx, groups.slice(half), { ...zone, right: true }, fonts)));\n}\n\nfunction capAligned(zone: Rect, head: FlowResult): Rect {\n const first = head.texts[0]?.box;\n const shift = first ? Math.min(Math.max(0, Math.round(first.y + first.h * CAP_TOP) - zone.y), Math.round(zone.h / 2)) : 0;\n return { ...zone, y: zone.y + shift, h: zone.h - shift };\n}\n\nfunction splitHeader(header: Rect, hasLogo: boolean): { text: Rect; logo: Rect } {\n const logoW = hasLogo ? Math.round(header.w * LOGO_SHARE) : 0;\n return { text: { ...header, w: header.w - logoW * 1.1 }, logo: { ...header, x: header.x + header.w - logoW, w: logoW } };\n}\n\n/** Validates the doc, then draws it on the canvas (resized to the format); throws FlierDocError before touching the canvas. */\nexport function render(input: unknown, assets: PosterAssets, canvas: PosterCanvas): RenderReport {\n const doc = checked(input, assets);\n const { width, height } = FORMAT_SIZES[doc.format];\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('poster-render: the canvas has no 2d context');\n }\n const palette = PALETTES[doc.palette];\n const fonts = FONT_SETS[doc.fonts];\n const geo = geometry(doc.layout, width, height);\n const u = Math.min(width, height) / BASE;\n ctx.globalAlpha = 1;\n ctx.fillStyle = palette.background;\n ctx.fillRect(0, 0, width, height);\n if (doc.background === BackgroundStyle.Tint) {\n ctx.fillStyle = palette.tint;\n [geo.header, geo.body].forEach((r) => ctx.fillRect(r.x, r.y, r.w, r.h));\n }\n const zones = geo.logo ? { text: geo.header, logo: geo.logo } : splitHeader(geo.header, doc.logo !== undefined);\n const head = flow(ctx, headerGroups(doc, palette, u), zones.text, fonts);\n const flanks = geo.flanks ?? [];\n const body = flow(ctx, bodyGroups(doc, palette, u, flanks.length === 0), geo.body, fonts);\n const sides = flanks.length > 0 ? flankFlows(ctx, flankPriceGroups(doc, palette, u), flanks, fonts) : [emptyFlow()];\n const radius = Math.min(width, height) * CARD_RADIUS;\n [head, body, ...sides].forEach((f) => drawFlow(ctx, f, radius));\n const logoImage = doc.logo ? assets[doc.logo.imageId] : undefined;\n const logo = logoImage ? placeContain(logoImage, geo.logo ? zones.logo : capAligned(zones.logo, head), PictureAnchor.Top, 1, 1) : null;\n if (logoImage && logo) {\n ctx.drawImage(logoImage, logo.x, logo.y, logo.w, logo.h);\n }\n const image = doc.picture ? assets[doc.picture.imageId] : undefined;\n const backdrop = image ? archRect(geo) : null;\n if (backdrop) {\n drawArch(ctx, backdrop, palette.arch);\n }\n const picture = image && doc.picture ? placeContain(image, geo.picture, doc.picture.anchor, geo.alignX, doc.picture.scale) : null;\n if (image && picture) {\n ctx.drawImage(image, picture.x, picture.y, picture.w, picture.h);\n }\n return {\n width,\n height,\n picture,\n pictureRegion: geo.picture,\n textBoxes: [head, body, ...sides].flatMap((f) => f.texts.map((t) => t.box)),\n cardBoxes: body.cards.map((c) => c.rect),\n iconBoxes: [head, body, ...sides].flatMap((f) => f.icons.map((i) => i.rect)),\n logo,\n backdrop,\n };\n}\n","export interface DataUrlCanvas {\n toDataURL(type: string): string;\n}\n\nconst PREFIX = 'data:image/png;base64,';\n\n/** Encodes the canvas as a PNG Blob of the canvas's exact pixel size. */\nexport function exportPng(canvas: DataUrlCanvas): Blob {\n const url = canvas.toDataURL('image/png');\n if (!url.startsWith(PREFIX)) {\n throw new Error('poster-render: the canvas did not return a PNG data URL');\n }\n const binary = atob(url.slice(PREFIX.length));\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return new Blob([bytes], { type: 'image/png' });\n}\n","import { FormatId } from './enums/FormatId';\nimport { LayoutId } from './enums/LayoutId';\n\nexport interface LayoutCatalogueEntry {\n id: LayoutId;\n designId: string;\n label: string;\n description: string;\n formats: readonly FormatId[];\n}\n\nconst POSTERS = [FormatId.Story, FormatId.Post, FormatId.Square];\n\nexport const LAYOUT_CATALOGUE: readonly LayoutCatalogueEntry[] = [\n { id: LayoutId.PictureRight, designId: 'E-A', label: 'Picture right', description: 'Titles across the top, details on the left, the picture on the right standing on the bottom edge.', formats: POSTERS },\n { id: LayoutId.PictureLeft, designId: 'E-B', label: 'Picture left', description: 'Titles across the top, the picture on the left standing on the bottom edge, details on the right.', formats: POSTERS },\n { id: LayoutId.Arch, designId: 'E-C', label: 'Arch', description: 'Titles and details on top, the picture centred in a soft arch at the bottom, prices either side.', formats: POSTERS },\n { id: LayoutId.PictureBottom, designId: 'picture-bottom', label: 'Picture bottom', description: 'Titles and details on top, the picture across the bottom half.', formats: POSTERS },\n { id: LayoutId.List, designId: 'list', label: 'Upcoming list', description: 'Several dated events as a list beside the picture.', formats: POSTERS },\n { id: LayoutId.PhoneClockSafe, designId: 'P-A', label: 'Phone, clock clear', description: 'Lock-screen wallpaper: top kept clear for the clock, details on the left, picture on the right.', formats: [FormatId.Phone] },\n { id: LayoutId.PhoneArch, designId: 'P-B', label: 'Phone arch', description: 'Lock-screen wallpaper: top kept clear for the clock, details in the middle, the picture in an arch at the bottom.', formats: [FormatId.Phone] },\n { id: LayoutId.DesktopSafe, designId: 'D-A', label: 'Desktop, icons clear', description: 'Desktop wallpaper: text on the left clear of desktop icons and the taskbar, the picture on the right.', formats: [FormatId.Desktop] },\n { id: LayoutId.DesktopArch, designId: 'D-B', label: 'Desktop arch', description: 'Desktop wallpaper: titles left, the picture in a centred arch, details right.', formats: [FormatId.Desktop] },\n];\n\nconst DEFAULTS: Readonly<Record<FormatId, LayoutId>> = {\n [FormatId.Story]: LayoutId.PictureRight,\n [FormatId.Post]: LayoutId.PictureRight,\n [FormatId.Square]: LayoutId.PictureRight,\n [FormatId.Phone]: LayoutId.PhoneClockSafe,\n [FormatId.Desktop]: LayoutId.DesktopSafe,\n};\n\n/** The default layout for a format (D4: E-A for posters, P-A for phone, D-A for desktop). */\nexport function defaultLayoutFor(format: FormatId): LayoutId {\n return DEFAULTS[format];\n}\n","import { BackgroundStyle } from '../enums/BackgroundStyle';\nimport { FontSetId } from '../enums/FontSetId';\nimport { FormatId } from '../enums/FormatId';\nimport { LayoutId } from '../enums/LayoutId';\nimport { PaletteId } from '../enums/PaletteId';\nimport { PictureAnchor } from '../enums/PictureAnchor';\nimport type { FlierBlocks, FlierDoc, ScheduleRow } from '../types';\n\ninterface Workshop {\n script: string;\n date: string;\n first: string;\n second: string;\n party: string;\n}\n\nconst WORKSHOPS: Workshop[] = [\n { script: 'Saturday 31 October', date: 'Sat 31 Oct', first: '20:00 - 21:00', second: '21:00 - 22:00', party: '20€' },\n { script: 'Saturday 7 November', date: 'Sat 7 Nov', first: '20:00 - 21:00', second: '21:00 - 22:00', party: '15€' },\n { script: 'Sunday 29 November', date: 'Sun 29 Nov', first: '17:00 - 18:00', second: '18:00 - 19:00', party: '10€' },\n];\n\nconst INCLUDES = { heading: 'Party pass includes', items: ['Salsa & Bachata room', 'Kizomba dedicated room', '2 drinks'] };\n\nconst schedule = (w: Workshop): ScheduleRow[] => [\n { label: 'Level 1', time: w.first },\n { label: 'Level 2', time: w.second },\n];\n\nconst base = {\n version: 1 as const,\n format: FormatId.Story,\n palette: PaletteId.Sand,\n fonts: FontSetId.Classic,\n background: BackgroundStyle.Solid,\n picture: { imageId: 'dancers', anchor: PictureAnchor.Bottom, scale: 1 },\n logo: { imageId: 'logo' },\n};\n\nconst shared: Omit<FlierBlocks, 'title'> = {\n venue: ['Bailemos', 'Dance School'],\n includes: INCLUDES,\n footer: 'with Jimmy & Ismini',\n};\n\nconst workshopDoc = (w: Workshop): FlierDoc => ({\n ...base,\n layout: LayoutId.PictureRight,\n blocks: {\n ...shared,\n title: 'KIZOMBA',\n titleBottom: 'WORKSHOP',\n script: w.script,\n schedule: schedule(w),\n prices: [{ amount: '5€', label: 'per hour' }, { amount: w.party, label: 'Party pass' }],\n },\n});\n\nexport const kizombaWorkshop: FlierDoc = {\n ...base,\n layout: LayoutId.List,\n blocks: {\n ...shared,\n title: 'UPCOMING',\n titleBottom: 'WORKSHOPS',\n script: 'Kizomba',\n prices: [{ amount: '5€', label: 'per hour' }],\n },\n items: WORKSHOPS.map((w) => ({ date: w.date, schedule: schedule(w), price: `Party pass ${w.party}` })),\n};\n\nexport const kizombaWorkshopDocs: FlierDoc[] = [...WORKSHOPS.map(workshopDoc), kizombaWorkshop];\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dloizides/poster-render",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Poster and flier rendering from one JSON document: FlierDoc JSON Schema + validator, a pure canvas render(doc, assets, canvas) with layouts, formats, palette and font sets, and PNG export. The picture is placed contain + anchor, never cropped, and nothing is drawn over it. No UI.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"poster",
|