openvibers/openvibe.shared Commits
Shared 2.14.1: the update log names every site (Space, Services, Actor, …), never a lowercase id. (#35)
Changes
@@@ -4,6 +4,12 @@ All notable changes to `openvibe-shared`. Versions follow [semver](https://semvebreaking change to any exported module, browser global or served file name is a new major.A release is the git tag `vX.Y.Z`; consumers pin the tag's tarball (see README).++## 2.14.1 — 2026-10-08++++- shipped.js names every site (Space, Services, Actor, Run, Watch, Download and the rest): the update log showed++ "space", "services" and "actor" in lowercase next to "Host" and "Community". A site missing from the list still reads++ as a name (its id capitalised), and `siteName` is exported.++## 2.14.0 — 2026-10-08- A boost page move no longer keeps the old navbar. 2.13.3 removed the render's document listeners, but panels.js@@@ -1,12 +1,12 @@{"name": "openvibe-shared",-- "version": "2.14.0",++ "version": "2.14.1","lockfileVersion": 3,"requires": true,"packages": {"": {"name": "openvibe-shared",-- "version": "2.14.0",++ "version": "2.14.1","license": "MIT","dependencies": {"jsonwebtoken": "^9.0.0"@@@ -1,6 +1,6 @@{"name": "openvibe-shared",-- "version": "2.14.0",++ "version": "2.14.1","description": "Shared navbar, footer, themes, icons, legal pages, SEO, auth and analytics for every OpenVibe site","main": "index.js","bin": {@@@ -34,7 +34,18 @@}(typeof globalThis !== 'undefined' ? globalThis : this, function () {'use strict';const API = 'https://openvibe.network/api/v1/changelog';-- const SITE_NAMES = { live: 'Live', network: 'Network', tools: 'Tools', media: 'Media', community: 'Community', chat: 'Chat', games: 'Games', blog: 'Blog', wiki: 'Wiki', news: 'News', reviews: 'Reviews', deals: 'Deals', coupons: 'Coupons', trade: 'Trade', codes: 'Codes', host: 'Host', ai: 'AI', search: 'Search', sources: 'Sources', events: 'Events', billing: 'Billing', tips: 'Tips', vip: 'VIP', openre: 'OpenRe', bot: 'Bot', sites: 'Sites', realtime: 'Realtime' };++ // Every OpenVibe service's display name (openvibe-contracts site.name). A service missing here still reads as a name++ // (siteName capitalises its id), never as a lowercase id next to capitalised ones.++ const SITE_NAMES = {++ live: 'Live', network: 'Network', tools: 'Tools', media: 'Media', community: 'Community', chat: 'Chat', games: 'Games',++ blog: 'Blog', wiki: 'Wiki', news: 'News', reviews: 'Reviews', deals: 'Deals', coupons: 'Coupons', trade: 'Trade',++ codes: 'Codes', host: 'Host', ai: 'AI', search: 'Search', sources: 'Sources', events: 'Events', billing: 'Billing',++ tips: 'Tips', vip: 'VIP', openre: 'OpenRe', bot: 'Bot', sites: 'Sites', realtime: 'Realtime', space: 'Space',++ services: 'Services', actor: 'Actor', run: 'Run', watch: 'Watch', node: 'Node', zone: 'Zone', download: 'Download',++ video: 'Video', pics: 'Pics', rent: 'Rent', homes: 'Homes', work: 'Work', food: 'Food', help: 'Help', quest: 'Quest',++ website: 'Website', fund: 'Fund', 'media-hub': 'Media Hub', extensions: 'Extensions', contracts: 'Contracts', sdk: 'SDK',++ shared: 'Shared', examples: 'Examples', publishing: 'Publishing',++ };const STYLE_ID = 'ov-shipped-style';const TEXT = 'var(--text-primary,var(--text,inherit))';const MUTED = 'var(--text-secondary,var(--text-muted,#8b93ad))';@@@ -98,7 +109,7 @@function safeUrl(u) { return /^https:\/\//.test(String(u || '')) ? String(u) : null; }function localHref(u) { const s = String(u || ''); return /^\/(?!\/)/.test(s) || /^https:\/\//.test(s) ? s : null; }function clamp(n, lo, hi, d) { const v = parseInt(n, 10); return Number.isFinite(v) ? Math.min(Math.max(v, lo), hi) : d; }-- const siteName = (id) => SITE_NAMES[id] || id;++ const siteName = (id) => SITE_NAMES[id] || String(id || '').replace(/(^|-)([a-z])/g, (m, d, c) => `${d ? ' ' : ''}${c.toUpperCase()}`);function timeEl(iso) { const t = el('time', { datetime: iso, 'data-ov-ago': '' }, ago(iso)); t.title = new Date(iso).toLocaleString(); return t; }function rocket() {const ns = 'http://www.w3.org/2000/svg';@@@ -371,5 +382,5 @@return out;}-- return { latest, list, mount: list, log, scan, render, renderLatest, appendDays, serviceFor, ago, API, SITE_NAMES };++ return { latest, list, mount: list, log, scan, render, renderLatest, appendDays, serviceFor, ago, API, SITE_NAMES, siteName };}));@@@ -26,6 +26,10 @@ const data = {assert.strictEqual(node.querySelectorAll('img').length, 0, 'commit text is text, never markup');assert.ok(items[0].textContent.includes('<img src=x'));assert.strictEqual(items[0].querySelector('.ov-shipped-site').textContent, 'Live', 'network-wide: each line names its site');++ // Every site reads as its name, never as a lowercase id next to capitalised ones (the owner saw "space", "actor").++ for (const [id, name] of [['space', 'Space'], ['services', 'Services'], ['actor', 'Actor'], ['vip', 'VIP'], ['openre', 'OpenRe'], ['media-hub', 'Media Hub'], ['brand-new', 'Brand New']]) {++ assert.strictEqual(shipped.siteName(id), name, id);++ }assert.strictEqual(items[1].querySelector('a'), null, 'a non-https link is not a link');assert.ok(items[0].querySelector('time').textContent.endsWith('h ago'));assert.strictEqual(node.querySelector('.ov-shipped-notes').getAttribute('href'), data.latest_post.url);
@@ -4,6 +4,12 @@ All notable changes to `openvibe-shared`. Versions follow [semver](https://semve
@@ -4,6 +4,12 @@ All notable changes to `openvibe-shared`. Versions follow [semver](https://semve
breaking change to any exported module, browser global or served file name is a new major.
breaking change to any exported module, browser global or served file name is a new major.
A release is the git tag `vX.Y.Z`; consumers pin the tag's tarball (see README).
A release is the git tag `vX.Y.Z`; consumers pin the tag's tarball (see README).
+## 2.14.1 — 2026-10-08
+
+- shipped.js names every site (Space, Services, Actor, Run, Watch, Download and the rest): the update log showed
+ "space", "services" and "actor" in lowercase next to "Host" and "Community". A site missing from the list still reads
+ as a name (its id capitalised), and `siteName` is exported.
+
## 2.14.0 — 2026-10-08
## 2.14.0 — 2026-10-08
- A boost page move no longer keeps the old navbar. 2.13.3 removed the render's document listeners, but panels.js
- A boost page move no longer keeps the old navbar. 2.13.3 removed the render's document listeners, but panels.js
@@ -1,12 +1,12 @@
@@ -1,12 +1,12 @@
{
{
"name": "openvibe-shared",
"name": "openvibe-shared",
- "version": "2.14.0",
+ "version": "2.14.1",
"lockfileVersion": 3,
"lockfileVersion": 3,
"requires": true,
"requires": true,
"packages": {
"packages": {
"": {
"": {
"name": "openvibe-shared",
"name": "openvibe-shared",
- "version": "2.14.0",
+ "version": "2.14.1",
"license": "MIT",
"license": "MIT",
"dependencies": {
"dependencies": {
"jsonwebtoken": "^9.0.0"
"jsonwebtoken": "^9.0.0"
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-shared",
"name": "openvibe-shared",
- "version": "2.14.0",
+ "version": "2.14.1",
"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": {
@@ -34,7 +34,18 @@
@@ -34,7 +34,18 @@
}(typeof globalThis !== 'undefined' ? globalThis : this, function () {
}(typeof globalThis !== 'undefined' ? globalThis : this, function () {
'use strict';
'use strict';
const API = 'https://openvibe.network/api/v1/changelog';
const API = 'https://openvibe.network/api/v1/changelog';
- const SITE_NAMES = { live: 'Live', network: 'Network', tools: 'Tools', media: 'Media', community: 'Community', chat: 'Chat', games: 'Games', blog: 'Blog', wiki: 'Wiki', news: 'News', reviews: 'Reviews', deals: 'Deals', coupons: 'Coupons', trade: 'Trade', codes: 'Codes', host: 'Host', ai: 'AI', search: 'Search', sources: 'Sources', events: 'Events', billing: 'Billing', tips: 'Tips', vip: 'VIP', openre: 'OpenRe', bot: 'Bot', sites: 'Sites', realtime: 'Realtime' };
+ // Every OpenVibe service's display name (openvibe-contracts site.name). A service missing here still reads as a name
+ // (siteName capitalises its id), never as a lowercase id next to capitalised ones.
+ const SITE_NAMES = {
+ live: 'Live', network: 'Network', tools: 'Tools', media: 'Media', community: 'Community', chat: 'Chat', games: 'Games',
+ blog: 'Blog', wiki: 'Wiki', news: 'News', reviews: 'Reviews', deals: 'Deals', coupons: 'Coupons', trade: 'Trade',
+ codes: 'Codes', host: 'Host', ai: 'AI', search: 'Search', sources: 'Sources', events: 'Events', billing: 'Billing',
+ tips: 'Tips', vip: 'VIP', openre: 'OpenRe', bot: 'Bot', sites: 'Sites', realtime: 'Realtime', space: 'Space',
+ services: 'Services', actor: 'Actor', run: 'Run', watch: 'Watch', node: 'Node', zone: 'Zone', download: 'Download',
+ video: 'Video', pics: 'Pics', rent: 'Rent', homes: 'Homes', work: 'Work', food: 'Food', help: 'Help', quest: 'Quest',
+ website: 'Website', fund: 'Fund', 'media-hub': 'Media Hub', extensions: 'Extensions', contracts: 'Contracts', sdk: 'SDK',
+ shared: 'Shared', examples: 'Examples', publishing: 'Publishing',
+ };
const STYLE_ID = 'ov-shipped-style';
const STYLE_ID = 'ov-shipped-style';
const TEXT = 'var(--text-primary,var(--text,inherit))';
const TEXT = 'var(--text-primary,var(--text,inherit))';
const MUTED = 'var(--text-secondary,var(--text-muted,#8b93ad))';
const MUTED = 'var(--text-secondary,var(--text-muted,#8b93ad))';
@@ -98,7 +109,7 @@
@@ -98,7 +109,7 @@
function safeUrl(u) { return /^https:\/\//.test(String(u || '')) ? String(u) : null; }
function safeUrl(u) { return /^https:\/\//.test(String(u || '')) ? String(u) : null; }
function localHref(u) { const s = String(u || ''); return /^\/(?!\/)/.test(s) || /^https:\/\//.test(s) ? s : null; }
function localHref(u) { const s = String(u || ''); return /^\/(?!\/)/.test(s) || /^https:\/\//.test(s) ? s : null; }
function clamp(n, lo, hi, d) { const v = parseInt(n, 10); return Number.isFinite(v) ? Math.min(Math.max(v, lo), hi) : d; }
function clamp(n, lo, hi, d) { const v = parseInt(n, 10); return Number.isFinite(v) ? Math.min(Math.max(v, lo), hi) : d; }
- const siteName = (id) => SITE_NAMES[id] || id;
+ const siteName = (id) => SITE_NAMES[id] || String(id || '').replace(/(^|-)([a-z])/g, (m, d, c) => `${d ? ' ' : ''}${c.toUpperCase()}`);
function timeEl(iso) { const t = el('time', { datetime: iso, 'data-ov-ago': '' }, ago(iso)); t.title = new Date(iso).toLocaleString(); return t; }
function timeEl(iso) { const t = el('time', { datetime: iso, 'data-ov-ago': '' }, ago(iso)); t.title = new Date(iso).toLocaleString(); return t; }
function rocket() {
function rocket() {
const ns = 'http://www.w3.org/2000/svg';
const ns = 'http://www.w3.org/2000/svg';
@@ -371,5 +382,5 @@
@@ -371,5 +382,5 @@
return out;
return out;
}
}
- return { latest, list, mount: list, log, scan, render, renderLatest, appendDays, serviceFor, ago, API, SITE_NAMES };
+ return { latest, list, mount: list, log, scan, render, renderLatest, appendDays, serviceFor, ago, API, SITE_NAMES, siteName };
}));
}));
@@ -26,6 +26,10 @@ const data = {
@@ -26,6 +26,10 @@ const data = {
assert.strictEqual(node.querySelectorAll('img').length, 0, 'commit text is text, never markup');
assert.strictEqual(node.querySelectorAll('img').length, 0, 'commit text is text, never markup');
assert.ok(items[0].textContent.includes('<img src=x'));
assert.ok(items[0].textContent.includes('<img src=x'));
assert.strictEqual(items[0].querySelector('.ov-shipped-site').textContent, 'Live', 'network-wide: each line names its site');
assert.strictEqual(items[0].querySelector('.ov-shipped-site').textContent, 'Live', 'network-wide: each line names its site');
+ // Every site reads as its name, never as a lowercase id next to capitalised ones (the owner saw "space", "actor").
+ for (const [id, name] of [['space', 'Space'], ['services', 'Services'], ['actor', 'Actor'], ['vip', 'VIP'], ['openre', 'OpenRe'], ['media-hub', 'Media Hub'], ['brand-new', 'Brand New']]) {
+ assert.strictEqual(shipped.siteName(id), name, id);
+ }
assert.strictEqual(items[1].querySelector('a'), null, 'a non-https link is not a link');
assert.strictEqual(items[1].querySelector('a'), null, 'a non-https link is not a link');
assert.ok(items[0].querySelector('time').textContent.endsWith('h ago'));
assert.ok(items[0].querySelector('time').textContent.endsWith('h ago'));
assert.strictEqual(node.querySelector('.ov-shipped-notes').getAttribute('href'), data.latest_post.url);
assert.strictEqual(node.querySelector('.ov-shipped-notes').getAttribute('href'), data.latest_post.url);