|
4 | 4 | @inject GexDataService DataService |
5 | 5 | @implements IDisposable |
6 | 6 |
|
7 | | -<div class="gex-sidebar"> |
| 7 | +<div class="gex-sidebar" role="complementary" aria-label="GEX Controls and Information"> |
8 | 8 | <!-- Data Source Section --> |
9 | 9 | <div class="section-title">Data Source</div> |
10 | 10 | <div class="data-source-controls"> |
11 | | - <div class="data-mode-toggle"> |
12 | | - <button class="mode-btn @(IsDemo ? "active" : "")" @onclick="() => SetMode(DataMode.Demo)">Demo</button> |
13 | | - <button class="mode-btn @(!IsDemo ? "active" : "")" @onclick="() => SetMode(DataMode.Real)">Real Data</button> |
| 11 | + <div class="data-mode-toggle" role="radiogroup" aria-label="Data source selection"> |
| 12 | + <button class="mode-btn @(IsDemo ? "active" : "")" @onclick="() => SetMode(DataMode.Demo)" role="radio" aria-checked="@IsDemo" aria-label="Use demo data">Demo</button> |
| 13 | + <button class="mode-btn @(!IsDemo ? "active" : "")" @onclick="() => SetMode(DataMode.Real)" role="radio" aria-checked="@(!IsDemo)" aria-label="Use real market data">Real Data</button> |
14 | 14 | </div> |
15 | 15 |
|
16 | 16 | @if (!IsDemo) |
17 | 17 | { |
18 | 18 | <div class="symbol-selectors"> |
19 | 19 | <div class="selector-row"> |
20 | | - <select @onchange="OnAssetClassChange" value="@SelectedAssetClass"> |
| 20 | + <select @onchange="OnAssetClassChange" value="@SelectedAssetClass" aria-label="Select asset class"> |
21 | 21 | <option value="">Select asset class...</option> |
22 | 22 | @foreach (var ac in AssetClasses) |
23 | 23 | { |
|
26 | 26 | </select> |
27 | 27 | </div> |
28 | 28 | <div class="selector-row"> |
29 | | - <select @onchange="OnSymbolChange" value="@SelectedSymbol" disabled="@string.IsNullOrEmpty(SelectedAssetClass)"> |
| 29 | + <select @onchange="OnSymbolChange" value="@SelectedSymbol" disabled="@string.IsNullOrEmpty(SelectedAssetClass)" aria-label="Select trading symbol"> |
30 | 30 | <option value="">Select symbol...</option> |
31 | 31 | @foreach (var sym in Symbols) |
32 | 32 | { |
|
45 | 45 | <!-- Simulation Section --> |
46 | 46 | <div class="section-title">Simulation</div> |
47 | 47 | <div class="sim-controls"> |
48 | | - <div class="media-controls"> |
49 | | - <button class="media-btn" @onclick="StateService.JumpToStart" title="Start (Home)">⏮</button> |
50 | | - <button class="media-btn" @onclick="JumpToPrevYear" title="Prev Year (↓)">«</button> |
51 | | - <button class="media-btn" @onclick="StateService.StepBackward" title="Step Back (←)">◀</button> |
52 | | - <button class="media-btn play-btn @(IsSimulating ? "active" : "")" @onclick="StateService.ToggleSimulation" title="Play/Pause (Space)"> |
| 48 | + <div class="media-controls" role="group" aria-label="Playback controls"> |
| 49 | + <button class="media-btn" @onclick="StateService.JumpToStart" title="Start (Home)" aria-label="Jump to start">⏮</button> |
| 50 | + <button class="media-btn" @onclick="JumpToPrevYear" title="Prev Year (↓)" aria-label="Jump to previous year">«</button> |
| 51 | + <button class="media-btn" @onclick="StateService.StepBackward" title="Step Back (←)" aria-label="Step backward">◀</button> |
| 52 | + <button class="media-btn play-btn @(IsSimulating ? "active" : "")" @onclick="StateService.ToggleSimulation" title="Play/Pause (Space)" aria-label="@(IsSimulating ? "Pause simulation" : "Play simulation")" aria-pressed="@IsSimulating"> |
53 | 53 | @(IsSimulating ? "⏸" : "▶") |
54 | 54 | </button> |
55 | | - <button class="media-btn" @onclick="StateService.StepForward" title="Step Fwd (→)">▶</button> |
56 | | - <button class="media-btn" @onclick="JumpToNextYear" title="Next Year (↑)">»</button> |
57 | | - <button class="media-btn" @onclick="StateService.JumpToEnd" title="End (End)">⏭</button> |
| 55 | + <button class="media-btn" @onclick="StateService.StepForward" title="Step Fwd (→)" aria-label="Step forward">▶</button> |
| 56 | + <button class="media-btn" @onclick="JumpToNextYear" title="Next Year (↑)" aria-label="Jump to next year">»</button> |
| 57 | + <button class="media-btn" @onclick="StateService.JumpToEnd" title="End (End)" aria-label="Jump to end">⏭</button> |
58 | 58 | </div> |
59 | 59 |
|
60 | | - <div class="speed-control"> |
61 | | - <button class="speed-btn @(PlaybackSpeed == 1 ? "active" : "")" @onclick="() => SetSpeed(1)">0.5x</button> |
62 | | - <button class="speed-btn @(PlaybackSpeed == 2 ? "active" : "")" @onclick="() => SetSpeed(2)">1x</button> |
63 | | - <button class="speed-btn @(PlaybackSpeed == 4 ? "active" : "")" @onclick="() => SetSpeed(4)">2x</button> |
| 60 | + <div class="speed-control" role="radiogroup" aria-label="Playback speed"> |
| 61 | + <button class="speed-btn @(PlaybackSpeed == 1 ? "active" : "")" @onclick="() => SetSpeed(1)" role="radio" aria-checked="@(PlaybackSpeed == 1)" aria-label="Half speed">0.5x</button> |
| 62 | + <button class="speed-btn @(PlaybackSpeed == 2 ? "active" : "")" @onclick="() => SetSpeed(2)" role="radio" aria-checked="@(PlaybackSpeed == 2)" aria-label="Normal speed">1x</button> |
| 63 | + <button class="speed-btn @(PlaybackSpeed == 4 ? "active" : "")" @onclick="() => SetSpeed(4)" role="radio" aria-checked="@(PlaybackSpeed == 4)" aria-label="Double speed">2x</button> |
64 | 64 | </div> |
65 | 65 |
|
66 | 66 | <div class="timeline-scrubber"> |
67 | 67 | <div class="timeline-track"> |
68 | | - <div class="timeline-progress" style="width: @ProgressPercent%"></div> |
69 | | - <input type="range" min="0" max="@MaxIndex" value="@CurrentIndex" @oninput="OnScrub" class="timeline-input" /> |
| 68 | + <div class="timeline-progress" style="width: @ProgressPercent%" aria-hidden="true"></div> |
| 69 | + <input type="range" min="0" max="@MaxIndex" value="@CurrentIndex" @oninput="OnScrub" class="timeline-input" aria-label="Timeline position" aria-valuemin="0" aria-valuemax="@MaxIndex" aria-valuenow="@CurrentIndex" aria-valuetext="@EventDate" /> |
70 | 70 | </div> |
71 | 71 | </div> |
72 | 72 |
|
|
82 | 82 | <PriceSparkline Title="@SparklineTitle" /> |
83 | 83 |
|
84 | 84 | <!-- Parameters Section --> |
85 | | - <div class="section-title">Parameters</div> |
86 | | - <div class="control-group"> |
| 85 | + <div class="section-title" id="params-heading">Parameters</div> |
| 86 | + <div class="control-group" role="group" aria-labelledby="params-heading"> |
87 | 87 | <div class="control-label"> |
88 | | - <span>Spot Price (@SymbolLabel)</span> |
89 | | - <span class="control-value">$@Price.ToString("F0")</span> |
| 88 | + <span id="price-label">Spot Price (@SymbolLabel)</span> |
| 89 | + <span class="control-value" aria-live="polite">$@Price.ToString("F0")</span> |
90 | 90 | </div> |
91 | | - <input type="range" min="@StrikeStart" max="@StrikeEnd" step="1" value="@Price" @oninput="OnPriceChange" /> |
| 91 | + <input type="range" min="@StrikeStart" max="@StrikeEnd" step="1" value="@Price" @oninput="OnPriceChange" aria-labelledby="price-label" aria-valuetext="$@Price.ToString("F0")" /> |
92 | 92 | </div> |
93 | 93 |
|
94 | 94 | <div class="control-group"> |
95 | 95 | <div class="control-label"> |
96 | | - <span>Open Interest</span> |
97 | | - <span class="control-value">@OpenInterest.ToString("F1")M</span> |
| 96 | + <span id="oi-label">Open Interest</span> |
| 97 | + <span class="control-value" aria-live="polite">@OpenInterest.ToString("F1")M</span> |
98 | 98 | </div> |
99 | | - <input type="range" min="3" max="12" step="0.1" value="@OpenInterest" @oninput="OnOiChange" /> |
| 99 | + <input type="range" min="3" max="12" step="0.1" value="@OpenInterest" @oninput="OnOiChange" aria-labelledby="oi-label" aria-valuetext="@OpenInterest.ToString("F1") million" /> |
100 | 100 | </div> |
101 | 101 |
|
102 | 102 | <div class="control-group"> |
103 | 103 | <div class="control-label"> |
104 | | - <span>Dealer Positioning</span> |
105 | | - <span class="control-value">@Tilt.ToString("F2")</span> |
| 104 | + <span id="tilt-label">Dealer Positioning</span> |
| 105 | + <span class="control-value" aria-live="polite">@Tilt.ToString("F2")</span> |
106 | 106 | </div> |
107 | | - <input type="range" min="-0.5" max="0.5" step="0.01" value="@Tilt" @oninput="OnTiltChange" /> |
| 107 | + <input type="range" min="-0.5" max="0.5" step="0.01" value="@Tilt" @oninput="OnTiltChange" aria-labelledby="tilt-label" aria-valuetext="@Tilt.ToString("F2")" /> |
108 | 108 | </div> |
109 | 109 |
|
110 | 110 | <!-- Zero Gamma Section --> |
|
0 commit comments