diff --git a/src/app/App.tsx b/src/app/App.tsx
index 617421f9..7f9ef071 100644
--- a/src/app/App.tsx
+++ b/src/app/App.tsx
@@ -8985,18 +8985,52 @@ export function App({ store, initialStatusMessage }: AppProps) {
Clock
- {formatTimeOfDayHours(
+ Day {editorState.projectDocument.time.startDayNumber} ยท {formatTimeOfDayHours(
editorState.projectDocument.time.startTimeOfDayHours
)}
- Runner sessions begin at the authored start time and keep advancing across scene transitions.
+ Runner sessions begin on the authored start day and time, then keep advancing across scene transitions.
+
+
+
Sun Windows
+
+
+ Sunrise
+
+ setProjectTimeSunriseTimeOfDayDraft(
+ event.currentTarget.value
+ )
+ }
+ onBlur={applyProjectTimeSunriseTimeOfDay}
+ onKeyDown={(event) =>
+ handleDraftVectorKeyDown(
+ event,
+ applyProjectTimeSunriseTimeOfDay
+ )
+ }
+ onKeyUp={(event) =>
+ handleNumberInputKeyUp(
+ event,
+ applyProjectTimeSunriseTimeOfDay
+ )
+ }
+ onPointerUp={(event) =>
+ handleNumberInputPointerUp(
+ event,
+ applyProjectTimeSunriseTimeOfDay
+ )
+ }
+ />
+
+
+ Sunset
+
+ setProjectTimeSunsetTimeOfDayDraft(
+ event.currentTarget.value
+ )
+ }
+ onBlur={applyProjectTimeSunsetTimeOfDay}
+ onKeyDown={(event) =>
+ handleDraftVectorKeyDown(
+ event,
+ applyProjectTimeSunsetTimeOfDay
+ )
+ }
+ onKeyUp={(event) =>
+ handleNumberInputKeyUp(
+ event,
+ applyProjectTimeSunsetTimeOfDay
+ )
+ }
+ onPointerUp={(event) =>
+ handleNumberInputPointerUp(
+ event,
+ applyProjectTimeSunsetTimeOfDay
+ )
+ }
+ />
+
+
+
+
+ Dawn Hours
+
+ setProjectTimeDawnDurationHoursDraft(
+ event.currentTarget.value
+ )
+ }
+ onBlur={applyProjectTimeDawnDurationHours}
+ onKeyDown={(event) =>
+ handleDraftVectorKeyDown(
+ event,
+ applyProjectTimeDawnDurationHours
+ )
+ }
+ onKeyUp={(event) =>
+ handleNumberInputKeyUp(
+ event,
+ applyProjectTimeDawnDurationHours
+ )
+ }
+ onPointerUp={(event) =>
+ handleNumberInputPointerUp(
+ event,
+ applyProjectTimeDawnDurationHours
+ )
+ }
+ />
+
+
+ Dusk Hours
+
+ setProjectTimeDuskDurationHoursDraft(
+ event.currentTarget.value
+ )
+ }
+ onBlur={applyProjectTimeDuskDurationHours}
+ onKeyDown={(event) =>
+ handleDraftVectorKeyDown(
+ event,
+ applyProjectTimeDuskDurationHours
+ )
+ }
+ onKeyUp={(event) =>
+ handleNumberInputKeyUp(
+ event,
+ applyProjectTimeDuskDurationHours
+ )
+ }
+ onPointerUp={(event) =>
+ handleNumberInputPointerUp(
+ event,
+ applyProjectTimeDuskDurationHours
+ )
+ }
+ />
+
+
+
+ Sunrise must stay earlier than sunset. Dawn and dusk durations define how broadly the twilight profile blends around each boundary.
+
+
+
+
+
Dawn Profile
+
+
+ Sky Top
+
+ applyProjectTimePhaseColor(
+ "dawn",
+ "skyTopColorHex",
+ event.currentTarget.value,
+ "Set dawn sky top color",
+ "Updated the dawn sky top color."
+ )
+ }
+ />
+
+
+ Sky Bottom
+
+ applyProjectTimePhaseColor(
+ "dawn",
+ "skyBottomColorHex",
+ event.currentTarget.value,
+ "Set dawn sky bottom color",
+ "Updated the dawn sky bottom color."
+ )
+ }
+ />
+
+
+ Ambient Color
+
+ applyProjectTimePhaseColor(
+ "dawn",
+ "ambientColorHex",
+ event.currentTarget.value,
+ "Set dawn ambient color",
+ "Updated the dawn ambient color."
+ )
+ }
+ />
+
+
+ Ambient Factor
+
+ setProjectTimeDawnAmbientIntensityFactorDraft(
+ event.currentTarget.value
+ )
+ }
+ onBlur={() =>
+ applyProjectTimePhaseNumericField(
+ "dawn",
+ "ambientIntensityFactor",
+ projectTimeDawnAmbientIntensityFactorDraft,
+ "Set dawn ambient factor",
+ "Dawn ambient factor",
+ "Updated the dawn ambient factor."
+ )
+ }
+ />
+
+
+ Light Color
+
+ applyProjectTimePhaseColor(
+ "dawn",
+ "lightColorHex",
+ event.currentTarget.value,
+ "Set dawn light color",
+ "Updated the dawn light color."
+ )
+ }
+ />
+
+
+ Light Factor
+
+ setProjectTimeDawnLightIntensityFactorDraft(
+ event.currentTarget.value
+ )
+ }
+ onBlur={() =>
+ applyProjectTimePhaseNumericField(
+ "dawn",
+ "lightIntensityFactor",
+ projectTimeDawnLightIntensityFactorDraft,
+ "Set dawn light factor",
+ "Dawn light factor",
+ "Updated the dawn light factor."
+ )
+ }
+ />
+
+
+
+
+
+
Dusk Profile
+
+
+ Sky Top
+
+ applyProjectTimePhaseColor(
+ "dusk",
+ "skyTopColorHex",
+ event.currentTarget.value,
+ "Set dusk sky top color",
+ "Updated the dusk sky top color."
+ )
+ }
+ />
+
+
+ Sky Bottom
+
+ applyProjectTimePhaseColor(
+ "dusk",
+ "skyBottomColorHex",
+ event.currentTarget.value,
+ "Set dusk sky bottom color",
+ "Updated the dusk sky bottom color."
+ )
+ }
+ />
+
+
+ Ambient Color
+
+ applyProjectTimePhaseColor(
+ "dusk",
+ "ambientColorHex",
+ event.currentTarget.value,
+ "Set dusk ambient color",
+ "Updated the dusk ambient color."
+ )
+ }
+ />
+
+
+ Ambient Factor
+
+ setProjectTimeDuskAmbientIntensityFactorDraft(
+ event.currentTarget.value
+ )
+ }
+ onBlur={() =>
+ applyProjectTimePhaseNumericField(
+ "dusk",
+ "ambientIntensityFactor",
+ projectTimeDuskAmbientIntensityFactorDraft,
+ "Set dusk ambient factor",
+ "Dusk ambient factor",
+ "Updated the dusk ambient factor."
+ )
+ }
+ />
+
+
+ Light Color
+
+ applyProjectTimePhaseColor(
+ "dusk",
+ "lightColorHex",
+ event.currentTarget.value,
+ "Set dusk light color",
+ "Updated the dusk light color."
+ )
+ }
+ />
+
+
+ Light Factor
+
+ setProjectTimeDuskLightIntensityFactorDraft(
+ event.currentTarget.value
+ )
+ }
+ onBlur={() =>
+ applyProjectTimePhaseNumericField(
+ "dusk",
+ "lightIntensityFactor",
+ projectTimeDuskLightIntensityFactorDraft,
+ "Set dusk light factor",
+ "Dusk light factor",
+ "Updated the dusk light factor."
+ )
+ }
+ />
+
+
+
+
+
+
Night Profile
+
+
+ Sky Top
+
+ applyProjectTimePhaseColor(
+ "night",
+ "skyTopColorHex",
+ event.currentTarget.value,
+ "Set night sky top color",
+ "Updated the night sky top color."
+ )
+ }
+ />
+
+
+ Sky Bottom
+
+ applyProjectTimePhaseColor(
+ "night",
+ "skyBottomColorHex",
+ event.currentTarget.value,
+ "Set night sky bottom color",
+ "Updated the night sky bottom color."
+ )
+ }
+ />
+
+
+ Ambient Color
+
+ applyProjectTimePhaseColor(
+ "night",
+ "ambientColorHex",
+ event.currentTarget.value,
+ "Set night ambient color",
+ "Updated the night ambient color."
+ )
+ }
+ />
+
+
+ Ambient Factor
+
+ setProjectTimeNightAmbientIntensityFactorDraft(
+ event.currentTarget.value
+ )
+ }
+ onBlur={() =>
+ applyProjectTimePhaseNumericField(
+ "night",
+ "ambientIntensityFactor",
+ projectTimeNightAmbientIntensityFactorDraft,
+ "Set night ambient factor",
+ "Night ambient factor",
+ "Updated the night ambient factor."
+ )
+ }
+ />
+
+
+ Moon / Night Light
+
+ applyProjectTimePhaseColor(
+ "night",
+ "lightColorHex",
+ event.currentTarget.value,
+ "Set night light color",
+ "Updated the night light color."
+ )
+ }
+ />
+
+
+ Moon / Night Factor
+
+ setProjectTimeNightLightIntensityFactorDraft(
+ event.currentTarget.value
+ )
+ }
+ onBlur={() =>
+ applyProjectTimePhaseNumericField(
+ "night",
+ "lightIntensityFactor",
+ projectTimeNightLightIntensityFactorDraft,
+ "Set night light factor",
+ "Night light factor",
+ "Updated the night light factor."
+ )
+ }
+ />
+
+
+
+ Dawn, dusk, and night profiles blend over each scene's authored World settings whenever the scene enables global time influence.
+
+
@@ -9083,6 +9646,24 @@ export function App({ store, initialStatusMessage }: AppProps) {
data-testid="world-background-mode-value"
>
{formatWorldBackgroundLabel(editorState.document.world)}
+
+
+
+ Follow Project Time
+
+ applySceneProjectTimeLightingEnabled(
+ event.currentTarget.checked
+ )
+ }
+ />
+
+
+ Disable this when a scene should keep its authored world sky and lighting instead of the global sunrise, sunset, dawn, dusk, and night profile.
+
+