Skip to content

Commit 960e44e

Browse files
committed
Refresh Product Hunt gallery assets
1 parent 8129c60 commit 960e44e

10 files changed

Lines changed: 23 additions & 37 deletions
10.4 KB
Loading
9.76 KB
Loading
-7.24 KB
Loading
-1.78 KB
Loading
-102 KB
Loading
10.1 KB
Loading
-3.95 KB
Loading
7.75 KB
Loading
-31 Bytes
Loading

assets/webstore-explainer-2026-5/render.mjs

Lines changed: 23 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -89,16 +89,7 @@ const baseCss = `
8989
.proof { --bg1:#f7f6ff; --bg2:#eef4ff; --ink:#171a2b; --muted:#5a6274;
9090
--accent:#6e56cf; --accent2:#f0a52b; --border:rgba(30,34,64,0.13);
9191
--panel:rgba(255,255,255,0.9); --shadow:0 28px 70px rgba(38,34,78,0.18); }
92-
.content { position: relative; z-index: 1; width: 100%; height: 100%; padding: 44px 56px; }
93-
.eyebrow {
94-
display: inline-flex; align-items: center; gap: 10px; padding: 10px 15px;
95-
color: var(--accent); background: var(--panel); border: 1px solid var(--border);
96-
border-radius: 999px; font-family: var(--mono); font-size: 13.5px; font-weight: 650;
97-
text-transform: uppercase; letter-spacing: 0.07em; line-height: 1;
98-
}
99-
.head { display: flex; align-items: center; justify-content: flex-end; }
100-
.eyebrow .dot { width: 9px; height: 9px; border-radius: 999px; background: var(--accent2);
101-
box-shadow: 0 0 0 5px color-mix(in srgb, var(--accent2) 18%, transparent); }
92+
.content { position: relative; z-index: 1; padding: 38px 48px; }
10293
h1 {
10394
margin: 18px 0 0; font-family: var(--display); font-size: 62px; line-height: 1.05;
10495
font-weight: 800; letter-spacing: -0.02em; font-variation-settings: 'opsz' 72;
@@ -107,6 +98,7 @@ const baseCss = `
10798
.sub { margin-top: 16px; color: var(--muted); font-size: 24px; font-weight: 520; letter-spacing: -0.005em; }
10899
.num { font-family: var(--display); font-weight: 800; letter-spacing: -0.03em;
109100
font-variation-settings: 'opsz' 96; }
101+
.stack { height: 100%; display: flex; flex-direction: column; justify-content: center; }
110102
.crop-frame {
111103
overflow: hidden; border: 1px solid var(--border); border-radius: 24px;
112104
background: #ffffff; box-shadow: var(--shadow); position: relative;
@@ -117,6 +109,7 @@ const baseCss = `
117109
/* ---------- 01 HERO (dark + light variant) ---------- */
118110
function hero(light = false) {
119111
return {
112+
scale: 1.3,
120113
file: light ? '01-hero-light.png' : '01-hero.png',
121114
theme: light ? 'hero-light' : 'dark',
122115
body: `
@@ -148,13 +141,12 @@ function actScene() {
148141
['live', 'Clicking Search…'],
149142
];
150143
return {
144+
scale: 1.08,
151145
file: '02-tell-the-browser.png',
152146
theme: 'act',
153147
body: `
154-
<div class="head">
155-
<span class="eyebrow"><span class="dot"></span>Act mode</span>
156-
</div>
157-
<div style="text-align:center; margin-top:34px;">
148+
<div class="stack">
149+
<div style="text-align:center;">
158150
<h1 style="margin:0; font-size:58px;">Tell the browser what to do.</h1>
159151
</div>
160152
@@ -222,6 +214,7 @@ function actScene() {
222214
Pauses before anything irreversible
223215
</div>
224216
</div>
217+
</div>
225218
</div>`,
226219
};
227220
}
@@ -232,13 +225,11 @@ function askScene() {
232225
const s = 1.62;
233226
const x = 906, y = 122, w = 374, h = 352;
234227
return {
228+
scale: 1.03,
235229
file: '03-ask-any-page.png',
236230
theme: 'read',
237231
body: `
238-
<div class="head">
239-
<span class="eyebrow"><span class="dot"></span>Ask mode</span>
240-
</div>
241-
<div style="display:grid; grid-template-columns: 480px 1fr; gap:48px; align-items:center; height:calc(100% - 60px);">
232+
<div style="display:grid; grid-template-columns: 480px 1fr; gap:48px; align-items:center; height:100%;">
242233
<div>
243234
<h1>Ask any page.<br>Get the useful part.</h1>
244235
<div class="sub">Clean answers from messy pages. Read-only by default.</div>
@@ -258,13 +249,11 @@ function modelsScene() {
258249
const s = 0.82;
259250
const x = 418, y = 6, w = 744, h = 742;
260251
return {
252+
scale: 1.04,
261253
file: '04-any-llm.png',
262254
theme: 'provider',
263255
body: `
264-
<div class="head">
265-
<span class="eyebrow"><span class="dot"></span>Any LLM</span>
266-
</div>
267-
<div style="display:grid; grid-template-columns: 470px 1fr; gap:44px; align-items:center; height:calc(100% - 60px);">
256+
<div style="display:grid; grid-template-columns: 470px 1fr; gap:44px; align-items:center; height:100%;">
268257
<div>
269258
<h1>Use the model you trust.</h1>
270259
<div class="sub">Local, cloud, or your own keys &mdash; switch anytime.</div>
@@ -291,13 +280,11 @@ function planScene(light = false) {
291280
: { bg: '#151c2a', border: 'rgba(255,255,255,0.16)', shadow: '0 30px 80px rgba(0,0,0,0.42)',
292281
label: '#8d99ad', step: '#d7e2ea', onAccent: '#102319' };
293282
return {
283+
scale: 1.22,
294284
file: light ? '05-plan-before-act-light.png' : '05-plan-before-act.png',
295285
theme: light ? 'plan-light' : 'plan',
296286
body: `
297-
<div class="head">
298-
<span class="eyebrow"><span class="dot"></span>Plan before Act</span>
299-
</div>
300-
<div style="display:grid; grid-template-columns: 500px 1fr; gap:48px; align-items:center; height:calc(100% - 60px);">
287+
<div style="display:grid; grid-template-columns: 440px 1fr; gap:40px; align-items:center; height:100%;">
301288
<div>
302289
<h1>See the plan before it touches the page.</h1>
303290
<div class="sub">Approve first. You stay in the loop.</div>
@@ -332,13 +319,11 @@ function planScene(light = false) {
332319
/* ---------- 06 LAUNCH OFFER ---------- */
333320
function offerScene() {
334321
return {
322+
scale: 1.3,
335323
file: '06-launch-offer.png',
336324
theme: 'dark',
337325
body: `
338-
<div class="head">
339-
<span class="eyebrow"><span class="dot"></span>Launch offer</span>
340-
</div>
341-
<div style="height:calc(100% - 60px); display:flex; flex-direction:column; align-items:center; justify-content:center; text-align:center;">
326+
<div style="height:100%; display:flex; flex-direction:column; align-items:center; justify-content:center; text-align:center;">
342327
<h1 style="font-size:60px;">WebBrain Cloud launch pricing</h1>
343328
<div style="display:flex; align-items:baseline; gap:28px; margin-top:30px;">
344329
<!-- Bricolage sets line-through low on heavy figures, so the strike is drawn manually. -->
@@ -375,18 +360,17 @@ function proofScene() {
375360
['BW', '#8b5cf6'], ['RO', '#d14f6d'],
376361
];
377362
return {
363+
scale: 1.12,
378364
file: '07-social-proof.png',
379365
theme: 'proof',
380366
body: `
381-
<div class="head">
382-
<span class="eyebrow"><span class="dot"></span>Open source</span>
383-
</div>
384367
385-
<div style="text-align:center; margin-top:44px;">
368+
<div class="stack">
369+
<div style="text-align:center;">
386370
<h1 style="margin:0; font-size:64px;">Built in the open.</h1>
387371
</div>
388372
389-
<div style="display:grid; grid-template-columns:repeat(3, 1fr); gap:26px; width:1120px; margin:52px auto 0;">
373+
<div style="display:grid; grid-template-columns:repeat(3, 1fr); gap:26px; width:1040px; margin:52px auto 0;">
390374
${stats.map(([glyph, value, label]) => `
391375
<div style="background:var(--panel); border:1px solid var(--border); border-radius:26px;
392376
padding:40px 24px 36px; text-align:center; box-shadow:var(--shadow);">
@@ -396,7 +380,7 @@ function proofScene() {
396380
</div>`).join('')}
397381
</div>
398382
399-
<div style="width:1120px; margin:44px auto 0; display:flex; align-items:center; justify-content:space-between;
383+
<div style="width:1040px; margin:44px auto 0; display:flex; align-items:center; justify-content:space-between;
400384
gap:24px; background:#171827; border:1px solid rgba(255,255,255,0.12); border-radius:22px;
401385
padding:22px 26px; color:#fff; box-shadow:0 24px 60px rgba(23,26,43,0.3);">
402386
<div style="display:flex; align-items:center; gap:14px; min-width:0;">
@@ -425,6 +409,7 @@ function proofScene() {
425409
<path d="M12 2.2l2.95 5.98 6.6.96-4.78 4.66 1.13 6.57L12 17.27l-5.9 3.1 1.13-6.57L2.45 9.14l6.6-.96z"/>
426410
</svg>Star</span>
427411
</div>
412+
</div>
428413
</div>`,
429414
};
430415
}
@@ -437,7 +422,8 @@ const scenes = [
437422
function html(scene) {
438423
return `<!doctype html><html><head><meta charset="utf-8">
439424
<style>${baseCss}</style></head>
440-
<body><main class="canvas ${scene.theme}"><div class="content">${scene.body}</div></main></body></html>`;
425+
<body><main class="canvas ${scene.theme}"><div class="content" style="width:${W / (scene.scale ?? 1)}px;
426+
height:${H / (scene.scale ?? 1)}px; zoom:${scene.scale ?? 1};">${scene.body}</div></main></body></html>`;
441427
}
442428

443429
async function renderAll() {

0 commit comments

Comments
 (0)