openvibers/openvibe.help Commits

Home: a taste and a door on phones (#133)

OP OpenVibers committed 15 days ago · 161141dc8c · 3 files, +19 −5

The forty site cards are a two-column list of names on a phone (each still opens
the site's page; what each one is reads on wide screens and /sites), six popular
questions show (all stay in the HTML and the FAQPage data), the figures sit in
one row, and the closing call that repeated the footer's update log goes. CSS
brotli budget 7.5 -> 8 (measured 7.8).

Changes

ddiff --git a/public/css/app.css b/public/css/app.css
iindex 8107d04..5b3d7fd 100644
---- a/public/css/app.css
++++ b/public/css/app.css
@@@ -102,3 +102,17 @@ mark { background: var(--warning, #f59e0b); color: #10151f; border-radius: 3px;
.q-faq summary .q-site { font-weight: 400; }
.q-faq details p { margin: 4px 0 0; color: var(--text-secondary, #96a7c2); overflow-wrap: anywhere; }
.site-card-count { margin-top: auto; font-size: .8rem; color: var(--text-secondary, #96a7c2); }
++
++/* Phones (2026-10-29): a taste and a door. The figures are one row, six popular questions show, and the forty sites
++ are a two-column list of names (each opens its page; what each one is reads on wide screens and /sites). */
++@media (max-width: 599px) {
++ .help-stats { grid-template-columns: none; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); gap: 8px; }
++ .help-stats div { padding: 10px 12px; }
++ .help-stats dt { font-size: 1.05rem; }
++ .help-stats dd { font-size: .78rem; line-height: 1.35; }
++ .q-faq > details:nth-child(n+7) { display: none; }
++ .site-cards { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
++ .site-card { justify-content: center; min-height: 48px; padding: 8px 12px; }
++ .site-card-line, .site-card-count, .site-card:not(.coming) .site-state { display: none; }
++ .site-card b { overflow-wrap: anywhere; }
++}
ddiff --git a/server/http/pages.js b/server/http/pages.js
iindex fff0f6f..a92b852 100644
---- a/server/http/pages.js
++++ b/server/http/pages.js
@@@ -125,15 +125,15 @@ ${searchForm()}</section>
<section class="sc-sec" aria-labelledby="h-popular"><h2 id="h-popular">Popular questions</h2>
<p class="sc-lede">One question from each site in turn, answered the way the site answers it in its own manifest.</p>
<div class="q-faq">${catalog.popular.map((a) => html`<details><summary><span>${a.question}</span><span class="q-site">${String(a.siteName).replace(/^OpenVibe\./, '')}</span></summary><p>${a.answer}</p><p class="small"><a href="${a.path}">The answer's own page</a> · <a href="/sites/${a.site}">Every ${String(a.siteName).replace(/^OpenVibe\./, '')} question</a></p></details>`)}</div>
--<p class="small"><a href="/sites">All ${catalog.sites.length} sites and their questions</a></p></section>
++<p class="small"><a href="/sites">Every question, site by site</a></p></section>
<section class="sc-sec" aria-labelledby="h-sites"><h2 id="h-sites">Browse by site</h2>
<p class="sc-lede">Live sites first; each name opens that site's page, with its own words and its own questions. <a href="/sites">The full list, with what each one is</a>.</p>
--<ul class="site-cards">${catalog.sites.map((x) => html`<li><a class="site-card${x.live ? '' : ' coming'}" href="/sites/${x.id}"><span class="site-card-top"><b>${x.shortName}</b><span class="site-state">${x.live ? 'live' : 'coming'}</span></span><span class="site-card-line">${x.oneLine}</span>${answersBySite.get(x.domain) ? html`<span class="site-card-count">${String(answersBySite.get(x.domain))} ${answersBySite.get(x.domain) === 1 ? 'answer' : 'answers'}</span>` : ''}</a></li>`)}</ul></section>
++<ul class="site-cards">${catalog.sites.map((x) => html`<li><a class="site-card${x.live ? '' : ' coming'}" href="/sites/${x.id}"><span class="site-card-top"><b>${x.shortName}</b><span class="site-state">${x.live ? 'live' : 'coming'}</span></span><span class="site-card-line">${x.oneLine}</span>${answersBySite.get(x.domain) ? html`<span class="site-card-count">${String(answersBySite.get(x.domain))} ${answersBySite.get(x.domain) === 1 ? 'answer' : 'answers'}</span>` : ''}</a></li>`)}</ul>
++<p class="small"><a href="/sites">All ${catalog.sites.length} sites, with what each one is</a></p></section>
<section class="sc-sec" aria-labelledby="h-contact"><h2 id="h-contact">Contact support</h2>
<p class="sc-lede">Nothing here answered it? Open a ticket: you and the people who run OpenVibe, in one thread.</p>
${contactBlock(req)}</section>
--${raw(showcase.network({ service: 'help' }))}
--${raw(showcase.cta({ title: 'What shipped on OpenVibe.Help', text: 'The update log is the network changelog, filtered to this service.', actions: [{ label: 'The update log', href: '/updates' }, { label: 'The API', href: '/api/v1/sites' }] }))}`,
++${raw(showcase.network({ service: 'help' }))}`,
});
});
ddiff --git a/test/perf-budget.test.js b/test/perf-budget.test.js
iindex f7b8614..74219e1 100644
---- a/test/perf-budget.test.js
++++ b/test/perf-budget.test.js
@@@ -26,7 +26,7 @@ const BUDGETS = {
jsBrotliKB: 76, // 74.2 openvibe-shared 4.25.0: the menu's orb beside the brand, both balances on phones, messages, the account sheet on phones and the bar stepping away on phones; 70.5 Shared 4.17.0: OpenCoins and Vibes chips (wallet: true) in the navbar; 67.9 openvibe-shared 4.15 footer: the compact footer opens into the whole one, and the pulse line; 65.3 Shared 4.12.0: the light/dark switch, the seasonal mark and the theme pairs; 56.5
cssFiles: 2, // 2 (app.css + the cached /shared/showcase.css)
cssRawKB: 37, // 32.4 openvibe-shared 4.26.1 (hero visual); 26.9 with Shared 4.13.0 (2026-10-26: account links); 19.3
-- cssBrotliKB: 7.5, // 6 with Shared 4.13.0 (2026-10-26: account links); 4.6 // raised 7 -> 8 for the openvibe-shared Kit 2 pin (kit.css grew) // back to the pre-Kit 2 value: Kit 2 has its own files (kit-data.css) since openvibe-shared v4.37.0, so kit.css weighs what it did // back to the pre-Kit 2 value: Kit 2 has its own files (kit-data.css) since openvibe-shared v4.37.0, so kit.css weighs what it did
++ cssBrotliKB: 8, // 7.8 the home's phone layout (2026-10-29); 6 with Shared 4.13.0 (2026-10-26: account links); 4.6 // raised 7 -> 8 for the openvibe-shared Kit 2 pin (kit.css grew) // back to the pre-Kit 2 value: Kit 2 has its own files (kit-data.css) since openvibe-shared v4.37.0, so kit.css weighs what it did // back to the pre-Kit 2 value: Kit 2 has its own files (kit-data.css) since openvibe-shared v4.37.0, so kit.css weighs what it did
externalFiles: 0, // 0
};