@model StoryIntelligencePipelineHeaderViewModel @{ var reviewStages = new[] { new PipelineStage("Review Scenes", "Scenes", true), new PipelineStage("Review Characters", "Characters", true), new PipelineStage("Review Locations", "Locations", true), new PipelineStage("Review Assets", "Assets", true), new PipelineStage("Review Relationships", "Relationships", true), new PipelineStage("Review Knowledge", "Knowledge", true) }; var implementedReviewStages = reviewStages.Where(stage => stage.IsImplemented).ToList(); var currentReviewIndex = implementedReviewStages.FindIndex(stage => string.Equals(stage.StageName, Model.CurrentStage, StringComparison.OrdinalIgnoreCase)); var isReviewPhase = currentReviewIndex >= 0; var isComplete = string.Equals(Model.CurrentStage, "Complete", StringComparison.OrdinalIgnoreCase); var isAnalyse = string.Equals(Model.CurrentStage, "Analyse Manuscript", StringComparison.OrdinalIgnoreCase); var activePhase = isComplete ? 4 : isReviewPhase ? 3 : isAnalyse ? 2 : 1; var progressPercent = isReviewPhase ? Math.Clamp(((currentReviewIndex + 1) * 100) / implementedReviewStages.Count, 0, 100) : isComplete ? 100 : 100; var currentStageNumber = isReviewPhase ? currentReviewIndex + 1 : isComplete ? implementedReviewStages.Count : 0; }

Phase @activePhase

@CurrentPhaseTitle(activePhase)

@if (isReviewPhase) {

Stage @currentStageNumber of @implementedReviewStages.Count

} else if (isComplete) {

Final import and completion

} else if (isAnalyse) {

Story Intelligence Analysis

} else {

Prepare the manuscript for analysis

}
@ProgressLabel(activePhase, Model.CurrentStage)
  1. Prepare Manuscript 7 completed steps
    • Welcome
    • Writing Preferences
    • Project
    • Book
    • Connect Word
    • Scan Manuscript
    • Review Chapters
  2. Analyse Manuscript Story Intelligence Analysis
  3. Review Story Intelligence @ReviewSummary(isReviewPhase, currentStageNumber, implementedReviewStages.Count)
      @foreach (var stage in reviewStages) { var index = implementedReviewStages.FindIndex(item => string.Equals(item.StageName, stage.StageName, StringComparison.OrdinalIgnoreCase)); var stageClass = !stage.IsImplemented ? "is-upcoming" : isComplete || index < currentReviewIndex ? "is-complete" : index == currentReviewIndex ? "is-current" : "is-upcoming";
    • @stage.Label @if (!stage.IsImplemented) { Coming Soon }
    • }
  4. Build Story Database Final import and completion
@functions { private sealed record PipelineStage(string StageName, string Label, bool IsImplemented); private static string CurrentPhaseTitle(int phase) => phase switch { 1 => "Prepare Manuscript", 2 => "Analyse Manuscript", 3 => "Review Story Intelligence", _ => "Build Story Database" }; private static string ProgressLabel(int phase, string currentStage) => phase switch { 3 => currentStage, 4 => "Finalising import", _ => "Completed" }; private static string ReviewSummary(bool isReviewPhase, int currentStageNumber, int implementedStageCount) => isReviewPhase ? $"{Math.Max(0, currentStageNumber - 1)} of {implementedStageCount} review stages completed" : $"{implementedStageCount} review stages completed"; private static string StageMarker(string stageClass, bool isImplemented) => !isImplemented ? "○" : stageClass == "is-current" ? "►" : stageClass == "is-complete" ? "✓" : "○"; }