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 */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Скрыть на десктопе по умолчанию */
|
/* Скрыть на десктопе по умолчанию */
|
||||||
|
|||||||
@@ -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,19 +68,11 @@
|
|||||||
</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>
|
||||||
@@ -111,22 +83,13 @@
|
|||||||
<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
|
||||||
},
|
},
|
||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -324,10 +324,7 @@ export default {
|
|||||||
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>
|
||||||
|
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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