openvibers/openvibe.design Commits
The Arena's top shows what was chosen: the Pair with the wide gap, and Search and apps (#243)
Changes
@@@ -8,6 +8,16 @@.mx-wrap [hidden]{display:none!important}.mx-hero{display:grid;gap:8px;max-width:860px;margin:0 0 clamp(14px,2.4vw,24px)}.mx-eye{margin:0;font-size:12px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--accent,#4f7cff)}++/* The top shows what was chosen: the mark and the menu button, large, each with its name. No line naming the page. */++.mx-won{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;max-width:560px;margin:0 0 6px}++.mx-won-card{display:grid;justify-items:center;gap:10px;margin:0;padding:18px 10px 14px;border-radius:20px;border:1px solid color-mix(in srgb,var(--accent,#4f7cff) 38%,var(--mx-line));background:radial-gradient(120% 90% at 50% 0%,color-mix(in srgb,var(--accent,#4f7cff) 16%,transparent),transparent 70%),var(--mx-card);animation:mxWon .5s cubic-bezier(.2,.9,.3,1.15) both}++.mx-won-card:nth-child(2){animation-delay:.08s}++@keyframes mxWon{from{opacity:0;transform:translateY(calc(10px*var(--ov-move,1))) scale(.97)}}++.mx-won-card figcaption{display:grid;gap:2px;text-align:center}++.mx-won-card figcaption b{font-family:var(--mx-face);font-size:15px}++.mx-won-card figcaption span{font-size:12px;color:var(--mx-muted)}++.mx-won-btn{display:grid;place-items:center;width:72px;height:53px;color:var(--text-primary,#e6edf7)}++.mx-won-btn svg{fill:currentColor}.mx-won-bar{fill:none;stroke:currentColor;stroke-width:1.9}.mx-won-a{fill:var(--accent-light,#60a5fa)}.mx-hero h1{margin:0;font-family:var(--mx-face);font-weight:900;font-size:clamp(26px,4.2vw,46px);line-height:1.05;letter-spacing:-.02em;text-wrap:balance}.mx-lede,.mx-how{margin:0;max-width:72ch;font-size:clamp(14.5px,1.6vw,16px);line-height:1.55;color:var(--text-secondary,#b4bfcc)}.mx-lede b,.mx-how b{color:var(--text-primary,#e8edf3)}@@@ -808,10 +808,13 @@ function explorePage({ tally = null, wild = false } = {}) {const body = `<div class="mx-wrap" data-mx data-mx-fontcss="${esc(FONT_CSS)}"><svg class="mx-defs" width="0" height="0" aria-hidden="true" focusable="false"><defs>${today.defs}</defs><g id="art-pair-today">${today.body}</g></svg><noscript><style>.mx-panel[hidden]{display:block!important}</style></noscript>--<header class="mx-hero">--<p class="mx-eye">OpenVibe logo vote</p>--<h1>Which logo should OpenVibe use?</h1>--<p class="mx-lede">Tap every logo you like, from both kinds if you want. Then pick a menu button and a font. Votes count right away.</p>++<header class="mx-hero mx-hero--chosen">++<div class="mx-won" aria-label="Chosen on 10 November 2026">++<figure class="mx-won-card"><span class="ov-mark" data-size="96" data-wide></span><figcaption><b>The Pair, wide gap</b><span>P07 · the mark on every site</span></figcaption></figure>++<figure class="mx-won-card"><span class="mx-won-btn" aria-hidden="true"><svg viewBox="0 0 24 24" width="56" height="56"><rect class="mx-won-bar" x="4" y="5.2" width="16" height="5.6" rx="2.8"/><circle class="mx-won-a" cx="7.4" cy="8" r="1.15"/><rect x="4.2" y="14.6" width="4" height="4" rx="1.3"/><rect class="mx-won-a" x="10" y="14.6" width="4" height="4" rx="1.3"/><rect x="15.8" y="14.6" width="4" height="4" rx="1.3"/></svg></span><figcaption><b>Search and apps</b><span>M57 · the menu button, and its close</span></figcaption></figure>++</div>++<h1>The mark and the menu button were chosen here</h1>++<p class="mx-lede">Both are in the bar above this page now. The font is still open: tap the ones you like. Votes count right away, and the logos and buttons stay open to change your mind.</p></header>${tallyBlock(tally, { wild })}<nav class="mx-choose" role="tablist" aria-label="What to choose">@@@ -60,7 +60,8 @@ const explore = require('../server/views/marks-explore');assert.match(r.text, new RegExp(`<section class="mx-panel" id="${tab}" role="tabpanel"`));}assert.match(r.text, /<noscript><style>\.mx-panel\[hidden\]\{display:block!important\}<\/style><\/noscript>/, 'without the script every tab shows');-- assert.match(r.text, /<h1>Which logo should OpenVibe use\?<\/h1>\n<p class="mx-lede">Tap every logo you like, from both kinds if you want\. Then pick a menu button and a font\. Votes count right away\.<\/p>/, 'the top says it simply');++ assert.match(r.text, /<h1>The mark and the menu button were chosen here<\/h1>\n<p class="mx-lede">Both are in the bar above this page now\./, 'the top says what was chosen');++ assert.ok(/class="mx-won"/.test(r.text) && /P07 · the mark on every site/.test(r.text) && /M57 · the menu button, and its close/.test(r.text) && !/class="mx-eye"/.test(r.text), 'and shows both, with no line naming the page above the title');assert.match(r.text, /<span class="mx-qn">1<\/span> <b>Pick a logo<\/b>[\s\S]*?<span class="mx-or" aria-hidden="true">\+<\/span>[\s\S]*?<span class="mx-qn">2<\/span> <b>Pick a menu button<\/b>[\s\S]*?<span class="mx-qn">3<\/span> <b>Pick a font<\/b>/, 'three steps: a logo, a menu button, a font');assert.ok((r.text.match(/<section class="mx-row">/g) || []).length >= 15, 'sorted into rows by idea');assert.match(r.text, /<meta name="robots" content="noindex, follow">/, 'proposals are not indexed');
@@ -8,6 +8,16 @@
@@ -8,6 +8,16 @@
.mx-wrap [hidden]{display:none!important}
.mx-wrap [hidden]{display:none!important}
.mx-hero{display:grid;gap:8px;max-width:860px;margin:0 0 clamp(14px,2.4vw,24px)}
.mx-hero{display:grid;gap:8px;max-width:860px;margin:0 0 clamp(14px,2.4vw,24px)}
.mx-eye{margin:0;font-size:12px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--accent,#4f7cff)}
.mx-eye{margin:0;font-size:12px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--accent,#4f7cff)}
+/* The top shows what was chosen: the mark and the menu button, large, each with its name. No line naming the page. */
+.mx-won{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;max-width:560px;margin:0 0 6px}
+.mx-won-card{display:grid;justify-items:center;gap:10px;margin:0;padding:18px 10px 14px;border-radius:20px;border:1px solid color-mix(in srgb,var(--accent,#4f7cff) 38%,var(--mx-line));background:radial-gradient(120% 90% at 50% 0%,color-mix(in srgb,var(--accent,#4f7cff) 16%,transparent),transparent 70%),var(--mx-card);animation:mxWon .5s cubic-bezier(.2,.9,.3,1.15) both}
+.mx-won-card:nth-child(2){animation-delay:.08s}
+@keyframes mxWon{from{opacity:0;transform:translateY(calc(10px*var(--ov-move,1))) scale(.97)}}
+.mx-won-card figcaption{display:grid;gap:2px;text-align:center}
+.mx-won-card figcaption b{font-family:var(--mx-face);font-size:15px}
+.mx-won-card figcaption span{font-size:12px;color:var(--mx-muted)}
+.mx-won-btn{display:grid;place-items:center;width:72px;height:53px;color:var(--text-primary,#e6edf7)}
+.mx-won-btn svg{fill:currentColor}.mx-won-bar{fill:none;stroke:currentColor;stroke-width:1.9}.mx-won-a{fill:var(--accent-light,#60a5fa)}
.mx-hero h1{margin:0;font-family:var(--mx-face);font-weight:900;font-size:clamp(26px,4.2vw,46px);line-height:1.05;letter-spacing:-.02em;text-wrap:balance}
.mx-hero h1{margin:0;font-family:var(--mx-face);font-weight:900;font-size:clamp(26px,4.2vw,46px);line-height:1.05;letter-spacing:-.02em;text-wrap:balance}
.mx-lede,.mx-how{margin:0;max-width:72ch;font-size:clamp(14.5px,1.6vw,16px);line-height:1.55;color:var(--text-secondary,#b4bfcc)}
.mx-lede,.mx-how{margin:0;max-width:72ch;font-size:clamp(14.5px,1.6vw,16px);line-height:1.55;color:var(--text-secondary,#b4bfcc)}
.mx-lede b,.mx-how b{color:var(--text-primary,#e8edf3)}
.mx-lede b,.mx-how b{color:var(--text-primary,#e8edf3)}
@@ -808,10 +808,13 @@ function explorePage({ tally = null, wild = false } = {}) {
@@ -808,10 +808,13 @@ function explorePage({ tally = null, wild = false } = {}) {
const body = `<div class="mx-wrap" data-mx data-mx-fontcss="${esc(FONT_CSS)}">
const body = `<div class="mx-wrap" data-mx data-mx-fontcss="${esc(FONT_CSS)}">
<svg class="mx-defs" width="0" height="0" aria-hidden="true" focusable="false"><defs>${today.defs}</defs><g id="art-pair-today">${today.body}</g></svg>
<svg class="mx-defs" width="0" height="0" aria-hidden="true" focusable="false"><defs>${today.defs}</defs><g id="art-pair-today">${today.body}</g></svg>
<noscript><style>.mx-panel[hidden]{display:block!important}</style></noscript>
<noscript><style>.mx-panel[hidden]{display:block!important}</style></noscript>
-<header class="mx-hero">
-<p class="mx-eye">OpenVibe logo vote</p>
-<h1>Which logo should OpenVibe use?</h1>
-<p class="mx-lede">Tap every logo you like, from both kinds if you want. Then pick a menu button and a font. Votes count right away.</p>
+<header class="mx-hero mx-hero--chosen">
+<div class="mx-won" aria-label="Chosen on 10 November 2026">
+<figure class="mx-won-card"><span class="ov-mark" data-size="96" data-wide></span><figcaption><b>The Pair, wide gap</b><span>P07 · the mark on every site</span></figcaption></figure>
+<figure class="mx-won-card"><span class="mx-won-btn" aria-hidden="true"><svg viewBox="0 0 24 24" width="56" height="56"><rect class="mx-won-bar" x="4" y="5.2" width="16" height="5.6" rx="2.8"/><circle class="mx-won-a" cx="7.4" cy="8" r="1.15"/><rect x="4.2" y="14.6" width="4" height="4" rx="1.3"/><rect class="mx-won-a" x="10" y="14.6" width="4" height="4" rx="1.3"/><rect x="15.8" y="14.6" width="4" height="4" rx="1.3"/></svg></span><figcaption><b>Search and apps</b><span>M57 · the menu button, and its close</span></figcaption></figure>
+</div>
+<h1>The mark and the menu button were chosen here</h1>
+<p class="mx-lede">Both are in the bar above this page now. The font is still open: tap the ones you like. Votes count right away, and the logos and buttons stay open to change your mind.</p>
</header>
</header>
${tallyBlock(tally, { wild })}
${tallyBlock(tally, { wild })}
<nav class="mx-choose" role="tablist" aria-label="What to choose">
<nav class="mx-choose" role="tablist" aria-label="What to choose">
@@ -60,7 +60,8 @@ const explore = require('../server/views/marks-explore');
@@ -60,7 +60,8 @@ const explore = require('../server/views/marks-explore');
assert.match(r.text, new RegExp(`<section class="mx-panel" id="${tab}" role="tabpanel"`));
assert.match(r.text, new RegExp(`<section class="mx-panel" id="${tab}" role="tabpanel"`));
}
}
assert.match(r.text, /<noscript><style>\.mx-panel\[hidden\]\{display:block!important\}<\/style><\/noscript>/, 'without the script every tab shows');
assert.match(r.text, /<noscript><style>\.mx-panel\[hidden\]\{display:block!important\}<\/style><\/noscript>/, 'without the script every tab shows');
- assert.match(r.text, /<h1>Which logo should OpenVibe use\?<\/h1>\n<p class="mx-lede">Tap every logo you like, from both kinds if you want\. Then pick a menu button and a font\. Votes count right away\.<\/p>/, 'the top says it simply');
+ assert.match(r.text, /<h1>The mark and the menu button were chosen here<\/h1>\n<p class="mx-lede">Both are in the bar above this page now\./, 'the top says what was chosen');
+ assert.ok(/class="mx-won"/.test(r.text) && /P07 · the mark on every site/.test(r.text) && /M57 · the menu button, and its close/.test(r.text) && !/class="mx-eye"/.test(r.text), 'and shows both, with no line naming the page above the title');
assert.match(r.text, /<span class="mx-qn">1<\/span> <b>Pick a logo<\/b>[\s\S]*?<span class="mx-or" aria-hidden="true">\+<\/span>[\s\S]*?<span class="mx-qn">2<\/span> <b>Pick a menu button<\/b>[\s\S]*?<span class="mx-qn">3<\/span> <b>Pick a font<\/b>/, 'three steps: a logo, a menu button, a font');
assert.match(r.text, /<span class="mx-qn">1<\/span> <b>Pick a logo<\/b>[\s\S]*?<span class="mx-or" aria-hidden="true">\+<\/span>[\s\S]*?<span class="mx-qn">2<\/span> <b>Pick a menu button<\/b>[\s\S]*?<span class="mx-qn">3<\/span> <b>Pick a font<\/b>/, 'three steps: a logo, a menu button, a font');
assert.ok((r.text.match(/<section class="mx-row">/g) || []).length >= 15, 'sorted into rows by idea');
assert.ok((r.text.match(/<section class="mx-row">/g) || []).length >= 15, 'sorted into rows by idea');
assert.match(r.text, /<meta name="robots" content="noindex, follow">/, 'proposals are not indexed');
assert.match(r.text, /<meta name="robots" content="noindex, follow">/, 'proposals are not indexed');