add changed revileing header in ather pages begushiybashkir.ru site
This commit is contained in:
@@ -120,6 +120,7 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.header-container {
|
.header-container {
|
||||||
|
max-width: 1200px;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|||||||
@@ -167,6 +167,7 @@ export default {
|
|||||||
padding: 0;
|
padding: 0;
|
||||||
position: relative;
|
position: relative;
|
||||||
transition: transform 0.3s ease;
|
transition: transform 0.3s ease;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.burger-menu:hover {
|
.burger-menu:hover {
|
||||||
@@ -181,7 +182,7 @@ export default {
|
|||||||
display: block;
|
display: block;
|
||||||
height: 3px;
|
height: 3px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
background-color: white;
|
background-color: rgb(0, 0, 0);
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
transition: all 0.3s ease;
|
transition: all 0.3s ease;
|
||||||
transform-origin: center;
|
transform-origin: center;
|
||||||
|
|||||||
@@ -33,12 +33,16 @@ export default {
|
|||||||
width: 30px;
|
width: 30px;
|
||||||
height: 30px;
|
height: 30px;
|
||||||
object-fit: contain;
|
object-fit: contain;
|
||||||
|
border: 2px solid white;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mobile-logo span {
|
.mobile-logo span {
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #2e8b57;
|
color: #2e8b57;
|
||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
|
border: 2px solid black; /* Black border for the text */
|
||||||
|
padding: 2px 4px; /* Optional: Adds space inside the border */
|
||||||
|
border-radius: 4px; /* Optional: Rounded corners */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Скрыть на десктопе по умолчанию */
|
/* Скрыть на десктопе по умолчанию */
|
||||||
|
|||||||
@@ -55,7 +55,7 @@
|
|||||||
|
|
||||||
<div class="info-image">
|
<div class="info-image">
|
||||||
<img :src="getImageUrl('UMM2025.png')" alt="Команда бегового клуба Бегущий Башкир" class="club-image">
|
<img :src="getImageUrl('UMM2025.png')" alt="Команда бегового клуба Бегущий Башкир" class="club-image">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -281,6 +281,23 @@
|
|||||||
export default {
|
export default {
|
||||||
// eslint-disable-next-line vue/multi-word-component-names
|
// eslint-disable-next-line vue/multi-word-component-names
|
||||||
name: 'About',
|
name: 'About',
|
||||||
|
mounted() {
|
||||||
|
window.addEventListener('scroll', this.handleFirstInteraction, { passive: true, once: true })
|
||||||
|
window.addEventListener('click', this.handleFirstInteraction, { once: true })
|
||||||
|
window.addEventListener('touchstart', this.handleFirstInteraction, { once: true })
|
||||||
|
this.autoShowTimeout = setTimeout(() => {
|
||||||
|
if (!this.hasInteracted) {
|
||||||
|
this.showContent()
|
||||||
|
}
|
||||||
|
}, 3000)
|
||||||
|
},
|
||||||
|
beforeUnmount() {
|
||||||
|
// Убираем обработчики при размонтировании
|
||||||
|
window.removeEventListener('scroll', this.handleFirstInteraction)
|
||||||
|
window.removeEventListener('click', this.handleFirstInteraction)
|
||||||
|
window.removeEventListener('touchstart', this.handleFirstInteraction)
|
||||||
|
clearTimeout(this.autoShowTimeout)
|
||||||
|
},
|
||||||
metaInfo: {
|
metaInfo: {
|
||||||
title: 'О нас - Бегущий Башкир | Беговой клуб в Уфе',
|
title: 'О нас - Бегущий Башкир | Беговой клуб в Уфе',
|
||||||
meta: [
|
meta: [
|
||||||
@@ -302,6 +319,18 @@ export default {
|
|||||||
console.log(`${baseUrl}images/${path}`)
|
console.log(`${baseUrl}images/${path}`)
|
||||||
return `${baseUrl}images/${path}`
|
return `${baseUrl}images/${path}`
|
||||||
},
|
},
|
||||||
|
handleFirstInteraction() {
|
||||||
|
if (!this.hasInteracted) {
|
||||||
|
this.hasInteracted = true
|
||||||
|
this.showContent()
|
||||||
|
clearTimeout(this.autoShowTimeout)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
showContent() {
|
||||||
|
this.isContentVisible = true
|
||||||
|
// Эмитим событие для показа хедера
|
||||||
|
this.$emit('show-header')
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -27,36 +27,20 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="filters-container">
|
<div class="filters-container">
|
||||||
<div class="search-box">
|
<div class="search-box">
|
||||||
<input
|
<input v-model="searchQuery" type="text" placeholder="🔍 Поиск по имени или дистанции..."
|
||||||
v-model="searchQuery"
|
class="search-input">
|
||||||
type="text"
|
|
||||||
placeholder="🔍 Поиск по имени или дистанции..."
|
|
||||||
class="search-input"
|
|
||||||
>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="filter-buttons">
|
<div class="filter-buttons">
|
||||||
<button
|
<button v-for="filter in filters" :key="filter.value"
|
||||||
v-for="filter in filters"
|
:class="['filter-btn', { 'active': activeFilter === filter.value }]" @click="setFilter(filter.value)">
|
||||||
:key="filter.value"
|
|
||||||
:class="['filter-btn', { 'active': activeFilter === filter.value }]"
|
|
||||||
@click="setFilter(filter.value)"
|
|
||||||
>
|
|
||||||
{{ filter.label }}
|
{{ filter.label }}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="view-toggle">
|
<div class="view-toggle">
|
||||||
<button
|
<button :class="['view-btn', { 'active': viewMode === 'grid' }]" @click="viewMode = 'grid'" title="Сетка">
|
||||||
:class="['view-btn', { 'active': viewMode === 'grid' }]"
|
|
||||||
@click="viewMode = 'grid'"
|
|
||||||
title="Сетка"
|
|
||||||
>
|
|
||||||
▦
|
▦
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button :class="['view-btn', { 'active': viewMode === 'list' }]" @click="viewMode = 'list'" title="Список">
|
||||||
:class="['view-btn', { 'active': viewMode === 'list' }]"
|
|
||||||
@click="viewMode = 'list'"
|
|
||||||
title="Список"
|
|
||||||
>
|
|
||||||
≡
|
≡
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -71,11 +55,7 @@
|
|||||||
<div class="category-section">
|
<div class="category-section">
|
||||||
<h2 class="category-title">🏆 Командные достижения</h2>
|
<h2 class="category-title">🏆 Командные достижения</h2>
|
||||||
<div class="achievements-grid" :class="viewMode">
|
<div class="achievements-grid" :class="viewMode">
|
||||||
<div
|
<div v-for="achievement in teamAchievements" :key="achievement.id" class="achievement-card team-card">
|
||||||
v-for="achievement in teamAchievements"
|
|
||||||
:key="achievement.id"
|
|
||||||
class="achievement-card team-card"
|
|
||||||
>
|
|
||||||
<div class="achievement-icon">🏅</div>
|
<div class="achievement-icon">🏅</div>
|
||||||
<h3>{{ achievement.title }}</h3>
|
<h3>{{ achievement.title }}</h3>
|
||||||
<p>{{ achievement.description }}</p>
|
<p>{{ achievement.description }}</p>
|
||||||
@@ -88,45 +68,28 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Личные достижения по дистанциям -->
|
<!-- Личные достижения по дистанциям -->
|
||||||
<div
|
<div v-for="category in filteredCategories" :key="category.id" class="category-section">
|
||||||
v-for="category in filteredCategories"
|
|
||||||
:key="category.id"
|
|
||||||
class="category-section"
|
|
||||||
>
|
|
||||||
<h2 class="category-title">{{ category.icon }} {{ category.title }}</h2>
|
<h2 class="category-title">{{ category.icon }} {{ category.title }}</h2>
|
||||||
<div class="achievements-grid" :class="viewMode">
|
<div class="achievements-grid" :class="viewMode">
|
||||||
<div
|
<div v-for="achievement in category.achievements" :key="achievement.id" class="achievement-card"
|
||||||
v-for="achievement in category.achievements"
|
:class="getAchievementClass(achievement)">
|
||||||
:key="achievement.id"
|
|
||||||
class="achievement-card"
|
|
||||||
:class="getAchievementClass(achievement)"
|
|
||||||
>
|
|
||||||
<div class="achievement-header">
|
<div class="achievement-header">
|
||||||
<h3>{{ achievement.name }}</h3>
|
<h3>{{ achievement.name }}</h3>
|
||||||
<span class="result">{{ achievement.result }}</span>
|
<span class="result">{{ achievement.result }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="achievement-details">
|
<div class="achievement-details">
|
||||||
<p class="pace" v-if="achievement.pace">Темп: {{ achievement.pace }}</p>
|
<p class="pace" v-if="achievement.pace">Темп: {{ achievement.pace }}</p>
|
||||||
<p class="note" v-if="achievement.note">{{ achievement.note }}</p>
|
<p class="note" v-if="achievement.note">{{ achievement.note }}</p>
|
||||||
|
|
||||||
<div class="achievement-links" v-if="achievement.telegram">
|
<div class="achievement-links" v-if="achievement.telegram">
|
||||||
<a
|
<a :href="achievement.telegram" target="_blank" class="telegram-link" title="Написать в Telegram">
|
||||||
:href="achievement.telegram"
|
|
||||||
target="_blank"
|
|
||||||
class="telegram-link"
|
|
||||||
title="Написать в Telegram"
|
|
||||||
>
|
|
||||||
📱 @{{ getTelegramUsername(achievement.telegram) }}
|
📱 @{{ getTelegramUsername(achievement.telegram) }}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="achievement-meta">
|
<div class="achievement-meta">
|
||||||
<span
|
<span v-if="achievement.pb" class="badge pb-badge" title="Личный рекорд">
|
||||||
v-if="achievement.pb"
|
|
||||||
class="badge pb-badge"
|
|
||||||
title="Личный рекорд"
|
|
||||||
>
|
|
||||||
PB
|
PB
|
||||||
</span>
|
</span>
|
||||||
<span class="distance">{{ category.distance }}</span>
|
<span class="distance">{{ category.distance }}</span>
|
||||||
@@ -191,6 +154,23 @@
|
|||||||
export default {
|
export default {
|
||||||
// eslint-disable-next-line vue/multi-word-component-names
|
// eslint-disable-next-line vue/multi-word-component-names
|
||||||
name: 'Achievements',
|
name: 'Achievements',
|
||||||
|
mounted() {
|
||||||
|
window.addEventListener('scroll', this.handleFirstInteraction, { passive: true, once: true })
|
||||||
|
window.addEventListener('click', this.handleFirstInteraction, { once: true })
|
||||||
|
window.addEventListener('touchstart', this.handleFirstInteraction, { once: true })
|
||||||
|
this.autoShowTimeout = setTimeout(() => {
|
||||||
|
if (!this.hasInteracted) {
|
||||||
|
this.showContent()
|
||||||
|
}
|
||||||
|
}, 3000)
|
||||||
|
},
|
||||||
|
beforeUnmount() {
|
||||||
|
// Убираем обработчики при размонтировании
|
||||||
|
window.removeEventListener('scroll', this.handleFirstInteraction)
|
||||||
|
window.removeEventListener('click', this.handleFirstInteraction)
|
||||||
|
window.removeEventListener('touchstart', this.handleFirstInteraction)
|
||||||
|
clearTimeout(this.autoShowTimeout)
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
searchQuery: '',
|
searchQuery: '',
|
||||||
@@ -472,6 +452,18 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
handleFirstInteraction() {
|
||||||
|
if (!this.hasInteracted) {
|
||||||
|
this.hasInteracted = true
|
||||||
|
this.showContent()
|
||||||
|
clearTimeout(this.autoShowTimeout)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
showContent() {
|
||||||
|
this.isContentVisible = true
|
||||||
|
// Эмитим событие для показа хедера
|
||||||
|
this.$emit('show-header')
|
||||||
|
},
|
||||||
setFilter(filter) {
|
setFilter(filter) {
|
||||||
this.activeFilter = filter
|
this.activeFilter = filter
|
||||||
},
|
},
|
||||||
@@ -896,52 +888,52 @@ export default {
|
|||||||
.hero-title {
|
.hero-title {
|
||||||
font-size: 2.2rem;
|
font-size: 2.2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hero-stats {
|
.hero-stats {
|
||||||
gap: 2rem;
|
gap: 2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.stat-number {
|
.stat-number {
|
||||||
font-size: 2rem;
|
font-size: 2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.filters-container {
|
.filters-container {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: stretch;
|
align-items: stretch;
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-box {
|
.search-box {
|
||||||
min-width: auto;
|
min-width: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.filter-buttons {
|
.filter-buttons {
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.view-toggle {
|
.view-toggle {
|
||||||
align-self: center;
|
align-self: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.achievements-grid.grid {
|
.achievements-grid.grid {
|
||||||
grid-template-columns: 1fr;
|
grid-template-columns: 1fr;
|
||||||
}
|
}
|
||||||
|
|
||||||
.achievement-header {
|
.achievement-header {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
}
|
}
|
||||||
|
|
||||||
.result {
|
.result {
|
||||||
margin-left: 0;
|
margin-left: 0;
|
||||||
margin-top: 0.5rem;
|
margin-top: 0.5rem;
|
||||||
align-self: flex-start;
|
align-self: flex-start;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cta-buttons {
|
.cta-buttons {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn {
|
.btn {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: 300px;
|
max-width: 300px;
|
||||||
@@ -952,23 +944,23 @@ export default {
|
|||||||
.hero-section {
|
.hero-section {
|
||||||
padding: 60px 0 40px;
|
padding: 60px 0 40px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hero-title {
|
.hero-title {
|
||||||
font-size: 1.8rem;
|
font-size: 1.8rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.category-title {
|
.category-title {
|
||||||
font-size: 1.5rem;
|
font-size: 1.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.section-title {
|
.section-title {
|
||||||
font-size: 2rem;
|
font-size: 2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.stats-grid {
|
.stats-grid {
|
||||||
grid-template-columns: 1fr;
|
grid-template-columns: 1fr;
|
||||||
}
|
}
|
||||||
|
|
||||||
.container {
|
.container {
|
||||||
padding: 0 15px;
|
padding: 0 15px;
|
||||||
}
|
}
|
||||||
@@ -980,6 +972,7 @@ export default {
|
|||||||
opacity: 0;
|
opacity: 0;
|
||||||
transform: translateY(30px);
|
transform: translateY(30px);
|
||||||
}
|
}
|
||||||
|
|
||||||
to {
|
to {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
transform: translateY(0);
|
transform: translateY(0);
|
||||||
|
|||||||
@@ -261,6 +261,18 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
handleFirstInteraction() {
|
||||||
|
if (!this.hasInteracted) {
|
||||||
|
this.hasInteracted = true
|
||||||
|
this.showContent()
|
||||||
|
clearTimeout(this.autoShowTimeout)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
showContent() {
|
||||||
|
this.isContentVisible = true
|
||||||
|
// Эмитим событие для показа хедера
|
||||||
|
this.$emit('show-header')
|
||||||
|
},
|
||||||
getImageUrl(path) {
|
getImageUrl(path) {
|
||||||
// В продакшене замените на правильный путь
|
// В продакшене замените на правильный путь
|
||||||
const baseUrl = import.meta.env.BASE_URL
|
const baseUrl = import.meta.env.BASE_URL
|
||||||
@@ -330,14 +342,27 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
window.addEventListener('scroll', this.handleFirstInteraction, { passive: true, once: true })
|
||||||
|
window.addEventListener('click', this.handleFirstInteraction, { once: true })
|
||||||
|
window.addEventListener('touchstart', this.handleFirstInteraction, { once: true })
|
||||||
|
this.autoShowTimeout = setTimeout(() => {
|
||||||
|
if (!this.hasInteracted) {
|
||||||
|
this.showContent()
|
||||||
|
}
|
||||||
|
}, 3000)
|
||||||
this.startAutoSlide()
|
this.startAutoSlide()
|
||||||
document.addEventListener('keydown', this.handleKeydown)
|
document.addEventListener('keydown', this.handleKeydown)
|
||||||
},
|
},
|
||||||
beforeUnmount() {
|
beforeUnmount() {
|
||||||
|
// Убираем обработчики при размонтировании
|
||||||
|
window.removeEventListener('scroll', this.handleFirstInteraction)
|
||||||
|
window.removeEventListener('click', this.handleFirstInteraction)
|
||||||
|
window.removeEventListener('touchstart', this.handleFirstInteraction)
|
||||||
|
clearTimeout(this.autoShowTimeout)
|
||||||
this.stopAutoSlide()
|
this.stopAutoSlide()
|
||||||
document.removeEventListener('keydown', this.handleKeydown)
|
document.removeEventListener('keydown', this.handleKeydown)
|
||||||
document.body.style.overflow = ''
|
document.body.style.overflow = ''
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -322,12 +322,9 @@ export default {
|
|||||||
.title-main {
|
.title-main {
|
||||||
display: block;
|
display: block;
|
||||||
font-size: 3rem;
|
font-size: 3rem;
|
||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
text-shadow:
|
text-shadow:
|
||||||
-1px -1px 0 black,
|
2px 2px 4px #26302868;
|
||||||
1px -1px 0 black,
|
|
||||||
-1px 1px 0 black,
|
|
||||||
1px 1px 0 black;
|
|
||||||
line-height: 1.1;
|
line-height: 1.1;
|
||||||
margin-bottom: 0.5rem;
|
margin-bottom: 0.5rem;
|
||||||
letter-spacing: 2px;
|
letter-spacing: 2px;
|
||||||
|
|||||||
@@ -60,6 +60,18 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
handleFirstInteraction() {
|
||||||
|
if (!this.hasInteracted) {
|
||||||
|
this.hasInteracted = true
|
||||||
|
this.showContent()
|
||||||
|
clearTimeout(this.autoShowTimeout)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
showContent() {
|
||||||
|
this.isContentVisible = true
|
||||||
|
// Эмитим событие для показа хедера
|
||||||
|
this.$emit('show-header')
|
||||||
|
},
|
||||||
async handleLogin() {
|
async handleLogin() {
|
||||||
const result = await this.authStore.login(this.credentials)
|
const result = await this.authStore.login(this.credentials)
|
||||||
|
|
||||||
@@ -99,12 +111,27 @@ export default {
|
|||||||
}, 3000)
|
}, 3000)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
beforeUnmount() {
|
||||||
|
// Убираем обработчики при размонтировании
|
||||||
|
window.removeEventListener('scroll', this.handleFirstInteraction)
|
||||||
|
window.removeEventListener('click', this.handleFirstInteraction)
|
||||||
|
window.removeEventListener('touchstart', this.handleFirstInteraction)
|
||||||
|
clearTimeout(this.autoShowTimeout)
|
||||||
|
},
|
||||||
// Добавляем проверку при монтировании компонента
|
// Добавляем проверку при монтировании компонента
|
||||||
mounted() {
|
mounted() {
|
||||||
// Если пользователь уже авторизован, показываем уведомление
|
// Если пользователь уже авторизован, показываем уведомление
|
||||||
if (this.authStore.isAuthenticated) {
|
if (this.authStore.isAuthenticated) {
|
||||||
this.showAlreadyLoggedInNotification()
|
this.showAlreadyLoggedInNotification()
|
||||||
}
|
}
|
||||||
|
window.addEventListener('scroll', this.handleFirstInteraction, { passive: true, once: true })
|
||||||
|
window.addEventListener('click', this.handleFirstInteraction, { once: true })
|
||||||
|
window.addEventListener('touchstart', this.handleFirstInteraction, { once: true })
|
||||||
|
this.autoShowTimeout = setTimeout(() => {
|
||||||
|
if (!this.hasInteracted) {
|
||||||
|
this.showContent()
|
||||||
|
}
|
||||||
|
}, 3000)
|
||||||
},
|
},
|
||||||
showAlreadyLoggedInNotification() {
|
showAlreadyLoggedInNotification() {
|
||||||
const notification = document.createElement('div')
|
const notification = document.createElement('div')
|
||||||
|
|||||||
@@ -482,6 +482,18 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
handleFirstInteraction() {
|
||||||
|
if (!this.hasInteracted) {
|
||||||
|
this.hasInteracted = true
|
||||||
|
this.showContent()
|
||||||
|
clearTimeout(this.autoShowTimeout)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
showContent() {
|
||||||
|
this.isContentVisible = true
|
||||||
|
// Эмитим событие для показа хедера
|
||||||
|
this.$emit('show-header')
|
||||||
|
},
|
||||||
getExperienceLabel(experience) {
|
getExperienceLabel(experience) {
|
||||||
const labels = {
|
const labels = {
|
||||||
'beginner': 'Начинающий',
|
'beginner': 'Начинающий',
|
||||||
@@ -664,10 +676,23 @@ export default {
|
|||||||
mounted() {
|
mounted() {
|
||||||
document.addEventListener('keydown', this.handleKeydown)
|
document.addEventListener('keydown', this.handleKeydown)
|
||||||
this.loadMembers()
|
this.loadMembers()
|
||||||
|
window.addEventListener('scroll', this.handleFirstInteraction, { passive: true, once: true })
|
||||||
|
window.addEventListener('click', this.handleFirstInteraction, { once: true })
|
||||||
|
window.addEventListener('touchstart', this.handleFirstInteraction, { once: true })
|
||||||
|
this.autoShowTimeout = setTimeout(() => {
|
||||||
|
if (!this.hasInteracted) {
|
||||||
|
this.showContent()
|
||||||
|
}
|
||||||
|
}, 3000)
|
||||||
},
|
},
|
||||||
beforeUnmount() {
|
beforeUnmount() {
|
||||||
document.removeEventListener('keydown', this.handleKeydown)
|
document.removeEventListener('keydown', this.handleKeydown)
|
||||||
document.body.style.overflow = ''
|
document.body.style.overflow = ''
|
||||||
|
// Убираем обработчики при размонтировании
|
||||||
|
window.removeEventListener('scroll', this.handleFirstInteraction)
|
||||||
|
window.removeEventListener('click', this.handleFirstInteraction)
|
||||||
|
window.removeEventListener('touchstart', this.handleFirstInteraction)
|
||||||
|
clearTimeout(this.autoShowTimeout)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -387,6 +387,20 @@ export default {
|
|||||||
methods: {
|
methods: {
|
||||||
...mapActions(useAuthStore, ['fetchProfile']),
|
...mapActions(useAuthStore, ['fetchProfile']),
|
||||||
|
|
||||||
|
handleFirstInteraction() {
|
||||||
|
if (!this.hasInteracted) {
|
||||||
|
this.hasInteracted = true
|
||||||
|
this.showContent()
|
||||||
|
clearTimeout(this.autoShowTimeout)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
showContent() {
|
||||||
|
this.isContentVisible = true
|
||||||
|
// Эмитим событие для показа хедера
|
||||||
|
this.$emit('show-header')
|
||||||
|
},
|
||||||
|
|
||||||
// Валидация формы
|
// Валидация формы
|
||||||
validateForm() {
|
validateForm() {
|
||||||
this.clearAllErrors()
|
this.clearAllErrors()
|
||||||
@@ -708,10 +722,22 @@ export default {
|
|||||||
await this.fetchProfile()
|
await this.fetchProfile()
|
||||||
}
|
}
|
||||||
this.checkAuth()
|
this.checkAuth()
|
||||||
|
window.addEventListener('scroll', this.handleFirstInteraction, { passive: true, once: true })
|
||||||
|
window.addEventListener('click', this.handleFirstInteraction, { once: true })
|
||||||
|
window.addEventListener('touchstart', this.handleFirstInteraction, { once: true })
|
||||||
|
this.autoShowTimeout = setTimeout(() => {
|
||||||
|
if (!this.hasInteracted) {
|
||||||
|
this.showContent()
|
||||||
|
}
|
||||||
|
}, 3000)
|
||||||
},
|
},
|
||||||
beforeUnmount() {
|
beforeUnmount() {
|
||||||
document.removeEventListener('keydown', this.handleKeydown)
|
document.removeEventListener('keydown', this.handleKeydown)
|
||||||
document.body.style.overflow = ''
|
document.body.style.overflow = ''
|
||||||
|
window.removeEventListener('scroll', this.handleFirstInteraction)
|
||||||
|
window.removeEventListener('click', this.handleFirstInteraction)
|
||||||
|
window.removeEventListener('touchstart', this.handleFirstInteraction)
|
||||||
|
clearTimeout(this.autoShowTimeout)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -14,7 +14,8 @@
|
|||||||
<div class="document-content">
|
<div class="document-content">
|
||||||
<section class="document-section">
|
<section class="document-section">
|
||||||
<h2>1. Общие положения</h2>
|
<h2>1. Общие положения</h2>
|
||||||
<p>1.1. Настоящая Политика конфиденциальности регулирует порядок сбора, хранения и использования персональных данных пользователей бегового клуба "Бегущий Башкир".</p>
|
<p>1.1. Настоящая Политика конфиденциальности регулирует порядок сбора, хранения и использования персональных
|
||||||
|
данных пользователей бегового клуба "Бегущий Башкир".</p>
|
||||||
<p>1.2. Используя наш сайт и услуги, вы соглашаетесь с условиями настоящей Политики.</p>
|
<p>1.2. Используя наш сайт и услуги, вы соглашаетесь с условиями настоящей Политики.</p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
@@ -42,7 +43,8 @@
|
|||||||
|
|
||||||
<section class="document-section">
|
<section class="document-section">
|
||||||
<h2>4. Защита данных</h2>
|
<h2>4. Защита данных</h2>
|
||||||
<p>4.1. Мы принимаем все необходимые меры для защиты ваших персональных данных от несанкционированного доступа.</p>
|
<p>4.1. Мы принимаем все необходимые меры для защиты ваших персональных данных от несанкционированного
|
||||||
|
доступа.</p>
|
||||||
<p>4.2. Данные хранятся на защищенных серверах и передаются в зашифрованном виде.</p>
|
<p>4.2. Данные хранятся на защищенных серверах и передаются в зашифрованном виде.</p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
@@ -77,7 +79,7 @@
|
|||||||
<h2>8. Контакты</h2>
|
<h2>8. Контакты</h2>
|
||||||
<p>По вопросам, связанным с обработкой персональных данных, обращайтесь:</p>
|
<p>По вопросам, связанным с обработкой персональных данных, обращайтесь:</p>
|
||||||
<p>📧 Email: privacy@begushiybashkir.ru<br>
|
<p>📧 Email: privacy@begushiybashkir.ru<br>
|
||||||
📞 Телефон: +7 (XXX) XXX-XX-XX</p>
|
📞 Телефон: +7 (XXX) XXX-XX-XX</p>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -96,12 +98,47 @@
|
|||||||
<script>
|
<script>
|
||||||
export default {
|
export default {
|
||||||
name: 'PrivacyPolicy',
|
name: 'PrivacyPolicy',
|
||||||
|
mounted() {
|
||||||
|
window.addEventListener('scroll', this.handleFirstInteraction, { passive: true, once: true })
|
||||||
|
window.addEventListener('click', this.handleFirstInteraction, { once: true })
|
||||||
|
window.addEventListener('touchstart', this.handleFirstInteraction, { once: true })
|
||||||
|
this.autoShowTimeout = setTimeout(() => {
|
||||||
|
if (!this.hasInteracted) {
|
||||||
|
this.showContent()
|
||||||
|
}
|
||||||
|
}, 3000)
|
||||||
|
},
|
||||||
|
beforeUnmount() {
|
||||||
|
// Убираем обработчики при размонтировании
|
||||||
|
window.removeEventListener('scroll', this.handleFirstInteraction)
|
||||||
|
window.removeEventListener('click', this.handleFirstInteraction)
|
||||||
|
window.removeEventListener('touchstart', this.handleFirstInteraction)
|
||||||
|
clearTimeout(this.autoShowTimeout)
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
lastUpdated: '10 октября 2024 года'
|
lastUpdated: '10 октября 2024 года'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|
||||||
|
filteredNews() {
|
||||||
|
let filtered = this.news
|
||||||
|
if (this.activeFilter !== 'all') {
|
||||||
|
filtered = this.news.filter(item => item.category === this.activeFilter)
|
||||||
|
}
|
||||||
|
return filtered.slice(0, this.visibleNews)
|
||||||
|
},
|
||||||
|
|
||||||
|
// Проверка валидности формы
|
||||||
|
isFormValid() {
|
||||||
|
return this.newsForm.title.length >= 5 &&
|
||||||
|
this.newsForm.title.length <= 255 &&
|
||||||
|
this.newsForm.excerpt.length >= 10 &&
|
||||||
|
this.newsForm.excerpt.length <= 500 &&
|
||||||
|
this.newsForm.content.length >= 50 &&
|
||||||
|
this.newsForm.category !== ''
|
||||||
|
},
|
||||||
downloadPDF() {
|
downloadPDF() {
|
||||||
const link = document.createElement('a')
|
const link = document.createElement('a')
|
||||||
link.href = '/documents/privacy-policy.pdf'
|
link.href = '/documents/privacy-policy.pdf'
|
||||||
@@ -119,7 +156,7 @@ export default {
|
|||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
background: white;
|
background: white;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
box-shadow: 0 2px 15px rgba(0,0,0,0.1);
|
box-shadow: 0 2px 15px rgba(0, 0, 0, 0.1);
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -181,11 +218,11 @@ export default {
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.document-content {
|
.document-content {
|
||||||
padding: 1.5rem;
|
padding: 1.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.document-actions {
|
.document-actions {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -277,6 +277,18 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
handleFirstInteraction() {
|
||||||
|
if (!this.hasInteracted) {
|
||||||
|
this.hasInteracted = true
|
||||||
|
this.showContent()
|
||||||
|
clearTimeout(this.autoShowTimeout)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
showContent() {
|
||||||
|
this.isContentVisible = true
|
||||||
|
// Эмитим событие для показа хедера
|
||||||
|
this.$emit('show-header')
|
||||||
|
},
|
||||||
async onAvatarUpdated() {
|
async onAvatarUpdated() {
|
||||||
this.avatarLoadError = false;
|
this.avatarLoadError = false;
|
||||||
await this.authStore.fetchProfile();
|
await this.authStore.fetchProfile();
|
||||||
@@ -416,7 +428,23 @@ export default {
|
|||||||
} else {
|
} else {
|
||||||
await this.loadExtendedData();
|
await this.loadExtendedData();
|
||||||
}
|
}
|
||||||
}
|
window.addEventListener('scroll', this.handleFirstInteraction, { passive: true, once: true })
|
||||||
|
window.addEventListener('click', this.handleFirstInteraction, { once: true })
|
||||||
|
window.addEventListener('touchstart', this.handleFirstInteraction, { once: true })
|
||||||
|
this.autoShowTimeout = setTimeout(() => {
|
||||||
|
if (!this.hasInteracted) {
|
||||||
|
this.showContent()
|
||||||
|
}
|
||||||
|
}, 3000)
|
||||||
|
},
|
||||||
|
|
||||||
|
beforeUnmount() {
|
||||||
|
// Убираем обработчики при размонтировании
|
||||||
|
window.removeEventListener('scroll', this.handleFirstInteraction)
|
||||||
|
window.removeEventListener('click', this.handleFirstInteraction)
|
||||||
|
window.removeEventListener('touchstart', this.handleFirstInteraction)
|
||||||
|
clearTimeout(this.autoShowTimeout)
|
||||||
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -654,6 +682,7 @@ export default {
|
|||||||
.avatar-section {
|
.avatar-section {
|
||||||
margin-bottom: 1.5rem;
|
margin-bottom: 1.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.avatar-preview {
|
.avatar-preview {
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 150px;
|
width: 150px;
|
||||||
@@ -664,8 +693,10 @@ export default {
|
|||||||
border: 4px solid #2e8b57;
|
border: 4px solid #2e8b57;
|
||||||
background: linear-gradient(135deg, #f5f5f5, #e0e0e0);
|
background: linear-gradient(135deg, #f5f5f5, #e0e0e0);
|
||||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
|
||||||
isolation: isolate; /* Новое свойство */
|
isolation: isolate;
|
||||||
background-image: none !important; /* Явно убираем фоновое изображение */
|
/* Новое свойство */
|
||||||
|
background-image: none !important;
|
||||||
|
/* Явно убираем фоновое изображение */
|
||||||
}
|
}
|
||||||
|
|
||||||
.avatar-image {
|
.avatar-image {
|
||||||
@@ -673,7 +704,8 @@ export default {
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
transition: transform 0.3s ease;
|
transition: transform 0.3s ease;
|
||||||
display: block; /* Убедитесь, что block */
|
display: block;
|
||||||
|
/* Убедитесь, что block */
|
||||||
}
|
}
|
||||||
|
|
||||||
.avatar-placeholder {
|
.avatar-placeholder {
|
||||||
|
|||||||
@@ -137,6 +137,18 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
handleFirstInteraction() {
|
||||||
|
if (!this.hasInteracted) {
|
||||||
|
this.hasInteracted = true
|
||||||
|
this.showContent()
|
||||||
|
clearTimeout(this.autoShowTimeout)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
showContent() {
|
||||||
|
this.isContentVisible = true
|
||||||
|
// Эмитим событие для показа хедера
|
||||||
|
this.$emit('show-header')
|
||||||
|
},
|
||||||
async onAvatarUpdated() {
|
async onAvatarUpdated() {
|
||||||
// Обновляем данные пользователя после загрузки аватара
|
// Обновляем данные пользователя после загрузки аватара
|
||||||
await this.authStore.fetchProfile()
|
await this.authStore.fetchProfile()
|
||||||
@@ -205,7 +217,22 @@ export default {
|
|||||||
this.initializeForm()
|
this.initializeForm()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
window.addEventListener('scroll', this.handleFirstInteraction, { passive: true, once: true })
|
||||||
|
window.addEventListener('click', this.handleFirstInteraction, { once: true })
|
||||||
|
window.addEventListener('touchstart', this.handleFirstInteraction, { once: true })
|
||||||
|
this.autoShowTimeout = setTimeout(() => {
|
||||||
|
if (!this.hasInteracted) {
|
||||||
|
this.showContent()
|
||||||
|
}
|
||||||
|
}, 3000)
|
||||||
|
},
|
||||||
|
beforeUnmount() {
|
||||||
|
// Убираем обработчики при размонтировании
|
||||||
|
window.removeEventListener('scroll', this.handleFirstInteraction)
|
||||||
|
window.removeEventListener('click', this.handleFirstInteraction)
|
||||||
|
window.removeEventListener('touchstart', this.handleFirstInteraction)
|
||||||
|
clearTimeout(this.autoShowTimeout)
|
||||||
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -125,6 +125,23 @@ import { useAuthStore } from '../stores/auth'
|
|||||||
export default {
|
export default {
|
||||||
// eslint-disable-next-line vue/multi-word-component-names
|
// eslint-disable-next-line vue/multi-word-component-names
|
||||||
name: 'Register',
|
name: 'Register',
|
||||||
|
mounted() {
|
||||||
|
window.addEventListener('scroll', this.handleFirstInteraction, { passive: true, once: true })
|
||||||
|
window.addEventListener('click', this.handleFirstInteraction, { once: true })
|
||||||
|
window.addEventListener('touchstart', this.handleFirstInteraction, { once: true })
|
||||||
|
this.autoShowTimeout = setTimeout(() => {
|
||||||
|
if (!this.hasInteracted) {
|
||||||
|
this.showContent()
|
||||||
|
}
|
||||||
|
}, 3000)
|
||||||
|
},
|
||||||
|
beforeUnmount() {
|
||||||
|
// Убираем обработчики при размонтировании
|
||||||
|
window.removeEventListener('scroll', this.handleFirstInteraction)
|
||||||
|
window.removeEventListener('click', this.handleFirstInteraction)
|
||||||
|
window.removeEventListener('touchstart', this.handleFirstInteraction)
|
||||||
|
clearTimeout(this.autoShowTimeout)
|
||||||
|
},
|
||||||
setup() {
|
setup() {
|
||||||
const authStore = useAuthStore()
|
const authStore = useAuthStore()
|
||||||
return { authStore }
|
return { authStore }
|
||||||
@@ -195,7 +212,19 @@ export default {
|
|||||||
} else {
|
} else {
|
||||||
console.error('Ошибка регистрации:', result.error)
|
console.error('Ошибка регистрации:', result.error)
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
handleFirstInteraction() {
|
||||||
|
if (!this.hasInteracted) {
|
||||||
|
this.hasInteracted = true
|
||||||
|
this.showContent()
|
||||||
|
clearTimeout(this.autoShowTimeout)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
showContent() {
|
||||||
|
this.isContentVisible = true
|
||||||
|
// Эмитим событие для показа хедера
|
||||||
|
this.$emit('show-header')
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -372,6 +372,18 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
handleFirstInteraction() {
|
||||||
|
if (!this.hasInteracted) {
|
||||||
|
this.hasInteracted = true
|
||||||
|
this.showContent()
|
||||||
|
clearTimeout(this.autoShowTimeout)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
showContent() {
|
||||||
|
this.isContentVisible = true
|
||||||
|
// Эмитим событие для показа хедера
|
||||||
|
this.$emit('show-header')
|
||||||
|
},
|
||||||
async loadReviews() {
|
async loadReviews() {
|
||||||
this.loading = true
|
this.loading = true
|
||||||
try {
|
try {
|
||||||
@@ -643,10 +655,25 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
window.addEventListener('scroll', this.handleFirstInteraction, { passive: true, once: true })
|
||||||
|
window.addEventListener('click', this.handleFirstInteraction, { once: true })
|
||||||
|
window.addEventListener('touchstart', this.handleFirstInteraction, { once: true })
|
||||||
|
this.autoShowTimeout = setTimeout(() => {
|
||||||
|
if (!this.hasInteracted) {
|
||||||
|
this.showContent()
|
||||||
|
}
|
||||||
|
}, 3000)
|
||||||
this.checkAuth()
|
this.checkAuth()
|
||||||
this.loadReviews()
|
this.loadReviews()
|
||||||
this.loadStats()
|
this.loadStats()
|
||||||
},
|
},
|
||||||
|
beforeUnmount() {
|
||||||
|
// Убираем обработчики при размонтировании
|
||||||
|
window.removeEventListener('scroll', this.handleFirstInteraction)
|
||||||
|
window.removeEventListener('click', this.handleFirstInteraction)
|
||||||
|
window.removeEventListener('touchstart', this.handleFirstInteraction)
|
||||||
|
clearTimeout(this.autoShowTimeout)
|
||||||
|
},
|
||||||
watch: {
|
watch: {
|
||||||
sortBy() {
|
sortBy() {
|
||||||
this.currentPage = 1
|
this.currentPage = 1
|
||||||
|
|||||||
@@ -345,6 +345,18 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
handleFirstInteraction() {
|
||||||
|
if (!this.hasInteracted) {
|
||||||
|
this.hasInteracted = true
|
||||||
|
this.showContent()
|
||||||
|
clearTimeout(this.autoShowTimeout)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
showContent() {
|
||||||
|
this.isContentVisible = true
|
||||||
|
// Эмитим событие для показа хедера
|
||||||
|
this.$emit('show-header')
|
||||||
|
},
|
||||||
getImageUrl(path) {
|
getImageUrl(path) {
|
||||||
// В продакшене замените на правильный путь
|
// В продакшене замените на правильный путь
|
||||||
const baseUrl = import.meta.env.BASE_URL
|
const baseUrl = import.meta.env.BASE_URL
|
||||||
@@ -387,10 +399,22 @@ export default {
|
|||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
document.addEventListener('keydown', this.handleKeydown)
|
document.addEventListener('keydown', this.handleKeydown)
|
||||||
|
window.addEventListener('scroll', this.handleFirstInteraction, { passive: true, once: true })
|
||||||
|
window.addEventListener('click', this.handleFirstInteraction, { once: true })
|
||||||
|
window.addEventListener('touchstart', this.handleFirstInteraction, { once: true })
|
||||||
|
this.autoShowTimeout = setTimeout(() => {
|
||||||
|
if (!this.hasInteracted) {
|
||||||
|
this.showContent()
|
||||||
|
}
|
||||||
|
}, 3000)
|
||||||
},
|
},
|
||||||
beforeUnmount() {
|
beforeUnmount() {
|
||||||
document.removeEventListener('keydown', this.handleKeydown)
|
document.removeEventListener('keydown', this.handleKeydown)
|
||||||
document.body.style.overflow = ''
|
document.body.style.overflow = ''
|
||||||
|
window.removeEventListener('scroll', this.handleFirstInteraction)
|
||||||
|
window.removeEventListener('click', this.handleFirstInteraction)
|
||||||
|
window.removeEventListener('touchstart', this.handleFirstInteraction)
|
||||||
|
clearTimeout(this.autoShowTimeout)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
Reference in New Issue
Block a user