@inventure71/paddockjs 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/CHANGELOG.md +37 -1
  2. package/INSTALL_AND_UPDATE.md +10 -1
  3. package/README.md +92 -17
  4. package/docs/architecture.md +26 -16
  5. package/docs/component_inventory.md +72 -0
  6. package/docs/concepts.md +7 -5
  7. package/docs/custom_model_controller.md +2 -2
  8. package/docs/data_contract.md +121 -33
  9. package/docs/data_model.md +1 -1
  10. package/docs/index.md +10 -0
  11. package/docs/learnings.md +6 -6
  12. package/docs/rules.md +39 -9
  13. package/docs/sense_contract.md +59 -0
  14. package/docs/system_specs.md +76 -20
  15. package/docs/training.md +27 -20
  16. package/package.json +1 -1
  17. package/src/api/PaddockSimulatorController.js +75 -36
  18. package/src/app/BrowserExpertAdapter.js +9 -300
  19. package/src/app/BrowserExpertExternalRenderer.js +303 -0
  20. package/src/app/F1SimulatorApp.js +190 -68
  21. package/src/app/banners/raceDataBannerController.js +71 -36
  22. package/src/app/banners/stewardMessageController.js +5 -4
  23. package/src/app/camera/cameraConstants.js +2 -0
  24. package/src/app/camera/cameraController.js +86 -29
  25. package/src/app/camera/cameraGeometry.js +12 -1
  26. package/src/app/domBindings.js +89 -9
  27. package/src/app/layoutScheduler.js +27 -0
  28. package/src/app/layoutSupport.js +165 -0
  29. package/src/app/raceOverlayClearanceSupport.js +158 -0
  30. package/src/app/readouts/carOverviewRenderer.js +16 -8
  31. package/src/app/readouts/controlStateRenderer.js +1 -1
  32. package/src/app/readouts/raceStatusRenderer.js +30 -21
  33. package/src/app/readouts/readoutFormatters.js +2 -0
  34. package/src/app/readouts/telemetryRenderer.js +17 -8
  35. package/src/app/readouts/timingTowerRenderer.js +62 -10
  36. package/src/app/runtime/runtimeVisibility.js +66 -5
  37. package/src/config/cssValues.js +16 -0
  38. package/src/config/defaultOptions.js +51 -38
  39. package/src/config/restartOptions.js +34 -0
  40. package/src/config/themeOptions.js +825 -0
  41. package/src/config/timingGapMode.js +13 -0
  42. package/src/config/urlOptions.js +25 -0
  43. package/src/data/championship.js +14 -9
  44. package/src/environment/controllerLoop.js +34 -5
  45. package/src/environment/episode.js +14 -2
  46. package/src/environment/index.d.ts +17 -4
  47. package/src/environment/observationVector.js +200 -0
  48. package/src/environment/observations.js +58 -285
  49. package/src/environment/options.js +1 -1
  50. package/src/environment/recorder.js +13 -6
  51. package/src/environment/rewards.js +13 -2
  52. package/src/environment/runtime.js +65 -25
  53. package/src/environment/scenarios.js +22 -3
  54. package/src/environment/sensors/index.js +3 -3
  55. package/src/environment/sensors/opponentRadar.js +13 -3
  56. package/src/environment/sensors/sensorTargets.js +8 -2
  57. package/src/environment/sensors/surfaceRays.js +84 -12
  58. package/src/environment/sensors/trackRays.js +173 -15
  59. package/src/environment/specs.js +78 -40
  60. package/src/index.d.ts +112 -9
  61. package/src/index.js +26 -33
  62. package/src/simulation/driver/driverController.js +1 -1
  63. package/src/simulation/driver/edgeRecovery.js +1 -1
  64. package/src/simulation/driver/racingControls.js +2 -2
  65. package/src/simulation/driver/rejoinControls.js +2 -2
  66. package/src/simulation/pit/pitFlow.js +5 -0
  67. package/src/simulation/pit/pitKinematics.js +24 -0
  68. package/src/simulation/pit/pitQueue.js +5 -0
  69. package/src/simulation/pit/pitRouteMovement.js +7 -0
  70. package/src/simulation/pit/pitRouting.js +2 -4
  71. package/src/simulation/pit/pitService.js +2 -0
  72. package/src/simulation/pit/pitTireService.js +2 -0
  73. package/src/simulation/race/raceLifecycle.js +2 -6
  74. package/src/simulation/race/raceProgress.js +6 -1
  75. package/src/simulation/race/raceSetup.js +2 -6
  76. package/src/simulation/race/raceStep.js +2 -2
  77. package/src/simulation/race/redFlag.js +3 -3
  78. package/src/simulation/race/safetyCar.js +10 -4
  79. package/src/simulation/race/stalledDnf.js +8 -17
  80. package/src/simulation/raceSimulation.js +1 -0
  81. package/src/simulation/rules/rulesReview.js +3 -0
  82. package/src/simulation/snapshots/raceSnapshots.js +1 -0
  83. package/src/simulation/timing/lapTelemetry.js +28 -9
  84. package/src/simulation/track/pitLaneLayout.js +7 -3
  85. package/src/simulation/track/spatialQueries.js +5 -28
  86. package/src/simulation/track/trackQueryGrid.js +94 -0
  87. package/src/simulation/track/trackQueryIndex.js +193 -434
  88. package/src/simulation/track/trackQueryPitIndex.js +140 -0
  89. package/src/simulation/track/trackQueryScratch.js +46 -0
  90. package/src/simulation/track/trackQueryStats.js +28 -0
  91. package/src/simulation/track/trackStatePolicy.js +0 -1
  92. package/src/simulation/vehicle/contactResolution.js +67 -2
  93. package/src/simulation/vehicle/runoffResponse.js +11 -12
  94. package/src/simulation/vehicle/vehicleKinematics.js +37 -0
  95. package/src/simulation/vehicle/vehiclePhysics.js +5 -4
  96. package/src/simulation/vehicle/vehicleSnapshots.js +22 -0
  97. package/src/simulation/vehicle/vehicleState.js +36 -2
  98. package/src/simulation/vehicle/wheelSurface.js +3 -1
  99. package/src/simulation/warmup/runtimeWarmup.js +0 -1
  100. package/src/styles.css +1185 -136
  101. package/src/ui/bannerTemplates.js +38 -28
  102. package/src/ui/cameraControlsTemplate.js +16 -5
  103. package/src/ui/carOverviewTemplate.js +12 -5
  104. package/src/ui/raceCanvasTemplate.js +31 -8
  105. package/src/ui/raceControlsTemplate.js +27 -10
  106. package/src/ui/shellTemplate.js +3 -1
  107. package/src/ui/telemetryDrawerTemplate.js +23 -10
  108. package/src/ui/telemetryTemplates.js +58 -32
  109. package/src/ui/templateUtils.js +48 -0
  110. package/src/ui/timingTowerTemplate.js +29 -12
package/src/styles.css CHANGED
@@ -1,27 +1,35 @@
1
1
  @import url('https://fonts.googleapis.com/css2?family=Archivo:wdth,wght@85,500;100,700;110,900&family=IBM+Plex+Mono:wght@500;600;700&display=swap');
2
2
 
