openvibers/openvibe.shared Commits

4.15.2: showcase sections rise without fading in, so their text passes contrast checks (#127)

OP OpenVibers committed 17 days ago · ce995f8458 · 6 files, +15 −5

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 3b0ac15..d32bafb 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -4,6 +4,14 @@ 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.15.2 — 2026-10-27
++
++- **Showcase sections no longer fade in** (`showcase.js`, `showcase.css`). The scroll reveal animated opacity from
++ nothing, so a section below the fold was half transparent when it was measured. Text in it then failed contrast checks:
++ the post-release browser check (axe) reported color contrast on ten product homes (help, host, inventory, media, rent,
++ run, services, space, vip, zone). VIP's muted text measured #4d5464, its colour at about half opacity. The sections
++ still rise 18 px into place for people who want motion. `test/showcase.test.js` fails if the reveal animates opacity again.
++
## 4.15.1 — 2026-10-27
- **The compact footer is one line again** (`footer.js`). 4.15.0 put "More from OpenVibe" on a row of its own under the
ddiff --git a/package-lock.json b/package-lock.json
iindex 7ca9adb..032ca8b 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -1,12 +1,12 @@
{
"name": "openvibe-shared",
-- "version": "4.15.1",
++ "version": "4.15.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "openvibe-shared",
-- "version": "4.15.1",
++ "version": "4.15.2",
"license": "MIT",
"dependencies": {
"jsonwebtoken": "^9.0.0"
ddiff --git a/package.json b/package.json
iindex 1567bf1..ea4a059 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-shared",
-- "version": "4.15.1",
++ "version": "4.15.2",
"description": "Shared navbar, footer, themes, icons, legal pages, SEO, auth and analytics for every OpenVibe site",
"main": "index.js",
"bin": {
ddiff --git a/showcase.css b/showcase.css
iindex f2a10e1..3a1319b 100644
---- a/showcase.css
++++ b/showcase.css
@@@ -106,7 +106,7 @@ a.sc-stat:hover{border-color:var(--accent,#3b82f6)}
.sc-hero::before{content:'';position:absolute;z-index:-1;inset:-40px 0 auto;height:340px;pointer-events:none;background:radial-gradient(ellipse at 30% 20%,color-mix(in srgb,var(--accent,#3b82f6) 22%,transparent),transparent 62%),radial-gradient(ellipse at 80% 0%,color-mix(in srgb,var(--secondary,#22d3ee) 14%,transparent),transparent 58%);filter:blur(10px);opacity:.9}
@keyframes scPulse{50%{opacity:.35}}
@supports (animation-timeline:view()){@media (prefers-reduced-motion:no-preference){.sc-sec{animation:scRise linear both;animation-timeline:view();animation-range:entry 0% cover 18%}}}
--@keyframes scRise{from{opacity:.001;transform:translateY(18px)}to{opacity:1;transform:none}}
++@keyframes scRise{from{transform:translateY(18px)}to{transform:none}}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
@media (max-width:860px){.sc-hero.sc-split{grid-template-columns:1fr}.sc-hero{padding-top:36px}.sc-spot{grid-template-columns:1fr;gap:14px}.sc-spot:nth-child(even) .sc-spot-media{order:0}}
@media (max-width:520px){.sc-actions .sc-btn{flex:1 1 100%;justify-content:center}.sc-code{grid-template-columns:1fr}}
ddiff --git a/showcase.js b/showcase.js
iindex 97e258b..fc0a44b 100644
---- a/showcase.js
++++ b/showcase.js
@@@ -392,7 +392,7 @@ a.sc-stat:hover{border-color:var(--accent,#3b82f6)}
.sc-hero::before{content:'';position:absolute;z-index:-1;inset:-40px 0 auto;height:340px;pointer-events:none;background:radial-gradient(ellipse at 30% 20%,color-mix(in srgb,var(--accent,#3b82f6) 22%,transparent),transparent 62%),radial-gradient(ellipse at 80% 0%,color-mix(in srgb,var(--secondary,#22d3ee) 14%,transparent),transparent 58%);filter:blur(10px);opacity:.9}
@keyframes scPulse{50%{opacity:.35}}
@supports (animation-timeline:view()){@media (prefers-reduced-motion:no-preference){.sc-sec{animation:scRise linear both;animation-timeline:view();animation-range:entry 0% cover 18%}}}
--@keyframes scRise{from{opacity:.001;transform:translateY(18px)}to{opacity:1;transform:none}}
++@keyframes scRise{from{transform:translateY(18px)}to{transform:none}}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
@media (max-width:860px){.sc-hero.sc-split{grid-template-columns:1fr}.sc-hero{padding-top:36px}.sc-spot{grid-template-columns:1fr;gap:14px}.sc-spot:nth-child(even) .sc-spot-media{order:0}}
@media (max-width:520px){.sc-actions .sc-btn{flex:1 1 100%;justify-content:center}.sc-code{grid-template-columns:1fr}}
ddiff --git a/test/showcase.test.js b/test/showcase.test.js
iindex d020edb..0c7c9b3 100644
---- a/test/showcase.test.js
++++ b/test/showcase.test.js
@@@ -109,6 +109,8 @@ assert.ok(/@container \(min-width:520px\) and \(max-width:1035px\)\{\.sc-grid:ha
assert.ok(sc.network({ service: 'x', items: [['tools', 'Tools', 'https://openvibe.tools/'], ['bad', 'Bad', 'ftp://x']] }).includes('OpenVibe.Tools'));
for (const [svc, list] of Object.entries(sc.RELATED)) for (const [to, what, href] of list) assert.ok(to && what && /^https:\/\//.test(href) && to !== svc, `${svc} → ${to}`);
assert.ok(sc.CSS.includes('animation-timeline:view()') && sc.CSS.includes('prefers-reduced-motion:no-preference'), 'scroll reveal, only for people who want motion');
++ const rise = sc.CSS.match(/@keyframes scRise\{[^@]*?\}\}/);
++ assert.ok(rise && !/opacity/.test(rise[0]), 'the reveal only moves: a section that fades in is measured half-transparent, so its text fails contrast checks (axe on every product home)');
}
console.log('showcase: all checks passed');