openvibers/openvibe.surf Commits
Motion: Calm reduces, only Off removes (Shared 4.183.0) (#135)
Changes
@@@ -264,5 +264,5 @@ Part of the [OpenVibe network](https://openvibe.network). Built in the open by<!-- versions:start -->- openvibe-contracts: v0.384.0- openvibe-sdk: v0.125.0--- openvibe-shared: v4.179.0++- openvibe-shared: v4.183.0<!-- versions:end -->@@@ -10,7 +10,7 @@"domain": "openvibe.surf","contracts": "openvibe-contracts v0.384.0","sdk": "openvibe-sdk v0.125.0",-- "shared": "openvibe-shared v4.179.0",++ "shared": "openvibe-shared v4.183.0","packages": ["openvibe-contracts v0.384.0","openvibe-sdk v0.125.0",nnew file mode 120000@@@ -0,0 +1 @@++/home/workstation/.cache/openvibe-deps/OpenVibe.Surf/bc7371ec28947a16/node_modules\\ No newline at end of file@@@ -16,7 +16,7 @@"helmet": "^8.1.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.125.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"},"engines": {"node": ">=22.0.0"@@@ -1103,9 +1103,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",@@@ -22,7 +22,7 @@"helmet": "^8.1.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.125.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"},"engines": {"node": ">=22.0.0"@@@ -60,7 +60,7 @@ html.ov-motion .sf-run-speed i { animation: sf-speed 1.1s linear infinite; anima.sf-tile span:not(.sf-tile-ic):not(.sf-tile-go) { color: var(--text-secondary, #96a7c2); line-height: 1.5; font-size: .95rem; }.sf-tile-go { display: inline-flex; align-items: center; gap: 2px; margin-top: 4px; font-weight: 800; color: var(--room-strong); }.sf-tile-go .ovk-i { width: 1em; height: 1em; }--@media (prefers-reduced-motion: reduce) { .sf-tile a { transition: none; } .sf-tile a:hover { transform: none; } }++html[data-ov-motion=off] .sf-tile a:hover{transform: none}/* Scenes. */.sf-demo-run { display: grid; gap: 10px; padding: 16px; border-radius: 18px; background: #0b0f17; color: #e9f2ff; border: 1px solid color-mix(in srgb, var(--room-accent) 35%, transparent); }@@@ -77,7 +77,6 @@ html.ov-motion .sf-run-speed i { animation: sf-speed 1.1s linear infinite; anima.sf-demo-steps li.is-now { color: var(--text-primary, #e6edf7); font-weight: 650; }.sf-demo-steps li.is-now::before { border-color: var(--room-accent); animation: sf-pulse 1.4s ease-out infinite; } /* the step on now pulses out, never spins */@keyframes sf-pulse { from { box-shadow: 0 0 0 0 color-mix(in srgb, var(--room-accent) 50%, transparent); } to { box-shadow: 0 0 0 7px transparent; } }--@media (prefers-reduced-motion: reduce) { .sf-demo-steps li.is-now::before { animation: none; } }.sf-demo-tv { display: grid; gap: 8px; padding: 10px; border-radius: 18px; background: var(--bg-card, #0f1729); border: 1px solid var(--border, #1f2d47); }.sf-demo-screen { position: relative; display: flex; align-items: flex-end; gap: 8px; aspect-ratio: 16 / 6; max-height: 210px; padding: 12px; border-radius: 12px; color: #fff; font-weight: 700; font-size: .85rem;background: radial-gradient(120% 120% at 70% 30%, color-mix(in srgb, var(--room-accent) 45%, transparent), transparent 60%), linear-gradient(160deg, #1e293b, #0b1020); }@@@ -195,8 +194,6 @@ html.ov-motion .sf-party-dot { animation: sf-party-pulse 2.4s ease-in-out infini.sf-eps dt code { font: 600 .88rem/1.4 ui-monospace, SFMono-Regular, Menlo, monospace; color: var(--room-strong); overflow-wrap: anywhere; }.sf-eps dd { margin: 6px 0 0; color: var(--text-secondary, #96a7c2); line-height: 1.5; }--@media (prefers-reduced-motion: reduce) { .sf-run-speed i, .sf-demo-steps li.is-now::before, .sf-tv-screen.is-changing, .sf-party-dot { animation: none !important; } }--html[data-ov-motion=reduced] .sf-run-speed i { animation: none !important; }/* Watch together: the party bar above the TV. Everyone sees the host's channel and moment; the dot pulses whilethe party is in sync. */@@@ -216,7 +213,6 @@ html.ov-motion .sf-party-playing .sf-party-dot { animation: sf-pulse 1.6s ease-o.sf-party-chat-form { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }.sf-party-chat-url { flex: 1 1 240px; min-height: 38px; padding: 0 12px; border-radius: 10px; border: 1px solid var(--border, #1f2d47); background: var(--bg-input, var(--bg-primary, #0a0f1c)); color: inherit; font: inherit; }.sf-party-id { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: .8rem; color: var(--text-muted, #7386a3); }--@media (prefers-reduced-motion: reduce) { .sf-party-dot { animation: none !important; } }/* Surf with Vibe: the task page (/web/t/:id): state, desk links, live steps as a timeline, sources, the report */.sf-desk-page { display: grid; gap: 14px; }@@@ -266,8 +262,6 @@ html.ov-motion .sf-party-playing .sf-party-dot { animation: sf-pulse 1.6s ease-o.sf-desk-report-text { white-space: pre-wrap; line-height: 1.6; overflow-wrap: anywhere; }.sf-desk-report p { margin: 0; color: var(--text-secondary, #96a7c2); }.sf-desk-actor { margin: 4px 0 0; text-align: center; }--@media (prefers-reduced-motion: reduce) { .sf-desk-page[data-sf-desk-open="1"] .sf-desk-state::before { animation: none; } }--html[data-ov-motion=reduced] .sf-desk-page[data-sf-desk-open="1"] .sf-desk-state::before { animation: none; }/* Touch targets on phones (fleet audit 2026-10-29): the touch-only hit area for this group. Nothing moves with a mouse. */@media (pointer: coarse) {@@@ -377,5 +371,3 @@ html[data-ov-motion=reduced] .sf-desk-page[data-sf-desk-open="1"] .sf-desk-state.sf-task-count { color: var(--text-muted, #7386a3); font-weight: 600; }.sf-task-steps ol { margin-top: 8px; }.sf-task-rule { margin: 0; text-align: center; }--@media (prefers-reduced-motion: reduce) { .sf-task[data-sf-desk-open="1"] .sf-task-dot { animation: none; } .sf-task-steps summary::before { transition: none; } }--html[data-ov-motion=reduced] .sf-task[data-sf-desk-open="1"] .sf-task-dot { animation: none; }@@@ -5,7 +5,7 @@* - Home: the run motif's timer and speed tick. */(function () {'use strict';-- var reduced = function () { try { return matchMedia('(prefers-reduced-motion: reduce)').matches || document.documentElement.dataset.ovMotion === 'reduced'; } catch (e) { return false; } };++ var reduced = function () { try { return document.documentElement.getAttribute('data-ov-motion') === 'off'; } catch (e) { return false; } };// ── Home: the run's timer ─────────────────────────────────function runMotif() {
@@ -264,5 +264,5 @@ Part of the [OpenVibe network](https://openvibe.network). Built in the open by
@@ -264,5 +264,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.125.0
- openvibe-sdk: v0.125.0
-- openvibe-shared: v4.179.0
+- openvibe-shared: v4.183.0
<!-- versions:end -->
<!-- versions:end -->
@@ -10,7 +10,7 @@
@@ -10,7 +10,7 @@
"domain": "openvibe.surf",
"domain": "openvibe.surf",
"contracts": "openvibe-contracts v0.384.0",
"contracts": "openvibe-contracts v0.384.0",
"sdk": "openvibe-sdk v0.125.0",
"sdk": "openvibe-sdk v0.125.0",
- "shared": "openvibe-shared v4.179.0",
+ "shared": "openvibe-shared v4.183.0",
"packages": [
"packages": [
"openvibe-contracts v0.384.0",
"openvibe-contracts v0.384.0",
"openvibe-sdk v0.125.0",
"openvibe-sdk v0.125.0",
new file mode 120000
new file mode 120000
@@ -0,0 +1 @@
@@ -0,0 +1 @@
+/home/workstation/.cache/openvibe-deps/OpenVibe.Surf/bc7371ec28947a16/node_modules
\ No newline at end of file
\ No newline at end of file
@@ -16,7 +16,7 @@
@@ -16,7 +16,7 @@
"helmet": "^8.1.0",
"helmet": "^8.1.0",
"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.125.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.125.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"
},
},
"engines": {
"engines": {
"node": ">=22.0.0"
"node": ">=22.0.0"
@@ -1103,9 +1103,9 @@
@@ -1103,9 +1103,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",
@@ -22,7 +22,7 @@
@@ -22,7 +22,7 @@
"helmet": "^8.1.0",
"helmet": "^8.1.0",
"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.125.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.125.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"
},
},
"engines": {
"engines": {
"node": ">=22.0.0"
"node": ">=22.0.0"
@@ -60,7 +60,7 @@ html.ov-motion .sf-run-speed i { animation: sf-speed 1.1s linear infinite; anima
@@ -60,7 +60,7 @@ html.ov-motion .sf-run-speed i { animation: sf-speed 1.1s linear infinite; anima
.sf-tile span:not(.sf-tile-ic):not(.sf-tile-go) { color: var(--text-secondary, #96a7c2); line-height: 1.5; font-size: .95rem; }
.sf-tile span:not(.sf-tile-ic):not(.sf-tile-go) { color: var(--text-secondary, #96a7c2); line-height: 1.5; font-size: .95rem; }
.sf-tile-go { display: inline-flex; align-items: center; gap: 2px; margin-top: 4px; font-weight: 800; color: var(--room-strong); }
.sf-tile-go { display: inline-flex; align-items: center; gap: 2px; margin-top: 4px; font-weight: 800; color: var(--room-strong); }
.sf-tile-go .ovk-i { width: 1em; height: 1em; }
.sf-tile-go .ovk-i { width: 1em; height: 1em; }
-@media (prefers-reduced-motion: reduce) { .sf-tile a { transition: none; } .sf-tile a:hover { transform: none; } }
+html[data-ov-motion=off] .sf-tile a:hover{transform: none}
/* Scenes. */
/* Scenes. */
.sf-demo-run { display: grid; gap: 10px; padding: 16px; border-radius: 18px; background: #0b0f17; color: #e9f2ff; border: 1px solid color-mix(in srgb, var(--room-accent) 35%, transparent); }
.sf-demo-run { display: grid; gap: 10px; padding: 16px; border-radius: 18px; background: #0b0f17; color: #e9f2ff; border: 1px solid color-mix(in srgb, var(--room-accent) 35%, transparent); }
@@ -77,7 +77,6 @@ html.ov-motion .sf-run-speed i { animation: sf-speed 1.1s linear infinite; anima
@@ -77,7 +77,6 @@ html.ov-motion .sf-run-speed i { animation: sf-speed 1.1s linear infinite; anima
.sf-demo-steps li.is-now { color: var(--text-primary, #e6edf7); font-weight: 650; }
.sf-demo-steps li.is-now { color: var(--text-primary, #e6edf7); font-weight: 650; }
.sf-demo-steps li.is-now::before { border-color: var(--room-accent); animation: sf-pulse 1.4s ease-out infinite; } /* the step on now pulses out, never spins */
.sf-demo-steps li.is-now::before { border-color: var(--room-accent); animation: sf-pulse 1.4s ease-out infinite; } /* the step on now pulses out, never spins */
@keyframes sf-pulse { from { box-shadow: 0 0 0 0 color-mix(in srgb, var(--room-accent) 50%, transparent); } to { box-shadow: 0 0 0 7px transparent; } }
@keyframes sf-pulse { from { box-shadow: 0 0 0 0 color-mix(in srgb, var(--room-accent) 50%, transparent); } to { box-shadow: 0 0 0 7px transparent; } }
-@media (prefers-reduced-motion: reduce) { .sf-demo-steps li.is-now::before { animation: none; } }
.sf-demo-tv { display: grid; gap: 8px; padding: 10px; border-radius: 18px; background: var(--bg-card, #0f1729); border: 1px solid var(--border, #1f2d47); }
.sf-demo-tv { display: grid; gap: 8px; padding: 10px; border-radius: 18px; background: var(--bg-card, #0f1729); border: 1px solid var(--border, #1f2d47); }
.sf-demo-screen { position: relative; display: flex; align-items: flex-end; gap: 8px; aspect-ratio: 16 / 6; max-height: 210px; padding: 12px; border-radius: 12px; color: #fff; font-weight: 700; font-size: .85rem;
.sf-demo-screen { position: relative; display: flex; align-items: flex-end; gap: 8px; aspect-ratio: 16 / 6; max-height: 210px; padding: 12px; border-radius: 12px; color: #fff; font-weight: 700; font-size: .85rem;
background: radial-gradient(120% 120% at 70% 30%, color-mix(in srgb, var(--room-accent) 45%, transparent), transparent 60%), linear-gradient(160deg, #1e293b, #0b1020); }
background: radial-gradient(120% 120% at 70% 30%, color-mix(in srgb, var(--room-accent) 45%, transparent), transparent 60%), linear-gradient(160deg, #1e293b, #0b1020); }
@@ -195,8 +194,6 @@ html.ov-motion .sf-party-dot { animation: sf-party-pulse 2.4s ease-in-out infini
@@ -195,8 +194,6 @@ html.ov-motion .sf-party-dot { animation: sf-party-pulse 2.4s ease-in-out infini
.sf-eps dt code { font: 600 .88rem/1.4 ui-monospace, SFMono-Regular, Menlo, monospace; color: var(--room-strong); overflow-wrap: anywhere; }
.sf-eps dt code { font: 600 .88rem/1.4 ui-monospace, SFMono-Regular, Menlo, monospace; color: var(--room-strong); overflow-wrap: anywhere; }
.sf-eps dd { margin: 6px 0 0; color: var(--text-secondary, #96a7c2); line-height: 1.5; }
.sf-eps dd { margin: 6px 0 0; color: var(--text-secondary, #96a7c2); line-height: 1.5; }
-@media (prefers-reduced-motion: reduce) { .sf-run-speed i, .sf-demo-steps li.is-now::before, .sf-tv-screen.is-changing, .sf-party-dot { animation: none !important; } }
-html[data-ov-motion=reduced] .sf-run-speed i { animation: none !important; }
/* Watch together: the party bar above the TV. Everyone sees the host's channel and moment; the dot pulses while
/* Watch together: the party bar above the TV. Everyone sees the host's channel and moment; the dot pulses while
the party is in sync. */
the party is in sync. */
@@ -216,7 +213,6 @@ html.ov-motion .sf-party-playing .sf-party-dot { animation: sf-pulse 1.6s ease-o
@@ -216,7 +213,6 @@ html.ov-motion .sf-party-playing .sf-party-dot { animation: sf-pulse 1.6s ease-o
.sf-party-chat-form { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.sf-party-chat-form { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.sf-party-chat-url { flex: 1 1 240px; min-height: 38px; padding: 0 12px; border-radius: 10px; border: 1px solid var(--border, #1f2d47); background: var(--bg-input, var(--bg-primary, #0a0f1c)); color: inherit; font: inherit; }
.sf-party-chat-url { flex: 1 1 240px; min-height: 38px; padding: 0 12px; border-radius: 10px; border: 1px solid var(--border, #1f2d47); background: var(--bg-input, var(--bg-primary, #0a0f1c)); color: inherit; font: inherit; }
.sf-party-id { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: .8rem; color: var(--text-muted, #7386a3); }
.sf-party-id { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: .8rem; color: var(--text-muted, #7386a3); }
-@media (prefers-reduced-motion: reduce) { .sf-party-dot { animation: none !important; } }
/* Surf with Vibe: the task page (/web/t/:id): state, desk links, live steps as a timeline, sources, the report */
/* Surf with Vibe: the task page (/web/t/:id): state, desk links, live steps as a timeline, sources, the report */
.sf-desk-page { display: grid; gap: 14px; }
.sf-desk-page { display: grid; gap: 14px; }
@@ -266,8 +262,6 @@ html.ov-motion .sf-party-playing .sf-party-dot { animation: sf-pulse 1.6s ease-o
@@ -266,8 +262,6 @@ html.ov-motion .sf-party-playing .sf-party-dot { animation: sf-pulse 1.6s ease-o
.sf-desk-report-text { white-space: pre-wrap; line-height: 1.6; overflow-wrap: anywhere; }
.sf-desk-report-text { white-space: pre-wrap; line-height: 1.6; overflow-wrap: anywhere; }
.sf-desk-report p { margin: 0; color: var(--text-secondary, #96a7c2); }
.sf-desk-report p { margin: 0; color: var(--text-secondary, #96a7c2); }
.sf-desk-actor { margin: 4px 0 0; text-align: center; }
.sf-desk-actor { margin: 4px 0 0; text-align: center; }
-@media (prefers-reduced-motion: reduce) { .sf-desk-page[data-sf-desk-open="1"] .sf-desk-state::before { animation: none; } }
-html[data-ov-motion=reduced] .sf-desk-page[data-sf-desk-open="1"] .sf-desk-state::before { animation: none; }
/* Touch targets on phones (fleet audit 2026-10-29): the touch-only hit area for this group. Nothing moves with a mouse. */
/* Touch targets on phones (fleet audit 2026-10-29): the touch-only hit area for this group. Nothing moves with a mouse. */
@media (pointer: coarse) {
@media (pointer: coarse) {
@@ -377,5 +371,3 @@ html[data-ov-motion=reduced] .sf-desk-page[data-sf-desk-open="1"] .sf-desk-state
@@ -377,5 +371,3 @@ html[data-ov-motion=reduced] .sf-desk-page[data-sf-desk-open="1"] .sf-desk-state
.sf-task-count { color: var(--text-muted, #7386a3); font-weight: 600; }
.sf-task-count { color: var(--text-muted, #7386a3); font-weight: 600; }
.sf-task-steps ol { margin-top: 8px; }
.sf-task-steps ol { margin-top: 8px; }
.sf-task-rule { margin: 0; text-align: center; }
.sf-task-rule { margin: 0; text-align: center; }
-@media (prefers-reduced-motion: reduce) { .sf-task[data-sf-desk-open="1"] .sf-task-dot { animation: none; } .sf-task-steps summary::before { transition: none; } }
-html[data-ov-motion=reduced] .sf-task[data-sf-desk-open="1"] .sf-task-dot { animation: none; }
@@ -5,7 +5,7 @@
@@ -5,7 +5,7 @@
* - Home: the run motif's timer and speed tick. */
* - Home: the run motif's timer and speed tick. */
(function () {
(function () {
'use strict';
'use strict';
- var reduced = function () { try { return matchMedia('(prefers-reduced-motion: reduce)').matches || document.documentElement.dataset.ovMotion === 'reduced'; } catch (e) { return false; } };
+ var reduced = function () { try { return document.documentElement.getAttribute('data-ov-motion') === 'off'; } catch (e) { return false; } };
// ── Home: the run's timer ─────────────────────────────────
// ── Home: the run's timer ─────────────────────────────────
function runMotif() {
function runMotif() {