@using TuringMachine.Core
@for (int i = StartIndex; i <= EndIndex; i++) { var isHead = i == HeadPosition;
@i @Tape[i]
}
@code { [Parameter] public Tape Tape { get; set; } = new(); [Parameter] public int HeadPosition { get; set; } private ElementReference tapeContainer; private int ScrollOffset = 0; private const int CellsPerPage = 15; private const int Padding = 5; private int TapeStart => Tape.MinIndex - Padding; private int TapeEnd => Tape.MaxIndex + Padding; private int StartIndex => TapeStart + ScrollOffset; private int EndIndex => Math.Min(StartIndex + CellsPerPage - 1, TapeEnd); private int MaxScrollOffset => Math.Max(0, TapeEnd - TapeStart - CellsPerPage + 1); private void ScrollLeft() { ScrollOffset = Math.Max(0, ScrollOffset - CellsPerPage / 2); } private void ScrollRight() { ScrollOffset = Math.Min(MaxScrollOffset, ScrollOffset + CellsPerPage / 2); } protected override void OnParametersSet() { // Auto-center on head if it's outside visible range if (HeadPosition < StartIndex || HeadPosition > EndIndex) { ScrollOffset = Math.Max(0, HeadPosition - TapeStart - CellsPerPage / 2); } } }