@@ -644,21 +644,26 @@ screenrig --json media list --tag TAG --primitive image
644644` compose catalog ` prints the fail-closed page language: page keys
645645` width ` /` height ` /` font ` /` background ` /` brand ` /` text ` /` image ` /` video ` /` motion ` /` pages ` /` viewing ` /` logo ` ,
646646regions ` fullpage|left|right|left-third|middle-third|right-third|middle-half|top-half|bottom-half|top|bottom ` ,
647- and inner fields ` title|subtitle|text|footer|image|video|iframe|webapp|cards|card|table `
647+ and inner fields ` eyebrow| title|subtitle|text|footer|image|video|iframe|webapp|cards|card|table`
648648plus ` enter ` /` stagger ` /` motion ` /` align ` /` valign ` /` fill ` /` color ` /` z ` /` shadow ` /` outline ` .
649649Author only catalog fields. Unknown keys fail the whole spec. Do not author
650650` fontSize ` . Do not author ` x ` /` y ` . Do not author Frame trees, recipes, or
651651` .layout.json ` . On the page, ` text ` is the copy color. In a
652652region, ` text ` is body copy (a string or an array of lines). Type size is
653653procedural from ` min(width, height) ` and optional ` viewing ` ` near|mid|far `
654- (default ` mid ` ). Titles default to ` brand ` . Body (` subtitle ` , ` text ` , ` footer ` )
655- defaults to ` text ` . Optional region or ` card ` ` color ` overrides every role in
656- that box. Text over a page ` image ` or ` video ` with no ` fill ` gets a 1 px
657- unblurred drop shadow (` #000000E6 ` on light type, ` #FFFFFFE6 ` on dark type).
658- Set ` shadow ` to ` "none" ` or ` { x, y, color } ` to override. ` outline ` is
659- ` { width: 0.5-12, color } ` and is off unless set. A card plate is backing, so
660- type on a card does not get the automatic shadow.
661- On 1920×1080 mid, body wish is about 45 px and title wish is 86 px. A region
654+ (default ` mid ` ). Parse order is ` eyebrow ` , ` title ` , ` subtitle ` , ` text ` , then
655+ image/cards/table, footer last. ` eyebrow ` is the kicker above the headline and
656+ defaults to ` brand ` . Region ` title ` defaults to page ` text ` . Body ` text ` uses
657+ muted (mixed from ` text ` toward ` background ` ). ` subtitle ` and ` footer ` use
658+ ` text ` . Card-item titles, prices, and table headers stay ` brand ` . Optional
659+ region or ` card ` ` color ` overrides every role in that box. Text over a page
660+ ` image ` or ` video ` with no ` fill ` gets a 1 px unblurred drop shadow
661+ (` #000000E6 ` on light type, ` #FFFFFFE6 ` on dark type). Set ` shadow ` to
662+ ` "none" ` or ` { x, y, color, blur? } ` to override (` blur ` 0–32, omit is 0).
663+ ` outline ` is ` { width: 0.5-12, color } ` and is off unless set. A card plate is
664+ backing, so type on a card does not get the automatic shadow.
665+ On 1920×1080 mid, body wish is about 45 px, title wish is 130 px, and eyebrow
666+ wish is 32 px. A region
662667then applies one scale (about 0.65–1.35) so type fills the box; a single line
663668is not grown. Footer stays on the bottom edge. If the region holds image or a
664669placeholder, type stays at scale 1 and media takes the leftover. Copy that
@@ -673,7 +678,7 @@ column's body length.
673678` card ` (singular) is a plate. ` card.fit ` is ` region ` (default: fill the whole
674679region rect) or ` ink ` (hug measured type plus 24 px pad, placed with the
675680region's ` align ` /` valign ` ). Default fill is the page background + B3 (30%
676- transparency). Override with ` card.fill ` . Inner fields: ` title ` , ` subtitle ` ,
681+ transparency). Override with ` card.fill ` . Inner fields: ` eyebrow ` , ` title ` , ` subtitle ` ,
677682` text ` , ` footer ` , ` image ` , ` cards ` , ` table ` , ` fill ` , ` color ` , ` fit ` . ` cards `
678683(plural) is ` [{ title, subtitle?, text?, price?, image? }] ` and can sit inside
679684` card ` . No nested ` card ` . Sibling ` title ` /` text ` /` cards ` are not allowed next
@@ -742,8 +747,9 @@ enter/motion enums, viewing, installed fonts, and examples in this language.
742747
743748### Compose a deck with fewer corrective steps
744749
745- Prefer region ` title ` /` text ` /` cards ` /` table ` for titles, copy, cards and
746- tables so type fitting, font checks and safe-area diagnostics still run.
750+ Prefer region ` eyebrow ` /` title ` /` text ` /` cards ` /` table ` for kickers, titles,
751+ copy, cards and tables so type fitting, font checks and safe-area diagnostics
752+ still run.
747753Keep illustrations as image assets in a region. A deck is `{ "pages": [ {
748754"id": "intro", ...page overrides, regions } ] }` . ` compose render` of that
749755file is enough. ` compose batch ` adds a contact sheet and ` --only ID ` .
@@ -832,51 +838,63 @@ Codes worth acting on:
832838 adjacent playlist pages show the same media at the same rects; vary the
833839 layout or content when the repeat is accidental.
834840
835- ### Slide, overlay, and wordmark
841+ ### Overlay family (slide-deck pages)
836842
837843Overlay is a compose mechanic for slide-deck pages and live video. It is not
838844the presentable-poster path. A presentable poster, menu, or event still is
839845one generated image with the copy typeset in the still.
840846
841- For deck text over images or video, put copy in a ` card ` so the plate brings type
842- forward. Default ` card.fit ` ` region ` fills the region (a column, a half).
843- ` fit: "ink" ` hugs the measured type plus 24 px; use it for lower thirds and
844- short copy so a two-line ` bottom ` card does not paint a full-width opaque
845- band. The type is sized inside the plate's padding, so the plate contains
846- every line, title and body alike. Default fill is the page background + B3.
847- Override with ` card.fill ` .
848- Keep text opaque. Check contrast over changing bright and dark frames; a
849- poor type-on-plate contrast warns (` card_low_contrast ` ) and does not block
850- render. Do not wrap every region in a card.
847+ Named regions are the only compose language. Copy catalog examples; do not
848+ invent Frame trees, recipes, ` fontSize ` , ` x ` , or ` y ` . Do not put deck copy
849+ through ` playlist templates ` or template ` slots ` — those still
850+ ` vectorChromeError ` .
851851
852- Overlay still (transparent page, ink-fit lower third):
852+ Photo or video is page ` image ` or ` video ` , at rest. Copy is a named region.
853+ ` overlay-left ` , ` overlay-right ` , and ` overlay-bottom ` add a ` card ` .
854+ ` overlay-title ` and ` overlay-still ` do not. Enter lives on the copy region,
855+ from the layout side (page may override). The mark is page ` logo ` , at rest —
856+ not a third raster.
857+
858+ ` compose catalog ` examples name the family:
859+
860+ | example | rails | copy | enter |
861+ | ---| ---| ---| ---|
862+ | ` overlay-title ` | page ` image ` | ` left ` type, no card | ` fade-right ` |
863+ | ` overlay-left ` | page ` image ` | ` left ` card, ` fit ` ` region ` | ` fade-right ` |
864+ | ` overlay-right ` | page ` image ` | ` right ` card, ` fit ` ` region ` | ` fade-left ` |
865+ | ` overlay-bottom ` | page ` image ` or ` video ` | ` bottom ` card, ` fit ` ` region ` | ` fade-up ` |
866+ | ` overlay-still ` | no photo | ` fullpage ` type, no card | ` fade-in ` |
867+ | ` overlay ` | page ` video ` | ` bottom ` card, ` fit ` ` ink ` | ` fade-up ` |
868+
869+ ` card.fit: "region" ` for left/right panels and full-width bands. ` fit: "ink" `
870+ only for a snug lower third. Default fill is the page background + B3.
871+ Override with ` card.fill ` when that wash is too thin; keep text opaque.
872+ Do not wrap every region. Boardroom titles use ` overlay-title ` : type on
873+ ` left ` , ` valign ` bottom, no card. Lone stills and diagrams use ` overlay-still ` :
874+ ` fullpage ` with ` enter: "fade-in" ` and no copy card.
853875
854876``` json
855877{
856878 "width" : 1920 ,
857879 "height" : 1080 ,
858- "background" : " #00000000" ,
859- "brand" : " #C9A227" ,
860- "text" : " #FFFFFF" ,
861- "video" : " ./clip.mp4" ,
862- "bottom" : {
863- "enter" : " fade-up" ,
864- "valign" : " bottom" ,
880+ "background" : " #2A3547" ,
881+ "brand" : " #F8B334" ,
882+ "text" : " #F4F7FA" ,
883+ "image" : " ./still.jpg" ,
884+ "left" : {
885+ "enter" : " fade-right" ,
865886 "card" : {
866- "fit" : " ink" ,
867- "title" : " Lower third" ,
868- "text" : " Keep copy on a snug plate over the picture."
887+ "fit" : " region" ,
888+ "fill" : " #2A3547E6" ,
889+ "eyebrow" : " THE LOW END" ,
890+ "title" : " RAM is shrinking" ,
891+ "text" : " What, when, where, and the next action."
869892 }
870893 }
871894}
872895```
873896
874- Author the overlay at the full slide resolution (1920×1080 in this example),
875- so the type ramp stays at the intended scale. A ` bottom ` card with
876- ` fit: "region" ` is a full-width band; that is not the default for short copy.
877- Keep any separate wordmark clear of the copy and preserve its proportions.
878-
879- For a side rail, put a ` card ` in ` left ` or ` right ` . Do not author ` x ` /` y ` .
897+ Snug lower third (` overlay ` in the catalog):
880898
881899``` json
882900{
@@ -885,20 +903,25 @@ For a side rail, put a `card` in `left` or `right`. Do not author `x`/`y`.
885903 "background" : " #00000000" ,
886904 "brand" : " #C9A227" ,
887905 "text" : " #FFFFFF" ,
888- "left" : {
906+ "video" : " ./clip.mp4" ,
907+ "bottom" : {
908+ "enter" : " fade-up" ,
909+ "valign" : " bottom" ,
889910 "card" : {
890- "title" : " Side title" ,
891- "text" : " What, when, where, and the next action."
911+ "fit" : " ink" ,
912+ "title" : " Lower third" ,
913+ "text" : " Keep copy on a snug plate over the picture."
892914 }
893915 }
894916}
895917```
896918
897- Page ` logo ` is the identity mark: 32 px inset from the chosen corner, contain
898- inside 200×100, never upscaled. Prefer ` logo ` over a hand-placed playlist
899- wordmark when composing the still.
919+ Author the overlay at the full slide resolution (1920×1080 in this example),
920+ so the type ramp stays at the intended scale. Page ` logo ` is the identity
921+ mark: 32 px inset from the chosen corner, contain inside 200×100, never
922+ upscaled. Prefer ` logo ` over a hand-placed playlist wordmark.
900923
901- For a deck overlay playlist: photo ` layer ` 0 + overlay ` layer ` 1 on a
924+ For a deck overlay playlist: photo or video ` layer ` 0 + overlay ` layer ` 1 on a
9029251920×1080 canvas. Use ` content_fit: "fill" ` for a matching-aspect full-canvas
903926overlay; preserve the photo proportions with ` contain ` or intentional ` cover `
904927cropping. Eight-digit hex is how the page stays transparent and the plate
0 commit comments