3
3
  .f1-sim-component {
4
+ container-type: inline-size;
4
5
  color-scheme: dark;
5
- --surface: #08090b;
6
- --surface-raised: #111318;
7
- --surface-panel: #171a20;
8
- --line: rgba(255, 255, 255, 0.13);
9
- --line-strong: rgba(255, 255, 255, 0.28);
10
- --text: #f4f7fb;
11
- --muted: #8d97a7;
12
- --red: var(--paddock-accent-color, #e10600);
13
- --race-control-red: #e10600;
14
- --green: var(--paddock-green-color, #14c784);
15
- --yellow: var(--paddock-yellow-color, #ffd166);
16
- --blue: #39a7ff;
17
- --track: #262a31;
18
- --track-edge: #f4f7fb;
6
+ --paddock-safe-area-top: env(safe-area-inset-top, 0px);
7
+ --paddock-safe-area-right: env(safe-area-inset-right, 0px);
8
+ --paddock-safe-area-bottom: env(safe-area-inset-bottom, 0px);
9
+ --paddock-safe-area-left: env(safe-area-inset-left, 0px);
10
+ --surface: var(--paddock-color-surface, var(--paddock-surface-color, #08090b));
11
+ --surface-raised: var(--paddock-color-surface-raised, var(--paddock-surface-raised-color, #111318));
12
+ --surface-panel: var(--paddock-color-surface-panel, var(--paddock-surface-panel-color, #171a20));
13
+ --line: var(--paddock-color-border, var(--paddock-line-color, rgba(255, 255, 255, 0.13)));
14
+ --line-strong: var(--paddock-line-strong-color, var(--paddock-color-border, rgba(255, 255, 255, 0.28)));
15
+ --text: var(--paddock-color-text, var(--paddock-text-color, #f4f7fb));
16
+ --muted: var(--paddock-color-muted-text, var(--paddock-muted-text-color, #8d97a7));
17
+ --red: var(--paddock-color-primary, var(--paddock-accent-color, #e10600));
18
+ --primary-text: var(--paddock-color-primary-text, #ffffff);
19
+ --race-control-red: var(--paddock-color-red-flag, var(--paddock-race-control-red-color, #e10600));
20
+ --green: var(--paddock-color-green-flag, var(--paddock-green-color, #14c784));
21
+ --yellow: var(--paddock-color-yellow-flag, var(--paddock-yellow-color, #ffd166));
22
+ --blue: var(--paddock-color-info, var(--paddock-blue-color, #39a7ff));
23
+ --track: var(--paddock-color-track, var(--paddock-track-color, #262a31));
24
+ --track-edge: var(--paddock-color-track-edge, var(--paddock-track-edge-color, #f4f7fb));
19
25
  --font-display: 'Archivo', sans-serif;
20
26
  --font-mono: 'IBM Plex Mono', monospace;
21
27
  --timing-columns: 1.9rem 2.1rem minmax(4.6rem, 1fr) 4.55rem 1.6rem;
22
28
  --paddock-entry-count: 10;
23
29
  --timing-board-max-width: var(--paddock-timing-tower-max-width, 390px);
24
- --timing-board-min-height: calc(10.8rem + (var(--paddock-entry-count) * 2.25rem));
30
+ --timing-entry-extra-block-padding: 5px;
31
+ --timing-entry-row-min-height: calc(1.3rem + (var(--timing-entry-extra-block-padding) * 2));
32
+ --timing-board-min-height: calc(10.8rem + (var(--paddock-entry-count) * (var(--timing-entry-row-min-height) + 1px)));
25
33
  margin: 0;
26
34
  min-height: 100%;
27
35
  background: var(--surface);
@@ -29,6 +37,412 @@
29
37
  font-family: var(--font-display);
30
38
  }
31
39
 
40
+ .f1-sim-component[data-paddock-theme-mode='light'] {
41
+ color-scheme: light;
42
+ }
43
+
44
+ .f1-sim-component[data-paddock-theme-mode='light'] .sim-shell {
45
+ background: var(--surface);
46
+ }
47
+
48
+ .f1-sim-component[data-paddock-theme-mode='light'] .sim-topbar {
49
+ border-bottom-color: color-mix(in srgb, var(--red) 74%, var(--line));
50
+ box-shadow: 0 16px 30px rgba(17, 24, 39, 0.12);
51
+ }
52
+
53
+ .f1-sim-component[data-paddock-theme-mode='light'] .sim-backlink,
54
+ .f1-sim-component[data-paddock-theme-mode='light'] .sim-control {
55
+ color: var(--text);
56
+ background: color-mix(in srgb, var(--paddock-button-background, var(--surface-raised)) 10%, transparent);
57
+ border-color: var(--paddock-button-border, var(--line));
58
+ }
59
+
60
+ .f1-sim-component[data-paddock-theme-mode='light'] .sim-backlink:hover,
61
+ .f1-sim-component[data-paddock-theme-mode='light'] .sim-control:hover {
62
+ background: color-mix(in srgb, var(--paddock-button-background, var(--red)) 15%, transparent);
63
+ border-color: color-mix(in srgb, var(--paddock-button-border, var(--red)) 78%, var(--text));
64
+ }
65
+
66
+ .f1-sim-component[data-paddock-theme-mode='light'] .sim-control--safety.is-active {
67
+ color: var(--paddock-color-secondary-text, #111318);
68
+ background: var(--yellow);
69
+ border-color: var(--yellow);
70
+ }
71
+
72
+ .f1-sim-component[data-paddock-theme-mode='light'] .camera-controls {
73
+ background: color-mix(in srgb, var(--paddock-camera-controls-background, var(--surface-panel)) 88%, transparent);
74
+ border-color: var(--paddock-camera-controls-border, var(--line));
75
+ }
76
+
77
+ .f1-sim-component[data-paddock-theme-mode='light'] .camera-controls--external {
78
+ background: color-mix(in srgb, var(--paddock-camera-controls-background, var(--surface-panel)) 94%, transparent);
79
+ }
80
+
81
+ .f1-sim-component[data-paddock-theme-mode='light'] .camera-controls button {
82
+ color: var(--paddock-camera-controls-text, var(--text));
83
+ background: color-mix(in srgb, var(--paddock-camera-controls-background, var(--surface-raised)) 72%, transparent);
84
+ border-color: var(--paddock-camera-controls-border, var(--line));
85
+ }
86
+
87
+ .f1-sim-component[data-paddock-theme-mode='light'] .camera-controls button.is-active,
88
+ .f1-sim-component[data-paddock-theme-mode='light'] .camera-controls button[aria-pressed='true'] {
89
+ color: var(--primary-text);
90
+ background: var(--paddock-camera-controls-accent, var(--red));
91
+ border-color: var(--paddock-camera-controls-accent, var(--red));
92
+ }
93
+
94
+ .f1-sim-component[data-paddock-theme-mode='light'] .broadcast-tower-frame {
95
+ background:
96
+ linear-gradient(180deg, color-mix(in srgb, var(--text) 8%, transparent), transparent 42%),
97
+ linear-gradient(160deg,
98
+ color-mix(in srgb, var(--paddock-timing-tower-shell-background, var(--surface-panel)) 92%, var(--surface) 8%) 0%,
99
+ color-mix(in srgb, var(--paddock-timing-tower-shell-background, var(--surface-panel)) 80%, var(--surface-raised) 20%) 48%,
100
+ color-mix(in srgb, var(--surface) 82%, var(--surface-raised) 18%) 100%);
101
+ border-color: var(--line);
102
+ box-shadow:
103
+ inset 0 1px 0 color-mix(in srgb, var(--text) 8%, transparent),
104
+ 0 20px 46px rgba(17, 24, 39, 0.14);
105
+ }
106
+
107
+ .f1-sim-component[data-paddock-theme-mode='light'] .broadcast-tower-frame::before {
108
+ background:
109
+ linear-gradient(90deg, color-mix(in srgb, var(--text) 7%, transparent), transparent 18%, transparent 82%, color-mix(in srgb, var(--red) 12%, transparent)),
110
+ linear-gradient(180deg, color-mix(in srgb, var(--text) 8%, transparent), transparent 18%);
111
+ mix-blend-mode: multiply;
112
+ opacity: 0.55;
113
+ }
114
+
115
+ .f1-sim-component[data-paddock-theme-mode='light'] .broadcast-brand,
116
+ .f1-sim-component[data-paddock-theme-mode='light'] .broadcast-lap {
117
+ color: var(--paddock-timing-tower-driver-text, var(--text));
118
+ }
119
+
120
+ .f1-sim-component[data-paddock-theme-mode='light'] .broadcast-lap {
121
+ background: color-mix(in srgb, var(--surface-raised) 72%, transparent);
122
+ border-top-color: var(--line);
123
+ border-bottom-color: var(--line);
124
+ }
125
+
126
+ .f1-sim-component[data-paddock-theme-mode='light'] .broadcast-lap strong {
127
+ color: var(--text);
128
+ }
129
+
130
+ .f1-sim-component[data-paddock-theme-mode='light'] .car-overview-toggle button {
131
+ color: var(--muted);
132
+ background: color-mix(in srgb, var(--surface-raised) 72%, transparent);
133
+ border-color: var(--line);
134
+ }
135
+
136
+ .f1-sim-component[data-paddock-theme-mode='light'] .broadcast-gap-mode-toggle {
137
+ color: var(--muted);
138
+ }
139
+
140
+ .f1-sim-component[data-paddock-theme-mode='light'] .broadcast-gap-mode-toggle::before {
141
+ background: color-mix(in srgb, var(--surface-raised) 72%, transparent);
142
+ border-color: var(--line);
143
+ }
144
+
145
+ .f1-sim-component[data-paddock-theme-mode='light'] .broadcast-gap-mode-toggle.is-active,
146
+ .f1-sim-component[data-paddock-theme-mode='light'] .broadcast-gap-mode-toggle[aria-pressed='true'] {
147
+ color: var(--primary-text);
148
+ }
149
+
150
+ .f1-sim-component[data-paddock-theme-mode='light'] .broadcast-gap-mode-toggle.is-active::before,
151
+ .f1-sim-component[data-paddock-theme-mode='light'] .broadcast-gap-mode-toggle[aria-pressed='true']::before {
152
+ background: var(--red);
153
+ border-color: var(--red);
154
+ }
155
+
156
+ .f1-sim-component[data-paddock-theme-mode='light'] .broadcast-column-head {
157
+ color: var(--muted);
158
+ }
159
+
160
+ .f1-sim-component[data-paddock-theme-mode='light'] .timing-row {
161
+ color: var(--paddock-timing-tower-driver-text, var(--text));
162
+ background:
163
+ linear-gradient(90deg, color-mix(in srgb, var(--driver-color, var(--red)) 8%, transparent), transparent 42%),
164
+ color-mix(in srgb, var(--paddock-timing-tower-row-background, var(--surface-raised)) 88%, transparent);
165
+ }
166
+
167
+ .f1-sim-component[data-paddock-theme-mode='light'] .timing-row:hover {
168
+ background:
169
+ linear-gradient(90deg, color-mix(in srgb, var(--driver-color, var(--red)) 16%, transparent), transparent 52%),
170
+ color-mix(in srgb, var(--paddock-timing-tower-row-background, var(--surface-raised)) 96%, transparent);
171
+ }
172
+
173
+ .f1-sim-component[data-paddock-theme-mode='light'] .timing-row.is-selected {
174
+ color: var(--primary-text);
175
+ background: var(--red);
176
+ box-shadow:
177
+ inset 4px 0 0 var(--driver-color, var(--red)),
178
+ 0 0 0 1px color-mix(in srgb, var(--red) 30%, var(--line));
179
+ }
180
+
181
+ .f1-sim-component[data-paddock-theme-mode='light'] .timing-row.is-dnf {
182
+ color: var(--muted);
183
+ background:
184
+ linear-gradient(90deg, color-mix(in srgb, var(--muted) 12%, transparent), transparent 42%),
185
+ color-mix(in srgb, var(--surface-raised) 68%, transparent);
186
+ }
187
+
188
+ .f1-sim-component[data-paddock-theme-mode='light'] .timing-row.is-dnf .timing-icon,
189
+ .f1-sim-component[data-paddock-theme-mode='light'] .timing-row.is-dnf .timing-tire {
190
+ filter: grayscale(1);
191
+ opacity: 0.64;
192
+ }
193
+
194
+ .f1-sim-component[data-paddock-theme-mode='light'] .timing-row.is-dnf .timing-position {
195
+ color: var(--muted);
196
+ background: color-mix(in srgb, var(--muted) 16%, var(--surface-raised));
197
+ }
198
+
199
+ .f1-sim-component[data-paddock-theme-mode='light'] .timing-row.is-dnf .timing-gap {
200
+ color: var(--muted);
201
+ }
202
+
203
+ .f1-sim-component[data-paddock-theme-mode='light'] .timing-position {
204
+ color: var(--primary-text);
205
+ background: color-mix(in srgb, var(--text) 86%, var(--surface));
206
+ }
207
+
208
+ .f1-sim-component[data-paddock-theme-mode='light'] .timing-gap {
209
+ color: var(--paddock-timing-tower-gap-text, var(--muted));
210
+ }
211
+
212
+ .f1-sim-component[data-paddock-theme-mode='light'] .timing-row.is-selected .timing-position {
213
+ color: var(--primary-text);
214
+ background: var(--red);
215
+ }
216
+
217
+ .f1-sim-component[data-paddock-theme-mode='light'] .timing-row.is-selected .timing-gap,
218
+ .f1-sim-component[data-paddock-theme-mode='light'] .timing-row.is-selected .timing-tire--h,
219
+ .f1-sim-component[data-paddock-theme-mode='light'] .timing-row.is-selected .timing-tire--m,
220
+ .f1-sim-component[data-paddock-theme-mode='light'] .timing-row.is-selected .timing-tire--s {
221
+ color: var(--primary-text);
222
+ }
223
+
224
+ .f1-sim-component[data-paddock-theme-mode='light'] .sim-canvas-panel {
225
+ box-shadow:
226
+ inset 0 0 80px color-mix(in srgb, var(--text) 10%, transparent),
227
+ 0 24px 54px rgba(17, 24, 39, 0.16);
228
+ }
229
+
230
+ .f1-sim-component[data-paddock-theme-mode='light'] .race-telemetry-drawer {
231
+ background: var(--surface);
232
+ }
233
+
234
+ .f1-sim-component[data-paddock-theme-mode='light'] .race-telemetry-drawer__toolbar {
235
+ background: color-mix(in srgb, var(--surface-raised) 92%, var(--surface));
236
+ }
237
+
238
+ .f1-sim-component[data-paddock-theme-mode='light'] .telemetry-drawer {
239
+ background:
240
+ linear-gradient(180deg, color-mix(in srgb, var(--text) 5%, transparent), transparent 22%),
241
+ color-mix(in srgb, var(--surface-panel) 97%, transparent);
242
+ }
243
+
244
+ .f1-sim-component[data-paddock-theme-mode='light'] .steward-message,
245
+ .f1-sim-component[data-paddock-theme-mode='light'] .fps-counter,
246
+ .f1-sim-component[data-paddock-theme-mode='light'] .race-finish-panel {
247
+ background: color-mix(in srgb, var(--surface-panel) 88%, transparent);
248
+ border-color: var(--line);
249
+ box-shadow: 0 16px 34px rgba(17, 24, 39, 0.14);
250
+ }
251
+
252
+ .f1-sim-component[data-paddock-theme-mode='light'] .fps-counter,
253
+ .f1-sim-component[data-paddock-theme-mode='light'] .fps-counter strong {
254
+ color: var(--text);
255
+ }
256
+
257
+ .f1-sim-component[data-paddock-theme-mode='light'] .steward-message.is-penalty {
258
+ --steward-chip-bg: var(--race-control-red);
259
+ --steward-chip-color: var(--primary-text);
260
+ background: linear-gradient(
261
+ 110deg,
262
+ color-mix(in srgb, var(--race-control-red) 30%, var(--surface-panel)) 0%,
263
+ color-mix(in srgb, var(--surface-panel) 88%, var(--race-control-red)) 62%
264
+ );
265
+ border-color: var(--race-control-red);
266
+ box-shadow:
267
+ inset 0 3px 0 var(--race-control-red),
268
+ 0 16px 34px rgba(17, 24, 39, 0.14);
269
+ }
270
+
271
+ .f1-sim-component[data-paddock-theme-mode='light'] .steward-message.is-warning {
272
+ --steward-chip-bg: var(--yellow);
273
+ --steward-chip-color: var(--paddock-color-secondary-text, #111318);
274
+ background: linear-gradient(
275
+ 110deg,
276
+ color-mix(in srgb, var(--yellow) 36%, var(--surface-panel)) 0%,
277
+ color-mix(in srgb, var(--surface-panel) 88%, var(--yellow)) 62%
278
+ );
279
+ border-color: var(--yellow);
280
+ box-shadow:
281
+ inset 0 3px 0 var(--yellow),
282
+ 0 16px 34px rgba(17, 24, 39, 0.14);
283
+ }
284
+
285
+ .f1-sim-component[data-paddock-theme-mode='light'] .start-lights,
286
+ .f1-sim-component[data-paddock-theme-mode='light'] .paddock-loading {
287
+ color: var(--text);
288
+ background:
289
+ radial-gradient(circle at 50% 42%, color-mix(in srgb, var(--red) 12%, transparent), transparent 34%),
290
+ color-mix(in srgb, var(--surface-panel) 82%, transparent);
291
+ border-color: var(--line);
292
+ box-shadow: 0 16px 34px rgba(17, 24, 39, 0.14);
293
+ }
294
+
295
+ .f1-sim-component[data-paddock-theme-mode='light'] .start-lights__label,
296
+ .f1-sim-component[data-paddock-theme-mode='light'] .paddock-loading__label {
297
+ color: var(--muted);
298
+ text-shadow: none;
299
+ }
300
+
301
+ .f1-sim-component[data-paddock-theme-mode='light'] .start-lights__gantry span,
302
+ .f1-sim-component[data-paddock-theme-mode='light'] .paddock-loading__lights span {
303
+ background: color-mix(in srgb, var(--surface-raised) 88%, var(--text));
304
+ border-color: var(--line);
305
+ box-shadow: inset 0 0 10px color-mix(in srgb, var(--text) 12%, transparent);
306
+ }
307
+
308
+ .f1-sim-component[data-paddock-theme-mode='light'] .start-lights__gantry span.is-lit {
309
+ background: var(--race-control-red);
310
+ border-color: color-mix(in srgb, var(--race-control-red) 58%, var(--primary-text));
311
+ box-shadow:
312
+ inset 0 0 8px color-mix(in srgb, var(--primary-text) 18%, transparent),
313
+ 0 0 18px color-mix(in srgb, var(--race-control-red) 64%, transparent);
314
+ }
315
+
316
+ .f1-sim-component[data-paddock-theme-mode='light'] .start-lights.is-lights-out .start-lights__label {
317
+ color: var(--text);
318
+ }
319
+
320
+ .f1-sim-component[data-paddock-theme-mode='light'] .start-lights.is-lights-out .start-lights__gantry span {
321
+ background: color-mix(in srgb, var(--text) 86%, var(--surface));
322
+ border-color: var(--line);
323
+ box-shadow: inset 0 0 12px color-mix(in srgb, var(--text) 16%, transparent);
324
+ }
325
+
326
+ .f1-sim-component[data-paddock-theme-mode='light'] .paddock-loading__lights span {
327
+ animation-name: paddock-loading-pulse-light;
328
+ }
329
+
330
+ .f1-sim-component[data-paddock-theme-mode='light'] .race-data-panel {
331
+ color: var(--paddock-race-data-panel-text, var(--text));
332
+ background:
333
+ linear-gradient(104deg,
334
+ color-mix(in srgb, var(--paddock-race-data-panel-background, var(--surface-panel)) 98%, var(--surface) 2%) 0 58%,
335
+ color-mix(in srgb, var(--surface-raised) 86%, var(--paddock-race-data-panel-background, var(--surface-panel)) 14%) 58.2% 68%,
336
+ color-mix(in srgb, var(--surface-panel) 92%, var(--surface) 8%) 68.2% 100%),
337
+ repeating-linear-gradient(90deg, color-mix(in srgb, var(--text) 5%, transparent) 0 1px, transparent 1px 82px);
338
+ box-shadow:
339
+ 0 18px 44px rgba(17, 24, 39, 0.14),
340
+ inset 0 1px color-mix(in srgb, var(--text) 8%, transparent);
341
+ }
342
+
343
+ .f1-sim-component[data-paddock-theme-mode='light'] .race-data-copy strong,
344
+ .f1-sim-component[data-paddock-theme-mode='light'] .race-data-panel.is-radio-mode .race-data-copy strong,
345
+ .f1-sim-component[data-paddock-theme-mode='light'] .race-data-panel[data-idle-mode="quote"] .race-data-subtitle {
346
+ color: var(--text);
347
+ text-shadow: none;
348
+ }
349
+
350
+ .f1-sim-component[data-paddock-theme-mode='light'] .race-data-subtitle,
351
+ .f1-sim-component[data-paddock-theme-mode='light'] .race-data-panel[data-idle-mode="quote"] .race-data-copy strong {
352
+ color: var(--muted);
353
+ }
354
+
355
+ .f1-sim-component[data-paddock-theme-mode='light'] .race-data-number {
356
+ color: color-mix(in srgb, var(--text) 14%, transparent);
357
+ -webkit-text-stroke-color: color-mix(in srgb, var(--text) 42%, transparent);
358
+ }
359
+
360
+ .f1-sim-component[data-paddock-theme-mode='light'] .race-data-dismiss {
361
+ background: color-mix(in srgb, var(--surface-raised) 82%, transparent);
362
+ border-color: var(--line);
363
+ --race-data-dismiss-icon-color: var(--muted);
364
+ }
365
+
366
+ .f1-sim-component[data-paddock-theme-mode='light'] .race-data-link {
367
+ color: var(--primary-text);
368
+ border-color: color-mix(in srgb, var(--driver-color, var(--red)) 72%, var(--surface-raised));
369
+ }
370
+
371
+ .f1-sim-component[data-paddock-theme-mode='light'] .telemetry-sector-banner {
372
+ background:
373
+ linear-gradient(110deg, color-mix(in srgb, var(--surface-panel) 98%, var(--surface)), color-mix(in srgb, var(--surface-raised) 88%, var(--surface-panel))),
374
+ repeating-linear-gradient(90deg, color-mix(in srgb, var(--text) 5%, transparent) 0 1px, transparent 1px 58px);
375
+ box-shadow: 0 16px 36px rgba(17, 24, 39, 0.14), inset 0 1px color-mix(in srgb, var(--text) 8%, transparent);
376
+ }
377
+
378
+ .f1-sim-component[data-paddock-theme-mode='light'] .telemetry-sector-banner__copy em {
379
+ color: var(--muted);
380
+ }
381
+
382
+ .f1-sim-component[data-paddock-theme-mode='light'] .telemetry-lap-table,
383
+ .f1-sim-component[data-paddock-theme-mode='light'] .telemetry-sector-table {
384
+ background: color-mix(in srgb, var(--text) 6%, transparent);
385
+ }
386
+
387
+ .f1-sim-component[data-paddock-theme-mode='light'] .telemetry-lap-table tr,
388
+ .f1-sim-component[data-paddock-theme-mode='light'] .telemetry-sector-table tr {
389
+ border-bottom-color: color-mix(in srgb, var(--text) 8%, transparent);
390
+ }
391
+
392
+ .f1-sim-component[data-paddock-theme-mode='light'] .telemetry-sector-bar {
393
+ color: var(--text);
394
+ background:
395
+ linear-gradient(90deg, color-mix(in srgb, var(--sector-status-color) 42%, transparent) var(--sector-fill, 0%), color-mix(in srgb, var(--text) 4%, transparent) 0),
396
+ color-mix(in srgb, var(--surface-panel) 94%, var(--sector-status-color) 6%);
397
+ border-color: var(--line);
398
+ box-shadow: inset 0 -2px 0 color-mix(in srgb, var(--text) 5%, transparent);
399
+ }
400
+
401
+ .f1-sim-component[data-paddock-theme-mode='light'] .telemetry-sector-bar.is-active {
402
+ border-color: var(--green);
403
+ box-shadow:
404
+ inset 0 -2px 0 var(--green),
405
+ 0 0 24px color-mix(in srgb, var(--green) 16%, transparent);
406
+ }
407
+
408
+ .f1-sim-component[data-paddock-theme-mode='light'] .telemetry-sector-bar.is-overall-best,
409
+ .f1-sim-component[data-paddock-theme-mode='light'] .telemetry-sector-table td.is-overall-best {
410
+ color: var(--text);
411
+ }
412
+
413
+ .f1-sim-component[data-paddock-theme-mode='light'] .telemetry-sector-bar.is-personal-best,
414
+ .f1-sim-component[data-paddock-theme-mode='light'] .telemetry-sector-table td.is-personal-best {
415
+ color: var(--text);
416
+ }
417
+
418
+ .f1-sim-component[data-paddock-theme-mode='light'] .telemetry-sector-bar.is-slower,
419
+ .f1-sim-component[data-paddock-theme-mode='light'] .telemetry-sector-table td.is-slower {
420
+ color: color-mix(in srgb, var(--yellow) 74%, var(--text));
421
+ }
422
+
423
+ .f1-sim-component[data-paddock-theme-mode='light'] .car-overview-toggle button.is-active,
424
+ .f1-sim-component[data-paddock-theme-mode='light'] .car-overview-toggle button[aria-pressed='true'] {
425
+ color: var(--primary-text);
426
+ background: color-mix(in srgb, var(--driver-color, var(--red)) 76%, var(--surface-raised));
427
+ border-color: color-mix(in srgb, var(--driver-color, var(--red)) 72%, var(--line));
428
+ }
429
+
430
+ .f1-sim-component[data-paddock-theme-mode='light'] .car-overview-diagram {
431
+ background:
432
+ radial-gradient(circle at 50% 48%, color-mix(in srgb, var(--driver-color, var(--red)) 16%, transparent) 0 18%, transparent 42%),
433
+ linear-gradient(135deg, color-mix(in srgb, var(--surface-raised) 90%, transparent), color-mix(in srgb, var(--surface-panel) 70%, transparent));
434
+ border-color: var(--line);
435
+ }
436
+
437
+ .f1-sim-component[data-paddock-theme-mode='light'] .car-overview-cell {
438
+ background: color-mix(in srgb, var(--surface-panel) 92%, transparent);
439
+ border-color: var(--line);
440
+ }
441
+
442
+ .f1-sim-component[data-paddock-theme-mode='light'] .car-overview-cell strong {
443
+ color: var(--text);
444
+ }
445
+
32
446
  .f1-sim-component,
33
447
  .f1-sim-component * {
34
448
  box-sizing: border-box;
@@ -41,11 +455,29 @@
41
455
  .f1-sim-component button,
42
456
  .f1-sim-component a {
43
457
  font: inherit;
458
+ touch-action: manipulation;
459
+ -webkit-tap-highlight-color: transparent;
460
+ }
461
+
462
+ .f1-sim-component button:focus-visible,
463
+ .f1-sim-component a:focus-visible,
464
+ .f1-sim-component [tabindex]:focus-visible {
465
+ outline: 3px solid color-mix(in srgb, var(--paddock-color-info, var(--blue)) 78%, #ffffff);
466
+ outline-offset: 3px;
467
+ }
468
+
469
+ .f1-sim-component [data-paddock-component],
470
+ .f1-sim-component [data-f1-simulator-shell] {
471
+ min-inline-size: 0;
44
472
  }
45
473
 
46
474
  .sim-shell {
47
475
  min-height: 100svh;
48
- padding: clamp(0.85rem, 2vw, 1.4rem);
476
+ padding:
477
+ max(clamp(0.85rem, 2vw, 1.4rem), var(--paddock-safe-area-top))
478
+ max(clamp(0.85rem, 2vw, 1.4rem), var(--paddock-safe-area-right))
479
+ max(clamp(0.85rem, 2vw, 1.4rem), var(--paddock-safe-area-bottom))
480
+ max(clamp(0.85rem, 2vw, 1.4rem), var(--paddock-safe-area-left));
49
481
  background: #000;
50
482
  }
51
483
 
@@ -69,7 +501,8 @@
69
501
 
70
502
  .sim-backlink,
71
503
  .sim-control {
72
- min-width: 0;
504
+ min-height: 44px;
505
+ min-width: 44px;
73
506
  overflow: hidden;
74
507
  border: 1px solid var(--line-strong);
75
508
  color: var(--text);
@@ -133,6 +566,32 @@
133
566
  justify-content: flex-end;
134
567
  }
135
568
 
569
+ @container (max-width: 860px) {
570
+ .sim-topbar {
571
+ grid-template-columns: minmax(0, 1fr);
572
+ align-items: stretch;
573
+ }
574
+
575
+ .sim-controls,
576
+ .sim-backlink {
577
+ justify-content: stretch;
578
+ }
579
+
580
+ .sim-controls {
581
+ display: grid;
582
+ grid-template-columns: repeat(2, minmax(0, 1fr));
583
+ }
584
+
585
+ .sim-topbar h1 {
586
+ line-height: 1.06;
587
+ }
588
+
589
+ .sim-control,
590
+ .sim-backlink {
591
+ text-align: center;
592
+ }
593
+ }
594
+
136
595
  .sim-external-camera-controls {
137
596
  display: flex;
138
597
  justify-content: flex-start;
@@ -209,6 +668,62 @@
209
668
  pointer-events: auto;
210
669
  }
211
670
 
671
+ .timing-panel-toggle {
672
+ position: absolute;
673
+ z-index: 14;
674
+ top: 0.75rem;
675
+ left: 0.75rem;
676
+ display: none;
677
+ min-width: 44px;
678
+ min-height: 44px;
679
+ padding: 0.62rem 0.78rem;
680
+ color: var(--green);
681
+ background: rgba(8, 10, 16, 0.72);
682
+ border: 1px solid color-mix(in srgb, var(--green) 54%, rgba(255, 255, 255, 0.22));
683
+ font-family: var(--font-mono);
684
+ font-size: 0.66rem;
685
+ font-weight: 900;
686
+ letter-spacing: 0.1em;
687
+ text-transform: uppercase;
688
+ cursor: pointer;
689
+ box-shadow: 0 12px 28px rgba(0, 0, 0, 0.24);
690
+ }
691
+
692
+ .timing-panel-toggle[aria-expanded='true'] {
693
+ color: transparent;
694
+ background: rgba(8, 10, 16, 0.82);
695
+ border-color: color-mix(in srgb, var(--green) 74%, rgba(255, 255, 255, 0.22));
696
+ }
697
+
698
+ .timing-panel-toggle[aria-expanded='true'] {
699
+ width: 44px;
700
+ min-width: 44px;
701
+ padding: 0;
702
+ overflow: hidden;
703
+ color: transparent;
704
+ font-size: 0;
705
+ }
706
+
707
+ .timing-panel-toggle[aria-expanded='true']::before,
708
+ .timing-panel-toggle[aria-expanded='true']::after {
709
+ content: "";
710
+ position: absolute;
711
+ left: 50%;
712
+ top: 50%;
713
+ width: 0.58rem;
714
+ height: 0.11rem;
715
+ background: var(--green);
716
+ border-radius: 999px;
717
+ }
718
+
719
+ .timing-panel-toggle[aria-expanded='true']::before {
720
+ transform: translate(-50%, -50%) rotate(45deg);
721
+ }
722
+
723
+ .timing-panel-toggle[aria-expanded='true']::after {
724
+ transform: translate(-50%, -50%) rotate(-45deg);
725
+ }
726
+
212
727
  .sim-shell--left-tower-overlay.sim-shell--timing-scroll .sim-timing {
213
728
  overflow: hidden;
214
729
  }
@@ -328,6 +843,7 @@
328
843
  padding: 0;
329
844
  background: transparent;
330
845
  border: 0;
846
+ container-type: inline-size;
331
847
  overflow: hidden;
332
848
  }
333
849
 
@@ -463,43 +979,86 @@
463
979
  line-height: 0.9;
464
980
  }
465
981
 
466
- .broadcast-gap-mode {
982
+ .broadcast-gap-mode-toggle {
983
+ position: relative;
984
+ isolation: isolate;
985
+ justify-self: end;
467
986
  display: grid;
468
- grid-template-columns: repeat(2, minmax(0, 1fr));
469
- gap: 0.35rem;
470
- padding: 0.45rem 0.2rem 0.2rem;
471
- }
472
-
473
- .broadcast-gap-mode button {
474
- min-width: 0;
475
- min-height: 1.75rem;
987
+ place-items: center;
988
+ width: 44px;
989
+ min-width: 44px;
990
+ height: 44px;
991
+ min-height: 44px;
992
+ margin: 0;
993
+ padding: 0;
476
994
  color: rgba(244, 247, 251, 0.58);
477
- background: rgba(255, 255, 255, 0.055);
478
- border: 1px solid rgba(255, 255, 255, 0.12);
995
+ background: transparent;
996
+ border: 0;
479
997
  font-family: var(--font-mono);
480
- font-size: 0.6rem;
998
+ font-size: 0.52rem;
481
999
  font-weight: 900;
482
1000
  letter-spacing: 0.08em;
483
1001
  text-transform: uppercase;
484
1002
  cursor: pointer;
485
1003
  }
486
1004
 
487
- .broadcast-gap-mode button.is-active,
488
- .broadcast-gap-mode button[aria-pressed='true'] {
489
- color: #08090b;
490
- background: #f5f6f8;
491
- border-color: #f5f6f8;
1005
+ .broadcast-gap-mode-toggle::before {
1006
+ content: '';
1007
+ position: absolute;
1008
+ inset: 11px 4px;
1009
+ z-index: -1;
1010
+ background: rgba(255, 255, 255, 0.055);
1011
+ border: 1px solid rgba(255, 255, 255, 0.14);
1012
+ border-radius: 0.22rem;
1013
+ transition:
1014
+ background 160ms ease,
1015
+ border-color 160ms ease,
1016
+ box-shadow 160ms ease,
1017
+ transform 160ms ease;
1018
+ }
1019
+
1020
+ .broadcast-gap-mode-toggle.is-active,
1021
+ .broadcast-gap-mode-toggle[aria-pressed='true'] {
1022
+ color: #f5f6f8;
1023
+ }
1024
+
1025
+ .broadcast-gap-mode-toggle.is-active::before,
1026
+ .broadcast-gap-mode-toggle[aria-pressed='true']::before {
1027
+ background: rgba(255, 255, 255, 0.12);
1028
+ border-color: rgba(255, 255, 255, 0.24);
1029
+ box-shadow: inset 0 0 0 1px rgba(244, 247, 251, 0.05);
1030
+ }
1031
+
1032
+ .broadcast-gap-mode-toggle:hover::before {
1033
+ background: rgba(255, 255, 255, 0.1);
1034
+ border-color: rgba(255, 255, 255, 0.24);
1035
+ }
1036
+
1037
+ .broadcast-gap-mode-toggle:active::before {
1038
+ transform: scale(0.96);
1039
+ }
1040
+
1041
+ .f1-sim-component .broadcast-gap-mode-toggle:focus-visible {
1042
+ outline: 0;
1043
+ }
1044
+
1045
+ .f1-sim-component .broadcast-gap-mode-toggle:focus-visible::before {
1046
+ outline: 2px solid var(--blue);
1047
+ outline-offset: 1px;
492
1048
  }
493
1049
 
494
1050
  .broadcast-column-head {
495
1051
  display: grid;
496
1052
  grid-template-columns: var(--timing-columns);
1053
+ align-items: center;
497
1054
  gap: 0;
498
- padding: 0.42rem 0 0.35rem;
1055
+ min-height: 44px;
1056
+ padding: 0;
499
1057
  color: rgba(244, 247, 251, 0.44);
500
1058
  font-family: var(--font-mono);
501
1059
  font-size: 0.52rem;
502
1060
  font-weight: 800;
1061
+ line-height: 1;
503
1062
  letter-spacing: 0.09em;
504
1063
  text-transform: uppercase;
505
1064
  }
@@ -526,6 +1085,7 @@
526
1085
  }
527
1086
 
528
1087
  .broadcast-column-head span:nth-child(4),
1088
+ .broadcast-gap-mode-toggle,
529
1089
  .timing-gap {
530
1090
  grid-column: 4;
531
1091
  }
@@ -539,11 +1099,17 @@
539
1099
  padding-inline: 0.45rem;
540
1100
  }
541
1101
 
542
- .broadcast-column-head span:nth-child(4) {
1102
+ .broadcast-column-head span:nth-child(4),
1103
+ .broadcast-gap-mode-toggle {
543
1104
  padding-right: 0.25rem;
544
1105
  text-align: right;
545
1106
  }
546
1107
 
1108
+ .broadcast-gap-mode-toggle {
1109
+ padding-right: 0;
1110
+ text-align: center;
1111
+ }
1112
+
547
1113
  .timing-header,
548
1114
  .telemetry-header {
549
1115
  display: flex;
@@ -575,7 +1141,7 @@
575
1141
  padding: 0;
576
1142
  margin: 0;
577
1143
  display: grid;
578
- grid-auto-rows: minmax(33px, max-content);
1144
+ grid-auto-rows: max-content;
579
1145
  align-content: start;
580
1146
  justify-content: stretch;
581
1147
  gap: 1px;
@@ -596,7 +1162,7 @@
596
1162
 
597
1163
  .sim-shell--left-tower-overlay .broadcast-column-head,
598
1164
  .sim-shell--left-tower-overlay .timing-row {
599
- grid-template-columns: 1.7rem 1.8rem minmax(0, 1fr) minmax(2.7rem, 3.45rem) 1.25rem;
1165
+ grid-template-columns: 1.7rem 1.8rem minmax(0, 1fr) minmax(44px, 3.45rem) 1.25rem;
600
1166
  }
601
1167
 
602
1168
  .sim-shell--left-tower-overlay .broadcast-column-head {
@@ -609,14 +1175,54 @@
609
1175
  text-overflow: ellipsis;
610
1176
  }
611
1177
 
1178
+ @container (max-width: 255px) {
1179
+ .sim-timing.broadcast-tower .broadcast-column-head,
1180
+ .sim-timing.broadcast-tower .timing-row {
1181
+ grid-template-columns: 1.45rem 1.55rem minmax(2.25rem, 1fr) minmax(2.75rem, 3rem) minmax(0.9rem, 1rem);
1182
+ }
1183
+
1184
+ .sim-timing.broadcast-tower .broadcast-column-head {
1185
+ font-size: 0.48rem;
1186
+ letter-spacing: 0.06em;
1187
+ }
1188
+
1189
+ .sim-timing.broadcast-tower .broadcast-column-head span:nth-child(3),
1190
+ .sim-timing.broadcast-tower .timing-name {
1191
+ padding-inline: 0.28rem;
1192
+ }
1193
+
1194
+ .sim-timing.broadcast-tower .broadcast-column-head span:nth-child(4),
1195
+ .sim-timing.broadcast-tower .broadcast-gap-mode-toggle,
1196
+ .sim-timing.broadcast-tower .timing-gap {
1197
+ padding-right: 0.1rem;
1198
+ }
1199
+
1200
+ .sim-timing.broadcast-tower .timing-position {
1201
+ font-size: 0.72rem;
1202
+ }
1203
+
1204
+ .sim-timing.broadcast-tower .timing-name {
1205
+ gap: 0.16rem;
1206
+ font-size: 0.7rem;
1207
+ }
1208
+
1209
+ .sim-timing.broadcast-tower .timing-gap {
1210
+ font-size: 0.62rem;
1211
+ }
1212
+
1213
+ .sim-timing.broadcast-tower .timing-tire {
1214
+ font-size: 0.68rem;
1215
+ }
1216
+ }
1217
+
612
1218
  .timing-row {
613
1219
  display: grid;
614
1220
  grid-template-columns: var(--timing-columns);
615
1221
  gap: 0;
616
1222
  align-items: center;
617
1223
  width: 100%;
618
- min-height: 33px;
619
- padding: 0;
1224
+ min-height: var(--timing-entry-row-min-height);
1225
+ padding: var(--timing-entry-extra-block-padding) 0;
620
1226
  border: 0;
621
1227
  color: var(--text);
622
1228
  background:
@@ -687,6 +1293,7 @@
687
1293
  align-self: stretch;
688
1294
  display: grid;
689
1295
  place-items: center;
1296
+ margin-block: calc(var(--timing-entry-extra-block-padding) * -1);
690
1297
  color: #f5f6f8;
691
1298
  background: rgba(2, 3, 7, 0.72);
692
1299
  font-size: 0.78rem;
@@ -838,23 +1445,88 @@
838
1445
  background: #168cff;
839
1446
  }
840
1447
 
841
- .physics-mode-indicator--simulator {
842
- background: #e10600;
843
- }
1448
+ .physics-mode-indicator--advanced {
1449
+ background: #e10600;
1450
+ }
1451
+
1452
+ .race-telemetry-drawer {
1453
+ --telemetry-drawer-width: min(390px, max(300px, 30cqw));
1454
+ --race-toolbar-height: 3.4rem;
1455
+ position: relative;
1456
+ display: flex;
1457
+ flex-direction: column;
1458
+ container-type: inline-size;
1459
+ inline-size: 100%;
1460
+ max-inline-size: 100%;
1461
+ height: var(--paddock-race-view-height, var(--paddock-race-view-min-height, 620px));
1462
+ min-height: min(100%, var(--paddock-race-view-min-height, 620px));
1463
+ overflow: hidden;
1464
+ background: #000;
1465
+ }
1466
+
1467
+ @container (max-width: 520px) {
1468
+ .race-telemetry-drawer--responsive-narrow {
1469
+ --telemetry-drawer-width: min(88%, 360px);
1470
+ height: auto;
1471
+ }
1472
+
1473
+ .race-telemetry-drawer--responsive-narrow .race-telemetry-drawer__toolbar {
1474
+ flex-direction: column;
1475
+ align-items: stretch;
1476
+ gap: 0.5rem;
1477
+ }
1478
+
1479
+ .race-telemetry-drawer--responsive-narrow .race-telemetry-drawer__toolbar .camera-controls--external {
1480
+ width: 100%;
1481
+ flex: 0 0 auto;
1482
+ justify-content: stretch;
1483
+ }
1484
+
1485
+ .race-telemetry-drawer--responsive-narrow .race-telemetry-drawer__toolbar .camera-controls--external button {
1486
+ flex: 1 1 min(9.25rem, 44%);
1487
+ }
1488
+
1489
+ .race-telemetry-drawer--responsive-narrow .race-telemetry-drawer__controls {
1490
+ display: grid;
1491
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1492
+ gap: 0.45rem;
1493
+ width: 100%;
1494
+ }
1495
+
1496
+ .race-telemetry-drawer--responsive-narrow .race-telemetry-drawer__controls .sim-control,
1497
+ .race-telemetry-drawer--responsive-narrow .race-telemetry-drawer__controls .telemetry-drawer-toggle {
1498
+ width: 100%;
1499
+ min-width: 0;
1500
+ white-space: nowrap;
1501
+ }
1502
+
1503
+ .race-telemetry-drawer--responsive-narrow .race-telemetry-drawer__race,
1504
+ .race-telemetry-drawer--responsive-narrow.is-telemetry-open .race-telemetry-drawer__race {
1505
+ flex: 0 0 auto;
1506
+ margin-right: 0;
1507
+ padding-right: 0;
1508
+ margin-bottom: 0;
1509
+ }
844
1510
 
845
- .race-telemetry-drawer {
846
- --telemetry-drawer-width: min(390px, max(300px, 30cqw));
847
- --race-toolbar-height: 3.4rem;
848
- position: relative;
849
- display: flex;
850
- flex-direction: column;
851
- container-type: inline-size;
852
- inline-size: 100%;
853
- max-inline-size: 100%;
854
- height: var(--paddock-race-view-height, var(--paddock-race-view-min-height, 620px));
855
- min-height: min(100%, var(--paddock-race-view-min-height, 620px));
856
- overflow: hidden;
857
- background: #000;
1511
+ .race-telemetry-drawer--responsive-narrow .telemetry-drawer {
1512
+ top: 0.75rem;
1513
+ right: 0.75rem;
1514
+ bottom: 0.75rem;
1515
+ width: var(--telemetry-drawer-width);
1516
+ height: auto;
1517
+ border-left: 1px solid var(--line);
1518
+ border-top: 0;
1519
+ clip-path: none;
1520
+ transform: translate3d(calc(100% + 1rem), 0, 0);
1521
+ box-shadow: -18px 0 40px rgba(0, 0, 0, 0.38);
1522
+ transition:
1523
+ opacity 180ms ease,
1524
+ transform 320ms cubic-bezier(0.2, 0.8, 0.2, 1);
1525
+ }
1526
+
1527
+ .race-telemetry-drawer--responsive-narrow.is-telemetry-open .telemetry-drawer {
1528
+ transform: translate3d(0, 0, 0);
1529
+ }
858
1530
  }
859
1531
 
860
1532
  .race-telemetry-drawer__toolbar {
@@ -875,16 +1547,19 @@
875
1547
  }
876
1548
 
877
1549
  .race-telemetry-drawer__race {
1550
+ position: relative;
878
1551
  min-width: 0;
879
1552
  display: flex;
880
1553
  flex: 1 1 auto;
881
1554
  min-height: 0;
882
1555
  margin-right: 0;
883
- transition: margin-right 320ms cubic-bezier(0.2, 0.8, 0.2, 1);
1556
+ padding-right: 0;
1557
+ overflow: hidden;
1558
+ transition: padding-right 320ms cubic-bezier(0.2, 0.8, 0.2, 1);
884
1559
  }
885
1560
 
886
1561
  .race-telemetry-drawer.is-telemetry-open .race-telemetry-drawer__race {
887
- margin-right: var(--telemetry-drawer-width);
1562
+ padding-right: var(--telemetry-drawer-width);
888
1563
  }
889
1564
 
890
1565
  .race-telemetry-drawer__race > .sim-canvas-panel {
@@ -903,7 +1578,7 @@
903
1578
 
904
1579
  .race-telemetry-drawer__controls .sim-control,
905
1580
  .race-telemetry-drawer__controls .telemetry-drawer-toggle {
906
- min-height: 2.45rem;
1581
+ min-height: 44px;
907
1582
  padding: 0.62rem 0.72rem;
908
1583
  }
909
1584
 
@@ -922,12 +1597,12 @@
922
1597
  .telemetry-drawer {
923
1598
  position: absolute;
924
1599
  z-index: 11;
925
- top: var(--race-toolbar-height);
1600
+ top: 0;
926
1601
  right: 0;
927
1602
  bottom: 0;
928
1603
  width: var(--telemetry-drawer-width);
929
1604
  min-width: 0;
930
- height: calc(100% - var(--race-toolbar-height));
1605
+ height: 100%;
931
1606
  overflow: hidden;
932
1607
  color: var(--text);
933
1608
  background:
@@ -935,17 +1610,19 @@
935
1610
  rgba(8, 9, 11, 0.97);
936
1611
  border-left: 1px solid var(--line);
937
1612
  clip-path: inset(0 0 0 100%);
938
- transform: translate3d(0, 0, 0);
1613
+ transform: translate3d(100%, 0, 0);
939
1614
  opacity: 0;
940
1615
  pointer-events: none;
941
1616
  will-change: transform, opacity;
942
1617
  transition:
943
1618
  clip-path 320ms cubic-bezier(0.2, 0.8, 0.2, 1),
1619
+ transform 320ms cubic-bezier(0.2, 0.8, 0.2, 1),
944
1620
  opacity 180ms ease;
945
1621
  }
946
1622
 
947
1623
  .race-telemetry-drawer.is-telemetry-open .telemetry-drawer {
948
1624
  clip-path: inset(0);
1625
+ transform: translate3d(0, 0, 0);
949
1626
  opacity: 1;
950
1627
  pointer-events: auto;
951
1628
  }
@@ -986,6 +1663,8 @@
986
1663
  }
987
1664
 
988
1665
  .camera-controls button {
1666
+ min-width: 44px;
1667
+ min-height: 44px;
989
1668
  border: 1px solid rgba(255, 255, 255, 0.22);
990
1669
  color: var(--text);
991
1670
  background: rgba(255, 255, 255, 0.06);
@@ -1180,6 +1859,11 @@
1180
1859
  display: inline-flex;
1181
1860
  align-items: center;
1182
1861
  justify-content: center;
1862
+ min-width: 0;
1863
+ }
1864
+
1865
+ .standalone-control > .sim-control {
1866
+ width: 100%;
1183
1867
  }
1184
1868
 
1185
1869
  .start-lights {
@@ -1313,6 +1997,66 @@
1313
1997
  opacity: 0;
1314
1998
  }
1315
1999
 
2000
+ .paddock-unsupported-size {
2001
+ position: absolute;
2002
+ inset: 0;
2003
+ z-index: 60;
2004
+ display: none;
2005
+ place-content: center;
2006
+ gap: 0.35rem;
2007
+ padding: 1rem;
2008
+ color: var(--text);
2009
+ background:
2010
+ linear-gradient(135deg, color-mix(in srgb, var(--race-control-red) 18%, transparent), transparent 42%),
2011
+ color-mix(in srgb, var(--surface) 94%, #000000);
2012
+ border: 1px solid var(--line-strong);
2013
+ font-family: var(--font-mono);
2014
+ text-align: center;
2015
+ text-transform: uppercase;
2016
+ }
2017
+
2018
+ .paddock-unsupported-size strong {
2019
+ color: var(--yellow);
2020
+ font-size: 0.82rem;
2021
+ font-weight: 900;
2022
+ letter-spacing: 0.12em;
2023
+ }
2024
+
2025
+ .paddock-unsupported-size span {
2026
+ max-width: 28rem;
2027
+ color: var(--muted);
2028
+ font-size: 0.68rem;
2029
+ font-weight: 800;
2030
+ letter-spacing: 0.08em;
2031
+ line-height: 1.35;
2032
+ }
2033
+
2034
+ [data-paddock-size-unsupported='true'] {
2035
+ position: relative;
2036
+ min-block-size: 7rem;
2037
+ overflow: hidden;
2038
+ }
2039
+
2040
+ [data-paddock-size-unsupported='true'] > :not(.paddock-unsupported-size) {
2041
+ visibility: hidden;
2042
+ pointer-events: none;
2043
+ }
2044
+
2045
+ [data-paddock-size-unsupported='true'] > .paddock-unsupported-size {
2046
+ display: grid;
2047
+ visibility: visible;
2048
+ pointer-events: auto;
2049
+ }
2050
+
2051
+ [data-f1-simulator-shell][data-paddock-size-unsupported='true'] {
2052
+ display: grid;
2053
+ min-block-size: min(100svh, 24rem);
2054
+ }
2055
+
2056
+ [data-f1-simulator-shell][data-paddock-size-unsupported='true'] > .sim-workspace {
2057
+ display: none;
2058
+ }
2059
+
1316
2060
  @keyframes paddock-loading-pulse {
1317
2061
  0%,
1318
2062
  100% {
@@ -1333,6 +2077,24 @@
1333
2077
  }
1334
2078
  }
1335
2079
 
2080
+ @keyframes paddock-loading-pulse-light {
2081
+ 0%,
2082
+ 100% {
2083
+ background: color-mix(in srgb, var(--surface-raised) 88%, var(--text));
2084
+ border-color: var(--line);
2085
+ box-shadow: inset 0 0 10px color-mix(in srgb, var(--text) 12%, transparent);
2086
+ }
2087
+
2088
+ 45%,
2089
+ 62% {
2090
+ background: var(--race-control-red);
2091
+ border-color: color-mix(in srgb, var(--race-control-red) 58%, var(--primary-text));
2092
+ box-shadow:
2093
+ inset 0 0 8px color-mix(in srgb, var(--primary-text) 18%, transparent),
2094
+ 0 0 18px color-mix(in srgb, var(--race-control-red) 64%, transparent);
2095
+ }
2096
+ }
2097
+
1336
2098
  .race-data-panel {
1337
2099
  --race-data-banner-left: 50%;
1338
2100
  --race-data-banner-width: min(1080px, calc(100% - 1.5rem));
@@ -1405,19 +2167,24 @@
1405
2167
 
1406
2168
  .race-data-dismiss {
1407
2169
  --race-data-dismiss-icon-color: rgba(244, 247, 251, 0.9);
2170
+ --race-data-dismiss-fill: rgba(8, 10, 16, 0.58);
2171
+ --race-data-dismiss-ring: rgba(244, 247, 251, 0.2);
1408
2172
  position: absolute;
1409
2173
  top: 0.44rem;
1410
2174
  right: 0.48rem;
1411
2175
  display: grid;
1412
2176
  place-items: center;
1413
- width: 0.95rem;
1414
- height: 0.95rem;
2177
+ width: 44px;
2178
+ height: 44px;
1415
2179
  padding: 0;
1416
2180
  overflow: hidden;
1417
2181
  color: transparent;
1418
- background: rgba(8, 10, 16, 0.62);
1419
- border: 1px solid rgba(244, 247, 251, 0.24);
1420
- border-radius: 999px;
2182
+ background:
2183
+ radial-gradient(circle at 50% 50%,
2184
+ var(--race-data-dismiss-fill) 0 12px,
2185
+ var(--race-data-dismiss-ring) 12.5px 13.5px,
2186
+ transparent 14px);
2187
+ border: 0;
1421
2188
  font-family: var(--font-mono);
1422
2189
  font-size: 0;
1423
2190
  font-weight: 900;
@@ -1449,9 +2216,9 @@
1449
2216
 
1450
2217
  .race-data-dismiss:hover {
1451
2218
  --race-data-dismiss-icon-color: #fff;
2219
+ --race-data-dismiss-fill: color-mix(in srgb, var(--driver-color, var(--red)) 48%, rgba(8, 10, 16, 0.72));
2220
+ --race-data-dismiss-ring: color-mix(in srgb, var(--driver-color, var(--red)) 64%, #ffffff);
1452
2221
  color: transparent;
1453
- border-color: color-mix(in srgb, var(--driver-color, var(--red)) 70%, #ffffff);
1454
- background: color-mix(in srgb, var(--driver-color, var(--red)) 52%, rgba(8, 10, 16, 0.72));
1455
2222
  }
1456
2223
 
1457
2224
  .race-data-dismiss:focus-visible {
@@ -1546,21 +2313,10 @@
1546
2313
  grid-row: 1;
1547
2314
  align-self: stretch;
1548
2315
  display: grid;
1549
- grid-template-rows: auto minmax(0, 1fr);
1550
- gap: 0.4rem;
2316
+ grid-template-rows: minmax(0, 1fr);
1551
2317
  min-width: 0;
1552
2318
  padding: 0.85rem 0.65rem;
1553
- border-left: 1px solid rgba(255, 255, 255, 0.13);
1554
- }
1555
-
1556
- .race-data-telemetry__label {
1557
- color: var(--driver-color, var(--red));
1558
- font-family: var(--font-mono);
1559
- font-size: 0.58rem;
1560
- font-weight: 900;
1561
- letter-spacing: 0.14em;
1562
- line-height: 1;
1563
- text-transform: uppercase;
2319
+ border-left: 1px solid var(--line);
1564
2320
  }
1565
2321
 
1566
2322
  .race-data-telemetry__bars {
@@ -1634,12 +2390,13 @@
1634
2390
  grid-row: 1;
1635
2391
  display: grid;
1636
2392
  place-items: center;
1637
- align-self: center;
1638
- min-width: clamp(132px, 13vw, 176px);
2393
+ align-self: end;
2394
+ justify-self: end;
2395
+ min-width: clamp(112px, 10vw, 150px);
1639
2396
  max-width: calc(100% - 0.85rem);
1640
- min-height: 3.1rem;
1641
- margin-right: 0.85rem;
1642
- padding: 0 1.05rem;
2397
+ min-height: 44px;
2398
+ margin: 0 0.85rem 0.85rem 0;
2399
+ padding: 0 0.82rem;
1643
2400
  overflow: hidden;
1644
2401
  text-overflow: ellipsis;
1645
2402
  white-space: nowrap;
@@ -1647,14 +2404,23 @@
1647
2404
  background: color-mix(in srgb, var(--driver-color, var(--red)) 88%, #111318);
1648
2405
  border: 1px solid color-mix(in srgb, var(--driver-color, var(--red)) 72%, #ffffff);
1649
2406
  font-family: var(--font-mono);
1650
- font-size: 0.72rem;
2407
+ font-size: 0.66rem;
1651
2408
  font-weight: 900;
1652
- letter-spacing: 0.08em;
2409
+ letter-spacing: 0.07em;
2410
+ line-height: 1;
1653
2411
  text-align: center;
1654
2412
  text-decoration: none;
1655
2413
  text-transform: uppercase;
1656
2414
  }
1657
2415
 
2416
+ .f1-sim-component .race-data-link {
2417
+ font-family: var(--font-mono);
2418
+ font-size: 0.66rem;
2419
+ font-weight: 900;
2420
+ letter-spacing: 0.07em;
2421
+ line-height: 1;
2422
+ }
2423
+
1658
2424
  .race-data-link:hover {
1659
2425
  color: #fff;
1660
2426
  filter: brightness(1.12);
@@ -1995,7 +2761,7 @@
1995
2761
 
1996
2762
  .car-overview-toggle button {
1997
2763
  min-width: 0;
1998
- min-height: 2.15rem;
2764
+ min-height: 44px;
1999
2765
  color: var(--muted);
2000
2766
  font-family: var(--font-mono);
2001
2767
  font-size: 0.68rem;
@@ -2314,6 +3080,15 @@
2314
3080
  clip-path: none;
2315
3081
  }
2316
3082
 
3083
+ .sim-shell--left-tower-overlay .sim-timing.broadcast-tower {
3084
+ position: relative;
3085
+ inset: auto;
3086
+ width: min(100%, var(--timing-board-max-width));
3087
+ max-width: 390px;
3088
+ height: auto;
3089
+ clip-path: none;
3090
+ }
3091
+
2317
3092
  .sim-shell--left-tower-overlay .sim-canvas-panel > .camera-controls {
2318
3093
  left: 1rem;
2319
3094
  max-width: calc(100% - 2rem);
@@ -2334,7 +3109,7 @@
2334
3109
  min-height: auto;
2335
3110
  }
2336
3111
 
2337
- .sim-telemetry {
3112
+ .sim-telemetry:not(.telemetry-component) {
2338
3113
  display: grid;
2339
3114
  grid-template-columns: minmax(0, 0.9fr) minmax(280px, 1.1fr);
2340
3115
  gap: 1rem;
@@ -2400,28 +3175,37 @@
2400
3175
  min-height: 58svh;
2401
3176
  }
2402
3177
 
2403
- .race-telemetry-drawer {
2404
- --telemetry-drawer-width: 100%;
3178
+ .race-telemetry-drawer--responsive-narrow {
3179
+ --telemetry-drawer-width: min(88%, 360px);
2405
3180
  }
2406
3181
 
2407
- .race-telemetry-drawer__race,
2408
- .race-telemetry-drawer.is-telemetry-open .race-telemetry-drawer__race {
3182
+ .race-telemetry-drawer--responsive-narrow .race-telemetry-drawer__race,
3183
+ .race-telemetry-drawer--responsive-narrow.is-telemetry-open .race-telemetry-drawer__race {
2409
3184
  margin-right: 0;
3185
+ padding-right: 0;
2410
3186
  }
2411
3187
 
2412
- .race-telemetry-drawer.is-telemetry-open .race-telemetry-drawer__race {
2413
- margin-bottom: min(360px, 46svh);
3188
+ .race-telemetry-drawer--responsive-narrow.is-telemetry-open .race-telemetry-drawer__race {
3189
+ margin-bottom: 0;
2414
3190
  }
2415
3191
 
2416
- .telemetry-drawer {
2417
- top: auto;
2418
- height: min(360px, 46svh);
2419
- border-left: 0;
2420
- border-top: 1px solid var(--line);
2421
- transform: translate3d(0, 100%, 0);
3192
+ .race-telemetry-drawer--responsive-narrow .telemetry-drawer {
3193
+ top: 0.75rem;
3194
+ right: 0.75rem;
3195
+ bottom: 0.75rem;
3196
+ width: var(--telemetry-drawer-width);
3197
+ height: auto;
3198
+ border-left: 1px solid var(--line);
3199
+ border-top: 0;
3200
+ clip-path: none;
3201
+ transform: translate3d(calc(100% + 1rem), 0, 0);
3202
+ box-shadow: -18px 0 40px rgba(0, 0, 0, 0.38);
3203
+ transition:
3204
+ opacity 180ms ease,
3205
+ transform 320ms cubic-bezier(0.2, 0.8, 0.2, 1);
2422
3206
  }
2423
3207
 
2424
- .race-telemetry-drawer.is-telemetry-open .telemetry-drawer {
3208
+ .race-telemetry-drawer--responsive-narrow.is-telemetry-open .telemetry-drawer {
2425
3209
  transform: translate3d(0, 0, 0);
2426
3210
  }
2427
3211
 
@@ -2432,7 +3216,7 @@
2432
3216
  .race-data-panel {
2433
3217
  left: 50%;
2434
3218
  bottom: 0.75rem;
2435
- grid-template-columns: minmax(0, 1fr) auto;
3219
+ grid-template-columns: minmax(4.6rem, 0.26fr) minmax(0, 1fr) minmax(6.5rem, 7rem);
2436
3220
  width: calc(100% - 1.5rem);
2437
3221
  min-height: 88px;
2438
3222
  }
@@ -2453,12 +3237,18 @@
2453
3237
  }
2454
3238
 
2455
3239
  .race-data-panel--with-telemetry {
2456
- grid-template-columns: minmax(4.8rem, auto) minmax(0, 1fr);
3240
+ --race-data-action-rail: 0.45rem;
3241
+ grid-template-columns: minmax(4.6rem, 0.26fr) minmax(0, 1fr) minmax(6.5rem, 7rem);
3242
+ grid-template-rows: auto auto;
3243
+ }
3244
+
3245
+ .race-data-panel:not(.race-data-panel--with-telemetry):not(.is-radio-mode) {
3246
+ grid-template-columns: minmax(4.2rem, 0.24fr) minmax(0, 1fr) minmax(8.85rem, 8.85rem);
2457
3247
  }
2458
3248
 
2459
3249
  .race-data-copy {
2460
3250
  grid-column: 2;
2461
- padding: 0.78rem 0.95rem 0.85rem;
3251
+ padding: 0.78rem 0.7rem 0.85rem 0.45rem;
2462
3252
  }
2463
3253
 
2464
3254
  .race-data-panel--with-telemetry .race-data-copy {
@@ -2469,12 +3259,33 @@
2469
3259
  .race-data-telemetry {
2470
3260
  grid-column: 1 / -1;
2471
3261
  grid-row: 2;
2472
- padding: 0 0.95rem 0.75rem;
3262
+ align-self: start;
3263
+ grid-template-rows: max-content;
3264
+ padding: 0 var(--race-data-action-rail, 0.45rem) 0.75rem 0.95rem;
2473
3265
  border-left: 0;
2474
3266
  }
2475
3267
 
3268
+ .race-data-telemetry__bars {
3269
+ align-items: start;
3270
+ gap: 0.32rem;
3271
+ }
3272
+
3273
+ .race-data-sector-bar {
3274
+ min-height: 2.75rem;
3275
+ padding: 0.42rem 0.42rem 0.38rem;
3276
+ }
3277
+
3278
+ .race-data-sector-bar span {
3279
+ margin-bottom: 0.22rem;
3280
+ }
3281
+
3282
+ .race-data-sector-bar strong {
3283
+ font-size: 0.68rem;
3284
+ }
3285
+
2476
3286
  .race-data-panel--with-telemetry .race-data-link {
2477
- grid-column: 1 / -1;
3287
+ grid-column: 3;
3288
+ grid-row: 1;
2478
3289
  }
2479
3290
 
2480
3291
  .race-data-panel.is-radio-mode .race-data-copy {
@@ -2486,20 +3297,31 @@
2486
3297
  grid-column: 1;
2487
3298
  min-width: 4.8rem;
2488
3299
  height: auto;
2489
- font-size: 3.4rem;
3300
+ padding-inline: 0.45rem;
3301
+ font-size: clamp(2.9rem, 11cqw, 3.4rem);
2490
3302
  }
2491
3303
 
2492
- .race-data-link {
2493
- grid-column: 1 / -1;
2494
- margin: 0;
2495
- min-height: 48px;
3304
+ .race-data-link,
3305
+ .f1-sim-component .race-data-link,
3306
+ .sim-shell--left-tower-overlay .race-data-link,
3307
+ .sim-canvas-panel--with-timing-tower .race-data-link {
3308
+ grid-column: 3;
3309
+ grid-row: 1;
3310
+ min-width: 5.4rem;
3311
+ width: min(5.6rem, calc(100% - 0.45rem));
3312
+ max-width: 5.6rem;
3313
+ margin: 0 var(--race-data-action-rail, 0.45rem) 0 0;
3314
+ padding-inline: 0.5rem;
3315
+ min-height: 44px;
3316
+ font-size: 0.56rem;
3317
+ letter-spacing: 0.055em;
2496
3318
  }
2497
3319
 
2498
3320
  .race-data-dismiss {
2499
- top: 0.38rem;
2500
- right: 0.42rem;
2501
- width: 0.95rem;
2502
- height: 0.95rem;
3321
+ top: 0;
3322
+ right: var(--race-data-action-rail, 0.45rem);
3323
+ width: 44px;
3324
+ height: 44px;
2503
3325
  }
2504
3326
 
2505
3327
  .sim-telemetry {
@@ -2578,34 +3400,261 @@
2578
3400
  }
2579
3401
 
2580
3402
  @media (max-width: 520px) {
2581
- .sim-canvas-panel--with-timing-tower {
2582
- min-height: max(58svh, calc(min(46svh, 420px) + 17rem));
3403
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower {
3404
+ --race-overlay-banner-clearance: 0px;
3405
+ min-height: max(var(--paddock-race-view-min-height, 620px), var(--timing-board-min-height));
2583
3406
  }
2584
3407
 
2585
- .sim-canvas-panel--with-timing-tower > .sim-timing {
2586
- position: static;
2587
- inset: auto;
2588
- width: 100%;
2589
- max-width: 100%;
2590
- height: min(46svh, 420px);
2591
- clip-path: none;
3408
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower.sim-canvas-panel--needs-banner-clearance {
3409
+ min-height: max(
3410
+ calc(var(--paddock-race-view-min-height, 620px) + var(--race-overlay-banner-clearance)),
3411
+ calc(var(--timing-board-min-height) + var(--race-overlay-banner-clearance))
3412
+ );
2592
3413
  }
2593
3414
 
2594
- .sim-canvas-panel--with-timing-tower > .sim-timing.broadcast-tower {
2595
- position: static;
2596
- width: 100%;
2597
- max-width: 100%;
2598
- height: min(46svh, 420px);
3415
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower > .sim-timing {
3416
+ position: absolute;
3417
+ top: 0.75rem;
3418
+ bottom: 0.75rem;
3419
+ left: 0.75rem;
3420
+ width: min(82%, var(--timing-board-max-width));
3421
+ max-width: var(--timing-board-max-width);
3422
+ height: auto;
3423
+ transform: translate3d(calc(-100% - 1rem), 0, 0);
3424
+ opacity: 0;
3425
+ pointer-events: none;
3426
+ clip-path: inset(0 round 1.25rem);
3427
+ transition:
3428
+ opacity 180ms ease,
3429
+ transform 320ms cubic-bezier(0.2, 0.8, 0.2, 1);
3430
+ }
3431
+
3432
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower > .sim-timing.broadcast-tower {
3433
+ position: absolute;
3434
+ width: min(82%, var(--timing-board-max-width));
3435
+ max-width: var(--timing-board-max-width);
3436
+ height: auto;
3437
+ }
3438
+
3439
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower.sim-canvas-panel--needs-banner-clearance > .sim-timing {
3440
+ bottom: var(--race-overlay-banner-clearance);
3441
+ }
3442
+
3443
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower.is-timing-panel-open > .sim-timing {
3444
+ transform: translate3d(0, 0, 0);
3445
+ opacity: 1;
3446
+ pointer-events: auto;
3447
+ }
3448
+
3449
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower > .timing-panel-toggle {
3450
+ display: grid;
3451
+ place-items: center;
3452
+ }
3453
+
3454
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower > .camera-controls {
3455
+ left: 0.75rem;
3456
+ top: 4.45rem;
3457
+ max-width: calc(100% - 1.5rem);
3458
+ }
3459
+
3460
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower > .start-lights {
3461
+ top: 7.2rem;
3462
+ left: 50%;
3463
+ }
3464
+
3465
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower > .steward-message {
3466
+ top: 4.1rem;
3467
+ left: 0.75rem;
3468
+ right: 0.75rem;
3469
+ width: auto;
3470
+ min-width: 0;
3471
+ min-inline-size: 0;
3472
+ max-width: none;
3473
+ max-inline-size: none;
3474
+ grid-template-columns: minmax(4.7rem, max-content) minmax(0, 1fr);
3475
+ align-items: center;
3476
+ gap: 0.18rem 0.62rem;
3477
+ padding: 0.55rem 0.65rem;
3478
+ transform: none;
3479
+ }
3480
+
3481
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower > .steward-message.is-hidden {
3482
+ transform: translateY(-0.55rem);
3483
+ }
3484
+
3485
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower > .steward-message .steward-message__kicker {
3486
+ min-width: 4.7rem;
3487
+ padding: 0.44rem 0.52rem;
3488
+ font-size: 0.92rem;
3489
+ }
3490
+
3491
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower > .steward-message strong {
3492
+ font-size: 0.86rem;
3493
+ }
3494
+
3495
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower > .steward-message span:last-child {
3496
+ font-size: 0.66rem;
3497
+ }
3498
+ }
3499
+
3500
+ @container (max-width: 520px) {
3501
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower {
3502
+ --race-overlay-banner-clearance: 0px;
3503
+ min-height: max(var(--paddock-race-view-min-height, 620px), var(--timing-board-min-height));
3504
+ }
3505
+
3506
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower.sim-canvas-panel--needs-banner-clearance {
3507
+ min-height: max(
3508
+ calc(var(--paddock-race-view-min-height, 620px) + var(--race-overlay-banner-clearance)),
3509
+ calc(var(--timing-board-min-height) + var(--race-overlay-banner-clearance))
3510
+ );
3511
+ }
3512
+
3513
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower > .sim-timing {
3514
+ position: absolute;
3515
+ top: 0.75rem;
3516
+ bottom: 0.75rem;
3517
+ left: 0.75rem;
3518
+ width: min(82%, var(--timing-board-max-width));
3519
+ max-width: var(--timing-board-max-width);
3520
+ height: auto;
3521
+ transform: translate3d(calc(-100% - 1rem), 0, 0);
3522
+ opacity: 0;
3523
+ pointer-events: none;
3524
+ clip-path: inset(0 round 1.25rem);
3525
+ }
3526
+
3527
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower > .sim-timing.broadcast-tower {
3528
+ position: absolute;
3529
+ width: min(82%, var(--timing-board-max-width));
3530
+ max-width: var(--timing-board-max-width);
3531
+ height: auto;
3532
+ }
3533
+
3534
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower.sim-canvas-panel--needs-banner-clearance > .sim-timing {
3535
+ bottom: var(--race-overlay-banner-clearance);
3536
+ }
3537
+
3538
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower.is-timing-panel-open > .sim-timing {
3539
+ transform: translate3d(0, 0, 0);
3540
+ opacity: 1;
3541
+ pointer-events: auto;
3542
+ }
3543
+
3544
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower > .timing-panel-toggle {
3545
+ display: grid;
3546
+ place-items: center;
2599
3547
  }
2600
3548
 
2601
- .sim-canvas-panel--with-timing-tower > .camera-controls {
3549
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower > .camera-controls {
2602
3550
  left: 0.75rem;
2603
- top: calc(min(46svh, 420px) + 1.25rem);
3551
+ top: 4.45rem;
2604
3552
  max-width: calc(100% - 1.5rem);
2605
3553
  }
2606
3554
 
2607
- .sim-canvas-panel--with-timing-tower > .start-lights {
2608
- top: calc(min(46svh, 420px) + 4.2rem);
3555
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower > .start-lights {
3556
+ top: 7.2rem;
2609
3557
  left: 50%;
2610
3558
  }
3559
+
3560
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower > .steward-message {
3561
+ top: 4.1rem;
3562
+ left: 0.75rem;
3563
+ right: 0.75rem;
3564
+ width: auto;
3565
+ min-width: 0;
3566
+ min-inline-size: 0;
3567
+ max-width: none;
3568
+ max-inline-size: none;
3569
+ grid-template-columns: minmax(4.7rem, max-content) minmax(0, 1fr);
3570
+ align-items: center;
3571
+ gap: 0.18rem 0.62rem;
3572
+ padding: 0.55rem 0.65rem;
3573
+ transform: none;
3574
+ }
3575
+
3576
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower > .steward-message.is-hidden {
3577
+ transform: translateY(-0.55rem);
3578
+ }
3579
+
3580
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower > .steward-message .steward-message__kicker {
3581
+ min-width: 4.7rem;
3582
+ padding: 0.44rem 0.52rem;
3583
+ font-size: 0.92rem;
3584
+ }
3585
+
3586
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower > .steward-message strong {
3587
+ font-size: 0.86rem;
3588
+ }
3589
+
3590
+ .sim-canvas-panel--responsive-narrow.sim-canvas-panel--with-timing-tower > .steward-message span:last-child {
3591
+ font-size: 0.66rem;
3592
+ }
3593
+ }
3594
+
3595
+ .race-data-panel--standalone {
3596
+ position: relative;
3597
+ left: auto;
3598
+ right: auto;
3599
+ bottom: auto;
3600
+ grid-template-columns: minmax(4.6rem, 0.35fr) minmax(0, 1fr);
3601
+ transform: none;
3602
+ width: 100%;
3603
+ max-width: 100%;
3604
+ min-height: 0;
3605
+ }
3606
+
3607
+ .race-data-panel--standalone .race-data-copy {
3608
+ grid-column: 2;
3609
+ grid-row: 1;
3610
+ min-width: 0;
3611
+ padding: 0.75rem 0.68rem 0.55rem;
3612
+ }
3613
+
3614
+ .race-data-panel--standalone .race-data-kicker {
3615
+ font-size: 0.54rem;
3616
+ letter-spacing: 0.12em;
3617
+ }
3618
+
3619
+ .race-data-panel--standalone .race-data-copy strong {
3620
+ font-size: clamp(1.05rem, 3vw, 1.45rem);
3621
+ line-height: 0.98;
3622
+ }
3623
+
3624
+ .race-data-panel--standalone .race-data-subtitle {
3625
+ font-size: 0.55rem;
3626
+ letter-spacing: 0.06em;
3627
+ }
3628
+
3629
+ .race-data-panel--standalone .race-data-number {
3630
+ grid-column: 1;
3631
+ grid-row: 1;
3632
+ min-width: 0;
3633
+ height: auto;
3634
+ font-size: clamp(2.3rem, 5vw, 3.9rem);
3635
+ }
3636
+
3637
+ .race-data-panel--standalone .race-data-link {
3638
+ grid-column: 1 / -1;
3639
+ grid-row: 2;
3640
+ margin: 0;
3641
+ min-width: 0;
3642
+ min-height: 44px;
3643
+ font-size: 0.62rem;
3644
+ }
3645
+
3646
+ .race-data-panel--standalone.race-data-panel--with-telemetry {
3647
+ grid-template-columns: minmax(4.6rem, 0.35fr) minmax(0, 1fr);
3648
+ }
3649
+
3650
+ .race-data-panel--standalone.race-data-panel--with-telemetry .race-data-copy {
3651
+ grid-column: 2;
3652
+ padding-bottom: 0.35rem;
3653
+ }
3654
+
3655
+ .race-data-panel--standalone .race-data-telemetry {
3656
+ grid-column: 1 / -1;
3657
+ grid-row: auto;
3658
+ padding: 0 0.68rem 0.65rem;
3659
+ border-left: 0;
2611
3660
  }