openvibers/openvibe.shared Commits
Navbar: Work together (openvibe.chat/work) beside Ask Vibe: start a workspace room where a team and Vibe work together (#111)
Changes
@@@ -9,7 +9,9 @@ A release is the git tag `vX.Y.Z`; consumers pin the tag's tarball (see README).- **Ask Vibe from every site** (`navbar.js`). The account menu's "Ask Actor" is now **Ask Vibe**: it opens a new chatwith Vibe, OpenVibe's assistant, at `openvibe.chat/vibe`, with the text selected on the page and the page's addressfilled in (never sent by itself; OpenVibe.Chat#165). `_ask.askVibeHref` replaces `askActorHref`;-- `test/navbar-ask-vibe.test.js` replaces `navbar-ask-actor.test.js`.++ `test/navbar-ask-vibe.test.js` replaces `navbar-ask-actor.test.js`. Beside it, **Work together** starts a workspace++ room on OpenVibe.Chat (`openvibe.chat/work`): a team and Vibe with a work queue, alerts from other systems and a++ shared screen (OpenVibe.Chat#163–#168).- **Richer home pages for every site** (`showcase.js`, `showcase.css`, `docs/home-pages.md`). The owner, 2026-10-25:"more rich content and different types… shared code so you can make nice home pages across all our different sites…and other people can reuse too". About 30 sites build their homes from showcase.@@@ -1509,7 +1509,7 @@${!isAnon && u.username ? `<a href="https://openvibe.network/@${escapeAttr(u.username)}"><span class="icon">${navIcon('fa-id-card')}</span> My Profile</a>` : ''}${!isAnon && u.username ? `<a href="https://openvibe.live/@${escapeAttr(u.username)}"><span class="icon">${navIcon('fa-tower-broadcast')}</span> My Channel</a>` : ''}<a href="https://openvibe.network/my#notifications"><span class="icon">${navIcon('fa-bell')}</span> Notifications</a>-- ${!isAnon ? `<a href="https://openvibe.chat/vibe" data-ov-ask><span class="icon">${navIcon('fa-brain')}</span> Ask Vibe</a>` : ''}++ ${!isAnon ? `<a href="https://openvibe.chat/vibe" data-ov-ask><span class="icon">${navIcon('fa-brain')}</span> Ask Vibe</a><a href="https://openvibe.chat/work" data-ov-work><span class="icon">${navIcon('fa-plus')}</span> Work together</a>` : ''}<div class="sep"></div>`}<div class="ud-label">Display</div><div class="ud-scheme" role="group" aria-label="Light or dark" hidden><button type="button" data-ov-scheme="light" aria-pressed="false"><span class="icon">${navIcon('fa-sun')}</span> Light</button><button type="button" data-ov-scheme="dark" aria-pressed="false"><span class="icon">${navIcon('fa-moon')}</span> Dark</button><button type="button" data-ov-scheme="auto" aria-pressed="false" title="Follow this device's light or dark setting"><span class="icon">${navIcon('fa-circle-half-stroke')}</span> Auto</button></div>@@@ -1,5 +1,5 @@'use strict';--// "Ask Vibe" in the account menu (the OpenVibe Frame's button): signed in only, it opens a new chat with Vibe (openvibe.chat/vibe)++// "Ask Vibe" and "Work together" in the account menu (the OpenVibe Frame's button): signed in only, it opens a new chat with Vibe (openvibe.chat/vibe)// with the text selected on the page as the ask and the page as where it came from. The link part runs in plain node;// the selection part runs in a real headless Chrome (skipped without Chrome or with OV_SKIP_BROWSER=1): text selected,// then a real press on the avatar, must reach the link even though the press can clear the selection.@@@ -69,10 +69,13 @@ const server = http.createServer((req, res) => {await p.goto(`${base}/out`, { maxMs: 5000 });await p.evaluate(ready);assert.strictEqual(await p.evaluate(`!!document.querySelector('[data-ov-ask]')`), false, 'signed out: no Ask Vibe');++ assert.strictEqual(await p.evaluate(`!!document.querySelector('[data-ov-work]')`), false, 'signed out: no Work together');await p.goto(`${base}/in`, { maxMs: 5000 });await p.evaluate(ready);assert.strictEqual(await p.evaluate(`document.querySelector('[data-ov-ask]').textContent.trim()`), 'Ask Vibe');++ // Work together: a new workspace room on OpenVibe.Chat (a team and Vibe, a work queue, a shared screen).++ assert.strictEqual(await p.evaluate(`document.querySelector('[data-ov-work]').href`), 'https://openvibe.chat/work');// Nothing selected: the plain console.await press();
@@ -9,7 +9,9 @@ A release is the git tag `vX.Y.Z`; consumers pin the tag's tarball (see README).
@@ -9,7 +9,9 @@ A release is the git tag `vX.Y.Z`; consumers pin the tag's tarball (see README).
- **Ask Vibe from every site** (`navbar.js`). The account menu's "Ask Actor" is now **Ask Vibe**: it opens a new chat
- **Ask Vibe from every site** (`navbar.js`). The account menu's "Ask Actor" is now **Ask Vibe**: it opens a new chat
with Vibe, OpenVibe's assistant, at `openvibe.chat/vibe`, with the text selected on the page and the page's address
with Vibe, OpenVibe's assistant, at `openvibe.chat/vibe`, with the text selected on the page and the page's address
filled in (never sent by itself; OpenVibe.Chat#165). `_ask.askVibeHref` replaces `askActorHref`;
filled in (never sent by itself; OpenVibe.Chat#165). `_ask.askVibeHref` replaces `askActorHref`;
- `test/navbar-ask-vibe.test.js` replaces `navbar-ask-actor.test.js`.
+ `test/navbar-ask-vibe.test.js` replaces `navbar-ask-actor.test.js`. Beside it, **Work together** starts a workspace
+ room on OpenVibe.Chat (`openvibe.chat/work`): a team and Vibe with a work queue, alerts from other systems and a
+ shared screen (OpenVibe.Chat#163–#168).
- **Richer home pages for every site** (`showcase.js`, `showcase.css`, `docs/home-pages.md`). The owner, 2026-10-25:
- **Richer home pages for every site** (`showcase.js`, `showcase.css`, `docs/home-pages.md`). The owner, 2026-10-25:
"more rich content and different types… shared code so you can make nice home pages across all our different sites…
"more rich content and different types… shared code so you can make nice home pages across all our different sites…
and other people can reuse too". About 30 sites build their homes from showcase.
and other people can reuse too". About 30 sites build their homes from showcase.
@@ -1509,7 +1509,7 @@
@@ -1509,7 +1509,7 @@
${!isAnon && u.username ? `<a href="https://openvibe.network/@${escapeAttr(u.username)}"><span class="icon">${navIcon('fa-id-card')}</span> My Profile</a>` : ''}
${!isAnon && u.username ? `<a href="https://openvibe.network/@${escapeAttr(u.username)}"><span class="icon">${navIcon('fa-id-card')}</span> My Profile</a>` : ''}
${!isAnon && u.username ? `<a href="https://openvibe.live/@${escapeAttr(u.username)}"><span class="icon">${navIcon('fa-tower-broadcast')}</span> My Channel</a>` : ''}
${!isAnon && u.username ? `<a href="https://openvibe.live/@${escapeAttr(u.username)}"><span class="icon">${navIcon('fa-tower-broadcast')}</span> My Channel</a>` : ''}
<a href="https://openvibe.network/my#notifications"><span class="icon">${navIcon('fa-bell')}</span> Notifications</a>
<a href="https://openvibe.network/my#notifications"><span class="icon">${navIcon('fa-bell')}</span> Notifications</a>
- ${!isAnon ? `<a href="https://openvibe.chat/vibe" data-ov-ask><span class="icon">${navIcon('fa-brain')}</span> Ask Vibe</a>` : ''}
+ ${!isAnon ? `<a href="https://openvibe.chat/vibe" data-ov-ask><span class="icon">${navIcon('fa-brain')}</span> Ask Vibe</a><a href="https://openvibe.chat/work" data-ov-work><span class="icon">${navIcon('fa-plus')}</span> Work together</a>` : ''}
<div class="sep"></div>`}
<div class="sep"></div>`}
<div class="ud-label">Display</div>
<div class="ud-label">Display</div>
<div class="ud-scheme" role="group" aria-label="Light or dark" hidden><button type="button" data-ov-scheme="light" aria-pressed="false"><span class="icon">${navIcon('fa-sun')}</span> Light</button><button type="button" data-ov-scheme="dark" aria-pressed="false"><span class="icon">${navIcon('fa-moon')}</span> Dark</button><button type="button" data-ov-scheme="auto" aria-pressed="false" title="Follow this device's light or dark setting"><span class="icon">${navIcon('fa-circle-half-stroke')}</span> Auto</button></div>
<div class="ud-scheme" role="group" aria-label="Light or dark" hidden><button type="button" data-ov-scheme="light" aria-pressed="false"><span class="icon">${navIcon('fa-sun')}</span> Light</button><button type="button" data-ov-scheme="dark" aria-pressed="false"><span class="icon">${navIcon('fa-moon')}</span> Dark</button><button type="button" data-ov-scheme="auto" aria-pressed="false" title="Follow this device's light or dark setting"><span class="icon">${navIcon('fa-circle-half-stroke')}</span> Auto</button></div>
@@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
'use strict';
'use strict';
-// "Ask Vibe" in the account menu (the OpenVibe Frame's button): signed in only, it opens a new chat with Vibe (openvibe.chat/vibe)
+// "Ask Vibe" and "Work together" in the account menu (the OpenVibe Frame's button): signed in only, it opens a new chat with Vibe (openvibe.chat/vibe)
// with the text selected on the page as the ask and the page as where it came from. The link part runs in plain node;
// with the text selected on the page as the ask and the page as where it came from. The link part runs in plain node;
// the selection part runs in a real headless Chrome (skipped without Chrome or with OV_SKIP_BROWSER=1): text selected,
// the selection part runs in a real headless Chrome (skipped without Chrome or with OV_SKIP_BROWSER=1): text selected,
// then a real press on the avatar, must reach the link even though the press can clear the selection.
// then a real press on the avatar, must reach the link even though the press can clear the selection.
@@ -69,10 +69,13 @@ const server = http.createServer((req, res) => {
@@ -69,10 +69,13 @@ const server = http.createServer((req, res) => {
await p.goto(`${base}/out`, { maxMs: 5000 });
await p.goto(`${base}/out`, { maxMs: 5000 });
await p.evaluate(ready);
await p.evaluate(ready);
assert.strictEqual(await p.evaluate(`!!document.querySelector('[data-ov-ask]')`), false, 'signed out: no Ask Vibe');
assert.strictEqual(await p.evaluate(`!!document.querySelector('[data-ov-ask]')`), false, 'signed out: no Ask Vibe');
+ assert.strictEqual(await p.evaluate(`!!document.querySelector('[data-ov-work]')`), false, 'signed out: no Work together');
await p.goto(`${base}/in`, { maxMs: 5000 });
await p.goto(`${base}/in`, { maxMs: 5000 });
await p.evaluate(ready);
await p.evaluate(ready);
assert.strictEqual(await p.evaluate(`document.querySelector('[data-ov-ask]').textContent.trim()`), 'Ask Vibe');
assert.strictEqual(await p.evaluate(`document.querySelector('[data-ov-ask]').textContent.trim()`), 'Ask Vibe');
+ // Work together: a new workspace room on OpenVibe.Chat (a team and Vibe, a work queue, a shared screen).
+ assert.strictEqual(await p.evaluate(`document.querySelector('[data-ov-work]').href`), 'https://openvibe.chat/work');
// Nothing selected: the plain console.
// Nothing selected: the plain console.
await press();
await press();