index.pug 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. section(class="min-h-screen bg-gray-50 dark:bg-gray-900 py-8")
  2. div(class="container mx-auto px-4")
  3. div(v-if="loading" class="text-center")
  4. div(class="animate-spin rounded-full h-12 w-12 border-b-2 border-accent mx-auto")
  5. p(class="text-gray-600 dark:text-gray-400 mt-4") Загрузка мероприятия...
  6. div(v-else-if="event" class="max-w-4xl mx-auto")
  7. div(class="bg-white dark:bg-gray-800 rounded-2xl shadow-lg overflow-hidden")
  8. div(class="relative")
  9. img(:src="event.image" :alt="event.title" class="w-full h-64 md:h-80 object-cover")
  10. div(class="absolute top-4 right-4")
  11. span(
  12. :class="getCategoryBadgeClass(event.category)"
  13. class="px-3 py-1 rounded-full text-xs font-bold text-white"
  14. ) {{ getCategoryLabel(event.category) }}
  15. div(class="p-8")
  16. div(class="flex flex-col md:flex-row md:justify-between md:items-start mb-6")
  17. div(class="mb-4 md:mb-0")
  18. h1(class="text-3xl md:text-4xl font-bold text-gray-800 dark:text-white mb-2") {{ event.title }}
  19. p(class="text-xl text-accent font-semibold") {{ event.price }} сомони
  20. div(class="text-right")
  21. p(class="text-lg font-semibold text-gray-800 dark:text-white") {{ formatDateTime(event.date, event.time) }}
  22. p(class="text-gray-600 dark:text-gray-400") {{ event.venue }}
  23. div(class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-8")
  24. div(class="text-center p-4 bg-gray-50 dark:bg-gray-700 rounded-lg")
  25. div(class="text-2xl font-bold text-accent mb-1") {{ event.availableTickets }}
  26. div(class="text-sm text-gray-600 dark:text-gray-400") Осталось билетов
  27. div(class="text-center p-4 bg-gray-50 dark:bg-gray-700 rounded-lg")
  28. div(class="text-xl font-bold text-gray-800 dark:text-white mb-1") {{ event.duration }}
  29. div(class="text-sm text-gray-600 dark:text-gray-400") Продолжительность
  30. div(class="text-center p-4 bg-gray-50 dark:bg-gray-700 rounded-lg")
  31. div(class="text-xl font-bold text-gray-800 dark:text-white mb-1") {{ event.ageRestriction }}
  32. div(class="text-sm text-gray-600 dark:text-gray-400") Возраст
  33. div(class="prose prose-lg dark:prose-invert max-w-none mb-8")
  34. p(class="text-gray-700 dark:text-gray-300 leading-relaxed") {{ event.description }}
  35. div(class="flex flex-col sm:flex-row gap-4")
  36. button(
  37. @click="bookTickets"
  38. class="bg-accent text-white px-8 py-4 rounded-lg font-medium hover:bg-yellow-600 transition-colors flex items-center justify-center"
  39. )
  40. svg(class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24")
  41. path(stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 11V7a4 4 0 00-8 0v4M5 9h14l1 12H4L5 9z")
  42. span Купить билеты
  43. button(
  44. @click="$router.back()"
  45. class="border border-gray-300 text-gray-700 px-6 py-4 rounded-lg font-medium hover:bg-gray-50 transition-colors dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-700"
  46. ) Назад к мероприятиям
  47. div(v-else class="text-center")
  48. div(class="empty-icon mx-auto mb-4")
  49. svg(class="w-24 h-24 text-gray-400 mx-auto" fill="none" stroke="currentColor" viewBox="0 0 24 24")
  50. path(stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.172 16.172a4 4 0 015.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z")
  51. h3(class="text-xl font-bold text-gray-600 dark:text-gray-400 mb-2") Мероприятие не найдено
  52. p(class="text-gray-500 dark:text-gray-500 mb-6") Запрошенное мероприятие не существует или было удалено
  53. app-link(
  54. to="/events"
  55. class="bg-accent text-white px-6 py-2 rounded-lg hover:bg-yellow-600 transition-colors inline-block"
  56. ) Вернуться к мероприятиям