openvibers/openvibe.shared Commits
4.99.1: the conversation's head follows the navbar as it slides away on a phone (#259)
Changes
@@@ -4,6 +4,13 @@ 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).++## 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):@@@ -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 deployedconsumer 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` namesthe tag it pins.@@@ -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)",@@@ -63,8 +63,8 @@ OVThread.live(id, 'Reading'); // the working turn's live lineOVThread.work(id, rowHtml); // a row in its work listOVThread.replace(id, html); // the finished turn; its answer types in, word by wordOVThread.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@@@ -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);@@@ -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": {
@@ -4,6 +4,13 @@ All notable changes to `openvibe-shared`. Versions follow [semver](https://semve
@@ -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.
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).
+## 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
## 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):
- **The conversation UI shows several agents, approvals and what the work produced** (plan L55 C4 stage 3, for Codes):
@@ -2,7 +2,7 @@
@@ -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.
> 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
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
([docs/migration-plan.md](docs/migration-plan.md) is done); each repository's `package.json` names
the tag it pins.
the tag it pins.
@@ -4,7 +4,7 @@
@@ -4,7 +4,7 @@
"code": true,
"code": true,
"wave": "W2",
"wave": "W2",
"package": "openvibe-shared",
"package": "openvibe-shared",
- "version": "4.99.0",
+ "version": "4.99.1",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"deployed": false,
"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)",
"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)",
@@ -63,8 +63,8 @@ OVThread.live(id, 'Reading'); // the working turn's live line
@@ -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.work(id, rowHtml); // a row in its work list
OVThread.replace(id, html); // the finished turn; its answer types in, word by word
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.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
A site renders those strings on the server (`GET /chat/turn/:id`, as Actor does) or in the page. The helpers keep the
@@ -230,16 +230,21 @@
@@ -230,16 +230,21 @@
box.dataset.ovtReady = '1';
box.dataset.ovtReady = '1';
var head = q(box, '[data-ovt-head]');
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() {
function measure() {
ticking = false;
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;
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 (b !== topWas) { topWas = b; box.style.setProperty('--ovt-top', b + 'px'); }
if (head) head.classList.toggle('is-stuck', root.scrollY > 8);
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();
measure();
root.addEventListener('scroll', onScroll, { passive: true });
root.addEventListener('scroll', onScroll, { passive: true });
root.addEventListener('resize', onScroll);
root.addEventListener('resize', onScroll);
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-shared",
"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",
"description": "Shared navbar, footer, themes, icons, legal pages, SEO, auth and analytics for every OpenVibe site",
"main": "index.js",
"main": "index.js",
"bin": {
"bin": {