diff --git a/README.md b/README.md index f9c0392..ec010f0 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ + + Opcore: specific feedback for coding agents while they edit. Check the change and show the evidence. 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.

-opcore +opcore - - + + -editcheckfeedback +editcheckfeedback repair what was found 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.

-opcore +opcore - - + + -editcheckfeedback +editcheckfeedback repair what was found 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