openvibers/openvibe.shared Commits

4.47.3: a tap on the logo no longer opens the menu (#192)

OP OpenVibers committed 14 days ago · 9ba7baa663 · 6 files, +34 −4

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. 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. The burger keeps
its own position; test/navbar-hit-areas.test.js checks every touch hit
area stays on its own button.

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex f75306c..07b8b40 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -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
ddiff --git a/README.md b/README.md
iindex 0e90680..70f49f3 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.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
([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 5cddb15..8625f2b 100644
---- a/STATUS.json
++++ b/STATUS.json
@@@ -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)",
ddiff --git a/navbar.js b/navbar.js
iindex 8d30309..8fd027a 100644
---- a/navbar.js
++++ b/navbar.js
@@@ -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; }
ddiff --git a/package.json b/package.json
iindex 964b687..1e1733c 100644
---- a/package.json
++++ b/package.json
@@@ -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": {
ddiff --git a/test/navbar-hit-areas.test.js b/test/navbar-hit-areas.test.js
nnew file mode 100644
iindex 0000000..db17cdd
---- /dev/null
++++ b/test/navbar-hit-areas.test.js
@@@ -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');