Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 574e6cb189 | |||
| 358aa62c3a | |||
| ff416777f9 | |||
| 94891af6ee |
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"phase": 0,
|
||||
"stage": "plan",
|
||||
"phase": 1,
|
||||
"stage": "complete",
|
||||
"milestone": "v1.22",
|
||||
"phase_role": "pre_execution",
|
||||
"phase_role": "execution",
|
||||
"attempts": 0,
|
||||
"updated_at": "2026-08-11T14:38:00Z",
|
||||
"updated_at": "2026-08-11T14:45:00Z",
|
||||
"milestone_complete": false,
|
||||
"tag": null,
|
||||
"requirements": ["REQ-254","REQ-255","REQ-256","REQ-257","REQ-258","REQ-259","REQ-260","REQ-261","REQ-262"],
|
||||
"notes": "v1.22 PLAN complete. 7 phases, 4 waves. Plan persisted to PLAN.md. Tags on v1.21.x line."
|
||||
"tag": "v1.21.1",
|
||||
"requirements": ["REQ-254","REQ-255","REQ-256"],
|
||||
"notes": "v1.22 P1 complete. Tag v1.21.1. Theme CSS fixed (padding, overflow, image, title chrome). 23 slide tests pass. Proceeding to P2 (render scripts)."
|
||||
}
|
||||
@@ -84,8 +84,7 @@ CHROME_PATH=/root/.cache/ms-playwright/chromium-1217/chrome-linux64/chrome \
|
||||
|
||||
HTML export inlines images as base64 data URIs. PPTX export requires
|
||||
`--allow-local-files` so the local PNG diagrams are embedded in the file.
|
||||
The render + commit + attach pipeline is automated by `scripts/render_deck.sh`
|
||||
and `scripts/render_slides.sh`.
|
||||
The render + commit + attach pipeline is automated by `scripts/render_slides.sh`.
|
||||
|
||||
### Step 4 — Talking points (presenter cues)
|
||||
|
||||
|
||||
@@ -4,9 +4,18 @@
|
||||
* Palette: S&P Red (#D6002A), Black (#1B1B1B), White (#FFFFFF), Grey (#F0F0F0).
|
||||
* Font: Akkurat Pro (fallback Helvetica Neue / Arial).
|
||||
*
|
||||
* This theme extends Marp's default and applies the S&P palette to ALL slide
|
||||
* chrome — backgrounds, headers/footers, pagination, tables, blockquotes,
|
||||
* code blocks — not just headings.
|
||||
* This theme is a STANDALONE stylesheet (applied via `marp --theme
|
||||
* nova-sp-theme.css`). It does NOT `@import "default"` because Marp's
|
||||
* default theme applies `padding: 56px 64px` (which does not reserve
|
||||
* header/footer space) and other base styles (font, color, list spacing)
|
||||
* that would conflict with the S&P palette. Instead, this theme sets
|
||||
* the padding explicitly: 48px top (reserves header space), 40px bottom
|
||||
* (reserves footer space), 56px sides. This gives precise control over
|
||||
* the padding budget. (GRILL revision 2 — @import rejection documented.)
|
||||
*
|
||||
* v1.22 (REQ-254,255,256): added section padding + overflow handling,
|
||||
* aspect-ratio-aware image rules, title-slide chrome suppression,
|
||||
* paragraph/list/table spacing tightening.
|
||||
*/
|
||||
|
||||
:root {
|
||||
@@ -17,12 +26,17 @@
|
||||
--sp-dark-grey: #2E2E2E;
|
||||
}
|
||||
|
||||
/* Base section */
|
||||
/* Base section — padding reserves header (top) + footer (bottom) space.
|
||||
* REQ-254: zero padding was the root cause of "out of whack" layout.
|
||||
* 48px top reserves header chrome; 40px bottom reserves footer chrome;
|
||||
* 56px sides give breathing room. */
|
||||
section {
|
||||
font-family: "Akkurat Pro", "Helvetica Neue", "Arial", sans-serif;
|
||||
font-size: 22px;
|
||||
color: var(--sp-black);
|
||||
background: var(--sp-white);
|
||||
padding: 48px 56px 40px;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
/* Headings — S&P Red */
|
||||
@@ -31,6 +45,12 @@ h2 { color: var(--sp-red); font-size: 26px; margin-bottom: 0.2em; }
|
||||
h3 { color: var(--sp-red); font-size: 22px; margin-bottom: 0.2em; }
|
||||
h4 { color: var(--sp-dark-grey); font-size: 20px; margin-bottom: 0.15em; }
|
||||
|
||||
/* REQ-256: tighten h2 + lead-paragraph spacing (the deck's recurring
|
||||
* `## Slide N — Title` + `**bold lead**` pattern). Default <p> margins
|
||||
* waste ~44px per slide; this reclaims ~22px. */
|
||||
section h2 + p { margin-top: 0.2em; }
|
||||
section p { margin: 0.4em 0; }
|
||||
|
||||
/* Title slides — black background, red top border */
|
||||
section.title {
|
||||
background: var(--sp-black);
|
||||
@@ -40,6 +60,12 @@ section.title {
|
||||
section.title h1 { color: var(--sp-white); }
|
||||
section.title h2 { color: var(--sp-white); }
|
||||
|
||||
/* REQ-256: suppress header/footer chrome on title slides. The
|
||||
* `<!-- _class: title -->` + `<!-- _paginate: false -->` directives
|
||||
* only suppress the page number, not the chrome. This prevents the
|
||||
* header/footer from colliding with title/appendix content. */
|
||||
section.title header, section.title footer { display: none; }
|
||||
|
||||
/* Tables — grey header with red underline, explicit white body for readability on any background */
|
||||
table { font-size: 18px; width: 100%; border-collapse: collapse; background: var(--sp-white); }
|
||||
th { background: var(--sp-grey); border-bottom: 2px solid var(--sp-red); padding: 6px 10px; text-align: left; }
|
||||
@@ -49,6 +75,12 @@ section.title table, section table { background: var(--sp-white); }
|
||||
section.title td, section td { background: var(--sp-white); color: var(--sp-black); }
|
||||
section.title th, section th { background: var(--sp-grey); color: var(--sp-black); }
|
||||
|
||||
/* REQ-256: dense tables (≥8 rows) use tighter cell padding so 10-13 row
|
||||
* tables (slides 8, 12, A1) fit. Apply via `table.dense` class in the
|
||||
* marp deck. */
|
||||
table.dense td, table.dense th { padding: 4px 8px; }
|
||||
table.dense { font-size: 16px; }
|
||||
|
||||
/* Blockquotes — red left border */
|
||||
blockquote { border-left: 4px solid var(--sp-red); color: var(--sp-dark-grey); font-size: 20px; padding-left: 12px; }
|
||||
|
||||
@@ -57,8 +89,18 @@ pre { background: var(--sp-black); color: var(--sp-white); border-radius: 4px; p
|
||||
code { background: var(--sp-grey); color: var(--sp-black); border-radius: 2px; padding: 1px 4px; font-size: 18px; }
|
||||
pre code { background: transparent; color: inherit; }
|
||||
|
||||
/* Images — centered, max height */
|
||||
img { display: block; margin: 0 auto; max-height: 320px; }
|
||||
/* REQ-255: aspect-ratio-aware image rules. The blunt `max-height: 320px`
|
||||
* broke `w:` directives on tall images (slide 9) and did nothing for
|
||||
* ultra-wide images (slide 6). The new rule uses `object-fit: contain`
|
||||
* and `max-width: 100%` so images scale within the content area without
|
||||
* ignoring explicit `w:`/`h:` directives. */
|
||||
img { display: block; margin: 0 auto; max-width: 100%; max-height: 380px; object-fit: contain; }
|
||||
/* Wide diagrams (ultra-wide aspect): tighter max-height so they don't
|
||||
* render as a thin strip. Apply via `![w:1000 class:wide]` — or rely on
|
||||
* the default max-height which is already tighter. */
|
||||
img.wide { max-height: 280px; }
|
||||
/* Tall diagrams: more vertical room. Apply via `![h:480 class:tall]`. */
|
||||
img.tall { max-height: 480px; }
|
||||
|
||||
/* Header/footer — subtle grey */
|
||||
header { color: var(--sp-dark-grey); border-bottom: 1px solid var(--sp-grey); }
|
||||
@@ -73,9 +115,17 @@ footer { color: var(--sp-dark-grey); border-top: 1px solid var(--sp-grey); }
|
||||
.bespoke-progress-parent { background: var(--sp-grey); }
|
||||
.bespoke-progress-bar { background: var(--sp-red) !important; }
|
||||
|
||||
/* Lists — tighter */
|
||||
/* Lists — tighter. REQ-256: add ol styling (match ul). */
|
||||
ul { margin-top: 0.3em; }
|
||||
ol { margin-top: 0.3em; }
|
||||
li { margin-bottom: 0.2em; }
|
||||
|
||||
/* Strong — S&P Red for emphasis in lead lines */
|
||||
strong { color: var(--sp-red); }
|
||||
|
||||
/* REQ-256: PPTX export fidelity — no scrollbars in exported slides.
|
||||
* The `overflow: auto` above is an authoring-time signal; in print/PPTX
|
||||
* we clamp to `hidden` so the exported slide is clean. */
|
||||
@media print {
|
||||
section { overflow: hidden; }
|
||||
}
|
||||
@@ -1,56 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# scripts/render_deck.sh — render a Marp deck to HTML + PPTX, commit both to git.
|
||||
# REQ-228 (v1.18): PPTX is now a first-class committed artifact + release attachment.
|
||||
#
|
||||
# Usage:
|
||||
# bash scripts/render_deck.sh <deck-name>
|
||||
# bash scripts/render_deck.sh nova-autonomous-cloud-delivery
|
||||
#
|
||||
# Renders:
|
||||
# docs/presentations/<deck-name>-marp.md → docs/presentations/<deck-name>.html (committed)
|
||||
# → docs/presentations/<deck-name>.pptx (committed, binary)
|
||||
#
|
||||
# The PPTX is also attached to the current phase's Gitea release via
|
||||
# scripts/attach_release_asset.py (call separately after ship, or this script
|
||||
# will invoke it if NOVA_GITEA_RELEASE_ID is set).
|
||||
set -euo pipefail
|
||||
|
||||
DECK="${1:?Usage: render_deck.sh <deck-name>}"
|
||||
cd "$(git rev-parse --show-toplevel)"
|
||||
|
||||
SRC="docs/presentations/${DECK}-marp.md"
|
||||
HTML="docs/presentations/${DECK}.html"
|
||||
PPTX="docs/presentations/${DECK}.pptx"
|
||||
|
||||
if [ ! -f "$SRC" ]; then
|
||||
echo "ERROR: source deck $SRC not found" >&2; exit 1
|
||||
fi
|
||||
|
||||
CHROME=""
|
||||
for c in \
|
||||
/root/.cache/ms-playwright/chromium-1217/chrome-linux64/chrome \
|
||||
/usr/bin/chromium \
|
||||
/usr/bin/chromium-browser \
|
||||
/usr/bin/google-chrome; do
|
||||
if [ -x "$c" ]; then CHROME="$c"; break; fi
|
||||
done
|
||||
if [ -z "$CHROME" ]; then
|
||||
echo "WARNING: no Chrome/Chromium found — skipping render (HTML/PPTX will need manual re-render)" >&2
|
||||
exit 0
|
||||
fi
|
||||
export CHROME_PATH="$CHROME"
|
||||
|
||||
echo "Rendering HTML → $HTML"
|
||||
npx --yes @marp-team/marp-cli@latest --allow-local-files "$SRC" -o "$HTML" 2>&1 | tail -3
|
||||
|
||||
echo "Rendering PPTX → $PPTX"
|
||||
npx --yes @marp-team/marp-cli@latest --allow-local-files "$SRC" -o "$PPTX" 2>&1 | tail -3
|
||||
|
||||
git add "$HTML" "$PPTX"
|
||||
echo "Staged $HTML + $PPTX for commit."
|
||||
|
||||
if [ -n "${NOVA_GITEA_RELEASE_ID:-}" ]; then
|
||||
echo "Attaching PPTX to Gitea release $NOVA_GITEA_RELEASE_ID..."
|
||||
python3 scripts/attach_release_asset.py "$PPTX" "$NOVA_GITEA_RELEASE_ID" || \
|
||||
echo "WARNING: attach failed — PPTX is still committed; attach manually."
|
||||
fi
|
||||
@@ -41,16 +41,18 @@ if [ -z "$CHROME" ]; then
|
||||
fi
|
||||
export CHROME_PATH="$CHROME"
|
||||
|
||||
# --- Step 1: render mermaid diagrams (S&P-themed) ---
|
||||
echo "=== Step 1: Rendering mermaid diagrams (S&P theme: $THEME_JSON) ==="
|
||||
# --- Step 1: render mermaid diagrams (S&P-themed, 2x scale, transparent bg) ---
|
||||
# REQ-258: -s 2 (2x scale) + -b transparent (transparent background) per README spec.
|
||||
echo "=== Step 1: Rendering mermaid diagrams (S&P theme: $THEME_JSON, 2x, transparent) ==="
|
||||
if [ -d "$MMD_DIR" ]; then
|
||||
for mmd in "$MMD_DIR"/*.mmd; do
|
||||
name="$(basename "$mmd" .mmd)"
|
||||
png="$PNG_DIR/$name.png"
|
||||
echo " $name.mmd → $name.png"
|
||||
npx --yes @mermaid-js/mermaid-cli \
|
||||
npx --yes @mermaid-js/mermaid-cli@11.16.0 \
|
||||
--configFile "$THEME_JSON" \
|
||||
--puppeteerConfigFile "$PUPPETEER_CFG" \
|
||||
-s 2 -b transparent \
|
||||
--input "$mmd" \
|
||||
--output "$png" 2>&1 | grep -v "^$" || true
|
||||
done
|
||||
@@ -61,13 +63,14 @@ fi
|
||||
echo ""
|
||||
|
||||
# --- Step 2: render Marp deck (S&P-themed) ---
|
||||
# REQ-257: pinned marp-cli version (v4.5.0) to prevent boilerplate-CSS drift.
|
||||
echo "=== Step 2: Rendering Marp deck → HTML + PPTX ==="
|
||||
echo " Theme: $THEME_CSS"
|
||||
echo " HTML → $HTML"
|
||||
npx --yes @marp-team/marp-cli@latest --allow-local-files --theme "$THEME_CSS" "$SRC" -o "$HTML" 2>&1 | tail -3
|
||||
npx --yes @marp-team/marp-cli@4.5.0 --allow-local-files --theme "$THEME_CSS" "$SRC" -o "$HTML" 2>&1 | tail -3
|
||||
|
||||
echo " PPTX → $PPTX"
|
||||
npx --yes @marp-team/marp-cli@latest --allow-local-files --theme "$THEME_CSS" "$SRC" -o "$PPTX" 2>&1 | tail -3
|
||||
npx --yes @marp-team/marp-cli@4.5.0 --allow-local-files --theme "$THEME_CSS" "$SRC" -o "$PPTX" 2>&1 | tail -3
|
||||
echo ""
|
||||
|
||||
# --- Step 3: stage ---
|
||||
|
||||
@@ -117,7 +117,6 @@ EXCLUDE_SCRIPTS=(
|
||||
sync_workflows.py
|
||||
attach_release_asset.py
|
||||
check_north_star_diff.sh
|
||||
render_deck.sh
|
||||
render_slides.sh
|
||||
)
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ _EXCLUDE_SCRIPTS = {
|
||||
"untag_acdl_keys.py", "seed_uptime_monitors.py",
|
||||
"push_consumer_image.py", "sync_workflows.py",
|
||||
"attach_release_asset.py", "check_north_star_diff.sh",
|
||||
"render_deck.sh", "render_slides.sh",
|
||||
"render_slides.sh",
|
||||
}
|
||||
|
||||
# Synced top-level files (not in any excluded dir).
|
||||
|
||||
Reference in New Issue
Block a user