From e872de691386bf45790891fd51b08a23b5c7db84 Mon Sep 17 00:00:00 2001 From: Walker Sutton Date: Tue, 29 Sep 2026 23:59:56 -0400 Subject: [PATCH] feat: prompt for rider weight wherever W/kg would render as 0 Adds a shared RiderWeightField (Settings) and RiderWeightPrompt, shown in the export dialog, the preview canvas, and W/kg element properties when the template uses power_to_weight but no weight is set. Element list flags affected W/kg rows with a warning icon. Co-Authored-By: Claude Opus 5.5 --- app/src/app.svelte | 8 +- app/src/components/layout/CenterCanvas.svelte | 23 ++- .../overlays/ExportFormatDialog.svelte | 20 +++ app/src/components/overlays/Settings.svelte | 25 +-- app/src/components/panels/ElementList.svelte | 18 +- .../panels/ElementProperties.svelte | 10 ++ app/src/components/ui/RiderWeightField.svelte | 115 +++++++++++++ .../components/ui/RiderWeightPrompt.svelte | 161 ++++++++++++++++++ app/src/state/appState.svelte.js | 32 +++- 9 files changed, 373 insertions(+), 39 deletions(-) create mode 100644 app/src/components/ui/RiderWeightField.svelte create mode 100644 app/src/components/ui/RiderWeightPrompt.svelte diff --git a/app/src/app.svelte b/app/src/app.svelte index 8c8cb40..af99057 100644 --- a/app/src/app.svelte +++ b/app/src/app.svelte @@ -728,6 +728,7 @@ sizeFor={exportSizeEstimateFor} bytesFor={renderFileSizeBytesFor} diskFreeBytes={exportDiskFreeBytes} + usesRiderWeight={app.usesRiderWeight} testAvailableFor={exportTestAvailableFor} calibrating={app.calibratingFormat} oncalibrate={(fmt) => app.calibrateExportEstimate(fmt)} @@ -786,13 +787,6 @@ use:windowDrag class="h-[52px] shrink-0 bg-[var(--panel)] rounded-[10px] flex items-center gap-2 pr-3 pl-[88px] z-50" > - - C -
-
diff --git a/app/src/components/layout/CenterCanvas.svelte b/app/src/components/layout/CenterCanvas.svelte index 7a05bb5..b326473 100644 --- a/app/src/components/layout/CenterCanvas.svelte +++ b/app/src/components/layout/CenterCanvas.svelte @@ -9,6 +9,7 @@ import VideoBackdrop from '../canvas/VideoBackdrop.svelte' import WysiwygLayer from '../canvas/WysiwygLayer.svelte' import PlaybackControls from '../canvas/PlaybackControls.svelte' + import RiderWeightPrompt from '../ui/RiderWeightPrompt.svelte' import VideoAlignmentBar from '../canvas/VideoAlignmentBar.svelte' import { videoStartOnAxis } from '@/lib/videoAlignment.js' import { isLapMetric } from '@/lib/elementTypes.js' @@ -743,11 +744,31 @@
+ + {#if app.usesRiderWeight && app.hasActivity} + +
e.stopPropagation()} + onwheel={(e) => e.stopPropagation()} + > + +
+ {/if} + {#if app.config && app.hasActivity}
boolean — true when the codec has no same-machine // measurement yet, so it offers a quick test render testAvailableFor = null, @@ -60,6 +64,13 @@ }) function onKeydown(e) { + // Enter inside a field (the rider-weight prompt) edits, it doesn't render. + const t = e.target + if ( + e.key === 'Enter' && + (t?.tagName === 'INPUT' || t?.tagName === 'SELECT') + ) + return if (e.key === 'Escape') { e.preventDefault() oncancel?.() @@ -251,6 +262,15 @@
{/if} + + {#if usesRiderWeight} + + {/if} +