openvibers/openvibe.network Commits
openvibe-shared v4.59.0 (was v4.57.1) (#453)
Changes
@@@ -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 -->@@@ -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",@@@ -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",@@@ -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"@@@ -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 fileBBinary files a/public/assets/logo-192.png and b/public/assets/logo-192.png differBBinary files a/public/assets/logo-512.png and b/public/assets/logo-512.png differBBinary files a/public/assets/logo-72.png and b/public/assets/logo-72.png differBBinary files a/public/assets/logo-maskable-192.png and b/public/assets/logo-maskable-192.png differBBinary files a/public/assets/logo-maskable-512.png and b/public/assets/logo-maskable-512.png differ@@@ -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 fileddeleted file mode 100644@@@ -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();--})();@@@ -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>@@@ -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>
@@ -809,7 +809,7 @@ Reporting a vulnerability: [SECURITY.md](SECURITY.md). The rules the code keeps:
@@ -809,7 +809,7 @@ Reporting a vulnerability: [SECURITY.md](SECURITY.md). The rules the code keeps:
MIT (`license` in [package.json](package.json)).
MIT (`license` in [package.json](package.json)).
<!-- versions:start -->
<!-- versions:start -->
-- openvibe-contracts: v0.251.0
+- openvibe-contracts: v0.256.0
- openvibe-sdk: v0.74.0
- openvibe-sdk: v0.74.0
-- openvibe-shared: v4.57.1
+- openvibe-shared: v4.59.0
<!-- versions:end -->
<!-- versions:end -->
@@ -6,9 +6,9 @@
@@ -6,9 +6,9 @@
"runtime": "node 22, express, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9",
"runtime": "node 22, express, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9",
"port": 4000,
"port": 4000,
"domain": "openvibe.network (with auth., api., admin., my. and themes.openvibe.network in its manifest)",
"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",
"sdk": "openvibe-sdk v0.74.0",
- "shared": "openvibe-shared v4.57.1",
+ "shared": "openvibe-shared v4.59.0",
"capabilities": [
"capabilities": [
"identity.subject.resolve",
"identity.subject.resolve",
"mods.grant.manage",
"mods.grant.manage",
@@ -22,7 +22,7 @@
@@ -22,7 +22,7 @@
"multer": "^1.4.5-lts.1",
"multer": "^1.4.5-lts.1",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.256.0",
"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-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",
"pg": "^8.23.0",
"uuid": "^11.1.0",
"uuid": "^11.1.0",
"web-push": "^3.6.7"
"web-push": "^3.6.7"
@@ -1638,9 +1638,9 @@
@@ -1638,9 +1638,9 @@
}
}
},
},
"node_modules/openvibe-shared": {
"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",
"license": "MIT",
"dependencies": {
"dependencies": {
"jsonwebtoken": "^9.0.0",
"jsonwebtoken": "^9.0.0",
@@ -26,7 +26,7 @@
@@ -26,7 +26,7 @@
"multer": "^1.4.5-lts.1",
"multer": "^1.4.5-lts.1",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.256.0",
"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-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",
"pg": "^8.23.0",
"uuid": "^11.1.0",
"uuid": "^11.1.0",
"web-push": "^3.6.7"
"web-push": "^3.6.7"
@@ -1 +1,3 @@
@@ -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
\ No newline at end of file
Binary files a/public/assets/logo-192.png and b/public/assets/logo-192.png differ
Binary files a/public/assets/logo-192.png and b/public/assets/logo-192.png differ
Binary files a/public/assets/logo-512.png and b/public/assets/logo-512.png differ
Binary files a/public/assets/logo-512.png and b/public/assets/logo-512.png differ
Binary files a/public/assets/logo-72.png and b/public/assets/logo-72.png differ
Binary files a/public/assets/logo-72.png and b/public/assets/logo-72.png differ
Binary files a/public/assets/logo-maskable-192.png and b/public/assets/logo-maskable-192.png differ
Binary files a/public/assets/logo-maskable-192.png and b/public/assets/logo-maskable-192.png differ
Binary files a/public/assets/logo-maskable-512.png and b/public/assets/logo-maskable-512.png differ
Binary files a/public/assets/logo-maskable-512.png and b/public/assets/logo-maskable-512.png differ
@@ -1,8 +1,3 @@
@@ -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
\ 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
\ No newline at end of file
deleted file mode 100644
deleted file mode 100644
@@ -1,83 +0,0 @@
@@ -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();
-})();
@@ -223,7 +223,6 @@ footer{border-top:1px solid var(--border);background:var(--bg-secondary)}
@@ -223,7 +223,6 @@ footer{border-top:1px solid var(--border);background:var(--bg-secondary)}
}
}
</style>
</style>
<script src="/shared/theme-loader.js"></script>
<script src="/shared/theme-loader.js"></script>
-<script src="/assets/ov-mark.js"></script>
</head>
</head>
<body>
<body>
@@ -172,7 +172,7 @@
@@ -172,7 +172,7 @@
<div class="login-toast" id="toast"></div>
<div class="login-toast" id="toast"></div>
<script src="/js/login.js" defer></script>
<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>
<script src="https://openvibe.live/live-notify.js" async></script>
</body>
</body>
</html>
</html>