Expands the slice from a single 300x250 banner to four IAB sizes (300x600, 300x250, 728x90, 160x600) driven by a designer-authored TypeSystem and a per-row strip review surface. Layout engine - TypeSystem with role-based typography (headline/subheadline/cta/legal) and piecewise size-class derivation: half_page / rectangle / leaderboard / skyscraper / mobile_banner. - resolveLayout now derives per-size font/leading from the role + artboard size, then clamps to a legibility floor and emits a constraint_signal when copy does not fit at the floor. - Four reference templates with character constraints per size. AI pipeline (Shape B) - One extract + one generate per feed row; generate returns per-size copy keyed by artboard_id plus a shared rationale block. - Constraint-signal retry: orchestrator tightens per-(artboard, field) limits and re-calls generate before giving up. - orchestrateRow returns specs[] + rationale + constraint_signals. Review UI - /review renders one strip per feed row, all four sizes side-by-side at true pixel dimensions, synced on a single GSAP master timeline. - AiReasoningDrawer shows a per-size copy table, shared rationale, and any constraint signals that fired. - /api/generate response grouped by row; /api/export accepts the same shape and writes exports/row-N/artboard_id.zip. Render worker - render-to-zip / render-many accept optional subdir + filename overrides so multi-size exports can be grouped by feed row. Docs - VERTICAL_SLICE and BUILD_SEQUENCE updated for the multi-size scope. - RESOLVED_FEED.md documents the V1 Resolved Creative Feed proposal. - SLICE_DEVIATIONS.md records where the slice diverges from V1. Tests: 56 pass (28 layout-engine + 14 api-lib + 14 render-worker). Web app: tsc clean, next build succeeds. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
29 lines
782 B
TypeScript
29 lines
782 B
TypeScript
export {
|
|
initLayoutEngine,
|
|
measureText,
|
|
isInitialized
|
|
} from './dropflow-wrapper.js';
|
|
export type {
|
|
FontDescriptor,
|
|
InitOptions,
|
|
MeasureInput,
|
|
MeasureResult
|
|
} from './dropflow-wrapper.js';
|
|
|
|
export { shrinkToFit } from './shrink-to-fit.js';
|
|
export type { ShrinkInput, ShrinkResult } from './shrink-to-fit.js';
|
|
|
|
export { applyPushSiblings } from './push-siblings.js';
|
|
export type { ApplyPushInput, PushResult } from './push-siblings.js';
|
|
|
|
export { deriveTypeSpec, maxCharsAtSize } from './type-scale.js';
|
|
export type { DeriveTarget, DerivedTypography } from './type-scale.js';
|
|
|
|
export { resolveLayout } from './resolve-layout.js';
|
|
|
|
export {
|
|
DEMO_TEMPLATE_300x250,
|
|
DEMO_TEMPLATE_300x600,
|
|
DEMO_TEMPLATE_728x90,
|
|
DEMO_TEMPLATE_160x600
|
|
} from './templates/index.js';
|