openvibers/openvibe.network Commits

openvibe-shared v4.59.0 (was v4.57.1) (#453)

OP OpenVibers committed 13 days ago · dae7dd385e · 14 files, +16 −103

* openvibe-shared v4.59.0 (was v4.57.1)

Opened by scripts/pin-bump.js in OpenVibers/OpenVibe.Shared after the v4.59.0 release.

* The Pair on the Network: its logo files and favicon, and its pages load the pinned mark

public/assets/logo* and favicon.svg are the new mark (openvibe-shared/app-icon). index.html and login.html load
/shared/ov-mark.js from the pinned Shared instead of the copy of the old Loop kept in public/assets, which goes.

* The home page leaves the mark to the navbar, which loads it after the first paint

Its own tag for /shared/ov-mark.js (the Pair, 33.7 KB) put 28 KB on the home page's first load; the old copy it replaced was 6.7 KB. navbar.js already loads ov-mark.js beside itself when a page has none. The sign-in page has no navbar and keeps its async tag.

Changes

ddiff --git a/README.md b/README.md
iindex ebf91f91..602a00f4 100644
---- a/README.md
++++ b/README.md
@@@ -809,7 +809,7 @@ Reporting a vulnerability: [SECURITY.md](SECURITY.md). The rules the code keeps:
MIT (`license` in [package.json](package.json)).
<!-- versions:start -->
--- openvibe-contracts: v0.251.0
++- openvibe-contracts: v0.256.0
- openvibe-sdk: v0.74.0
--- openvibe-shared: v4.57.1
++- openvibe-shared: v4.59.0
<!-- versions:end -->
ddiff --git a/STATUS.json b/STATUS.json
iindex 4023e464..b5bbdf2d 100644
---- a/STATUS.json
++++ b/STATUS.json
@@@ -6,9 +6,9 @@
"runtime": "node 22, express, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9",
"port": 4000,
"domain": "openvibe.network (with auth., api., admin., my. and themes.openvibe.network in its manifest)",
-- "contracts": "openvibe-contracts v0.251.0",
++ "contracts": "openvibe-contracts v0.256.0",
"sdk": "openvibe-sdk v0.74.0",
-- "shared": "openvibe-shared v4.57.1",
++ "shared": "openvibe-shared v4.59.0",
"capabilities": [
"identity.subject.resolve",
"mods.grant.manage",
ddiff --git a/package-lock.json b/package-lock.json
iindex 5e528324..07d71091 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -22,7 +22,7 @@
"multer": "^1.4.5-lts.1",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.256.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.74.0",
-- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.57.1",
++ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.59.0",
"pg": "^8.23.0",
"uuid": "^11.1.0",
"web-push": "^3.6.7"
@@@ -1638,9 +1638,9 @@
}
},
"node_modules/openvibe-shared": {
-- "version": "4.57.1",
-- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.57.1",
-- "integrity": "sha512-zlU7F9H9E/5gqzklyGPJl7SH+WQ/+wn3e9Z7ErI3FbKxQ3caaVEGdZyX4Uww0PbvpgcXs2i6AnwNBi0JSOMlXQ==",
++ "version": "4.59.0",
++ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.59.0",
++ "integrity": "sha512-kaJ6Tcz7WCewK/kCx4NzNWRNI4U1Z1lpwCQHWD115YtcaJps8Ulqpu1y2ArLpywARHtYf3ddPH/hL9wkb6MJlw==",
"license": "MIT",
"dependencies": {
"jsonwebtoken": "^9.0.0",
ddiff --git a/package.json b/package.json
iindex 0b84d545..c4057861 100644
---- a/package.json
++++ b/package.json
@@@ -26,7 +26,7 @@
"multer": "^1.4.5-lts.1",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.256.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.74.0",
-- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.57.1",
++ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.59.0",
"pg": "^8.23.0",
"uuid": "^11.1.0",
"web-push": "^3.6.7"
ddiff --git a/public/assets/favicon.svg b/public/assets/favicon.svg
iindex 38638d57..b929d904 100644
---- a/public/assets/favicon.svg
++++ b/public/assets/favicon.svg
@@@ -1 +1,3 @@
--<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><rect width="48" height="48" rx="12" fill="#0f172a"/><circle cx="24" cy="24" r="16" fill="none" stroke="#3b82f6" stroke-width="4" opacity=".35"/><path d="M8.5 24 A15.5 15.5 0 0 1 24 8.5" fill="none" stroke="#60a5fa" stroke-width="4" stroke-linecap="round"/><path d="M15.5 18 L24 33 L32.5 18" fill="none" stroke="#fff" stroke-width="4.5" stroke-linecap="round" stroke-linejoin="round"/><circle cx="24" cy="33" r="2.4" fill="#fff"/></svg>
++<svg xmlns="http://www.w3.org/2000/svg" viewBox="-32 -32 64 64"><defs><mask id="ovh" maskUnits="userSpaceOnUse" x="-20" y="-20" width="140" height="140"><rect x="-20" y="-20" width="140" height="140" fill="#fff"/><path d="M70.59 68.5L53.31 31.5M70.59 68.5L88.41 31.5" fill="none" stroke="#000" stroke-width="24" stroke-linecap="round"/></mask>
++<radialGradient id="glow"><stop offset="0" stop-color="#60a5fa" stop-opacity=".3"/><stop offset="1" stop-color="#60a5fa" stop-opacity="0"/></radialGradient>
++<radialGradient id="bg" cx=".5" cy=".38" r=".8"><stop offset="0" stop-color="#16223a"/><stop offset=".6" stop-color="#0a0f1c"/><stop offset="1" stop-color="#060912"/></radialGradient></defs><rect x="-32" y="-32" width="64" height="64" rx="15" fill="url(#bg)"/><g transform="scale(0.58) translate(-50 -50)"><ellipse cx="50" cy="50" rx="52" ry="40" fill="url(#glow)"/><circle cx="30.09" cy="50" r="18" fill="none" stroke="#4f7cff" stroke-width="18" mask="url(#ovh)"/><path d="M70.59 68.5L53.31 31.5M70.59 68.5L88.41 31.5" fill="none" stroke="#8b5cf6" stroke-width="17" stroke-linecap="round" stroke-linejoin="round"/></g></svg>
\\ No newline at end of file
ddiff --git a/public/assets/logo-192.png b/public/assets/logo-192.png
iindex 2d63be41..e0e18ab8 100644
BBinary files a/public/assets/logo-192.png and b/public/assets/logo-192.png differ
ddiff --git a/public/assets/logo-512.png b/public/assets/logo-512.png
iindex 5a18ae3e..e293bd80 100644
BBinary files a/public/assets/logo-512.png and b/public/assets/logo-512.png differ
ddiff --git a/public/assets/logo-72.png b/public/assets/logo-72.png
iindex c74235db..94416e27 100644
BBinary files a/public/assets/logo-72.png and b/public/assets/logo-72.png differ
ddiff --git a/public/assets/logo-maskable-192.png b/public/assets/logo-maskable-192.png
iindex 4feb6a5e..f0bb52cd 100644
BBinary files a/public/assets/logo-maskable-192.png and b/public/assets/logo-maskable-192.png differ
ddiff --git a/public/assets/logo-maskable-512.png b/public/assets/logo-maskable-512.png
iindex 1b6f809a..5463d24a 100644
BBinary files a/public/assets/logo-maskable-512.png and b/public/assets/logo-maskable-512.png differ
ddiff --git a/public/assets/logo.svg b/public/assets/logo.svg
iindex 2dea82f9..b929d904 100644
---- a/public/assets/logo.svg
++++ b/public/assets/logo.svg
@@@ -1,8 +1,3 @@
--<svg xmlns="http://www.w3.org/2000/svg" viewBox="-32 -32 64 64"><defs><linearGradient id="ring" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#60a5fa"/><stop offset="1" stop-color="#2563eb"/></linearGradient>
--<radialGradient id="glow"><stop offset="0" stop-color="#60a5fa" stop-opacity=".34"/><stop offset="1" stop-color="#60a5fa" stop-opacity="0"/></radialGradient>
--<radialGradient id="bg" cx=".5" cy=".38" r=".8"><stop offset="0" stop-color="#16223a"/><stop offset=".6" stop-color="#0a0f1c"/><stop offset="1" stop-color="#060912"/></radialGradient></defs><rect x="-32" y="-32" width="64" height="64" rx="15" fill="url(#bg)"/><g transform="scale(1.22)">
--<circle r="21" fill="url(#glow)"/>
--<circle r="18" fill="none" stroke="url(#ring)" stroke-width="4" opacity=".38"/>
--<path d="M0,-18 A18,18 0 0,1 17.4,4.6" fill="none" stroke="url(#ring)" stroke-width="4.4" stroke-linecap="round"/>
--<path d="M-9.5,-7 L0,10 L9.5,-7" fill="none" stroke="#fff" stroke-width="4.8" stroke-linecap="round" stroke-linejoin="round"/>
--<circle cx="17.4" cy="4.6" r="3.2" fill="#ffffff"/></g></svg>
\\ No newline at end of file
++<svg xmlns="http://www.w3.org/2000/svg" viewBox="-32 -32 64 64"><defs><mask id="ovh" maskUnits="userSpaceOnUse" x="-20" y="-20" width="140" height="140"><rect x="-20" y="-20" width="140" height="140" fill="#fff"/><path d="M70.59 68.5L53.31 31.5M70.59 68.5L88.41 31.5" fill="none" stroke="#000" stroke-width="24" stroke-linecap="round"/></mask>
++<radialGradient id="glow"><stop offset="0" stop-color="#60a5fa" stop-opacity=".3"/><stop offset="1" stop-color="#60a5fa" stop-opacity="0"/></radialGradient>
++<radialGradient id="bg" cx=".5" cy=".38" r=".8"><stop offset="0" stop-color="#16223a"/><stop offset=".6" stop-color="#0a0f1c"/><stop offset="1" stop-color="#060912"/></radialGradient></defs><rect x="-32" y="-32" width="64" height="64" rx="15" fill="url(#bg)"/><g transform="scale(0.58) translate(-50 -50)"><ellipse cx="50" cy="50" rx="52" ry="40" fill="url(#glow)"/><circle cx="30.09" cy="50" r="18" fill="none" stroke="#4f7cff" stroke-width="18" mask="url(#ovh)"/><path d="M70.59 68.5L53.31 31.5M70.59 68.5L88.41 31.5" fill="none" stroke="#8b5cf6" stroke-width="17" stroke-linecap="round" stroke-linejoin="round"/></g></svg>
\\ No newline at end of file
ddiff --git a/public/assets/ov-mark.js b/public/assets/ov-mark.js
ddeleted file mode 100644
iindex 5e5bf5be..00000000
---- a/public/assets/ov-mark.js
++++ /dev/null
@@@ -1,83 +0,0 @@
--/**
-- * ov-mark.js — the OpenVibe "OV" brand mark as a drop-in.
-- * <span class="ov-mark"></span> → 32px animated mark
-- * <span class="ov-mark" data-size="56"> → any size; add data-static="1" for no motion
-- * <span class="ov-mark" data-variant="live"> → the site's own twist on the motion (see VARIANTS)
-- * Self-contained: injects its own CSS once, works on any page (Live, Network, static pages).
-- * The O is a ring with a comet arc running around it, the V is drawn inside with a light
-- * sweep, and a dot orbits the ring. Transform/opacity/stroke motion only.
-- */
--(function () {
-- 'use strict';
-- if (window.__ovMark) return; window.__ovMark = true;
-- let n = 0;
-- const CSS = `
--.ov-mark{display:inline-grid;place-items:center;width:32px;height:32px;color:var(--accent,#8b5cf6);flex:none;vertical-align:middle;line-height:0}
--.ov-mark svg{width:100%;height:100%;overflow:visible;transform-origin:50% 50%;animation:ovmFloat 5s ease-in-out infinite}
--.ov-mark .g{fill:currentColor;opacity:.1;transform-box:fill-box;transform-origin:center;animation:ovmGlow 3.4s ease-in-out infinite}
--.ov-mark .r{fill:none;stroke:currentColor;stroke-width:4;opacity:.28}
--.ov-mark .c{fill:none;stroke-width:4;stroke-linecap:round;stroke-dasharray:34 79;transform-box:fill-box;transform-origin:center;animation:ovmComet 3.6s linear infinite}
--.ov-mark .v{fill:none;stroke-width:4.6;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:46;animation:ovmDraw 1.1s cubic-bezier(.2,.8,.2,1) both}
--.ov-mark .d{fill:var(--ovm-dot,#fff);transform-box:fill-box;transform-origin:center;animation:ovmDot 2.4s ease-in-out infinite}
--/* Per-site variants: one family, each site with its own motion so the network reads as one brand
-- with many rooms. Colours stay with the theme (currentColor); only the dot and the rhythm change. */
--.ov-mark[data-variant=live]{--ovm-dot:#ef4444}
--.ov-mark[data-variant=live] .d{animation:ovmOnAir 1.4s ease-in-out infinite}
--.ov-mark[data-variant=tools] .c{animation-duration:2.2s;stroke-dasharray:22 91}
--.ov-mark[data-variant=tools] .o2{display:none}
--.ov-mark[data-variant=media] .c{stroke-dasharray:14 14 14 71;animation-duration:4.4s}
--.ov-mark[data-variant=games] svg{animation:ovmBounce 1.6s cubic-bezier(.3,1.4,.4,1) infinite}
--.ov-mark[data-variant=games] .d{animation-duration:1.6s}
--.ov-mark[data-variant=community] .o2{opacity:.9;r:1.8}
--.ov-mark[data-variant=community] .c{animation-direction:reverse}
--.ov-mark[data-variant=network] .g{animation-duration:2.4s}
--.ov-mark[data-variant=chat] .d{animation:ovmDot 1s ease-in-out infinite}
--.ov-mark[data-variant=stream] .c{stroke-dasharray:60 53;animation-duration:2.8s}
--.ov-mark[data-variant=codes] .v{animation:ovmDraw 1.1s cubic-bezier(.2,.8,.2,1) infinite alternate}
--.ov-mark[data-variant=blog] .c,.ov-mark[data-variant=wiki] .c,.ov-mark[data-variant=news] .c{animation-duration:6s}
--.ov-mark[data-variant=vip]{--ovm-dot:#facc15}
--.ov-mark[data-variant=tips]{--ovm-dot:#22c55e}
--.ov-mark[data-variant=deals],.ov-mark[data-variant=coupons]{--ovm-dot:#f59e0b}
--.ov-mark[data-variant=trade] .c{animation-timing-function:cubic-bezier(.4,0,.2,1)}
--.ov-mark[data-variant=host] svg{animation:none}
--@keyframes ovmOnAir{0%,100%{transform:scale(1);opacity:.7}50%{transform:scale(1.7);opacity:1}}
--@keyframes ovmBounce{0%,100%{transform:translateY(0)}50%{transform:translateY(-2.5px)}}
--.ov-mark .o{fill:#fff;filter:drop-shadow(0 0 3px currentColor)}
--.ov-mark .o2{opacity:.5}
--.ov-mark:hover svg,a:hover>.ov-mark svg,button:hover>.ov-mark svg{animation:ovmSpin .9s cubic-bezier(.2,1.5,.3,1) 1}
--.ov-mark:hover .c{animation-duration:.9s}
--.ov-mark[data-static] svg,.ov-mark[data-static] .g,.ov-mark[data-static] .c,.ov-mark[data-static] .v,.ov-mark[data-static] .d{animation:none!important}
--.ov-mark[data-static] .o{display:none}
--@keyframes ovmFloat{0%,100%{transform:translateY(0) rotate(0deg)}50%{transform:translateY(-1px) rotate(2deg)}}
--@keyframes ovmGlow{0%,100%{opacity:.08;transform:scale(.92)}50%{opacity:.2;transform:scale(1.06)}}
--@keyframes ovmComet{to{transform:rotate(360deg)}}
--@keyframes ovmDraw{from{stroke-dashoffset:46}to{stroke-dashoffset:0}}
--@keyframes ovmDot{0%,100%{transform:scale(1);opacity:.85}50%{transform:scale(1.5);opacity:1}}
--@keyframes ovmSpin{from{transform:rotate(0deg) scale(1)}40%{transform:rotate(200deg) scale(1.18)}to{transform:rotate(360deg) scale(1)}}
--@media (prefers-reduced-motion:reduce){.ov-mark svg,.ov-mark .g,.ov-mark .c,.ov-mark .v,.ov-mark .d{animation:none!important}.ov-mark .o{display:none}.ov-mark .c{stroke-dasharray:none;opacity:.9}}`;
-- function svg(id) {
-- return `<svg viewBox="0 0 48 48" aria-hidden="true"><defs>
--<linearGradient id="${id}g" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="currentColor"/><stop offset="1" stop-color="currentColor" stop-opacity="0.45"/></linearGradient>
--<linearGradient id="${id}v" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#fff"/><stop offset="0.5" stop-color="currentColor"/><stop offset="1" stop-color="#fff" stop-opacity="0.9"/><animateTransform attributeName="gradientTransform" type="translate" from="-1 0" to="1 0" dur="3.2s" repeatCount="indefinite"/></linearGradient>
--<path id="${id}p" d="M24,6 A18,18 0 1,1 23.99,6 Z"/></defs>
--<circle class="g" cx="24" cy="24" r="21"/><circle class="r" cx="24" cy="24" r="18"/><circle class="c" cx="24" cy="24" r="18" stroke="url(#${id}g)"/>
--<path class="v" d="M14.5,17 L24,34 L33.5,17" stroke="url(#${id}v)"/><circle class="d" cx="24" cy="34" r="2.6"/>
--<circle class="o" r="2"><animateMotion dur="3.6s" repeatCount="indefinite"><mpath href="#${id}p"/></animateMotion></circle>
--<circle class="o o2" r="1.4"><animateMotion dur="3.6s" begin="0.14s" repeatCount="indefinite"><mpath href="#${id}p"/></animateMotion></circle></svg>`;
-- }
-- function mount(root) {
-- (root || document).querySelectorAll('.ov-mark:not([data-ov])').forEach(el => {
-- el.setAttribute('data-ov', '1');
-- const size = parseInt(el.getAttribute('data-size'), 10);
-- if (size) { el.style.width = size + 'px'; el.style.height = size + 'px'; }
-- el.innerHTML = svg('ovm' + (++n) + '_');
-- });
-- }
-- function init() {
-- if (!document.getElementById('ov-mark-css')) { const st = document.createElement('style'); st.id = 'ov-mark-css'; st.textContent = CSS; document.head.appendChild(st); }
-- mount();
-- try { new MutationObserver(() => mount()).observe(document.body, { childList: true, subtree: true }); } catch { /* */ }
-- }
-- window.ovMarkMount = mount;
-- if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
--})();
ddiff --git a/public/index.html b/public/index.html
iindex df8a513c..7f9e1159 100644
---- a/public/index.html
++++ b/public/index.html
@@@ -223,7 +223,6 @@ footer{border-top:1px solid var(--border);background:var(--bg-secondary)}
}
</style>
<script src="/shared/theme-loader.js"></script>
--<script src="/assets/ov-mark.js"></script>
</head>
<body>
ddiff --git a/public/login.html b/public/login.html
iindex 47a0a75e..f0d7f16b 100644
---- a/public/login.html
++++ b/public/login.html
@@@ -172,7 +172,7 @@
<div class="login-toast" id="toast"></div>
<script src="/js/login.js" defer></script>
-- <script src="/assets/ov-mark.js"></script>
++ <script src="/shared/ov-mark.js" async></script>
<script src="https://openvibe.live/live-notify.js" async></script>
</body>
</html>