@inventure71/paddockjs 2.0.1 → 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 (80) hide show
  1. package/CHANGELOG.md +31 -1
  2. package/INSTALL_AND_UPDATE.md +10 -1
  3. package/README.md +65 -15
  4. package/docs/architecture.md +17 -13
  5. package/docs/component_inventory.md +72 -0
  6. package/docs/concepts.md +2 -2
  7. package/docs/custom_model_controller.md +2 -2
  8. package/docs/data_contract.md +96 -21
  9. package/docs/index.md +2 -1
  10. package/docs/learnings.md +6 -6
  11. package/docs/rules.md +7 -7
  12. package/docs/sense_contract.md +1 -1
  13. package/docs/system_specs.md +25 -18
  14. package/docs/training.md +13 -12
  15. package/package.json +1 -1
  16. package/src/api/PaddockSimulatorController.js +74 -4
  17. package/src/app/F1SimulatorApp.js +191 -28
  18. package/src/app/banners/raceDataBannerController.js +71 -36
  19. package/src/app/banners/stewardMessageController.js +5 -4
  20. package/src/app/camera/cameraConstants.js +2 -0
  21. package/src/app/camera/cameraController.js +86 -29
  22. package/src/app/camera/cameraGeometry.js +12 -1
  23. package/src/app/domBindings.js +89 -9
  24. package/src/app/layoutScheduler.js +27 -0
  25. package/src/app/layoutSupport.js +165 -0
  26. package/src/app/raceOverlayClearanceSupport.js +158 -0
  27. package/src/app/readouts/carOverviewRenderer.js +16 -8
  28. package/src/app/readouts/controlStateRenderer.js +1 -1
  29. package/src/app/readouts/raceStatusRenderer.js +30 -21
  30. package/src/app/readouts/readoutFormatters.js +2 -0
  31. package/src/app/readouts/telemetryRenderer.js +17 -8
  32. package/src/app/readouts/timingTowerRenderer.js +62 -10
  33. package/src/app/runtime/runtimeVisibility.js +66 -5
  34. package/src/config/cssValues.js +16 -0
  35. package/src/config/defaultOptions.js +51 -38
  36. package/src/config/themeOptions.js +825 -0
  37. package/src/config/timingGapMode.js +13 -0
  38. package/src/config/urlOptions.js +25 -0
  39. package/src/data/championship.js +14 -9
  40. package/src/environment/controllerLoop.js +17 -3
  41. package/src/environment/index.d.ts +1 -2
  42. package/src/environment/options.js +1 -1
  43. package/src/environment/runtime.js +3 -11
  44. package/src/environment/scenarios.js +1 -1
  45. package/src/environment/sensors/surfaceRays.js +41 -33
  46. package/src/environment/sensors/trackRays.js +44 -49
  47. package/src/index.d.ts +110 -9
  48. package/src/index.js +25 -1
  49. package/src/simulation/driver/driverController.js +1 -1
  50. package/src/simulation/driver/edgeRecovery.js +1 -1
  51. package/src/simulation/driver/racingControls.js +2 -2
  52. package/src/simulation/driver/rejoinControls.js +2 -2
  53. package/src/simulation/pit/pitKinematics.js +2 -2
  54. package/src/simulation/pit/pitRouting.js +2 -4
  55. package/src/simulation/race/raceSetup.js +2 -6
  56. package/src/simulation/race/raceStep.js +1 -1
  57. package/src/simulation/race/safetyCar.js +1 -1
  58. package/src/simulation/race/stalledDnf.js +1 -1
  59. package/src/simulation/timing/lapTelemetry.js +28 -9
  60. package/src/simulation/track/pitLaneLayout.js +7 -3
  61. package/src/simulation/track/spatialQueries.js +5 -28
  62. package/src/simulation/track/trackQueryIndex.js +180 -135
  63. package/src/simulation/track/trackStatePolicy.js +0 -1
  64. package/src/simulation/vehicle/contactResolution.js +3 -3
  65. package/src/simulation/vehicle/vehicleKinematics.js +2 -2
  66. package/src/simulation/vehicle/vehiclePhysics.js +3 -3
  67. package/src/simulation/vehicle/vehicleSnapshots.js +12 -1
  68. package/src/simulation/vehicle/vehicleState.js +1 -1
  69. package/src/simulation/warmup/runtimeWarmup.js +0 -1
  70. package/src/styles.css +1185 -136
  71. package/src/ui/bannerTemplates.js +38 -28
  72. package/src/ui/cameraControlsTemplate.js +16 -5
  73. package/src/ui/carOverviewTemplate.js +12 -5
  74. package/src/ui/raceCanvasTemplate.js +31 -8
  75. package/src/ui/raceControlsTemplate.js +27 -10
  76. package/src/ui/shellTemplate.js +3 -1
  77. package/src/ui/telemetryDrawerTemplate.js +23 -10
  78. package/src/ui/telemetryTemplates.js +58 -32
  79. package/src/ui/templateUtils.js +48 -0
  80. 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
  }