Skip to content

Commit 96124bb

Browse files
cursoragentgersham
andcommitted
Regenerate plugin bundle with composition skill files
Canonical skill source added composition.md and updated SKILL.md; the committed plugins/screenrig copy was stale and failed verify. Co-authored-by: Gersham Meharg <gersham@users.noreply.github.com>
1 parent d5e3ff8 commit 96124bb

2 files changed

Lines changed: 160 additions & 32 deletions

File tree

‎plugins/screenrig/skills/screenrig/SKILL.md‎

Lines changed: 46 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,11 @@ whose permissions are too broad.
255255

256256
## Local compose
257257

258+
When composing signage pages—including posters, ads, menus, schedules, and
259+
video-backed pages—read [Composition and visual direction](references/composition.md)
260+
before choosing a layout. It covers reference research, useful density, independent artwork,
261+
readability, and playlist-wide visual review.
262+
258263
Write JSON, render a PNG, look at that PNG, iterate. Compose is not billed.
259264
Uploads and playlist writes are billed. Iterate `compose render` and read
260265
`<output>.layout.json` before any `media upload`.
@@ -309,10 +314,13 @@ this computer only when the user asked to view the still here. Agent vision
309314
uses the file path, not `--open`. Raster a diagram to PNG or WebP at canvas
310315
size, upload it, and place it as `image`. HTML is not a primitive.
311316

312-
Choose raster dimensions for the screen's **physical content viewport**, not
313-
just the playlist's logical canvas or the full panel when content is
314-
letterboxed. A 1920×1080 slide displayed in a 3840×2160 viewport enlarges
315-
every flattened element 2×, even when its original logo is high resolution.
317+
Plan the canvas from the user's intended output, orientation, and content
318+
viewport. Honor a requested 1920×1080 deliverable even when reviewing on a
319+
larger monitor; desktop dimensions alone do not change the brief. For final
320+
physical display quality, choose raster dimensions for the **physical content
321+
viewport**, excluding letterboxing. A 1920×1080 slide displayed in a
322+
3840×2160 viewport enlarges every flattened element 2×, even when its original
323+
logo is high resolution.
316324
Preserve aspect ratio: use `objectFit: "contain"` for complete marks and
317325
`cover` for intentional cropping; `fill` can distort mismatched proportions.
318326
Source images must support their actual painted pixel dimensions, including
@@ -353,16 +361,17 @@ and tables. Flattening all copy into an SVG or PNG hides it from text fitting,
353361
font checks and safe-area diagnostics. Keep code-native illustrations as image
354362
assets when useful, while leaving adjacent explanatory text measurable.
355363

356-
Start with a recipe from `compose catalog`: `title`, `split-image`, `cards`,
357-
`table`, or `overlay`. Recipes expand to the same ordinary compose nodes;
358-
they keep a 5% content inset and the normal readable type floors. Set `width`
359-
and `height` to the physical content viewport. Omitted dimensions are
364+
Recipes from `compose catalog` (`title`, `split-image`, `cards`, `table`,
365+
`overlay`) are optional starting points, not a visual system for every page.
366+
Use ordinary compose nodes when the content calls for a different hierarchy.
367+
Recipes keep a 5% content inset and the normal readable type floors. Set
368+
`width` and `height` to the intended content viewport. Omitted dimensions are
360369
1920×1080. `split-image` uses `contain` by default; `cover` crops proportionally.
361370
The overlay recipe defaults to a transparent canvas and an approximately 89%
362371
opaque plate with independently opaque text. Omit its `image` to layer the
363372
PNG over native video; include a local image for a flattened still.
364373

365-
For several pages, author one batch instead of separate render/review scripts:
374+
For several pages, `compose batch` provides a shared render and review path:
366375

