index.pug 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. //- app/pages/Events/index.pug
  2. section(class="min-h-screen bg-gray-50 dark:bg-gray-900 py-8")
  3. div(class="container mx-auto px-4")
  4. //- Заголовок и описание
  5. div(class="text-center mb-12")
  6. h1(class="text-4xl md:text-5xl font-bold text-gray-800 dark:text-white mb-4") Мероприятия
  7. p(class="text-xl text-gray-600 dark:text-gray-400 max-w-3xl mx-auto") Откройте для себя богатую палитру культурных событий в концертном зале "Кохи Борбад"
  8. //- Фильтры и сортировка
  9. div(class="mb-8")
  10. FilterSort(
  11. :items='allEvents'
  12. :filters='eventFilters'
  13. :sortOptions='sortOptions'
  14. :multipleFilters='true'
  15. @filter-changed='handleFilterChange'
  16. )
  17. //- Сетка мероприятий
  18. div(class="events-grid")
  19. transition-group(name="events-list" tag="div")
  20. div(
  21. v-for='event in displayedEvents'
  22. :key='event.id'
  23. class="event-card bg-white dark:bg-gray-800 rounded-xl shadow-lg overflow-hidden hover:shadow-2xl transition-all duration-300 cursor-pointer transform hover:-translate-y-2"
  24. @click='showEventDetails(event)'
  25. )
  26. div(class="event-image relative overflow-hidden")
  27. img(
  28. :src='event.image'
  29. :alt='event.title'
  30. class="w-full h-48 md:h-56 object-cover transition-transform duration-500 hover:scale-105"
  31. )
  32. div(class="event-badge absolute top-4 right-4")
  33. span(
  34. :class='getCategoryBadgeClass(event.category)'
  35. class="px-3 py-1 rounded-full text-xs font-bold text-white"
  36. ) {{ getCategoryLabel(event.category) }}
  37. div(class="event-date absolute top-4 left-4 bg-white dark:bg-gray-900 text-gray-800 dark:text-white px-3 py-2 rounded-lg shadow-md")
  38. div(class="text-sm font-bold") {{ formatDate(event.date) }}
  39. div(class="event-content p-6")
  40. h3(class="text-xl font-bold text-gray-800 dark:text-white mb-3 line-clamp-2") {{ event.title }}
  41. p(class="text-gray-600 dark:text-gray-400 text-sm mb-4 line-clamp-3") {{ event.description }}
  42. div(class="event-meta flex items-center justify-between mb-4")
  43. div(class="event-time flex items-center text-sm text-gray-500 dark:text-gray-400")
  44. svg(class="w-4 h-4 mr-1" fill="none" stroke="currentColor" viewBox="0 0 24 24")
  45. path(stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z")
  46. span {{ event.time }}
  47. div(class="event-venue flex items-center text-sm text-gray-500 dark:text-gray-400")
  48. svg(class="w-4 h-4 mr-1" fill="none" stroke="currentColor" viewBox="0 0 24 24")
  49. path(stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z")
  50. span {{ event.venue }}
  51. div(class="event-price-and-button flex items-center justify-between")
  52. div(class="price text-2xl font-bold text-accent") {{ event.price }}
  53. span(class="text-sm font-normal text-gray-500 dark:text-gray-400") сомони
  54. button(
  55. class="bg-primary text-white px-4 py-2 rounded-lg hover:bg-gray-700 transition-colors text-sm font-medium"
  56. @click.stop='bookTicket(event)'
  57. ) Купить билет
  58. //- Кнопка "Показать еще"
  59. div(class="load-more text-center mt-12" v-if='hasMoreEvents && !loading')
  60. button(
  61. @click='loadMoreEvents'
  62. class="bg-accent text-white px-8 py-3 rounded-lg hover:bg-yellow-600 transition-colors font-medium text-lg"
  63. ) Показать еще мероприятия
  64. //- Состояние загрузки
  65. div(class="loading-state text-center mt-8" v-if='loading')
  66. div(class="animate-spin rounded-full h-12 w-12 border-b-2 border-accent mx-auto")
  67. p(class="text-gray-600 dark:text-gray-400 mt-4") Загрузка мероприятий...
  68. //- Состояние "нет результатов"
  69. div(class="empty-state text-center mt-12" v-if='!loading && displayedEvents.length === 0')
  70. div(class="empty-icon mx-auto mb-4")
  71. svg(class="w-24 h-24 text-gray-400 mx-auto" fill="none" stroke="currentColor" viewBox="0 0 24 24")
  72. 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")
  73. h3(class="text-xl font-bold text-gray-600 dark:text-gray-400 mb-2") Мероприятия не найдены
  74. p(class="text-gray-500 dark:text-gray-500 mb-6") Попробуйте изменить параметры фильтрации
  75. button(
  76. @click='resetFilters'
  77. class="bg-accent text-white px-6 py-2 rounded-lg hover:bg-yellow-600 transition-colors"
  78. ) Сбросить фильтры
  79. //- Модальное окно деталей мероприятия
  80. EventDetailModal(
  81. v-if='selectedEvent'
  82. :isVisible='showEventModal'
  83. :event='selectedEvent'
  84. @update:isVisible='showEventModal = false'
  85. @ticket-booking='handleTicketBooking'
  86. )