diff --git a/frontend/src/stores/phone.ts b/frontend/src/stores/phone.ts index 5f9eb3f..cdaa3cf 100644 --- a/frontend/src/stores/phone.ts +++ b/frontend/src/stores/phone.ts @@ -2502,7 +2502,7 @@ const defaultLocales: LocaleTree = { home: 'Home', rides: 'Rides', activity: 'Activity', - messages: 'Messages', + messages: 'Chat', profile: 'Profile', }, rides: 'Your Rides', diff --git a/frontend/src/stores/skyride.test.ts b/frontend/src/stores/skyride.test.ts index bb09bc5..9ae3608 100644 --- a/frontend/src/stores/skyride.test.ts +++ b/frontend/src/stores/skyride.test.ts @@ -25,7 +25,9 @@ const ride: SkyRideRide = { createdAt: 1_755_000_000, currency: '$', destination, + distanceMeters: 5_200, driver: null, + durationSeconds: 640, id: 'ride-1', pickup, price: 48, diff --git a/frontend/src/types/skyride.ts b/frontend/src/types/skyride.ts index b83a60a..8816198 100644 --- a/frontend/src/types/skyride.ts +++ b/frontend/src/types/skyride.ts @@ -87,7 +87,9 @@ export type SkyRideRide = { createdAt: number currency: string destination: SkyRideLocation + distanceMeters: number driver: SkyRideDriver | null + durationSeconds: number finalPrice?: number id: string passenger?: SkyRidePassenger diff --git a/frontend/src/views/apps/SkyRideApp.contract.test.ts b/frontend/src/views/apps/SkyRideApp.contract.test.ts new file mode 100644 index 0000000..08370bf --- /dev/null +++ b/frontend/src/views/apps/SkyRideApp.contract.test.ts @@ -0,0 +1,42 @@ +import { readFileSync } from 'node:fs' + +import { describe, expect, it } from 'vitest' + +const source = readFileSync( + new URL('./SkyRideApp.vue', import.meta.url), + 'utf8', +) +const types = readFileSync( + new URL('../../types/skyride.ts', import.meta.url), + 'utf8', +) + +describe('SkyRide app layout', () => { + it('shows the server-authoritative ride distance in history', () => { + expect(types).toContain('distanceMeters: number') + expect(source).toContain('formatRideDistance(ride.distanceMeters)') + expect(source).toContain('skyride-history-card__distance') + }) + + it('aligns rider and activity surfaces to one content width', () => { + expect(source).toMatch( + /\.skyride-location-list,\s*\.skyride-activity-list\s*\{[^}]*margin-inline:\s*2px !important;/s, + ) + expect(source).toMatch( + /\.skyride-home-panel\s*\{[^}]*background:\s*linear-gradient/s, + ) + }) + + it('uses a compact swipeable profile editor with equal actions', () => { + expect(source).toContain('class="skyride-profile-sheet"') + expect(source).toContain('swipe-to-close') + expect(source).toContain('@swipeclose="closeProfileEditor"') + expect(source).toMatch( + /\.skyride-profile-sheet :deep\(\.sky-sheet__panel\)\s*\{[^}]*max-height:\s*78%;/s, + ) + expect(source.match(/ {