@model OnboardingJourneyHeaderViewModel @{ var characterReviewStepCount = Math.Max(1, Model.TotalSteps - 9); var steps = Model.TotalSteps <= 10 ? BuildDefaultSteps() : BuildDynamicSteps(characterReviewStepCount, Model.TotalSteps); var progressWidth = Model.TotalSteps <= 1 ? 100 : ((Math.Clamp(Model.CurrentStep, 1, Model.TotalSteps) - 1) * 100) / (Model.TotalSteps - 1); }
Step @Model.CurrentStep of @Model.TotalSteps
    @foreach (var step in steps) {
  1. @step.Order @step.Label
  2. }
@functions { private sealed record HeaderStep(string Label, int Order); private static IReadOnlyList BuildDefaultSteps() => [ new("Welcome", 1), new("Writing Stage", 2), new("Writing Software", 3), new("Project", 4), new("Book", 5), new("Connect Word", 6), new("Review Chapters", 7), new("Review Characters", 8), new("Analyse Manuscript", 9), new("Complete", 10) ]; private static IReadOnlyList BuildDynamicSteps(int characterReviewStepCount, int totalSteps) { var steps = new List { new("Welcome", 1), new("Writing Stage", 2), new("Writing Software", 3), new("Project", 4), new("Book", 5), new("Connect Word", 6), new("Review Chapters", 7) }; for (var index = 1; index <= characterReviewStepCount; index++) { steps.Add(new HeaderStep($"Characters {index}", 7 + index)); } steps.Add(new HeaderStep("Analyse Manuscript", totalSteps - 1)); steps.Add(new HeaderStep("Complete", totalSteps)); return steps; } private static string StepClass(int order, int currentStep) { if (order < currentStep) { return "is-complete"; } return order == currentStep ? "is-current" : "is-upcoming"; } }