From bc71f141e1007ebf491cceb6b622578d10bf8d61 Mon Sep 17 00:00:00 2001 From: leubeem Date: Mon, 29 Jun 2026 06:34:59 +0200 Subject: [PATCH] feat(pm): add Rejected Take-Off drill to the scenario chooser (#14) New standalone "Drills" section in the scenario picker, with the Rejected Take-Off drill (rto-v1). Drills are surfaced separately from the journey chains via DRILL_IDS / drillScenarios. Co-Authored-By: Claude Opus 4.8 --- app/pages/pm.vue | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/app/pages/pm.vue b/app/pages/pm.vue index b082407..f1674d7 100644 --- a/app/pages/pm.vue +++ b/app/pages/pm.vue @@ -188,6 +188,34 @@ + +
+

+ Drills +

+ + +
+
+ +
+
{{ drill.name }}
+
{{ drill.subtitle }}
+
+
+ + Start + +
+
+
+
+

Tap a step to practise just that phase · “Fly full” runs the whole chain.

@@ -2110,6 +2138,18 @@ const SCENARIOS: Scenario[] = [ noChain: true, airport: 'arr', }, + // ── Drills (standalone, not part of a journey chain) ───────────────────── + { + id: 'rto', + name: 'Rejected Take-Off', + subtitle: 'Tower cancels takeoff — reject and stop', + chain: 'rto-v1', + icon: 'mdi-airplane-alert', + startFlow: 'rto-v1', + isComplete: false, + noChain: true, + airport: 'dep', + }, ] // --------------------------------------------------------------------------- @@ -2128,6 +2168,12 @@ const CHAIN_DEFS: ChainDef[] = [ { category: 'Arrival', completeId: 'vfr-arrival', segmentIds: ['vfr-approach', 'circuit-landing', 'taxi-in'] }, ] +// Standalone drills shown in their own section, separate from the journey chains. +const DRILL_IDS = ['rto'] +const drillScenarios = computed(() => DRILL_IDS + .map(id => SCENARIOS.find(s => s.id === id)) + .filter((s): s is Scenario => !!s)) + const chainGroups = computed(() => { const byCategory = new Map>() for (const def of CHAIN_DEFS) {