openvibers/openvibe.shared Commits

Shared 2.12.0: showcase and footer fonts, Space and AI icons and brands (#23)

OP OpenVibers committed 7 Oct 2026 · 0f75dcddd0 · 9 files, +32 −8

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex d86978c..d7ff22d 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -6,6 +6,17 @@ A release is the git tag `vX.Y.Z`; consumers pin the tag's tarball (see README).
## Unreleased
++## 2.12.0 — 2026-10-07
++
++- `showcase`: the sections (`.sc-hero`, `.sc-sec`, `.sc-cta`) set their own font stack (`--ov-font`, else Inter and
++ the system sans-serif fonts). `shell.page` adds no base stylesheet, so a home built from the shell and the
++ showcase rendered in the browser's default serif face (OpenVibe.Events, Reviews, Deals, Trade, Host).
++- `footer`: the Frame footer sets the same font stack on `.ovf`, as the navbar already does, so it no longer
++ inherits a serif face on pages without a body font.
++- `app-icon`: `space` (indigo, OpenVibe.Space) and `ai` (cyan, OpenVibe.AI) tints.
++- `navbar`: the brand spells `openvibe.space`, `openvibe.services`, `openvibe.events` and `openvibe.bot` with their
++ names (Space, Services, Events, Bot), and the `space` service falls back to the Space brand off the network.
++
## 2.11.0 — 2026-10-07
- `ov-icons`: a `bot` glyph (a robot head with its antenna, eyes and side lights, in the family's 24-unit stroke
ddiff --git a/app-icon.js b/app-icon.js
iindex fe92006..1590ff6 100644
---- a/app-icon.js
++++ b/app-icon.js
@@@ -20,6 +20,8 @@ const SITES = {
community: { accent: ['#34d399', '#2563eb'], dot: '#ffffff' },
games: { accent: ['#a78bfa', '#2563eb'], dot: '#facc15' },
media: { accent: ['#fbbf24', '#2563eb'], dot: '#ffffff' },
++ space: { accent: ['#818cf8', '#4f46e5'], dot: '#ffffff' },
++ ai: { accent: ['#22d3ee', '#2563eb'], dot: '#ffffff' },
};
const of = (site) => SITES[site] || SITES.network;
ddiff --git a/footer.js b/footer.js
iindex 9c2d4ee..c113bc0 100644
---- a/footer.js
++++ b/footer.js
@@@ -317,7 +317,7 @@
// ── Styles (injected once) ─────────────────────────────────
const CSS = `
--.ovf{background:var(--bg-secondary,#12131c);border-top:1px solid var(--border,rgba(255,255,255,.08));margin-top:40px;
++.ovf{background:var(--bg-secondary,#12131c);border-top:1px solid var(--border,rgba(255,255,255,.08));margin-top:40px;font-family:var(--ov-font,'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif);
padding:clamp(24px,4vw,40px) clamp(14px,4vw,32px) calc(clamp(20px,3vw,28px) + env(safe-area-inset-bottom,0px));}
.ovf[data-variant="compact"]{margin-top:24px;padding:14px clamp(12px,3vw,24px) calc(14px + env(safe-area-inset-bottom,0px));}
.ovf-inner{max-width:1240px;margin:0 auto}
ddiff --git a/navbar.js b/navbar.js
iindex 0cc30bf..f0d1429 100644
---- a/navbar.js
++++ b/navbar.js
@@@ -434,7 +434,7 @@
live: 'Live', tools: 'Tools', network: 'Network', media: 'Media', games: 'Games',
community: 'Community', chat: 'Chat', codes: 'Codes', blog: 'Blog', wiki: 'Wiki',
news: 'News', reviews: 'Reviews', tips: 'Tips', vip: 'VIP', trade: 'Trade', host: 'Host',
-- deals: 'Deals', coupons: 'Coupons',
++ deals: 'Deals', coupons: 'Coupons', space: 'Space', services: 'Services', events: 'Events', bot: 'Bot',
};
const SUB_LABELS = {
json: 'JSON', yaml: 'YAML', xml: 'XML', csv: 'CSV', sql: 'SQL', html: 'HTML', jwt: 'JWT',
@@@ -457,7 +457,7 @@
net: 'Net', img: 'Img', pastes: 'Pastes', paste: 'Pastes', maps: 'Maps', food: 'Food',
text: 'Text', logo: 'Logo', audio: 'Audio', ai: 'AI', cdn: 'CDN', status: 'Status',
};
-- const SERVICE_TLD = { live: 'live', tools: 'tools', games: 'games', media: 'media', network: 'network', community: 'community' };
++ const SERVICE_TLD = { live: 'live', tools: 'tools', games: 'games', media: 'media', network: 'network', community: 'community', space: 'space' };
const SERVICE_SUB = { net: 'net', dev: 'dev', paste: 'pastes', maps: 'maps', food: 'food', img: 'img', yt: 'yt', audio: 'audio', text: 'text', logo: 'logo', docs: 'docs' };
function titleCase(w) { return w ? w.charAt(0).toUpperCase() + w.slice(1) : ''; }
ddiff --git a/package-lock.json b/package-lock.json
iindex 75977cd..da8eec1 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -1,12 +1,12 @@
{
"name": "openvibe-shared",
-- "version": "2.11.0",
++ "version": "2.12.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "openvibe-shared",
-- "version": "2.11.0",
++ "version": "2.12.0",
"license": "MIT",
"bin": {
"openvibe-build-assets": "scripts/build-assets.js"
ddiff --git a/package.json b/package.json
iindex 574b79a..aae1302 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-shared",
-- "version": "2.11.0",
++ "version": "2.12.0",
"description": "Shared navbar, footer, themes, icons, legal pages, SEO, auth and analytics for every OpenVibe site",
"main": "index.js",
"bin": {
ddiff --git a/showcase.css b/showcase.css
iindex adcb4ab..9a8cff1 100644
---- a/showcase.css
++++ b/showcase.css
@@@ -1,5 +1,5 @@
/* Generated by scripts/build-styles.js from showcase.js and ov-icons.js. Do not edit. */
--.sc-hero,.sc-sec,.sc-cta{max-width:1080px;margin:0 auto;padding:0 24px}
++.sc-hero,.sc-sec,.sc-cta{max-width:1080px;margin:0 auto;padding:0 24px;font-family:var(--ov-font,'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif)}
.sc-hero{padding-top:56px;padding-bottom:8px}
.sc-hero.sc-split{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);gap:32px;align-items:center}
.sc-eyebrow{display:inline-block;margin:0 0 14px;padding:4px 12px;border-radius:999px;border:1px solid var(--border-light,var(--border,#2c3d5c));background:var(--bg-secondary,#101828);color:var(--accent-light,var(--accent,#60a5fa));font-size:12px;font-weight:700;letter-spacing:.4px}
ddiff --git a/showcase.js b/showcase.js
iindex d1808cf..b07bfc5 100644
---- a/showcase.js
++++ b/showcase.js
@@@ -165,7 +165,7 @@ function cta({ title, text, actions: acts } = {}) {
}
const CSS = `
--.sc-hero,.sc-sec,.sc-cta{max-width:1080px;margin:0 auto;padding:0 24px}
++.sc-hero,.sc-sec,.sc-cta{max-width:1080px;margin:0 auto;padding:0 24px;font-family:var(--ov-font,'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif)}
.sc-hero{padding-top:56px;padding-bottom:8px}
.sc-hero.sc-split{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);gap:32px;align-items:center}
.sc-eyebrow{display:inline-block;margin:0 0 14px;padding:4px 12px;border-radius:999px;border:1px solid var(--border-light,var(--border,#2c3d5c));background:var(--bg-secondary,#101828);color:var(--accent-light,var(--accent,#60a5fa));font-size:12px;font-weight:700;letter-spacing:.4px}
ddiff --git a/test/navbar-brand.test.js b/test/navbar-brand.test.js
iindex 7cc80d2..076fdd6 100644
---- a/test/navbar-brand.test.js
++++ b/test/navbar-brand.test.js
@@@ -56,6 +56,17 @@ function load(hostname, opts = {}) {
navbar.init({ service: 'docs' });
assert.strictEqual(navbar.brand().name, 'MergePDF.OpenVibe.Tools');
}
++{
++ const { navbar } = load('openvibe.space');
++ navbar.init({ service: 'space' });
++ assert.strictEqual(navbar.brand().name, 'OpenVibe.Space');
++ const { navbar: ai } = load('ai.openvibe.services');
++ ai.init({ service: 'ai' });
++ assert.strictEqual(ai.brand().name, 'AI.OpenVibe.Services');
++ const { navbar: off } = load('localhost');
++ off.init({ service: 'space' });
++ assert.strictEqual(off.brand().name, 'OpenVibe.Space', 'off the network the space service keeps its brand');
++}
{
const { navbar } = load('openvibe.live');
navbar.init({ service: 'live' });