367376
```json
368377
{
@@ -424,9 +433,10 @@ require server checks. Raster QA alone never proves the playlist is valid.
424433
`flex: 1`, or the copy lives in a `Box` with `pin: "bottom"`. A `Column`
425434
without `flex: 1` shrinks to its text and sits at the top of the Frame.
426435

427-
For text over images or video, prefer a subtly translucent backplate so the
428-
imagery shows through. Start around 85–92% opacity as a visual preference,
429-
then adjust for readability. Compose colors use `#RRGGBBAA`: for example,
436+
For text over images or video, fit support snugly around the copy: a
437+
translucent plate or raster gradient can retain the picture while making type
438+
readable. Choose opacity from the actual imagery; a large nearly opaque panel
439+
is not the default. Compose colors use `#RRGGBBAA`: for example,
430440
`Box.background: "#000000E0"` is black at about 88% opacity. Add padding
431441
around the copy, such as `"padding": "l"`. Apply alpha to the backplate
432442
background only; keep text opaque, such as `"color": "#FFFFFF"`, rather
@@ -456,20 +466,17 @@ Overlay still (transparent Frame, lower-third plate):
456466
}
457467
```
458468

459-
Do not copy a short strip Frame from an older deck. Author the overlay at
460-
the full slide resolution (1920×1080 in this example) with `pin: "bottom"`.
461-
Leave a right pocket for the playlist
462-
wordmark: shrink-wrap `Column` plus `Spacer`. The 5% wordmark rect
463-
`{ x: 1424, y: 946, width: 400, height: 80 }` sits on bottom-plate body
464-
copy. A tighter corner that clears copy is
465-
`{ x: 1544, y: 996, width: 352, height: 68 }`.
466-
467-
Side rail: shrink-wrap `Box` plus `Spacer`, not `pin: "left"` or `"right"`.
468-
A `Row` with `{ Box, Spacer flex: 1 }` is a left rail. Reverse the children
469-
for a right rail. Do not put `flex` on the copy `Box` or Yoga grows it
470-
across the canvas. Force newlines in title and body so min-width lands
471-
around 740–900 px; one long line almost fills the frame. Mix left, right,
472-
and bottom across a photo sequence. Bottom stays right for a lower-third.
469+
Author the overlay at the full slide resolution (1920×1080 in this example),
470+
so the type ramp stays at the intended scale. The pinned bottom plate above
471+
is a full-width lower-third example, not a requirement for every image. Keep
472+
any separate wordmark clear of the copy and preserve its proportions.
473+
474+
For snug side support, use a shrink-wrapped `Box` plus `Spacer` rather than
475+
`pin: "left"` or `"right"`, which stretches the cross axis. A `Row` with
476+
`{ Box, Spacer flex: 1 }` makes a left rail; reverse the children for a right
477+
rail. Omit `flex` on the copy `Box` to avoid growing it across the canvas.
478+
Choose line breaks and measured container sizes for the actual copy and
479+
picture; inspect the resulting plate bounds.
473480

474481
```json
475482
{
@@ -496,9 +503,10 @@ and bottom across a photo sequence. Bottom stays right for a lower-third.
496503
}
497504
```
498505

499-
Playlist: photo `layer` 0 + overlay `layer` 1, both `content_fit: "fill"` on a
500-
1920×1080 canvas. Eight-digit hex is how the Frame stays transparent and the
501-
plate keeps alpha.
506+
Playlist: photo `layer` 0 + overlay `layer` 1 on a 1920×1080 canvas. Use
507+
`content_fit: "fill"` for a matching-aspect full-canvas overlay; preserve the
508+
photo proportions with `contain` or intentional `cover` cropping. Eight-digit
509+
hex is how the Frame stays transparent and the plate keeps alpha.
502510

503511
Wordmark: playlist `image` primitive with a `rect`. Soft-open: omit that
504512
primitive until a named page. Do not pin a logo in compose; `pin` stretches
@@ -636,9 +644,11 @@ These are playlist document fields the CLI sends. The control plane accepts
636644
swipe types and object `enter`.
637645

638646
Default pages: `transition` is `{ "type": "crossfade", "duration_ms": 200 }`.
639-
Author crossfade unless swipe or `enter` is the intended emphasis. One overlay
640-
`enter` is enough; do not put `enter` on every primitive, including the
641-
wordmark.
647+
Author crossfade unless swipe or `enter` is the intended emphasis. Select
648+
foreground artwork or a short headline for restrained entrances; leave menu
649+
items, prices, and other information stationary. Video already supplies
650+
motion. Choose animated layers by purpose, without a fixed layer quota or
651+
an entrance on every primitive.
642652

643653
`transition.type` is `crossfade`, `swipe-left`, `swipe-right`, `swipe-up`, or
644654
`swipe-down`. `duration_ms` is required and runs from 0 through 60000. When
@@ -659,6 +669,10 @@ fields and not CLI flags. Do not send duration or delay inside `enter`.
659669
To slide text in over a still or video, compose the text and its translucent
660670
plate into a transparent PNG, place that image above the background's layer,
661671
and apply `enter` to the overlay image. Keep the background independent.
672+
The same mechanism works for independent foreground artwork with alpha.
673+
Leave transparent breathing room around moving ink within its raster and
674+
primitive rect so entry motion does not clip its edges; do not stretch the
675+
asset to compensate. Keep supported timing constants unchanged.
662676
Preview the first activation and a loop replay on each intended player; check
663677
that the overlay begins hidden, enters within its rect, and retains the
664678
expected layer order. A settled screenshot alone cannot verify animation.
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
# Composition and visual direction
2+
3+
Make signage that belongs in its real setting: a persuasive event poster, an
4+
orderable restaurant menu, or an inviting moving welcome. A technically valid
5+
title/body/footer slide can still look like generic PowerPoint. Choose the
6+
visual hierarchy from the content and genre, not from the first available
7+
recipe.
8+
9+
## Learn from comparable screens
10+
11+
When establishing a visual direction, inspect a few strong comparable screens,
12+
posters, or menus using available browsing and image-viewing tools. Reuse that
13+
understanding for minor edits; a fresh research phase is not always needed.
14+
Inspect the visual examples, not just search snippets. Official venue and restaurant pages, published menus,
15+
and public design portfolios can reveal category grouping, information density,
16+
type scale, photograph placement, price alignment, and the space given to
17+
branding. Prefer examples relevant to the brief over an unrelated mood board.
18+
If browsing is unavailable, use supplied references and disclose that limit.
19+
20+
Borrow and recreate successful layout and information structure with the user's
21+
content. Use supplied, original, or appropriately licensed imagery; copying a
22+
composition does not require copying another business's private art or assets.
23+
Keep source notes for material references. Historical menus can inform layout, but do not establish current prices or offerings.
24+
25+
## Compose for the content
26+
27+
Use deliberate depth, overlap, contrast, scale, and negative space to guide the
28+
eye. Rich composition can be clear: complexity should organize or express
29+
something. Arbitrary minimalism, gratuitous decoration, and a repeated grid of
30+
cards can each weaken the result. There is no fixed template or maximum layer
31+
count; every element should earn its space.
32+
33+
- **Creative poster playlists:** vary authentic art direction and composition
34+
across distinct concepts where the brief invites it: photographic editorial,
35+
illustration, collage, bold typography, or other genre-appropriate styles.
36+
Changing only colors and titles leaves the same visual hierarchy. A real
37+
campaign or brand still needs consistent identity across its pages.
38+
- **Menus:** keep most of the canvas useful for choosing an order. Group actual
39+
categories, make item names and prices easy to scan, and subordinate concise
40+
descriptions, size choices, modifiers, and add-ons. Product photographs should
41+
support the choices, with enough presence to be useful. Keep branding compact;
42+
do not turn every menu into a large logo and three decorative dishes. Preserve
43+
consistent type, price alignment, and grouping within one restaurant system;
44+
different restaurant genres can need different structures and densities.
45+
- **Events and promotions:** make what, when, where, and the next action legible
46+
alongside the expressive imagery. Use the user's facts. For a requested demo,
47+
invent coherent fictional details; do not present invented dates, offers, or
48+
prices as a real business's information.
49+
- **Schedules and noticeboards:** make time, activity, location, and status
50+
easy to scan, with a clear date, audience, and next step. A consistent grid
51+
can be the right structure for functional information; choose it when it
52+
helps people find what they need.
53+
- **Video-backed pages:** full-bleed video is useful when it serves the content.
54+
Plan the crop, focal subject, and copy together. Keep aspect ratio intact and
55+
verify source resolution against the painted area after cropping; a 720p clip
56+
expanded to 1080p does not become a 1080p source. Check readable text against
57+
changing light and motion, not only a convenient frame.
58+
59+
## Build actual depth and purposeful motion
60+
61+
For a layered composition, use independent foreground images with real alpha
62+
where appropriate: a product cutout, figure, illustrated object, or collage
63+
fragment can sit above a background and alongside or across typography. A
64+
flattened poster with separately animated text is not independent moving
65+
artwork. Decide which elements must remain separate before rendering assets.
66+
Rasterize foreground art at its intended painted resolution; preserve clean
67+
alpha edges and its relationship to the background. Use measured compose text
68+
for functional copy, then place its output and artwork as image primitives.
69+
70+
Keep support behind text close to its actual bounds. Prefer sufficient contrast
71+
from the composition itself, a snug translucent surface, or a soft raster
72+
gradient over a giant opaque plate that hides the imagery. Keep text opaque;
73+
adjust the support independently. A full-width lower third is useful when the
74+
content calls for one, rather than a default applied to every page.
75+
76+
Use restrained entry animation for emphasis: foreground artwork or a short
77+
headline can draw attention while functional information settles immediately.
78+
Menu items, descriptions, prices, and ordering information should remain
79+
stationary. Video already provides motion, so additional entrances need a
80+
reason. Do not animate everything or enforce a quota. Keep foreground raster
81+
padding and primitive bounds large enough for clean motion without changing
82+
the artwork's intended scale. The main skill's Page motion section defines the
83+
supported `enter` types, fixed timing, and review mechanics.
84+
85+
Read the selected CLI's `compose catalog` and current command help before
86+
authoring effects. Do not invent native rotation, shadows, gradient node fields,
87+
or animation controls. When an unsupported visual treatment is needed, bake it
88+
into an appropriate image asset using available tools and preserve transparent
89+
padding. Distinguish supported compose text shadows and canvas backgrounds from
90+
effects on playlist primitives; they are not interchangeable APIs.
91+
92+
## Review the intended output
93+
94+
Honor the requested canvas and orientation, including a 1920×1080 target shown
95+
in a window on a larger monitor. Plan source density for the intended display
96+
viewport and preserve logos with `contain`; never stretch a mark to fill a box.
97+
The main skill's Local compose section covers resolution diagnostics and
98+
scaling mechanics.
99+
100+
Review the whole playlist locally for rhythm, repeated adjacent hierarchies,
101+
authentic genre treatment, and consistency within a brand. Then inspect
102+
individual pages at the intended size for useful information, readable prices,
103+
crop, contrast, clean alpha, and awkward overlaps. A contact sheet reveals
104+
repetition; individual full-resolution images reveal detail. For separate
105+
layers, inspect the combined composition as well as the individual assets.
106+
Zero truncation and valid JSON do not prove compelling design. Choose page
107+
timing for the brief, reading load, and media; do not carry a fixed duration
108+
from an unrelated playlist.
109+
110+
Correct observed problems with focused local renders before uploading. Use
111+
motion previews when available; a settled still cannot verify an entrance or
112+
video behavior. Match any player verification to the authorized task and state
113+
what was actually observed. Do not turn creative review into a mandatory paid
114+
generation loop or repeat expensive testing without a specific unresolved issue.

0 commit comments

Comments
 (0)