Files
webapp/app/components/catalog/OfferResultCard.vue
Ruslan Bakiev de95dbd059
All checks were successful
Build Docker Image / build (push) Successful in 4m36s
Unify offer cards: RouteStepper + OfferResultCard components
- Add RouteStepper component with transport icons (🚛 🚂 🚢)
- Add OfferResultCard with price, distance, route stages
- Update hub page to use OfferResultCard
- Update CalcResultContent to use OfferResultCard
2026-01-14 23:47:42 +07:00

53 lines
1.4 KiB
Vue

<template>
<Card padding="md" interactive @click="$emit('select')">
<!-- Header: Source + Price -->
<div class="flex items-start justify-between mb-2">
<div>
<Text weight="semibold">{{ sourceName }}</Text>
<Text v-if="productName" tone="muted" size="sm">{{ productName }}</Text>
</div>
<div class="text-right">
<Text v-if="priceDisplay" weight="semibold" class="text-primary text-lg">
{{ priceDisplay }}
</Text>
<Text tone="muted" size="sm">{{ formatDistance(totalDistance) }} км</Text>
</div>
</div>
<!-- Route stepper -->
<RouteStepper v-if="stages.length > 0" :stages="stages" />
</Card>
</template>
<script setup lang="ts">
import type { RouteStage } from './RouteStepper.vue'
const props = withDefaults(defineProps<{
sourceName: string
productName?: string
pricePerUnit?: number | null
currency?: string | null
unit?: string | null
totalDistance: number
stages?: RouteStage[]
}>(), {
stages: () => []
})
defineEmits<{
select: []
}>()
const priceDisplay = computed(() => {
if (!props.pricePerUnit) return null
const curr = props.currency || 'USD'
const u = props.unit || 'т'
return `${props.pricePerUnit} ${curr}/${u}`
})
const formatDistance = (km?: number | null) => {
if (!km) return '0'
return Math.round(km).toLocaleString()
}
</script>