openvibers/openvibe.shared Commits
4.47.3: a tap on the logo no longer opens the menu (#192)
Changes
@@@ -6,6 +6,14 @@ A release is the git tag `vX.Y.Z`; consumers pin the tag's tarball (see README).## Unreleased++## 4.47.3 — 2026-10-30++++- **A tap on the logo no longer opens the menu.** On a phone, the menu button's invisible touch area (4.46.0) covered++ the whole navbar. The touch rules made the button `position: relative`, but its own `all: unset` rule came later and++ reset it, so the 44 px hit area was placed against the bar instead. A tap on the mark, the site's name or the orb++ opened the burger menu on every site on 4.46.0–4.47.2 (found on openvibe.network). The burger now keeps its own++ position. `test/navbar-hit-areas.test.js` checks that every touch hit area stays on its own button.++## 4.47.2 — 2026-10-30- **The updates log reads as changes, not commits.** `shipped.js`'s log folds the entries of one day that are the same@@@ -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.47.2 (every release is a tag; see [CHANGELOG.md](CHANGELOG.md)). Every deployed++**Status:** alpha, v4.47.3 (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.47.2",++ "version": "4.47.3","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)",@@@ -91,7 +91,7 @@.openvibe-navbar-dropdown-header a.name.ud-me { line-height: inherit; display: block; }.openvibe-navbar-dropdown-header a.name.ud-me:hover, .openvibe-navbar-dropdown-header a.name.ud-me:focus-visible { text-decoration: underline; }.openvibe-navbar-dropdown .ovnav-chip--menu { all: unset; box-sizing: border-box; cursor: pointer; display: inline-flex; align-items: center; gap: 5px; padding: 3px 10px; border-radius: 999px; font: 700 12px/1.2 inherit; color: var(--chip-c, #fbbf24); background: color-mix(in srgb, var(--chip-c, #fbbf24) 12%, transparent); border: 1px solid color-mix(in srgb, var(--chip-c, #fbbf24) 34%, transparent); }-- .openvibe-navbar .ovnav-burger { all: unset; box-sizing: border-box; cursor: pointer; display: none; width: 38px; height: 38px; border-radius: 11px; flex-direction: column; align-items: center; justify-content: center; gap: 4px; flex: none; }++ .openvibe-navbar .ovnav-burger { all: unset; box-sizing: border-box; position: relative; cursor: pointer; display: none; width: 38px; height: 38px; border-radius: 11px; flex-direction: column; align-items: center; justify-content: center; gap: 4px; flex: none; }.openvibe-navbar .ovnav-burger span { display: block; width: 18px; height: 2px; border-radius: 2px; background: currentColor; transition: transform .2s, opacity .2s; }.openvibe-navbar .ovnav-burger[aria-expanded="true"] span:nth-child(1) { transform: translateY(6px) rotate(45deg); }.openvibe-navbar .ovnav-burger[aria-expanded="true"] span:nth-child(2) { opacity: 0; }@@@ -1,6 +1,6 @@{"name": "openvibe-shared",-- "version": "4.47.2",++ "version": "4.47.3","description": "Shared navbar, footer, themes, icons, legal pages, SEO, auth and analytics for every OpenVibe site","main": "index.js","bin": {nnew file mode 100644@@@ -0,0 +1,22 @@++'use strict';++// A touch hit area must stay on its own button (4.47.3). The 4.46.0 touch targets give the burger, the orb, Sign In and++// the mark an invisible ::after that reaches 44px to a finger, and set the button position: relative so the ::after++// sits on it. The burger's own rule ({ all: unset; … }) came later at the same specificity and reset its position to++// static, so its ::after was placed against the whole navbar: on a phone, a tap on the logo, the name or the orb opened++// the menu instead (openvibe.network, 2026-10-30). Every element that gets such a hit area keeps position: relative in++// its own all: unset rule.++const assert = require('assert');++const fs = require('fs');++const path = require('path');++++const src = fs.readFileSync(path.join(__dirname, '..', 'navbar.js'), 'utf8');++const hits = [...src.matchAll(/([.#][\w-]+(?:\s+[.#][\w-]+)*)::after \{ content: ''; position: absolute;/g)].map((m) => m[1].trim());++assert.ok(hits.length >= 4, `the touch hit areas are found (${hits.join(', ')})`);++for (const sel of hits) {++ const esc = sel.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');++ const own = new RegExp(`(?:^|\\n)\\s*${esc} \\{ all: unset;[^}]*\\}`).exec(src);++ if (own) assert.ok(/position: relative/.test(own[0]), `${sel}: its all: unset rule keeps position: relative, or its hit area escapes it`);++}++const burger = /\.openvibe-navbar \.ovnav-burger \{ all: unset;[^}]*\}/.exec(src);++assert.ok(burger && /position: relative/.test(burger[0]), 'the burger keeps its own position');++console.log('navbar-hit-areas: all checks passed');
@@ -6,6 +6,14 @@ A release is the git tag `vX.Y.Z`; consumers pin the tag's tarball (see README).
@@ -6,6 +6,14 @@ A release is the git tag `vX.Y.Z`; consumers pin the tag's tarball (see README).
## Unreleased
## Unreleased
+## 4.47.3 — 2026-10-30
+
+- **A tap on the logo no longer opens the menu.** On a phone, the menu button's invisible touch area (4.46.0) covered
+ the whole navbar. The touch rules made the button `position: relative`, but its own `all: unset` rule came later and
+ reset it, so the 44 px hit area was placed against the bar instead. A tap on the mark, the site's name or the orb
+ opened the burger menu on every site on 4.46.0–4.47.2 (found on openvibe.network). The burger now keeps its own
+ position. `test/navbar-hit-areas.test.js` checks that every touch hit area stays on its own button.
+
## 4.47.2 — 2026-10-30
## 4.47.2 — 2026-10-30
- **The updates log reads as changes, not commits.** `shipped.js`'s log folds the entries of one day that are the same
- **The updates log reads as changes, not commits.** `shipped.js`'s log folds the entries of one day that are the same
@@ -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.47.2 (every release is a tag; see [CHANGELOG.md](CHANGELOG.md)). Every deployed
+**Status:** alpha, v4.47.3 (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.47.2",
+ "version": "4.47.3",
"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)",
@@ -91,7 +91,7 @@
@@ -91,7 +91,7 @@
.openvibe-navbar-dropdown-header a.name.ud-me { line-height: inherit; display: block; }
.openvibe-navbar-dropdown-header a.name.ud-me { line-height: inherit; display: block; }
.openvibe-navbar-dropdown-header a.name.ud-me:hover, .openvibe-navbar-dropdown-header a.name.ud-me:focus-visible { text-decoration: underline; }
.openvibe-navbar-dropdown-header a.name.ud-me:hover, .openvibe-navbar-dropdown-header a.name.ud-me:focus-visible { text-decoration: underline; }
.openvibe-navbar-dropdown .ovnav-chip--menu { all: unset; box-sizing: border-box; cursor: pointer; display: inline-flex; align-items: center; gap: 5px; padding: 3px 10px; border-radius: 999px; font: 700 12px/1.2 inherit; color: var(--chip-c, #fbbf24); background: color-mix(in srgb, var(--chip-c, #fbbf24) 12%, transparent); border: 1px solid color-mix(in srgb, var(--chip-c, #fbbf24) 34%, transparent); }
.openvibe-navbar-dropdown .ovnav-chip--menu { all: unset; box-sizing: border-box; cursor: pointer; display: inline-flex; align-items: center; gap: 5px; padding: 3px 10px; border-radius: 999px; font: 700 12px/1.2 inherit; color: var(--chip-c, #fbbf24); background: color-mix(in srgb, var(--chip-c, #fbbf24) 12%, transparent); border: 1px solid color-mix(in srgb, var(--chip-c, #fbbf24) 34%, transparent); }
- .openvibe-navbar .ovnav-burger { all: unset; box-sizing: border-box; cursor: pointer; display: none; width: 38px; height: 38px; border-radius: 11px; flex-direction: column; align-items: center; justify-content: center; gap: 4px; flex: none; }
+ .openvibe-navbar .ovnav-burger { all: unset; box-sizing: border-box; position: relative; cursor: pointer; display: none; width: 38px; height: 38px; border-radius: 11px; flex-direction: column; align-items: center; justify-content: center; gap: 4px; flex: none; }
.openvibe-navbar .ovnav-burger span { display: block; width: 18px; height: 2px; border-radius: 2px; background: currentColor; transition: transform .2s, opacity .2s; }
.openvibe-navbar .ovnav-burger span { display: block; width: 18px; height: 2px; border-radius: 2px; background: currentColor; transition: transform .2s, opacity .2s; }
.openvibe-navbar .ovnav-burger[aria-expanded="true"] span:nth-child(1) { transform: translateY(6px) rotate(45deg); }
.openvibe-navbar .ovnav-burger[aria-expanded="true"] span:nth-child(1) { transform: translateY(6px) rotate(45deg); }
.openvibe-navbar .ovnav-burger[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
.openvibe-navbar .ovnav-burger[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-shared",
"name": "openvibe-shared",
- "version": "4.47.2",
+ "version": "4.47.3",
"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": {
new file mode 100644
new file mode 100644
@@ -0,0 +1,22 @@
@@ -0,0 +1,22 @@
+'use strict';
+// A touch hit area must stay on its own button (4.47.3). The 4.46.0 touch targets give the burger, the orb, Sign In and
+// the mark an invisible ::after that reaches 44px to a finger, and set the button position: relative so the ::after
+// sits on it. The burger's own rule ({ all: unset; … }) came later at the same specificity and reset its position to
+// static, so its ::after was placed against the whole navbar: on a phone, a tap on the logo, the name or the orb opened
+// the menu instead (openvibe.network, 2026-10-30). Every element that gets such a hit area keeps position: relative in
+// its own all: unset rule.
+const assert = require('assert');
+const fs = require('fs');
+const path = require('path');
+
+const src = fs.readFileSync(path.join(__dirname, '..', 'navbar.js'), 'utf8');
+const hits = [...src.matchAll(/([.#][\w-]+(?:\s+[.#][\w-]+)*)::after \{ content: ''; position: absolute;/g)].map((m) => m[1].trim());
+assert.ok(hits.length >= 4, `the touch hit areas are found (${hits.join(', ')})`);
+for (const sel of hits) {
+ const esc = sel.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
+ const own = new RegExp(`(?:^|\\n)\\s*${esc} \\{ all: unset;[^}]*\\}`).exec(src);
+ if (own) assert.ok(/position: relative/.test(own[0]), `${sel}: its all: unset rule keeps position: relative, or its hit area escapes it`);
+}
+const burger = /\.openvibe-navbar \.ovnav-burger \{ all: unset;[^}]*\}/.exec(src);
+assert.ok(burger && /position: relative/.test(burger[0]), 'the burger keeps its own position');
+console.log('navbar-hit-areas: all checks passed');