Part of EPIC #193. Depends on #194, #197.
Description
Create a new WindowFeature reducer with @ObservableState State { windowID, route: Welcome | Main, closeAlert, serverList?, cloudNavigation? }. Move the Route enum and the per-window sheets out of AppFeature into WindowFeature. MainFeature and WelcomeFeature become children under WindowFeature. Refactor AppFeature.State to hold windows: IdentifiedArrayOf<WindowFeature.State> (MVP ships with one element — enables multi-window without regressing single-window flow). Composition: AppFeature → ForEach(\.windows, action: \.windows) { WindowFeature() }. AppFeature retains only global concerns: projectRegistry (lookup ProjectID → WindowID).
Acceptance Criteria
Module / Layer
Relay / AppFeature (new child: WindowFeature)
Complexity
Large
Part of EPIC #193. Depends on #194, #197.
Description
Create a new
WindowFeaturereducer with@ObservableState State { windowID, route: Welcome | Main, closeAlert, serverList?, cloudNavigation? }. Move theRouteenum and the per-window sheets out ofAppFeatureintoWindowFeature.MainFeatureandWelcomeFeaturebecome children underWindowFeature. RefactorAppFeature.Stateto holdwindows: IdentifiedArrayOf<WindowFeature.State>(MVP ships with one element — enables multi-window without regressing single-window flow). Composition:AppFeature → ForEach(\.windows, action: \.windows) { WindowFeature() }.AppFeatureretains only global concerns:projectRegistry(lookupProjectID → WindowID).Acceptance Criteria
WindowFeature.Statehas a stablewindowID: UUIDAppFeature.State.windowsis anIdentifiedArrayOfwith an initial count of 1WindowFeature.Action(set route, show alert, close)Module / Layer
Relay / AppFeature (new child: WindowFeature)
Complexity
Large