openvibers/openvibe.help Commits
Home: a taste and a door on phones (#133)
Changes
@@@ -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; }++}@@@ -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' }))}`,});});@@@ -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.5cssFiles: 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 didexternalFiles: 0, // 0};
@@ -102,3 +102,17 @@ mark { background: var(--warning, #f59e0b); color: #10151f; border-radius: 3px;
@@ -102,3 +102,17 @@ mark { background: var(--warning, #f59e0b); color: #10151f; border-radius: 3px;
.q-faq summary .q-site { font-weight: 400; }
.q-faq summary .q-site { font-weight: 400; }
.q-faq details p { margin: 4px 0 0; color: var(--text-secondary, #96a7c2); overflow-wrap: anywhere; }
.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); }
.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; }
+}
@@ -125,15 +125,15 @@ ${searchForm()}</section>
@@ -125,15 +125,15 @@ ${searchForm()}</section>
<section class="sc-sec" aria-labelledby="h-popular"><h2 id="h-popular">Popular questions</h2>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
${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' }))}`,
});
});
});
});
@@ -26,7 +26,7 @@ const BUDGETS = {
@@ -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
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)
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
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
externalFiles: 0, // 0
};
};