+
diff --git a/web/src/components/MobileScoreStrip.vue b/web/src/components/MobileScoreStrip.vue
new file mode 100644
index 0000000..c893957
--- /dev/null
+++ b/web/src/components/MobileScoreStrip.vue
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
diff --git a/web/src/components/PlayerBar.vue b/web/src/components/PlayerBar.vue
index 03b0f87..0090ef7 100644
--- a/web/src/components/PlayerBar.vue
+++ b/web/src/components/PlayerBar.vue
@@ -335,5 +335,16 @@ input[type='range']::-moz-range-thumb {
.player .iconbtn.step {
display: none;
}
+
+ /* 44 px touch targets (spec section 8). */
+ .iconbtn {
+ width: 44px;
+ height: 44px;
+ }
+
+ .iconbtn.play {
+ width: 48px;
+ height: 48px;
+ }
}
diff --git a/web/src/components/ScenarioPanel.vue b/web/src/components/ScenarioPanel.vue
index 3498b75..d1847f3 100644
--- a/web/src/components/ScenarioPanel.vue
+++ b/web/src/components/ScenarioPanel.vue
@@ -94,7 +94,7 @@ const dimmed = computed(() => store.state.runState === 'running' && result.value
-
+
{{ panel.label }}
@@ -340,4 +340,18 @@ const dimmed = computed(() => store.state.runState === 'running' && result.value
background-position: -200% 0;
}
}
+
+@media (max-width: 760px) {
+ /* 44 px touch target for the kebab (spec section 8). */
+ .kebab {
+ min-width: 44px;
+ min-height: 44px;
+ margin-right: -12px;
+ }
+
+ /* Anchor target lands below the sticky app bar plus score strip. */
+ .panel {
+ scroll-margin-top: 128px;
+ }
+}
diff --git a/web/src/components/ScenarioToolbar.vue b/web/src/components/ScenarioToolbar.vue
index 475f3f0..db90040 100644
--- a/web/src/components/ScenarioToolbar.vue
+++ b/web/src/components/ScenarioToolbar.vue
@@ -24,9 +24,15 @@ function addScenario() {
Scenarios
-