diff --git a/README.md b/README.md
index f9c0392..ec010f0 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,6 @@
+
+
diff --git a/docs/brand/README.md b/docs/brand/README.md
index 0fb4d55..fe7930a 100644
--- a/docs/brand/README.md
+++ b/docs/brand/README.md
@@ -11,6 +11,10 @@ handwritten headings and diagrams, yellow notes, and the company mascot.
- `hero.css`: shared layout and theme tokens.
- `opcore-hero-light.png` and `opcore-hero-dark.png`: 2560 × 800 exports
from a 1280 × 400 canvas at 2× scale.
+- `opcore-hero-mobile-light.png` and `opcore-hero-mobile-dark.png`: 1024 × 1280
+ portrait exports from a 512 × 640 canvas at 2× scale. The same HTML sources use
+ the mobile rules in `hero.css`. The README selects these below 641px, before
+ the desktop sources. Larger text and a stacked layout replace the sticky note.
- `assets/`: local fonts, font licenses, and the website mascot. Rendering needs
no network requests.
@@ -40,16 +44,22 @@ const { pathToFileURL } = require('node:url');
viewport: { width: 1280, height: 400 },
deviceScaleFactor: 2,
});
- for (const theme of ['light', 'dark']) {
- const stem = resolve(`docs/brand/opcore-hero-${theme}`);
- await page.goto(pathToFileURL(`${stem}.html`).href);
- await page.evaluate(() => document.fonts.ready);
- const ready = await page.evaluate(() =>
- [...document.fonts].every(font => font.status === 'loaded') &&
- [...document.images].every(image => image.complete && image.naturalWidth > 0)
- );
- if (!ready) throw new Error('Banner assets failed to load');
- await page.locator('.hero').screenshot({ path: `${stem}.png` });
+ for (const layout of ['desktop', 'mobile']) {
+ await page.setViewportSize(layout === 'mobile'
+ ? { width: 512, height: 640 }
+ : { width: 1280, height: 400 });
+ for (const theme of ['light', 'dark']) {
+ const stem = resolve(`docs/brand/opcore-hero-${theme}`);
+ await page.goto(pathToFileURL(`${stem}.html`).href);
+ await page.evaluate(() => document.fonts.ready);
+ const ready = await page.evaluate(() =>
+ [...document.fonts].every(font => font.status === 'loaded') &&
+ [...document.images].every(image => image.complete && image.naturalWidth > 0)
+ );
+ if (!ready) throw new Error('Banner assets failed to load');
+ const output = resolve(`docs/brand/opcore-hero-${layout === 'mobile' ? 'mobile-' : ''}${theme}.png`);
+ await page.locator('.hero').screenshot({ path: output });
+ }
}
} finally {
await browser.close();
@@ -58,7 +68,8 @@ const { pathToFileURL } = require('node:url');
JS
```
-Review both exports at full resolution and README display width before committing.
+Review all four exports at full resolution and their intended README display widths
+before committing, including 390px in both themes.
## Asset provenance
diff --git a/docs/brand/hero.css b/docs/brand/hero.css
index 68f8988..74a9bc8 100644
--- a/docs/brand/hero.css
+++ b/docs/brand/hero.css
@@ -6,18 +6,28 @@
html, body { margin: 0; width: 1280px; height: 400px; }
.hero { position: relative; width: 1280px; height: 400px; overflow: hidden; background: var(--paper); color: var(--ink); font-family: "Reenie Beanie", cursive; }
.hero::after { content: ""; position: absolute; inset: 0; pointer-events: none; opacity: .035; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='240'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E"); }
-.brand { position: absolute; top: 28px; left: 52px; display: flex; align-items: center; gap: 13px; font: 600 15px Fraunces, serif; letter-spacing: 1.3px; }
+.brand { position: absolute; top: 28px; left: 52px; display: flex; align-items: center; gap: 13px; font: 600 16px Fraunces, serif; letter-spacing: 1.3px; }
.brand img { width: 33px; height: 36px; object-fit: contain; }
[data-theme="dark"] .brand img { filter: invert(1); }
-h1 { position: absolute; margin: 0; left: 51px; top: 87px; font-size: 112px; font-weight: 400; line-height: 1; letter-spacing: -2px; }
-.description { position: absolute; top: 206px; left: 56px; margin: 0; font-size: 37px; line-height: 1.12; }
+h1 { position: absolute; margin: 0; left: 51px; top: 87px; font-size: 120px; font-weight: 400; line-height: 1; letter-spacing: -2px; }
+.description { position: absolute; top: 206px; left: 56px; margin: 0; font-size: 44px; line-height: 1.12; }
.emphasis { position: relative; display: inline-block; }
.emphasis::after { content: ""; position: absolute; left: 0; right: 0; bottom: -1px; height: 6px; border-bottom: 2px solid var(--accent); border-radius: 50%; transform: rotate(-1deg); }
-.url { position: absolute; bottom: 29px; left: 56px; margin: 0; color: var(--muted); font: 13px ui-monospace, "SF Mono", Menlo, monospace; letter-spacing: .4px; }
-.note { position: absolute; top: 40px; right: 72px; width: 242px; height: 116px; padding: 18px 23px; margin: 0; background: linear-gradient(153deg,#fbef99 0%,#f5e777 65%,#f0de68 100%); box-shadow: 2px 8px 12px #00000020; transform: rotate(3deg); color: #26221c; font-size: 30px; line-height: 1.02; }
+.url { position: absolute; bottom: 29px; left: 56px; margin: 0; color: var(--muted); font: 16px ui-monospace, "SF Mono", Menlo, monospace; letter-spacing: .4px; }
+.note { position: absolute; top: 40px; right: 72px; width: 278px; height: 124px; padding: 18px 23px; margin: 0; background: linear-gradient(153deg,#fbef99 0%,#f5e777 65%,#f0de68 100%); box-shadow: 2px 8px 12px #00000020; transform: rotate(3deg); color: #26221c; font-size: 34px; line-height: 1.02; }
.note .emphasis::after { border-color: #c2240c; }
.diagram { position: absolute; top: 184px; right: 47px; width: 444px; height: 176px; overflow: visible; }
-.diagram text { font-family: "Reenie Beanie", cursive; font-size: 27px; fill: var(--ink); text-anchor: middle; }
+.diagram text { font-family: "Reenie Beanie", cursive; font-size: 31px; fill: var(--ink); text-anchor: middle; }
.diagram .stroke { fill: none; stroke: var(--ink); stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }
.diagram .retry { fill: none; stroke: var(--accent); stroke-width: 1.5; stroke-linecap: round; stroke-dasharray: 5 5; }
-.diagram .label { fill: var(--accent); font-size: 23px; }
+.diagram .label { fill: var(--accent); font-size: 27px; }
+
+@media (max-width: 640px) {
+ html, body, .hero { width: 512px; height: 640px; }
+ .brand { top: 24px; left: 28px; gap: 10px; font-size: 14px; letter-spacing: .4px; }
+ h1 { top: 80px; left: 27px; font-size: 126px; }
+ .description { top: 218px; left: 28px; width: 456px; font-size: 52px; line-height: 1; }
+ .note { display: none; }
+ .diagram { top: 398px; right: 28px; width: 456px; height: auto; }
+ .url { bottom: 22px; left: 28px; font-size: 21px; }
+}
diff --git a/docs/brand/opcore-hero-dark.html b/docs/brand/opcore-hero-dark.html
index e924a72..5449067 100644
--- a/docs/brand/opcore-hero-dark.html
+++ b/docs/brand/opcore-hero-dark.html
@@ -2,7 +2,7 @@
-
+
Opcore · The Open Engine
@@ -13,12 +13,12 @@ opcore
specific feedback for coding agents,
while they edit.
check the change.
show the evidence.
diff --git a/docs/brand/opcore-hero-dark.png b/docs/brand/opcore-hero-dark.png
index 34d86c4..2091012 100644
Binary files a/docs/brand/opcore-hero-dark.png and b/docs/brand/opcore-hero-dark.png differ
diff --git a/docs/brand/opcore-hero-light.html b/docs/brand/opcore-hero-light.html
index 372d7bf..c6fac9b 100644
--- a/docs/brand/opcore-hero-light.html
+++ b/docs/brand/opcore-hero-light.html
@@ -2,7 +2,7 @@
-
+
Opcore · The Open Engine
@@ -13,12 +13,12 @@ opcore
specific feedback for coding agents,
while they edit.
check the change.
show the evidence.
diff --git a/docs/brand/opcore-hero-light.png b/docs/brand/opcore-hero-light.png
index 337f939..ef385c6 100644
Binary files a/docs/brand/opcore-hero-light.png and b/docs/brand/opcore-hero-light.png differ
diff --git a/docs/brand/opcore-hero-mobile-dark.png b/docs/brand/opcore-hero-mobile-dark.png
new file mode 100644
index 0000000..ad4512e
Binary files /dev/null and b/docs/brand/opcore-hero-mobile-dark.png differ
diff --git a/docs/brand/opcore-hero-mobile-light.png b/docs/brand/opcore-hero-mobile-light.png
new file mode 100644
index 0000000..10a89cb
Binary files /dev/null and b/docs/brand/opcore-hero-mobile-light.png differ