openvibers/openvibe.chat Commits
Motion: Calm reduces, only Off stops (#460)
Changes
@@@ -983,5 +983,5 @@ Part of the [OpenVibe network](https://openvibe.network). Built in the open by [<!-- versions:start -->- openvibe-contracts: v0.384.0- openvibe-sdk: v0.133.0--- openvibe-shared: v4.179.0++- openvibe-shared: v4.183.0<!-- versions:end -->@@@ -9,7 +9,7 @@"domain": "openvibe.chat (Chat's own site: global chat, messages, rooms, settings; the service manifest records it live since 2026-09-24) and openvibe.live (/ws/chat, /api/chat/, /api/dm/, /api/tts/, /api/sounds via an nginx include in openvibe.live's vhost)","contracts": "openvibe-contracts v0.384.0","sdk": "openvibe-sdk v0.133.0",-- "shared": "openvibe-shared v4.179.0",++ "shared": "openvibe-shared v4.183.0","capabilities": ["chat.message.send","chat.event.publish",@@@ -19,7 +19,7 @@"multer": "^2.0.2","openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.384.0","openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.133.0",-- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.179.0",++ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.183.0","pg": "^8.23.0","ws": "^8.18.0"},@@@ -1601,9 +1601,9 @@}},"node_modules/openvibe-shared": {-- "version": "4.179.0",-- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.179.0",-- "integrity": "sha512-Fjffjq3gLINhiXTqQJwsKQT/QbV4TYvsmz6GTp5hBJ8xA6KUQgu0wDgCQ3BRxCZ0ehmn0HGVAHUI+5m0LtPQCQ==",++ "version": "4.183.0",++ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.183.0",++ "integrity": "sha512-vp9gg++Dhyj3h0cwvBjujM6dSFYoeXdh1UXdZ6OXP/NjG672Fs7uRANV4MjT467JtFDN7r7qLI3OJAwGQxOuQw==","license": "MIT","dependencies": {"jsonwebtoken": "^9.0.0",@@@ -31,7 +31,7 @@"multer": "^2.0.2","openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.384.0","openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.133.0",-- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.179.0",++ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.183.0","pg": "^8.23.0","ws": "^8.18.0"},@@@ -155,7 +155,8 @@ h2 { font-size: 1.15rem; margin: 1.4em 0 .5em; }.oc-ring-answer { background: var(--oc-ok-fill); color: #06281c; }.oc-ring-gone { color: var(--oc-muted); }@media (max-width: 520px) { .oc-ring { left: 16px; right: 16px; max-width: none; } }--@media (prefers-reduced-motion: no-preference) { .oc-ring:not(.oc-ring-gone) { animation: oc-ring-in .25s ease-out; } @keyframes oc-ring-in { from { transform: translateY(12px); opacity: 0; } } }++.oc-ring:not(.oc-ring-gone) { animation: oc-ring-in .25s ease-out; }++@keyframes oc-ring-in { from { transform: translateY(12px); opacity: 0; } }.oc-tools { display: block; margin-top: 8px; }.oc-blocked { margin-top: 20px; }.oc-blocked summary { cursor: pointer; color: var(--oc-muted); }@@@ -419,7 +420,6 @@ h2 { font-size: 1.15rem; margin: 1.4em 0 .5em; }.oc-task-cancelled { opacity: .7; }.oc-task-full p, .oc-task-details { overflow-wrap: anywhere; }@keyframes oc-work { 0%, 100% { opacity: 1; } 50% { opacity: .55; } }--@media (prefers-reduced-motion: reduce) { .oc-task-running .oc-task-state { animation: none; } }/* On a phone the conversation comes first and the queue follows it, without its how-to (the composer's @vibe says it). */@media (max-width: 900px) { .oc-ws { grid-template-columns: minmax(0, 1fr); } .oc-queue { position: static; max-height: none; } }@media (max-width: 560px) { .oc-queue-how { display: none; } }@@@ -483,7 +483,6 @@ h2 { font-size: 1.15rem; margin: 1.4em 0 .5em; }.oc-tp-running { color: var(--oc-accent); border-color: color-mix(in srgb, var(--oc-accent) 45%, transparent); }.oc-tp-running .oc-i { animation: oc-breathe 1.2s ease-in-out infinite; } /* running: it breathes, never spins */@keyframes oc-breathe { 50% { opacity: .35; transform: scale(.82); } }--@media (prefers-reduced-motion: reduce) { .oc-tp-running .oc-i { animation: none; } }.oc-tp-says { margin: 0; }.oc-tp-facts { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 8px; margin: 6px 0 0; }.oc-tp-facts div { padding: 8px 12px; border-radius: 12px; background: var(--oc-panel); border: 1px solid var(--oc-line); min-width: 0; }@@@ -608,7 +607,6 @@ h2 { font-size: 1.15rem; margin: 1.4em 0 .5em; }.oc-keyrow { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px; margin: 4px 0 12px; }.oc-keyrow .oc-i { vertical-align: -.2em; }.oc-danger-row { display: block; margin: 0 14px 14px; }--@media (prefers-reduced-motion: reduce) { .oc-fold > summary > .oc-i { transition: none; } }/* A code block people copy (a feed's setup): its copy button in the corner, and never taller than a screenful. */.oc-snip { position: relative; }.oc-snip > .oc-icon-btn { position: absolute; top: 6px; right: 6px; z-index: 1; width: 34px; height: 34px; background: var(--oc-panel); border-color: var(--oc-line); }@@@ -659,7 +657,6 @@ div.oc-set-row { cursor: default; }.oc-set-save button { width: 100%; min-height: 46px; border-radius: 12px; }.oc-aikey .oc-ai-form { max-width: none; }@media (min-width: 720px) { .oc-set-save button { width: auto; min-width: 200px; } }--@media (prefers-reduced-motion: reduce) { .oc-switch, .oc-switch::after { transition: none; } }/* Room settings: the room's form, its members (a row each, the role a small select that saves), and folded extras. */.oc-set-form { padding: 4px 14px 14px; }.oc-set-note { margin: 0; padding: 0 14px 10px; font-size: .86rem; }@@@ -40,7 +40,6 @@ a { color: var(--accent); }.em-dots { display: inline-flex; gap: 4px; } .em-dots i { width: 6px; height: 6px; border-radius: 50%; background: currentColor; opacity: .4; animation: emDot 1.2s infinite; }.em-dots i:nth-child(2) { animation-delay: .15s; } .em-dots i:nth-child(3) { animation-delay: .3s; }@keyframes emDot { 40% { opacity: 1; transform: translateY(-2px); } }--@media (prefers-reduced-motion: reduce) { .em-dots i { animation: none; } }.em-handoff { padding: 0 12px; }.em-handoff button { all: unset; cursor: pointer; font-size: .82rem; color: var(--accent); padding: 4px 6px; border-radius: 8px; }.em-handoff button[hidden] { display: none; }@@@ -31,4 +31,3 @@.fv-count, .fv-more { color: var(--fv-muted); font-size: .78rem; padding-left: 1.8em; }.fv-working { color: var(--fv-muted); font-size: .82rem; padding-left: 1.8em; }.fv-empty { margin: 4px 0; color: var(--fv-muted); font-size: .85rem; }--@media (prefers-reduced-motion: reduce) { .fv-live .fv-dot { animation: none; } .fv-chev { transition: none; } }@@@ -120,7 +120,8 @@ main[data-party] [hidden] { display: none !important; }main[data-party].is-guest [data-party-chat] { min-height: 0; flex: 0 0 auto; align-self: start; }.pt-float { position: absolute; bottom: 12px; font-size: 30px; animation: pt-rise 2.4s cubic-bezier(.2, .7, .3, 1) forwards; }@keyframes pt-rise { 0% { transform: translateY(0) scale(.7); opacity: 0; } 12% { opacity: 1; transform: translateY(-14px) scale(1.05); } 100% { transform: translateY(-190px) scale(1); opacity: 0; } }--@media (prefers-reduced-motion: reduce) { .pt-float { animation: pt-fade 1.6s ease forwards; } @keyframes pt-fade { 0%, 70% { opacity: 1; } 100% { opacity: 0; } } }++@keyframes pt-fade { 0%, 70% { opacity: 1; } 100% { opacity: 0; } }++html[data-ov-motion=reduced] .pt-float { animation: pt-fade 1.6s ease forwards; }/* The bar under the picture: the remote pill and the reactions. */.pt-bar { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; }@@@ -27,7 +27,7 @@var uploadDialog = document.querySelector('[data-vb-upload-dialog]');var uploadRoot = document.querySelector('[data-vb-upload]');var picture = null; // { file, url }: a picture waiting to go with the next message-- var reduce = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;++ var reduce = document.documentElement.getAttribute('data-ov-motion') === 'off';var chosenModels = Array.isArray(cfg.models) ? cfg.models.slice(0, 3) : [];function persistModelChoice() {if (!room) return;@@@ -56,7 +56,6 @@'.p.on{opacity:1;transform:none;pointer-events:auto}.p iframe{width:100%;height:100%;flex:1;min-height:0;border:0;display:block}' +'.h{display:none;align-items:center;justify-content:space-between;padding:8px 14px;background:#121a2b;color:#fff;font:600 14px system-ui}.h button{min-width:44px;min-height:44px;border:0;background:transparent;color:inherit;font:inherit;cursor:pointer}' +'@media (max-width:520px){.p{left:0;right:0;bottom:0;top:0;width:auto;height:auto;border-radius:0}.p.on~.b{display:none}.h{display:flex;touch-action:none}}' +-- '@media (prefers-reduced-motion:reduce){.b,.p{transition:none}}' +'</style>' +'<div class="p" role="dialog" aria-label="Chat"><div class="h"><span>Chat</span><button type="button" aria-label="Close chat">Close</button></div></div>' +'<button class="b" type="button" aria-label="Open the chat" aria-expanded="false"><span class="d"></span>' +
@@ -983,5 +983,5 @@ Part of the [OpenVibe network](https://openvibe.network). Built in the open by [
@@ -983,5 +983,5 @@ Part of the [OpenVibe network](https://openvibe.network). Built in the open by [
<!-- versions:start -->
<!-- versions:start -->
- openvibe-contracts: v0.384.0
- openvibe-contracts: v0.384.0
- openvibe-sdk: v0.133.0
- openvibe-sdk: v0.133.0
-- openvibe-shared: v4.179.0
+- openvibe-shared: v4.183.0
<!-- versions:end -->
<!-- versions:end -->
@@ -9,7 +9,7 @@
@@ -9,7 +9,7 @@
"domain": "openvibe.chat (Chat's own site: global chat, messages, rooms, settings; the service manifest records it live since 2026-09-24) and openvibe.live (/ws/chat, /api/chat/, /api/dm/, /api/tts/, /api/sounds via an nginx include in openvibe.live's vhost)",
"domain": "openvibe.chat (Chat's own site: global chat, messages, rooms, settings; the service manifest records it live since 2026-09-24) and openvibe.live (/ws/chat, /api/chat/, /api/dm/, /api/tts/, /api/sounds via an nginx include in openvibe.live's vhost)",
"contracts": "openvibe-contracts v0.384.0",
"contracts": "openvibe-contracts v0.384.0",
"sdk": "openvibe-sdk v0.133.0",
"sdk": "openvibe-sdk v0.133.0",
- "shared": "openvibe-shared v4.179.0",
+ "shared": "openvibe-shared v4.183.0",
"capabilities": [
"capabilities": [
"chat.message.send",
"chat.message.send",
"chat.event.publish",
"chat.event.publish",
@@ -19,7 +19,7 @@
@@ -19,7 +19,7 @@
"multer": "^2.0.2",
"multer": "^2.0.2",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.384.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.384.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.133.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.133.0",
- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.179.0",
+ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.183.0",
"pg": "^8.23.0",
"pg": "^8.23.0",
"ws": "^8.18.0"
"ws": "^8.18.0"
},
},
@@ -1601,9 +1601,9 @@
@@ -1601,9 +1601,9 @@
}
}
},
},
"node_modules/openvibe-shared": {
"node_modules/openvibe-shared": {
- "version": "4.179.0",
- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.179.0",
- "integrity": "sha512-Fjffjq3gLINhiXTqQJwsKQT/QbV4TYvsmz6GTp5hBJ8xA6KUQgu0wDgCQ3BRxCZ0ehmn0HGVAHUI+5m0LtPQCQ==",
+ "version": "4.183.0",
+ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.183.0",
+ "integrity": "sha512-vp9gg++Dhyj3h0cwvBjujM6dSFYoeXdh1UXdZ6OXP/NjG672Fs7uRANV4MjT467JtFDN7r7qLI3OJAwGQxOuQw==",
"license": "MIT",
"license": "MIT",
"dependencies": {
"dependencies": {
"jsonwebtoken": "^9.0.0",
"jsonwebtoken": "^9.0.0",
@@ -31,7 +31,7 @@
@@ -31,7 +31,7 @@
"multer": "^2.0.2",
"multer": "^2.0.2",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.384.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.384.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.133.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.133.0",
- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.179.0",
+ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.183.0",
"pg": "^8.23.0",
"pg": "^8.23.0",
"ws": "^8.18.0"
"ws": "^8.18.0"
},
},
@@ -155,7 +155,8 @@ h2 { font-size: 1.15rem; margin: 1.4em 0 .5em; }
@@ -155,7 +155,8 @@ h2 { font-size: 1.15rem; margin: 1.4em 0 .5em; }
.oc-ring-answer { background: var(--oc-ok-fill); color: #06281c; }
.oc-ring-answer { background: var(--oc-ok-fill); color: #06281c; }
.oc-ring-gone { color: var(--oc-muted); }
.oc-ring-gone { color: var(--oc-muted); }
@media (max-width: 520px) { .oc-ring { left: 16px; right: 16px; max-width: none; } }
@media (max-width: 520px) { .oc-ring { left: 16px; right: 16px; max-width: none; } }
-@media (prefers-reduced-motion: no-preference) { .oc-ring:not(.oc-ring-gone) { animation: oc-ring-in .25s ease-out; } @keyframes oc-ring-in { from { transform: translateY(12px); opacity: 0; } } }
+.oc-ring:not(.oc-ring-gone) { animation: oc-ring-in .25s ease-out; }
+@keyframes oc-ring-in { from { transform: translateY(12px); opacity: 0; } }
.oc-tools { display: block; margin-top: 8px; }
.oc-tools { display: block; margin-top: 8px; }
.oc-blocked { margin-top: 20px; }
.oc-blocked { margin-top: 20px; }
.oc-blocked summary { cursor: pointer; color: var(--oc-muted); }
.oc-blocked summary { cursor: pointer; color: var(--oc-muted); }
@@ -419,7 +420,6 @@ h2 { font-size: 1.15rem; margin: 1.4em 0 .5em; }
@@ -419,7 +420,6 @@ h2 { font-size: 1.15rem; margin: 1.4em 0 .5em; }
.oc-task-cancelled { opacity: .7; }
.oc-task-cancelled { opacity: .7; }
.oc-task-full p, .oc-task-details { overflow-wrap: anywhere; }
.oc-task-full p, .oc-task-details { overflow-wrap: anywhere; }
@keyframes oc-work { 0%, 100% { opacity: 1; } 50% { opacity: .55; } }
@keyframes oc-work { 0%, 100% { opacity: 1; } 50% { opacity: .55; } }
-@media (prefers-reduced-motion: reduce) { .oc-task-running .oc-task-state { animation: none; } }
/* On a phone the conversation comes first and the queue follows it, without its how-to (the composer's @vibe says it). */
/* On a phone the conversation comes first and the queue follows it, without its how-to (the composer's @vibe says it). */
@media (max-width: 900px) { .oc-ws { grid-template-columns: minmax(0, 1fr); } .oc-queue { position: static; max-height: none; } }
@media (max-width: 900px) { .oc-ws { grid-template-columns: minmax(0, 1fr); } .oc-queue { position: static; max-height: none; } }
@media (max-width: 560px) { .oc-queue-how { display: none; } }
@media (max-width: 560px) { .oc-queue-how { display: none; } }
@@ -483,7 +483,6 @@ h2 { font-size: 1.15rem; margin: 1.4em 0 .5em; }
@@ -483,7 +483,6 @@ h2 { font-size: 1.15rem; margin: 1.4em 0 .5em; }
.oc-tp-running { color: var(--oc-accent); border-color: color-mix(in srgb, var(--oc-accent) 45%, transparent); }
.oc-tp-running { color: var(--oc-accent); border-color: color-mix(in srgb, var(--oc-accent) 45%, transparent); }
.oc-tp-running .oc-i { animation: oc-breathe 1.2s ease-in-out infinite; } /* running: it breathes, never spins */
.oc-tp-running .oc-i { animation: oc-breathe 1.2s ease-in-out infinite; } /* running: it breathes, never spins */
@keyframes oc-breathe { 50% { opacity: .35; transform: scale(.82); } }
@keyframes oc-breathe { 50% { opacity: .35; transform: scale(.82); } }
-@media (prefers-reduced-motion: reduce) { .oc-tp-running .oc-i { animation: none; } }
.oc-tp-says { margin: 0; }
.oc-tp-says { margin: 0; }
.oc-tp-facts { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 8px; margin: 6px 0 0; }
.oc-tp-facts { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 8px; margin: 6px 0 0; }
.oc-tp-facts div { padding: 8px 12px; border-radius: 12px; background: var(--oc-panel); border: 1px solid var(--oc-line); min-width: 0; }
.oc-tp-facts div { padding: 8px 12px; border-radius: 12px; background: var(--oc-panel); border: 1px solid var(--oc-line); min-width: 0; }
@@ -608,7 +607,6 @@ h2 { font-size: 1.15rem; margin: 1.4em 0 .5em; }
@@ -608,7 +607,6 @@ h2 { font-size: 1.15rem; margin: 1.4em 0 .5em; }
.oc-keyrow { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px; margin: 4px 0 12px; }
.oc-keyrow { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px; margin: 4px 0 12px; }
.oc-keyrow .oc-i { vertical-align: -.2em; }
.oc-keyrow .oc-i { vertical-align: -.2em; }
.oc-danger-row { display: block; margin: 0 14px 14px; }
.oc-danger-row { display: block; margin: 0 14px 14px; }
-@media (prefers-reduced-motion: reduce) { .oc-fold > summary > .oc-i { transition: none; } }
/* A code block people copy (a feed's setup): its copy button in the corner, and never taller than a screenful. */
/* A code block people copy (a feed's setup): its copy button in the corner, and never taller than a screenful. */
.oc-snip { position: relative; }
.oc-snip { position: relative; }
.oc-snip > .oc-icon-btn { position: absolute; top: 6px; right: 6px; z-index: 1; width: 34px; height: 34px; background: var(--oc-panel); border-color: var(--oc-line); }
.oc-snip > .oc-icon-btn { position: absolute; top: 6px; right: 6px; z-index: 1; width: 34px; height: 34px; background: var(--oc-panel); border-color: var(--oc-line); }
@@ -659,7 +657,6 @@ div.oc-set-row { cursor: default; }
@@ -659,7 +657,6 @@ div.oc-set-row { cursor: default; }
.oc-set-save button { width: 100%; min-height: 46px; border-radius: 12px; }
.oc-set-save button { width: 100%; min-height: 46px; border-radius: 12px; }
.oc-aikey .oc-ai-form { max-width: none; }
.oc-aikey .oc-ai-form { max-width: none; }
@media (min-width: 720px) { .oc-set-save button { width: auto; min-width: 200px; } }
@media (min-width: 720px) { .oc-set-save button { width: auto; min-width: 200px; } }
-@media (prefers-reduced-motion: reduce) { .oc-switch, .oc-switch::after { transition: none; } }
/* Room settings: the room's form, its members (a row each, the role a small select that saves), and folded extras. */
/* Room settings: the room's form, its members (a row each, the role a small select that saves), and folded extras. */
.oc-set-form { padding: 4px 14px 14px; }
.oc-set-form { padding: 4px 14px 14px; }
.oc-set-note { margin: 0; padding: 0 14px 10px; font-size: .86rem; }
.oc-set-note { margin: 0; padding: 0 14px 10px; font-size: .86rem; }
@@ -40,7 +40,6 @@ a { color: var(--accent); }
@@ -40,7 +40,6 @@ a { color: var(--accent); }
.em-dots { display: inline-flex; gap: 4px; } .em-dots i { width: 6px; height: 6px; border-radius: 50%; background: currentColor; opacity: .4; animation: emDot 1.2s infinite; }
.em-dots { display: inline-flex; gap: 4px; } .em-dots i { width: 6px; height: 6px; border-radius: 50%; background: currentColor; opacity: .4; animation: emDot 1.2s infinite; }
.em-dots i:nth-child(2) { animation-delay: .15s; } .em-dots i:nth-child(3) { animation-delay: .3s; }
.em-dots i:nth-child(2) { animation-delay: .15s; } .em-dots i:nth-child(3) { animation-delay: .3s; }
@keyframes emDot { 40% { opacity: 1; transform: translateY(-2px); } }
@keyframes emDot { 40% { opacity: 1; transform: translateY(-2px); } }
-@media (prefers-reduced-motion: reduce) { .em-dots i { animation: none; } }
.em-handoff { padding: 0 12px; }
.em-handoff { padding: 0 12px; }
.em-handoff button { all: unset; cursor: pointer; font-size: .82rem; color: var(--accent); padding: 4px 6px; border-radius: 8px; }
.em-handoff button { all: unset; cursor: pointer; font-size: .82rem; color: var(--accent); padding: 4px 6px; border-radius: 8px; }
.em-handoff button[hidden] { display: none; }
.em-handoff button[hidden] { display: none; }
@@ -31,4 +31,3 @@
@@ -31,4 +31,3 @@
.fv-count, .fv-more { color: var(--fv-muted); font-size: .78rem; padding-left: 1.8em; }
.fv-count, .fv-more { color: var(--fv-muted); font-size: .78rem; padding-left: 1.8em; }
.fv-working { color: var(--fv-muted); font-size: .82rem; padding-left: 1.8em; }
.fv-working { color: var(--fv-muted); font-size: .82rem; padding-left: 1.8em; }
.fv-empty { margin: 4px 0; color: var(--fv-muted); font-size: .85rem; }
.fv-empty { margin: 4px 0; color: var(--fv-muted); font-size: .85rem; }
-@media (prefers-reduced-motion: reduce) { .fv-live .fv-dot { animation: none; } .fv-chev { transition: none; } }
@@ -120,7 +120,8 @@ main[data-party] [hidden] { display: none !important; }
@@ -120,7 +120,8 @@ main[data-party] [hidden] { display: none !important; }
main[data-party].is-guest [data-party-chat] { min-height: 0; flex: 0 0 auto; align-self: start; }
main[data-party].is-guest [data-party-chat] { min-height: 0; flex: 0 0 auto; align-self: start; }
.pt-float { position: absolute; bottom: 12px; font-size: 30px; animation: pt-rise 2.4s cubic-bezier(.2, .7, .3, 1) forwards; }
.pt-float { position: absolute; bottom: 12px; font-size: 30px; animation: pt-rise 2.4s cubic-bezier(.2, .7, .3, 1) forwards; }
@keyframes pt-rise { 0% { transform: translateY(0) scale(.7); opacity: 0; } 12% { opacity: 1; transform: translateY(-14px) scale(1.05); } 100% { transform: translateY(-190px) scale(1); opacity: 0; } }
@keyframes pt-rise { 0% { transform: translateY(0) scale(.7); opacity: 0; } 12% { opacity: 1; transform: translateY(-14px) scale(1.05); } 100% { transform: translateY(-190px) scale(1); opacity: 0; } }
-@media (prefers-reduced-motion: reduce) { .pt-float { animation: pt-fade 1.6s ease forwards; } @keyframes pt-fade { 0%, 70% { opacity: 1; } 100% { opacity: 0; } } }
+@keyframes pt-fade { 0%, 70% { opacity: 1; } 100% { opacity: 0; } }
+html[data-ov-motion=reduced] .pt-float { animation: pt-fade 1.6s ease forwards; }
/* The bar under the picture: the remote pill and the reactions. */
/* The bar under the picture: the remote pill and the reactions. */
.pt-bar { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
.pt-bar { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
@@ -27,7 +27,7 @@
@@ -27,7 +27,7 @@
var uploadDialog = document.querySelector('[data-vb-upload-dialog]');
var uploadDialog = document.querySelector('[data-vb-upload-dialog]');
var uploadRoot = document.querySelector('[data-vb-upload]');
var uploadRoot = document.querySelector('[data-vb-upload]');
var picture = null; // { file, url }: a picture waiting to go with the next message
var picture = null; // { file, url }: a picture waiting to go with the next message
- var reduce = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
+ var reduce = document.documentElement.getAttribute('data-ov-motion') === 'off';
var chosenModels = Array.isArray(cfg.models) ? cfg.models.slice(0, 3) : [];
var chosenModels = Array.isArray(cfg.models) ? cfg.models.slice(0, 3) : [];
function persistModelChoice() {
function persistModelChoice() {
if (!room) return;
if (!room) return;
@@ -56,7 +56,6 @@
@@ -56,7 +56,6 @@
'.p.on{opacity:1;transform:none;pointer-events:auto}.p iframe{width:100%;height:100%;flex:1;min-height:0;border:0;display:block}' +
'.p.on{opacity:1;transform:none;pointer-events:auto}.p iframe{width:100%;height:100%;flex:1;min-height:0;border:0;display:block}' +
'.h{display:none;align-items:center;justify-content:space-between;padding:8px 14px;background:#121a2b;color:#fff;font:600 14px system-ui}.h button{min-width:44px;min-height:44px;border:0;background:transparent;color:inherit;font:inherit;cursor:pointer}' +
'.h{display:none;align-items:center;justify-content:space-between;padding:8px 14px;background:#121a2b;color:#fff;font:600 14px system-ui}.h button{min-width:44px;min-height:44px;border:0;background:transparent;color:inherit;font:inherit;cursor:pointer}' +
'@media (max-width:520px){.p{left:0;right:0;bottom:0;top:0;width:auto;height:auto;border-radius:0}.p.on~.b{display:none}.h{display:flex;touch-action:none}}' +
'@media (max-width:520px){.p{left:0;right:0;bottom:0;top:0;width:auto;height:auto;border-radius:0}.p.on~.b{display:none}.h{display:flex;touch-action:none}}' +
- '@media (prefers-reduced-motion:reduce){.b,.p{transition:none}}' +
'</style>' +
'</style>' +
'<div class="p" role="dialog" aria-label="Chat"><div class="h"><span>Chat</span><button type="button" aria-label="Close chat">Close</button></div></div>' +
'<div class="p" role="dialog" aria-label="Chat"><div class="h"><span>Chat</span><button type="button" aria-label="Close chat">Close</button></div></div>' +
'<button class="b" type="button" aria-label="Open the chat" aria-expanded="false"><span class="d"></span>' +
'<button class="b" type="button" aria-label="Open the chat" aria-expanded="false"><span class="d"></span>' +