@ammduncan/easel 0.2.18 → 0.2.20

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 CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  All notable changes to easel. This project adheres to [Semantic Versioning](https://semver.org/).
4
4
 
5
+ ## 0.2.20 — 2026-05-23
6
+
7
+ ### Fixed
8
+ - **Prose reading-width cap silently missed when content was wrapped in `.wrap`.** The 880px cap only targeted direct body children (`body > p`, `body > h1`, …). But the skill recommends wrapping push content in `<div class="wrap">`, so prose became `body > .wrap > p` and the selector never matched — prose stretched the full card width (defeating the whole point of the reading column, and making the 0.2.19 full-bleed demo look like "everything's wide" rather than "prose narrow, mockup wide"). Extended the cap to also match one level deep through `.wrap`. `.full-bleed` was unaffected (it escapes via viewport units regardless of nesting).
9
+
10
+ ## 0.2.19 — 2026-05-23
11
+
12
+ ### Added
13
+ - **`.full-bleed` utility class for mockups embedded mid-presentation.** The common case: a presentation push with prose intro → embedded UI mockup → more prose. Prose should stay in the ~880px reading column, but the mockup should fill the full card width. `kind: "mockup"` can't help (it strips the frame from the whole push, prose included). Now wrapping just the mockup section in `<div class="full-bleed">` breaks it out of the body padding + 1400px prose cap to span the full card width (`width: 100vw; left: 50%; transform: translateX(-50%)` — inside the iframe 100vw === card width), while everything outside the wrapper stays in the reading column. Documented in the skill and the inline `push` tool description. Two cases, two tools: whole-push recreation → `kind: "mockup"`/`"app"`; embedded mockup → `.full-bleed` wrapper.
14
+
5
15
  ## 0.2.18 — 2026-05-23
6
16
 
7
17
  ### Reverted
@@ -693,13 +693,32 @@ body {
693
693
  body { max-width: 1600px; }
694
694
  }
695
695
  /* Constrain prose to a comfortable reading length, but let visual blocks
696
- (cards, grids, tables, mockups) use the full card width. */
696
+ (cards, grids, tables, mockups) use the full card width. Match prose both
697
+ as direct body children AND one level deep through a `.wrap` container —
698
+ the skill recommends wrapping content in <div class="wrap">, and without
699
+ the `.wrap >` branch the cap silently misses and prose stretches full width.
700
+ `.full-bleed` still escapes via viewport units regardless of nesting. */
697
701
  body > p, body > .deck, body > .lede, body > ul, body > ol, body > blockquote,
698
- body > h1, body > h2, body > h3, body > h4 {
702
+ body > h1, body > h2, body > h3, body > h4,
703
+ body > .wrap > p, body > .wrap > .deck, body > .wrap > .lede,
704
+ body > .wrap > ul, body > .wrap > ol, body > .wrap > blockquote,
705
+ body > .wrap > h1, body > .wrap > h2, body > .wrap > h3, body > .wrap > h4 {
699
706
  max-width: 880px;
700
707
  }
701
708
  body > *:first-child { margin-top: 0 !important; }
702
709
  body > *:last-child { margin-bottom: 0 !important; }
710
+ /* Full-bleed escape hatch for embedded mockups mid-presentation. Wrap a
711
+ section in <div class="full-bleed"> and it spans the full card width,
712
+ breaking out of the body padding + 1400px prose max-width, while the prose
713
+ around it stays in the comfortable reading column. Inside the iframe, 100vw
714
+ === the card's width; left:50% + translateX(-50%) re-centres on the card. */
715
+ .full-bleed {
716
+ width: 100vw;
717
+ position: relative;
718
+ left: 50%;
719
+ transform: translateX(-50%);
720
+ max-width: 100vw;
721
+ }
703
722
  .wrap { display: block; }
704
723
  .kicker {
705
724
  display: block;
package/dist/mcp.js CHANGED
@@ -139,6 +139,7 @@ export async function main() {
139
139
  "═══ LAYOUT ═══\n" +
140
140
  "• Stack desktop mockups VERTICALLY with labels ('Now', 'Proposed') — don't squeeze them side-by-side. The iframe is ~900px wide; two desktop screens at half-width crush columns, wrap headings to 3 lines, and turn tables unreadable.\n" +
141
141
  "• Side-by-side is fine only for narrow mobile mockups, small cards, or short text columns that genuinely fit in half-width.\n" +
142
+ "• Mockup embedded mid-explanation? Prose has a ~880px reading-width cap, but a mockup section should fill the full card. Wrap JUST the mockup in <div class=\"full-bleed\">…</div> — it breaks out of the body padding + prose cap to span the full card width, while surrounding prose stays in the reading column. (If the WHOLE push is a UI recreation, use kind:'mockup'/'app' instead — that strips the entire frame.)\n" +
142
143
  "• One accent color, 3–4 instances max per card. Status colors (red/amber/green) only when state genuinely maps to status.\n\n" +
143
144
  "═══ WHEN TO PUSH ═══\n" +
144
145
  "A response that would otherwise contain: >2 paragraphs of explanation, any UI mockup, a diagram, a code diff, a ≥3-option comparison, or a multi-step progress view. Do NOT ask permission — push proactively. After pushing, reply in chat with ONE LINE: 'pushed to easel ↗ — #<index>'. Don't restate the card's content.\n\n" +
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ammduncan/easel",
3
- "version": "0.2.18",
3
+ "version": "0.2.20",
4
4
  "description": "A live browser tab for every Claude Code (and MCP) session. The push MCP tool appends HTML cards to a scrolling feed you keep open in split-screen.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -265,6 +265,24 @@ Good shapes:
265
265
 
266
266
  ## Built-in helpers
267
267
 
268
+ ### Full-bleed mockups mid-presentation
269
+
270
+ Most mockups appear *inside* an explanation push — prose intro, embedded UI mockup, more prose. The prose should stay in the comfortable reading column, but the mockup should fill the full card width. Wrap just the mockup section in `.full-bleed`:
271
+
272
+ ```html
273
+ <p>Here's the proposed auth screen:</p>
274
+ <div class="full-bleed">
275
+ <!-- desktop mockup — spans the full card width, escaping the prose max-width -->
276
+ </div>
277
+ <p>The left panel uses the existing brand assets…</p>
278
+ ```
279
+
280
+ `.full-bleed` is injected into every presentation push. It breaks the wrapped element out of the body padding + 1400px prose cap to span the full card width, then everything outside it stays in the reading column. This is the right tool when a mockup is one section of a longer push.
281
+
282
+ Two cases, two tools:
283
+ - **Whole push is a mockup / app recreation** → `kind: "mockup"` (or `"app"`) on the push. Strips the entire presentation frame; content owns the canvas.
284
+ - **Mockup embedded in an explanation** → leave the push as-is and wrap the mockup section in `<div class="full-bleed">`.
285
+
268
286
  ### Semantic chips
269
287
 
270
288
  ```html