openvibers/openvibe.shared Commits

4.159.0: menu home screen and wall, Dock, homes v2, ai-marks (#361)

OP OpenVibers committed 4 days ago · 5cc9a7866d · 8 files, +15 −10

* 4.159.0: the menu's home screen and wall, the Dock, no hero pill, changing pages, homes v2, ai-marks, the pin

* Dock: a new share clears the old Send to bar at once

A bar left from an earlier share showed its words until the chat list reloaded (macOS CI caught it: 'From a
page button' where the new link should be). The test waits for the new words instead of reading them once.

* The Dock's new hash in the navbar; the open-state test waits on a slow runner

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 5058b64..1f12582 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -1,6 +1,6 @@
# Changelog
--## Unreleased
++## 4.159.0 — 2026-11-09
- **Homes v2: `openvibe-shared/showcase-stage`** (plan `OpenVibe_Homes_v2_Plan_2026-11-09.md`; the owner, 11-09: "make the
home pages more unique… show the features… custom animations… infographics… a shared, modular system… still SEO
ddiff --git a/README.md b/README.md
iindex dbd4136..1869ed6 100644
---- a/README.md
++++ b/README.md
@@@ -2,7 +2,7 @@
> Versioned UI, the OpenVibe Frame (the navbar, footer and "shipped" views every site sits in), SEO, legal and release-client packages every OpenVibe site renders.
--**Status:** alpha, v4.158.0 (every release is a tag; see [CHANGELOG.md](CHANGELOG.md)). Every deployed
++**Status:** alpha, v4.159.0 (every release is a tag; see [CHANGELOG.md](CHANGELOG.md)). Every deployed
consumer installs a tagged release and none keeps a vendored copy
([docs/migration-plan.md](docs/migration-plan.md) is done); each repository's `package.json` names
the tag it pins.
ddiff --git a/STATUS.json b/STATUS.json
iindex 06c412a..3b37f8d 100644
---- a/STATUS.json
++++ b/STATUS.json
@@@ -4,7 +4,7 @@
"code": true,
"wave": "W2",
"package": "openvibe-shared",
-- "version": "4.158.0",
++ "version": "4.159.0",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"deployed": false,
"deployment": "none of its own: a package released as git tags; OpenVibe.Network serves /shared/* from its pinned tag, and a site can serve its own pinned copy (openvibe-shared/serve)",
ddiff --git a/dock.js b/dock.js
iindex 08a460f..5061d1c 100644
---- a/dock.js
++++ b/dock.js
@@@ -897,7 +897,11 @@
function isOpen() { return !!(el && !el.hidden); }
function share({ text = '', title = '' } = {}) {
const t = String(text || '').trim().slice(0, 4000);
-- if (t) { chats.draft = { text: t, title: String(title || '').trim().slice(0, 140) }; chats.open = null; open({ tab: 'chats' }); }
++ if (!t) return;
++ chats.draft = { text: t, title: String(title || '').trim().slice(0, 140) }; chats.open = null;
++ // A bar left from an earlier share would show the old words until the list reloads: it goes now.
++ const stale = chats.panel && chats.panel.querySelector('.ovdk-share'); if (stale) stale.remove();
++ open({ tab: 'chats' });
}
function open(opts = {}) {
openedAt = typeof performance !== 'undefined' && performance.now ? performance.now() : 0;
ddiff --git a/navbar.js b/navbar.js
iindex 4beef99..47b89e7 100644
---- a/navbar.js
++++ b/navbar.js
@@@ -547,7 +547,7 @@
const NAV_ICONS_REV = 'd9a4febbbad7'; // sha256(nav-icons.js), first 12 hex: its ?v= (cacheable forever)
// END generated
// The files loaded from beside this one, by content (scripts/sibling-revs.js): a release changes their URLs.
-- const SIBLING_REV = { 'ov-mark.js': '1e91c9c0f347', 'ov-glyphs.js': '1a0d8ce6909f', 'ov-brand.woff2': '3b4e6a8a5878', 'ov-look.js': '2a6c53a7b176', 'ov-fx.js': '46fce1e2b8db', 'ov-labels.js': 'a30b178391f5', 'ov-forms.js': '068ce1b1c4d5', 'ov-forms.css': '98cf0f28bb68', 'ov-share.js': '8e55bfe93238', 'ov-share.css': 'cbd18e6ce991', 'search.js': '04ac8238e9ed', 'dock.js': 'd1354be66c41', 'presence.js': '1b675c37d888', 'panels.js': '7d8267ca8035', 'notification-ui.js': 'a2d37237ba0b', 'history.js': '1e6598f78ba4', 'site-switcher.js': '292bea111aa8', 'appbar.js': '1edf7532f228', 'release-watch.js': '25f02a3f0684', 'ov-icons.js': 'ba3981246bc0', 'sso-client.js': '52439265b980', 'overlay.js': '25960cf0c075', 'ov-home.js': '267bf753169d' };
++ const SIBLING_REV = { 'ov-mark.js': '1e91c9c0f347', 'ov-glyphs.js': '1a0d8ce6909f', 'ov-brand.woff2': '3b4e6a8a5878', 'ov-look.js': '2a6c53a7b176', 'ov-fx.js': '46fce1e2b8db', 'ov-labels.js': 'a30b178391f5', 'ov-forms.js': '068ce1b1c4d5', 'ov-forms.css': '98cf0f28bb68', 'ov-share.js': '8e55bfe93238', 'ov-share.css': 'cbd18e6ce991', 'search.js': '04ac8238e9ed', 'dock.js': '45215d0d60f4', 'presence.js': '1b675c37d888', 'panels.js': '7d8267ca8035', 'notification-ui.js': 'a2d37237ba0b', 'history.js': '1e6598f78ba4', 'site-switcher.js': '292bea111aa8', 'appbar.js': '1edf7532f228', 'release-watch.js': '25f02a3f0684', 'ov-icons.js': 'ba3981246bc0', 'sso-client.js': '52439265b980', 'overlay.js': '25960cf0c075', 'ov-home.js': '267bf753169d' };
// The navbar's icons are filled paths (no Font Awesome CSS needed): the ones above ship here, the rest
// (nav-icons.js) load after first paint when a link, chip or menu row names one, into an empty <svg> of their
// size. Anything unknown, or nav-icons.js failing, falls back to <i class="fa-solid">.
ddiff --git a/package-lock.json b/package-lock.json
iindex 1ff9bcd..ce140a9 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -1,12 +1,12 @@
{
"name": "openvibe-shared",
-- "version": "4.158.0",
++ "version": "4.159.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "openvibe-shared",
-- "version": "4.158.0",
++ "version": "4.159.0",
"license": "MIT",
"dependencies": {
"jsonwebtoken": "^9.0.0",
ddiff --git a/package.json b/package.json
iindex 64bb95c..99001f8 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-shared",
-- "version": "4.158.0",
++ "version": "4.159.0",
"description": "Shared navbar, footer, themes, icons, legal pages, SEO, auth and analytics for every OpenVibe site",
"main": "index.js",
"bin": {
ddiff --git a/test/dock-chrome.test.js b/test/dock-chrome.test.js
iindex fad588e..698298b 100644
---- a/test/dock-chrome.test.js
++++ b/test/dock-chrome.test.js
@@@ -344,7 +344,7 @@ async function drag(p, from, to) {
// Cancel: back to the list, nothing waiting.
await share();
await until(p, "!!document.querySelector('.ovdk .ovdk-share')", 'the bar');
-- assert.strictEqual(await p.evaluate("document.querySelector('.ovdk-share-what').textContent"), TEXT, 'with no title, the text itself');
++ await until(p, `(document.querySelector('.ovdk-share-what') || {}).textContent === ${JSON.stringify(TEXT)}`, 'with no title, the text itself');
await p.evaluate("document.querySelector('.ovdk-share-x').click()");
await until(p, "!document.querySelector('.ovdk .ovdk-share') && document.querySelectorAll('.ovdk .ovdk-chat').length === 2", 'the list without the bar');
await p.close();
@@@ -481,7 +481,8 @@ async function drag(p, from, to) {
assert.deepStrictEqual(await p.evaluate("window.__pip.opts"), { width: 360, height: 520 }, 'a window of about 360 × 520');
const inWindow = await until(p, PILL, 'the pill stays');
assert.strictEqual(inWindow.text, 'In a window', 'the page keeps the pill, and it says where the Dock went');
-- await wait(900);
++ // The state write is debounced; a slow runner (macOS CI) needs more than a fixed wait.
++ for (let i = 0; i < 50 && !puts.some((b) => b.open === true); i++) await wait(100);
assert.ok(puts.some((b) => b.open === true), `the Network is told the Dock is open (${JSON.stringify(puts)})`);
assert.ok(!puts.some((b) => 'popped' in b), `and never where its window is: that stays with this page (${JSON.stringify(puts)})`);
// The window is closed: the panel comes back to the page.