diff --git a/.openclaw/workspace-state.json b/.openclaw/workspace-state.json
new file mode 100644
index 00000000..eb1cb803
--- /dev/null
+++ b/.openclaw/workspace-state.json
@@ -0,0 +1,4 @@
+{
+ "version": 1,
+ "setupCompletedAt": "2026-06-07T11:37:04.444Z"
+}
diff --git a/src/components/displays/selfServe/ErrorBanner.vue b/src/components/displays/selfServe/ErrorBanner.vue
new file mode 100644
index 00000000..4b9c1c8e
--- /dev/null
+++ b/src/components/displays/selfServe/ErrorBanner.vue
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+ {{ message }}
+
+ {{ $t("common.try_again") }}
+
+
+
+
+
+
diff --git a/src/components/displays/selfServe/LaneSelectionSection.vue b/src/components/displays/selfServe/LaneSelectionSection.vue
new file mode 100644
index 00000000..ed3764c5
--- /dev/null
+++ b/src/components/displays/selfServe/LaneSelectionSection.vue
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
diff --git a/src/components/displays/selfServe/VehicleInputSection.vue b/src/components/displays/selfServe/VehicleInputSection.vue
new file mode 100644
index 00000000..a9d7187c
--- /dev/null
+++ b/src/components/displays/selfServe/VehicleInputSection.vue
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
diff --git a/src/components/displays/selfServe/WashProgressCard.vue b/src/components/displays/selfServe/WashProgressCard.vue
new file mode 100644
index 00000000..5393325e
--- /dev/null
+++ b/src/components/displays/selfServe/WashProgressCard.vue
@@ -0,0 +1,255 @@
+
+
+
+
+
+
+
+
{{ $t("self_wash.finishing_wash_exit_opening") }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t("self_wash.assistance") }}
+
+
+
+
+
+
+ {{ $t("self_wash.open_property_access_gate") }}
+
+
+
+ {{ $t("self_wash.open_property_exit_gate") }}
+
+
+
+
+
+
+ {{ $t("common.previous") }}
+
+
+
+ {{ $t("common.next") }}
+
+
+
+ {{ $t("common.done") }}
+
+
+
+
+
+
+
+
diff --git a/src/components/displays/selfServe/WashTypeSelector.vue b/src/components/displays/selfServe/WashTypeSelector.vue
new file mode 100644
index 00000000..8942e9e5
--- /dev/null
+++ b/src/components/displays/selfServe/WashTypeSelector.vue
@@ -0,0 +1,170 @@
+
+
+
+
+
+ {{ $t("self_wash.wash_type") }}
+
+
+
+
+
+ {{ $t("self_wash.manual") }}
+
+
+ {{ $t("self_wash.available") }}
+
+
+
+
+
+
+
+
+
+ {{ $t("self_wash.machine") }}
+
+
+
+ {{ $t("self_wash.unavailable") }}
+
+
+
+
+
+ {{ $t("self_wash.available") }}
+
+
+
+
+
+
+
+
+ {{ $t("self_wash.machine_unavailable_for_lane") }}
+
+
+
+
+
diff --git a/src/views/dashboards/userDashboard/wash/MyWashStart.vue b/src/views/dashboards/userDashboard/wash/MyWashStart.vue
index 7c845f0c..0ea9566a 100644
--- a/src/views/dashboards/userDashboard/wash/MyWashStart.vue
+++ b/src/views/dashboards/userDashboard/wash/MyWashStart.vue
@@ -13,6 +13,8 @@ import SelfServeLaneStep from "@/components/displays/selfServe/SelfServeLaneStep
import SelfServeTasksStep from "@/components/displays/selfServe/SelfServeTasksStep.vue";
import SelfServeGuidedInstructions from "@/components/displays/selfServe/SelfServeGuidedInstructions.vue";
import SelfServeCompletedStep from "@/components/displays/selfServe/SelfServeCompletedStep.vue";
+import ErrorBanner from "@/components/displays/selfServe/ErrorBanner.vue";
+import WashProgressCard from "@/components/displays/selfServe/WashProgressCard.vue";
import { guidedWashFlowSteps } from "@/constants/guidedWashFlowSteps";
import { useSelfServeLogic } from "@/composables/useSelfServeLogic";
import { useWashDepartments } from "@/composables/useWashDepartments";
@@ -2022,73 +2024,32 @@ watch(
-
-
- {{ departmentFetchError }}
-
- {{ $t("common.try_again") }}
-
-
-
+ @retry="fetchDepartments"
+ />
-
-
- {{ selfServeDataError }}
-
- {{ $t("common.try_again") }}
-
-
-
+ @retry="retrySelfServeData"
+ />
-
-
- {{ washActionError }}
-
- {{ $t("common.try_again") }}
-
-
-
+ @retry="retryWashAction"
+ />
-
-
- {{ $t("self_wash.assistance") }}
-
-
-
-
-
- {{ $t("self_wash.open_property_access_gate") }}
-
-
-
- {{ $t("self_wash.open_property_exit_gate") }}
-
-
-
-
-
- {{ $t("common.previous") }}
-
-
-
- {{ $t("common.next") }}
-
-
-
- {{ $t("common.done") }}
-
-
+
+
+
+
+
@@ -2543,21 +2446,6 @@ watch(
margin-bottom: 0;
}
-.self-serve-bottom-actions {
- display: flex;
- flex-direction: column;
- gap: 0.75rem;
- justify-content: center;
- margin: 0.75rem auto 0;
- max-width: 30rem;
-}
-
-.self-serve-bottom-actions__row {
- display: flex;
- gap: 0.75rem;
- justify-content: center;
- width: 100%;
-}
.self-serve-bottom-actions__row--prewash {
max-width: 30rem;
@@ -2573,10 +2461,21 @@ watch(
white-space: normal;
}
-.self-serve-finishing-screen {
- margin: 0 auto;
- max-width: 32rem;
- text-align: left;
+/* Wash progress card bottom actions (during active wash) */
+.self-serve-bottom-actions {
+ display: flex;
+ flex-direction: column;
+ gap: 0.75rem;
+ justify-content: center;
+ margin: 0.75rem auto 0;
+ max-width: 30rem;
+}
+
+.self-serve-bottom-actions__row {
+ display: flex;
+ gap: 0.75rem;
+ justify-content: center;
+ width: 100%;
}
@media screen and (max-width: 768px) {