@ammduncan/easel 0.2.17 → 0.2.19

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.19 — 2026-05-23
6
+
7
+ ### Added
8
+ - **`.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.
9
+
10
+ ## 0.2.18 — 2026-05-23
11
+
12
+ ### Reverted
13
+ - **Reverted the 0.2.17 full-bleed *card* breakout.** That change made `kind: mockup/app` cards grow to near-full viewport width — wrong axis. The actual ask was for the *content* to fill the card edge-to-edge (no inner inset), with the card itself staying at the normal reading-column width. That's already handled by app-fidelity mode (0.2.13): the wrapper sets `body { margin:0; padding:0 }`, `.push-body` has no padding, and the iframe is `width:100%`, so mockup content fills the card to its rounded edges. Cards now stay column-width again; mockup content still bleeds to the card edges.
14
+
5
15
  ## 0.2.17 — 2026-05-23
6
16
 
7
17
  ### Added
@@ -501,18 +501,6 @@ body {
501
501
  animation: pop-in 360ms cubic-bezier(0.2, 0.7, 0.2, 1);
502
502
  }
503
503
 
504
- /* App-fidelity pushes (kind: mockup / app) break out of the feed column to
505
- near-full viewport width, so desktop UI recreations render at real desktop
506
- proportions instead of being squeezed to the ~1540px reading column.
507
- margin-left:50% moves the left edge to the column's centre line (which is
508
- the viewport centre, since .feed is margin:0 auto), then translateX(-50%)
509
- pulls back by half the element's own width → viewport-centred full bleed. */
510
- .push--full-bleed {
511
- width: min(98vw, 1920px);
512
- margin-left: 50%;
513
- transform: translateX(-50%);
514
- }
515
-
516
504
  @keyframes pop-in {
517
505
  from { opacity: 0; transform: translateY(10px); }
518
506
  to { opacity: 1; transform: none; }
@@ -426,11 +426,6 @@
426
426
  const card = document.createElement("article");
427
427
  card.className = "push";
428
428
  if (opts && opts.fresh) card.classList.add("fresh");
429
- // App-fidelity pushes (mockup / app) break out of the feed column to
430
- // near-full viewport width so desktop screens render at real proportions.
431
- if (push.kind === "mockup" || push.kind === "app") {
432
- card.classList.add("push--full-bleed");
433
- }
434
429
  card.id = "push-" + push.id;
435
430
 
436
431
  const meta = document.createElement("div");
@@ -705,6 +700,18 @@ body > h1, body > h2, body > h3, body > h4 {
705
700
  }
706
701
  body > *:first-child { margin-top: 0 !important; }
707
702
  body > *:last-child { margin-bottom: 0 !important; }
703
+ /* Full-bleed escape hatch for embedded mockups mid-presentation. Wrap a
704
+ section in <div class="full-bleed"> and it spans the full card width,
705
+ breaking out of the body padding + 1400px prose max-width, while the prose
706
+ around it stays in the comfortable reading column. Inside the iframe, 100vw
707
+ === the card's width; left:50% + translateX(-50%) re-centres on the card. */
708
+ .full-bleed {
709
+ width: 100vw;
710
+ position: relative;
711
+ left: 50%;
712
+ transform: translateX(-50%);
713
+ max-width: 100vw;
714
+ }
708
715
  .wrap { display: block; }
709
716
  .kicker {
710
717
  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.17",
3
+ "version": "0.2.19",
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