openvibers/openvibe.shared Commits

4.99.1: the conversation's head follows the navbar as it slides away on a phone (#259)

OP OpenVibers committed 11 days ago · 31abf64ef5 · 6 files, +21 −9

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex ae5900d..1df593d 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -4,6 +4,13 @@ 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.
A release is the git tag `vX.Y.Z`; consumers pin the tag's tarball (see README).
++## 4.99.1 — 2026-11-02
++
++- **The conversation's head follows the navbar on a phone.** The navbar slides away while you read down. The thread's
++ sticky head stayed where the bar had been, leaving a gap with the thread showing through. ov-thread.js now finds the
++ bar on each measure (navbar.js may draw it after the kit starts) and measures again once the slide ends.
++- docs/thread.md: `OVThread.tool` and `toolDone` take the tool call's `key`.
++
## 4.99.0 — 2026-11-02
- **The conversation UI shows several agents, approvals and what the work produced** (plan L55 C4 stage 3, for Codes):
ddiff --git a/README.md b/README.md
iindex 0acbcca..52ab177 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.99.0 (every release is a tag; see [CHANGELOG.md](CHANGELOG.md)). Every deployed
++**Status:** alpha, v4.99.1 (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 724db4d..398e486 100644
---- a/STATUS.json
++++ b/STATUS.json
@@@ -4,7 +4,7 @@
"code": true,
"wave": "W2",
"package": "openvibe-shared",
-- "version": "4.99.0",
++ "version": "4.99.1",
"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/docs/thread.md b/docs/thread.md
iindex 75a457b..c689ad4 100644
---- a/docs/thread.md
++++ b/docs/thread.md
@@@ -63,8 +63,8 @@ OVThread.live(id, 'Reading'); // the working turn's live line
OVThread.work(id, rowHtml); // a row in its work list
OVThread.replace(id, html); // the finished turn; its answer types in, word by word
OVThread.reveal(answerEl); // the same reveal, for an answer a site draws itself
--OVThread.tool(id, { name: 'Bash', input: 'npm test', icon: 'run' }); // a running tool row, built from text
--OVThread.toolDone(id, ok); // the last running tool row finished (false: it failed)
++OVThread.tool(id, { name: 'Bash', input: 'npm test', icon: 'run', key }); // a running tool row, built from text
++OVThread.toolDone(id, ok, key); // that tool's row finished (key: the tool call's id); false: it failed, null: no result
```
A site renders those strings on the server (`GET /chat/turn/:id`, as Actor does) or in the page. The helpers keep the
ddiff --git a/ov-thread.js b/ov-thread.js
iindex 840df83..2cccaa5 100644
---- a/ov-thread.js
++++ b/ov-thread.js
@@@ -230,16 +230,21 @@
box.dataset.ovtReady = '1';
var head = q(box, '[data-ovt-head]');
-- // Under the navbar: the sticky head and the chats column follow its bottom edge.
-- var nav = document.querySelector('.openvibe-navbar') || document.getElementById('navbar-mount');
-- var topWas = -1, ticking = false;
++ // Under the navbar: the sticky head and the chats column follow its bottom edge. The bar is found on each
++ // measure (navbar.js may draw it after this runs), and measured again once its slide ends: on a phone it
++ // slides away while reading down (.32 s), and the head then moves up to the top instead of leaving a gap.
++ var topWas = -1, ticking = false, trail = 0;
function measure() {
ticking = false;
++ var nav = document.querySelector('.openvibe-navbar') || document.getElementById('navbar-mount');
var b = nav && nav.getBoundingClientRect ? Math.max(0, Math.round(nav.getBoundingClientRect().bottom || 0)) : 0;
if (b !== topWas) { topWas = b; box.style.setProperty('--ovt-top', b + 'px'); }
if (head) head.classList.toggle('is-stuck', root.scrollY > 8);
}
-- function onScroll() { if (!ticking) { ticking = true; (root.requestAnimationFrame || setTimeout)(measure); } }
++ function onScroll() {
++ if (!ticking) { ticking = true; (root.requestAnimationFrame || setTimeout)(measure); }
++ clearTimeout(trail); trail = setTimeout(measure, 380);
++ }
measure();
root.addEventListener('scroll', onScroll, { passive: true });
root.addEventListener('resize', onScroll);
ddiff --git a/package.json b/package.json
iindex e46dce3..b9652dd 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-shared",
-- "version": "4.99.0",
++ "version": "4.99.1",
"description": "Shared navbar, footer, themes, icons, legal pages, SEO, auth and analytics for every OpenVibe site",
"main": "index.js",
"bin": {