diff --git a/client/public/version.js b/client/public/version.js index 253faca..ecb8ddd 100644 --- a/client/public/version.js +++ b/client/public/version.js @@ -1,5 +1,5 @@ // Maintainer-controlled web client version. // Format: YYYY.MM.DD Rn (example: 2026.02.20 R2) -window.CHGRID_WEB_VERSION = "2026.02.28 R303"; +window.CHGRID_WEB_VERSION = "2026.02.28 R304"; // Optional display timezone for timestamps. Falls back to America/Detroit if unset/invalid. window.CHGRID_TIME_ZONE = "America/Detroit"; diff --git a/client/src/audio/itemEmitRuntime.ts b/client/src/audio/itemEmitRuntime.ts index de870aa..f389c26 100644 --- a/client/src/audio/itemEmitRuntime.ts +++ b/client/src/audio/itemEmitRuntime.ts @@ -311,6 +311,13 @@ export class ItemEmitRuntime { // Ignore stale media reload failures. } } + if (element.ended || (Number.isFinite(element.duration) && element.duration > 0 && element.currentTime >= element.duration - 0.01)) { + try { + element.currentTime = 0; + } catch { + // Ignore reset failures for streams/seeking-restricted media. + } + } void element .play() .then(() => { diff --git a/client/src/items/itemPropertyEditor.ts b/client/src/items/itemPropertyEditor.ts index f41df5e..1aff9a9 100644 --- a/client/src/items/itemPropertyEditor.ts +++ b/client/src/items/itemPropertyEditor.ts @@ -353,6 +353,16 @@ export function createItemPropertyEditor(deps: EditorDeps): { return; } + if (code === 'PageUp' || code === 'PageDown') { + const length = deps.state.itemPropertyOptionValues.length; + const delta = code === 'PageUp' ? -10 : 10; + const nextIndex = (deps.state.itemPropertyOptionIndex + delta + length * 1000) % length; + deps.state.itemPropertyOptionIndex = nextIndex; + deps.updateStatus(deps.state.itemPropertyOptionValues[nextIndex]); + deps.sfxUiBlip(); + return; + } + const control = handleListControlKey( code, key, diff --git a/docs/controls.md b/docs/controls.md index a184a97..bb1295a 100644 --- a/docs/controls.md +++ b/docs/controls.md @@ -74,6 +74,7 @@ This document is the authoritative keymap for the client. Applies to effect select, user/item list modes, item selection, item property list, and property option select. - `ArrowUp` / `ArrowDown`: Move selection +- `PageUp` / `PageDown` in item property option select: Jump 10 options backward/forward - `ArrowLeft` / `ArrowRight` in user list: Lower/raise selected user listen volume (`0.5..4.0`) - `Enter`: Confirm selection - `Escape`: Exit/cancel