openvibers/openvibe.shared Commits
Shared 2.12.0: showcase and footer fonts, Space and AI icons and brands (#23)
Changes
@@@ -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@@@ -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;@@@ -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}@@@ -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) : ''; }@@@ -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"@@@ -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": {@@@ -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}@@@ -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}@@@ -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' });
@@ -6,6 +6,17 @@ A release is the git tag `vX.Y.Z`; consumers pin the tag's tarball (see README).
@@ -6,6 +6,17 @@ A release is the git tag `vX.Y.Z`; consumers pin the tag's tarball (see README).
## Unreleased
## 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
## 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
- `ov-icons`: a `bot` glyph (a robot head with its antenna, eyes and side lights, in the family's 24-unit stroke
@@ -20,6 +20,8 @@ const SITES = {
@@ -20,6 +20,8 @@ const SITES = {
community: { accent: ['#34d399', '#2563eb'], dot: '#ffffff' },
community: { accent: ['#34d399', '#2563eb'], dot: '#ffffff' },
games: { accent: ['#a78bfa', '#2563eb'], dot: '#facc15' },
games: { accent: ['#a78bfa', '#2563eb'], dot: '#facc15' },
media: { accent: ['#fbbf24', '#2563eb'], dot: '#ffffff' },
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;
const of = (site) => SITES[site] || SITES.network;
@@ -317,7 +317,7 @@
@@ -317,7 +317,7 @@
// ── Styles (injected once) ─────────────────────────────────
// ── Styles (injected once) ─────────────────────────────────
const CSS = `
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));}
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[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}
.ovf-inner{max-width:1240px;margin:0 auto}
@@ -434,7 +434,7 @@
@@ -434,7 +434,7 @@
live: 'Live', tools: 'Tools', network: 'Network', media: 'Media', games: 'Games',
live: 'Live', tools: 'Tools', network: 'Network', media: 'Media', games: 'Games',
community: 'Community', chat: 'Chat', codes: 'Codes', blog: 'Blog', wiki: 'Wiki',
community: 'Community', chat: 'Chat', codes: 'Codes', blog: 'Blog', wiki: 'Wiki',
news: 'News', reviews: 'Reviews', tips: 'Tips', vip: 'VIP', trade: 'Trade', host: 'Host',
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 = {
const SUB_LABELS = {
json: 'JSON', yaml: 'YAML', xml: 'XML', csv: 'CSV', sql: 'SQL', html: 'HTML', jwt: 'JWT',
json: 'JSON', yaml: 'YAML', xml: 'XML', csv: 'CSV', sql: 'SQL', html: 'HTML', jwt: 'JWT',
@@ -457,7 +457,7 @@
@@ -457,7 +457,7 @@
net: 'Net', img: 'Img', pastes: 'Pastes', paste: 'Pastes', maps: 'Maps', food: 'Food',
net: 'Net', img: 'Img', pastes: 'Pastes', paste: 'Pastes', maps: 'Maps', food: 'Food',
text: 'Text', logo: 'Logo', audio: 'Audio', ai: 'AI', cdn: 'CDN', status: 'Status',
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' };
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) : ''; }
function titleCase(w) { return w ? w.charAt(0).toUpperCase() + w.slice(1) : ''; }
@@ -1,12 +1,12 @@
@@ -1,12 +1,12 @@
{
{
"name": "openvibe-shared",
"name": "openvibe-shared",
- "version": "2.11.0",
+ "version": "2.12.0",
"lockfileVersion": 3,
"lockfileVersion": 3,
"requires": true,
"requires": true,
"packages": {
"packages": {
"": {
"": {
"name": "openvibe-shared",
"name": "openvibe-shared",
- "version": "2.11.0",
+ "version": "2.12.0",
"license": "MIT",
"license": "MIT",
"bin": {
"bin": {
"openvibe-build-assets": "scripts/build-assets.js"
"openvibe-build-assets": "scripts/build-assets.js"
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-shared",
"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",
"description": "Shared navbar, footer, themes, icons, legal pages, SEO, auth and analytics for every OpenVibe site",
"main": "index.js",
"main": "index.js",
"bin": {
"bin": {
@@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
/* Generated by scripts/build-styles.js from showcase.js and ov-icons.js. Do not edit. */
/* 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{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-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}
.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}
@@ -165,7 +165,7 @@ function cta({ title, text, actions: acts } = {}) {
@@ -165,7 +165,7 @@ function cta({ title, text, actions: acts } = {}) {
}
}
const CSS = `
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{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-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}
.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}
@@ -56,6 +56,17 @@ function load(hostname, opts = {}) {
@@ -56,6 +56,17 @@ function load(hostname, opts = {}) {
navbar.init({ service: 'docs' });
navbar.init({ service: 'docs' });
assert.strictEqual(navbar.brand().name, 'MergePDF.OpenVibe.Tools');
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');
const { navbar } = load('openvibe.live');
navbar.init({ service: 'live' });
navbar.init({ service: 'live' });