diff --git a/app/components/live-atc/FlightSelectStep.vue b/app/components/live-atc/FlightSelectStep.vue new file mode 100644 index 0000000..9899869 --- /dev/null +++ b/app/components/live-atc/FlightSelectStep.vue @@ -0,0 +1,69 @@ + + + diff --git a/app/components/live-atc/FlightSourceStep.vue b/app/components/live-atc/FlightSourceStep.vue new file mode 100644 index 0000000..3681d16 --- /dev/null +++ b/app/components/live-atc/FlightSourceStep.vue @@ -0,0 +1,74 @@ + + + diff --git a/app/components/live-atc/ScenarioPickerStep.vue b/app/components/live-atc/ScenarioPickerStep.vue new file mode 100644 index 0000000..ddaf425 --- /dev/null +++ b/app/components/live-atc/ScenarioPickerStep.vue @@ -0,0 +1,150 @@ + + + + + diff --git a/app/components/live-atc/SessionCompleteStep.vue b/app/components/live-atc/SessionCompleteStep.vue new file mode 100644 index 0000000..159a7a7 --- /dev/null +++ b/app/components/live-atc/SessionCompleteStep.vue @@ -0,0 +1,52 @@ + + + diff --git a/app/components/live-atc/SetupCard.vue b/app/components/live-atc/SetupCard.vue new file mode 100644 index 0000000..768c034 --- /dev/null +++ b/app/components/live-atc/SetupCard.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/app/pages/live-atc.vue b/app/pages/live-atc.vue index d841293..c9010c4 100644 --- a/app/pages/live-atc.vue +++ b/app/pages/live-atc.vue @@ -11,263 +11,48 @@

{{ sessionStartingMessage }}

-
- -
- - -
-

VATSIM Integration

-

Enter your CID to load your filtered flight plans.

-
- - - Load flight plans - - - {{ error }} - -
-
+
+ +
+ - - - -
-

Demo Mode

-

Start with a sample flight plan for testing.

-
- - Start demo (DLH39A EDDF→EDDM) - -
-
-
+ - -
-
- - mdi-arrow-left - -

Available flight plans

- {{ vatsimId }} -
- -
- -

Loading flight plans from VATSIM…

-
- -
- mdi-airplane-off -

No flight plans found

- - Back - -
- -
- - -
-

{{ plan.callsign }}

- {{ plan.aircraft?.split('/')[0] }} -
-
-
- - {{ plan.dep }} → {{ plan.arr }} -
-
- - FL{{ Math.floor(parseInt(plan.altitude) / 100) }} -
-
- - Squawk: {{ plan.assignedsquawk }} -
-
-
-
-
-
- - -
- -
- - mdi-arrow-left - -
-

Choose your scenario

-

- {{ selectedPlan.callsign }} · {{ selectedPlan.dep }} → {{ selectedPlan.arr }} -

-
-
- - - {{ error }} - - - -
-

- {{ grp.category }} -

- - - - -
-
- -
-
{{ chain.complete.name }}
-
{{ chain.complete.subtitle }}
-
-
- - Fly full - -
- - -
- -
-
-
-
- - -
-

- Drills -

- - -
-
- -
-
{{ drill.name }}
-
{{ drill.subtitle }}
-
-
- - Start - -
-
-
-
- -

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

-
- - -
-
- mdi-check-circle-outline -

- {{ completedScenario?.name ?? 'Session' }} complete -

-

- {{ selectedPlan?.callsign }} · - {{ selectedPlan?.dep }} → {{ selectedPlan?.arr }} -

-
- -
- - mdi-refresh - Fly again - - - - {{ oppositeScenario.icon }} - Try {{ oppositeScenario.name }} - - - - Back to scenarios - -
-
+ + +
@@ -1526,6 +1311,10 @@ import { useBugReport } from '~/composables/useBugReport' import { useDebugSimulation } from '~/composables/useDebugSimulation' import { useSimBridgeSync } from '~/composables/useSimBridgeSync' import { CHAIN_GROUPS, DRILL_SCENARIOS } from '../../shared/constants/scenarios' +import FlightSourceStep from '~/components/live-atc/FlightSourceStep.vue' +import FlightSelectStep from '~/components/live-atc/FlightSelectStep.vue' +import ScenarioPickerStep from '~/components/live-atc/ScenarioPickerStep.vue' +import SessionCompleteStep from '~/components/live-atc/SessionCompleteStep.vue' import { useLiveAtcSession } from '~/composables/useLiveAtcSession' import { useSessionState } from '~/composables/useSessionState' import { useSpeechInterrupt } from '~/composables/useSpeechInterrupt' @@ -2566,33 +2355,15 @@ onUnmounted(() => { .pm-readback-expected { color: var(--text); font-weight: 600; } .pm-readback-forms { color: var(--t4); } -/* Scenario chooser — phase flow with arrows */ -.pm-flow { - display: flex; - align-items: center; - flex-wrap: wrap; - gap: 6px; +/* Setup screens sit above the shared radar backdrop. */ +.pm-setup { + position: relative; + min-height: 100vh; + isolation: isolate; } -.pm-flow-node { - display: inline-flex; - align-items: center; - gap: 4px; - padding: 4px 9px; - border-radius: 8px; - background: var(--pm-surface-1); - border: 1px solid var(--border); - font-size: 11.5px; - line-height: 1.2; - color: var(--t2); - transition: border-color .15s, background .15s, color .15s; -} -.pm-flow-node:hover { - border-color: rgba(34, 211, 238, 0.6); - background: rgba(34, 211, 238, 0.1); - color: var(--text); -} -.pm-flow-arrow { - color: var(--t4); +.pm-setup__inner { + position: relative; + z-index: 1; } .pm-bottomnav {