stylelint

This commit is contained in:
Norbaev 2024-07-19 17:19:52 +05:00
parent 329a75f57c
commit 674003ccd9
36 changed files with 1472 additions and 648 deletions

View File

@ -1,3 +1,11 @@
module.exports = { module.exports = {
printWidth: 120,
tabWidth: 2,
tabs: false,
semi: true,
singleQuote: true, singleQuote: true,
trailingComma: 'all',
bracketSpacing: true,
arrowParens: 'always',
endOfLine: 'auto',
}; };

6
client/.stylelintrc.json Normal file
View File

@ -0,0 +1,6 @@
{
"extends": ["stylelint-config-standard-scss", "stylelint-config-clean-order"],
"rules": {
"selector-class-pattern": null
}
}

1240
client/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -8,6 +8,8 @@
"scripts": { "scripts": {
"lint": "eslint --ext .js,.vue ./", "lint": "eslint --ext .js,.vue ./",
"lint:fix": "eslint --ext .js,.vue --fix ./", "lint:fix": "eslint --ext .js,.vue --fix ./",
"lint:css": "stylelint '**/*.scss'",
"lint:css:fix": "npm run lint:css -- --fix",
"test": "echo \"No test specified\" && exit 0", "test": "echo \"No test specified\" && exit 0",
"serve": "npx cross-env NODE_ENV=development quasar dev", "serve": "npx cross-env NODE_ENV=development quasar dev",
"serve:ssr": "quasar dev -m ssr", "serve:ssr": "quasar dev -m ssr",
@ -64,6 +66,10 @@
"postcss-simple-vars": "^7.0.1", "postcss-simple-vars": "^7.0.1",
"prettier": "^3.3.2", "prettier": "^3.3.2",
"sass-loader": "^13.3.2", "sass-loader": "^13.3.2",
"stylelint": "^16.7.0",
"stylelint-config-clean-order": "^6.1.0",
"stylelint-config-standard": "^36.0.1",
"stylelint-config-standard-scss": "^13.1.0",
"vue-loader": "^17.3.0" "vue-loader": "^17.3.0"
}, },
"browserslist": [ "browserslist": [

View File

@ -80,9 +80,7 @@ module.exports = configure(function (ctx) {
// "chain" is a webpack-chain object https://github.com/neutrinojs/webpack-chain // "chain" is a webpack-chain object https://github.com/neutrinojs/webpack-chain
chainWebpack(chain) { chainWebpack(chain) {
chain chain.plugin('eslint-webpack-plugin').use(ESLintPlugin, [{ extensions: ['js', 'vue'] }]);
.plugin('eslint-webpack-plugin')
.use(ESLintPlugin, [{ extensions: ['js', 'vue'] }]);
// chain.plugin('normal-module-replacement').use( // chain.plugin('normal-module-replacement').use(
// new webpack.NormalModuleReplacementPlugin(/settings$/, function(resource) { // new webpack.NormalModuleReplacementPlugin(/settings$/, function(resource) {
// resource.request = resource.request.replace(/settings$/, `settings/${process.env.NODE_ENV}`); // resource.request = resource.request.replace(/settings$/, `settings/${process.env.NODE_ENV}`);
@ -193,9 +191,7 @@ module.exports = configure(function (ctx) {
// Tell browser when a file from the server should expire from cache (in ms) // Tell browser when a file from the server should expire from cache (in ms)
chainWebpackWebserver(chain) { chainWebpackWebserver(chain) {
chain chain.plugin('eslint-webpack-plugin').use(ESLintPlugin, [{ extensions: ['js'] }]);
.plugin('eslint-webpack-plugin')
.use(ESLintPlugin, [{ extensions: ['js'] }]);
}, },
middlewares: [ middlewares: [
@ -213,9 +209,7 @@ module.exports = configure(function (ctx) {
// if using workbox in InjectManifest mode // if using workbox in InjectManifest mode
chainWebpackCustomSW(chain) { chainWebpackCustomSW(chain) {
chain chain.plugin('eslint-webpack-plugin').use(ESLintPlugin, [{ extensions: ['js'] }]);
.plugin('eslint-webpack-plugin')
.use(ESLintPlugin, [{ extensions: ['js'] }]);
}, },
manifest: { manifest: {
@ -290,15 +284,11 @@ module.exports = configure(function (ctx) {
// "chain" is a webpack-chain object https://github.com/neutrinojs/webpack-chain // "chain" is a webpack-chain object https://github.com/neutrinojs/webpack-chain
chainWebpackMain(chain) { chainWebpackMain(chain) {
chain chain.plugin('eslint-webpack-plugin').use(ESLintPlugin, [{ extensions: ['js'] }]);
.plugin('eslint-webpack-plugin')
.use(ESLintPlugin, [{ extensions: ['js'] }]);
}, },
chainWebpackPreload(chain) { chainWebpackPreload(chain) {
chain chain.plugin('eslint-webpack-plugin').use(ESLintPlugin, [{ extensions: ['js'] }]);
.plugin('eslint-webpack-plugin')
.use(ESLintPlugin, [{ extensions: ['js'] }]);
}, },
}, },
}; };

View File

@ -23,15 +23,7 @@ import Player from '@/components/player.vue';
import ChangingUser from '@/components/modal/сhanging-user.vue'; import ChangingUser from '@/components/modal/сhanging-user.vue';
export default { export default {
async preFetch({ async preFetch({ store, currentRoute, previousRoute, redirect, ssrContext, urlPath, publicPath }) {},
store,
currentRoute,
previousRoute,
redirect,
ssrContext,
urlPath,
publicPath,
}) {},
components: { components: {
ChangingUser, ChangingUser,
Player, Player,

View File

@ -1,80 +1,81 @@
*, *,
*::before, *::before,
*::after { *::after {
box-sizing: border-box; box-sizing: border-box;
outline: none !important; outline: none !important;
} }
h1{ h1 {
margin: 0; margin: 0;
position: relative; position: relative;
z-index: 2; z-index: 2;
} }
.text{ .text {
@mixin p; @mixin p;
} }
.h1 { .h1 {
@mixin h1; @mixin h1;
} }
.h2, h2 { .h2,
@mixin h2; h2 {
@mixin h2;
} }
.h3 { .h3 {
@mixin h3; @mixin h3;
} }
.h4 { .h4 {
@mixin h4; @mixin h4;
} }
.p { .p {
@mixin p; @mixin p;
} }
.title { .title {
@mixin p; @mixin p;
color: transparent; color: transparent;
background-clip: text; background-clip: text;
background-image: var(--linear-gradient); background-image: var(--linear-gradient);
font-size: 34px; font-size: 34px;
&.m--white{ &.m--white {
color: var(--color-white); color: var(--color-white);
} }
} }
.ul { .ul {
@mixin ul; @mixin ul;
} }
.ol { .ol {
@mixin ol; @mixin ol;
} }
.hr { .hr {
@mixin hr; @mixin hr;
} }
.a, .a,
a { a {
@mixin a; @mixin a;
/*@mixin a--color $color-base;*/ /*@mixin a--color $color-base;*/
} }
html{ html {
scrollbar-color: var(--color-black) var(--bg-opacity); scrollbar-color: var(--color-black) var(--bg-opacity);
scrollbar-gutter: stable; scrollbar-gutter: stable;
scrollbar-width: thin; scrollbar-width: thin;
} }
body{ body {
font-size: var(--base-fz); font-size: var(--base-fz);
line-height: var(--base-lh); line-height: var(--base-lh);
background: var(--color-black); background: var(--color-black);
font-family: var(--font-family-base); font-family: var(--font-family-base);
color: var(--color-white); color: var(--color-white);
padding: 0 !important; padding: 0 !important;
} }
.button { .button {
@mixin button; @mixin button;
} }

View File

@ -1,117 +1,120 @@
.about { .about {
&__header { &__header {
margin-bottom: var(--space-between-sections); margin-bottom: var(--space-between-sections);
&-top { &-top {
display: flex; display: flex;
gap: 20px; gap: 20px;
margin-bottom: var(--space-between-block); margin-bottom: var(--space-between-block);
}
&-left {
width: calc(42% - 10px);
}
&-right {
flex: 1 1 auto;
background: url("./assets/img/bg/about-banner.svg") no-repeat 50% 60%;
position: relative;
z-index: 2;
}
&-description {
font-size: 1.5rem;
}
&-bottom {
width: calc(58% - 10px);
margin-left: auto;
text-align: end;
}
} }
&__description { &-left {
margin-bottom: var(--space-between-block); width: calc(42% - 10px);
&-info {
display: flex;
gap: var(--space-between-block);
}
&-item {
flex: 1 1 auto;
&.m--left {
width: calc(70% - 40px);
}
}
} }
&__video { &-right {
position: relative; position: relative;
z-index: 2; z-index: 2;
width: 100%; flex: 1 1 auto;
margin-bottom: var(--space-between-sections); background: url('./assets/img/bg/about-banner.svg') no-repeat 50% 60%;
} }
&__gallery { &-description {
display: flex; font-size: 1.5rem;
gap: 20px;
margin-bottom: var(--space-between-sections);
&-item {
width: calc(100% / 3 - 20px / 3);
min-height: 725px;
position: relative;
z-index: 2;
background-size: cover;
background-repeat: no-repeat;
&.m--gallery-item-one {
background-image: url("./assets/img/bg/gallery-item-one.svg");
}
&.m--gallery-item-two {
background-image: url("./assets/img/bg/gallery-item-two.svg");
}
&.m--gallery-item-three {
background-image: url("./assets/img/bg/gallery-item-three.svg");
}
}
} }
&__history { &-bottom {
margin-bottom: var(--space-between-sections); width: calc(58% - 10px);
margin-left: auto;
&-header { text-align: end;
display: flex;
align-items: flex-end;
margin-bottom: var(--space-between-block);
}
&-title {
flex: 1 1 auto;
margin: 0;
}
&-date {
width: 220px;
}
&-list {
}
&-item {
display: flex;
align-items: center;
padding-bottom: 1.5rem;
margin-bottom: 1.5rem;
position: relative;
z-index: 2;
border-bottom: 1px solid var(--color-white-opacity);
}
} }
}
&__description {
margin-bottom: var(--space-between-block);
&-info {
display: flex;
gap: var(--space-between-block);
}
&-item {
flex: 1 1 auto;
&.m--left {
width: calc(70% - 40px);
}
}
}
&__video {
position: relative;
z-index: 2;
width: 100%;
margin-bottom: var(--space-between-sections);
}
&__gallery {
display: flex;
gap: 20px;
margin-bottom: var(--space-between-sections);
&-item {
position: relative;
z-index: 2;
width: calc(100% / 3 - 20px / 3);
min-height: 725px;
background-repeat: no-repeat;
background-size: cover;
&.m--gallery-item-one {
background-image: url('./assets/img/bg/gallery-item-one.svg');
}
&.m--gallery-item-two {
background-image: url('./assets/img/bg/gallery-item-two.svg');
}
&.m--gallery-item-three {
background-image: url('./assets/img/bg/gallery-item-three.svg');
}
}
}
&__history {
margin-bottom: var(--space-between-sections);
&-header {
display: flex;
align-items: flex-end;
margin-bottom: var(--space-between-block);
}
&-title {
flex: 1 1 auto;
margin: 0;
}
&-date {
width: 220px;
}
&-list {
}
&-item {
position: relative;
z-index: 2;
display: flex;
align-items: center;
margin-bottom: 1.5rem;
padding-bottom: 1.5rem;
border-bottom: 1px solid var(--color-white-opacity);
}
}
} }

View File

@ -1,18 +1,18 @@
.breadcrumbs{ .breadcrumbs {
display: flex; display: flex;
margin-top: 80px; margin-top: 80px;
margin-bottom: var(--space-between-block); margin-bottom: var(--space-between-block);
&__item{ &__item {
display: flex; display: flex;
align-items: center; align-items: center;
&:last-child:after{ &:last-child:after {
display: none; display: none;
} }
&:after{ &:after {
margin: 0 10px; margin: 0 10px;
content: '/'; content: '/';
} }
&-link{ &-link {
font-size: 0.875rem; font-size: 0.875rem;
} }
} }

View File

@ -20,18 +20,8 @@ $color-white-opacity: #bbb9ca;
--base-fz: 18px; --base-fz: 18px;
--base-lh: 1.3; --base-lh: 1.3;
--font-family-base: 'Manrope', 'Tahoma', sans-serif; --font-family-base: 'Manrope', 'Tahoma', sans-serif;
--linear-gradient-highlight: linear-gradient( --linear-gradient-highlight: linear-gradient(259.3deg, #5e5bfc 0.44%, #871df0 97.88%);
259.3deg, --linear-gradient: linear-gradient(91.17deg, #c6f1f7 -4.01%, #f983e9 36.14%, #b877ff 77.44%, #c2e9cd 106.11%);
#5e5bfc 0.44%,
#871df0 97.88%
);
--linear-gradient: linear-gradient(
91.17deg,
#c6f1f7 -4.01%,
#f983e9 36.14%,
#b877ff 77.44%,
#c2e9cd 106.11%
);
--container: $document-width-xl; --container: $document-width-xl;
--space-between-block: calc(var(--base-fz) * 2.25); --space-between-block: calc(var(--base-fz) * 2.25);
--space-between-sections: calc(var(--base-fz) * 7); --space-between-sections: calc(var(--base-fz) * 7);

View File

@ -1,12 +1,6 @@
<template> <template>
<div class="app__breadcrumbs breadcrumbs"> <div class="app__breadcrumbs breadcrumbs">
<router-link <router-link v-for="(item, key) in breadcrumbs" :key="key" v-slot="{ href, navigate }" :to="item.route" custom>
v-for="(item, key) in breadcrumbs"
:key="key"
v-slot="{ href, navigate }"
:to="item.route"
custom
>
<div v-if="item.name" class="breadcrumbs__item"> <div v-if="item.name" class="breadcrumbs__item">
<a :href="href" class="breadcrumbs__item-link" @click="navigate"> <a :href="href" class="breadcrumbs__item-link" @click="navigate">
{{ item.name }} {{ item.name }}

View File

@ -4,33 +4,20 @@
<h2 class="h2 m--white">Напишите нам</h2> <h2 class="h2 m--white">Напишите нам</h2>
<div class="footer__question"> <div class="footer__question">
<div class="text">Остались вопросы? Мы с радостью вам ответим!</div> <div class="text">Остались вопросы? Мы с радостью вам ответим!</div>
<button class="button m--white m--arrow footer__question-button"> <button class="button m--white m--arrow footer__question-button">Написать</button>
Написать
</button>
</div> </div>
</div> </div>
<div class="footer__bottom"> <div class="footer__bottom">
<ul class="footer__menu"> <ul class="footer__menu">
<li <li v-for="(item, key) in menu" :key="key" :class="['footer__menu-item', item.class]">
v-for="(item, key) in menu" <router-link :to="{ name: item.name, params: item.params }" class="footer__menu-link">
:key="key"
:class="['footer__menu-item', item.class]"
>
<router-link
:to="{ name: item.name, params: item.params }"
class="footer__menu-link"
>
{{ item.title }} {{ item.title }}
</router-link> </router-link>
</li> </li>
</ul> </ul>
<div class="footer__connection"> <div class="footer__connection">
<ul class="footer__social"> <ul class="footer__social">
<li <li v-for="(item, key) in socialMenu" :key="key" :class="['footer__menu-item', item.class]">
v-for="(item, key) in socialMenu"
:key="key"
:class="['footer__menu-item', item.class]"
>
<router-link :to="item.link" class="footer__menu-link"> <router-link :to="item.link" class="footer__menu-link">
{{ item.title }} {{ item.title }}
</router-link> </router-link>
@ -38,14 +25,10 @@
</ul> </ul>
<ul class="footer__connection"> <ul class="footer__connection">
<li class="footer__menu-item"> <li class="footer__menu-item">
<router-link to="#" class="m--underline"> <router-link to="#" class="m--underline"> it@radio.org </router-link>
it@radio.org
</router-link>
</li> </li>
<li class="footer__menu-item"> <li class="footer__menu-item">
<router-link to="#" class="m--underline"> <router-link to="#" class="m--underline"> +7 (900) 000-01-12 </router-link>
+7 (900) 000-01-12
</router-link>
</li> </li>
</ul> </ul>
</div> </div>

View File

@ -11,16 +11,8 @@
<li class="header__logo m--menu" @click="next('home')"> <li class="header__logo m--menu" @click="next('home')">
<img src="@/assets/img/icon/logo.svg" alt="logo" /> <img src="@/assets/img/icon/logo.svg" alt="logo" />
</li> </li>
<li <li v-for="(item, key) in menu" :key="key" :class="['header__menu-item', item.class]">
v-for="(item, key) in menu" <router-link v-if="!item.action" :to="{ name: item.name, params: item.params }" class="header__menu-link">
:key="key"
:class="['header__menu-item', item.class]"
>
<router-link
v-if="!item.action"
:to="{ name: item.name, params: item.params }"
class="header__menu-link"
>
{{ item.title }} {{ item.title }}
</router-link> </router-link>
<button <button
@ -31,12 +23,7 @@
> >
{{ item.title }} {{ item.title }}
</button> </button>
<button <button v-else class="header__menu-icon" :class="[item.icon]" @click="handlerClick(item.action)"></button>
v-else
class="header__menu-icon"
:class="[item.icon]"
@click="handlerClick(item.action)"
></button>
</li> </li>
</ul> </ul>
<div class="header__burger" @click="handlerShowMenu"> <div class="header__burger" @click="handlerShowMenu">

View File

@ -36,15 +36,13 @@ export default {
}, },
{ {
id: 2, id: 2,
title: title: 'Искусственный интеллект меняет мир технологий: возможности и вызовы',
'Искусственный интеллект меняет мир технологий: возможности и вызовы',
time: '2', time: '2',
data: '21 октября', data: '21 октября',
}, },
{ {
id: 3, id: 3,
title: title: 'Как кибербезопасность становится ключевым фактором успеха в IT',
'Как кибербезопасность становится ключевым фактором успеха в IT',
time: '2', time: '2',
data: '21 октября', data: '21 октября',
}, },

View File

@ -161,10 +161,7 @@ export default {
node.setErrors([err.detail], err.error); node.setErrors([err.detail], err.error);
}); });
} else { } else {
if ( if (this.formRegistration.password === this.formRegistration.repeatPassword) {
this.formRegistration.password ===
this.formRegistration.repeatPassword
) {
app app
.createUser(this.formRegistration) .createUser(this.formRegistration)
.then((res) => { .then((res) => {

View File

@ -19,10 +19,7 @@
<div class="title m--white rubric-modal__title"> <div class="title m--white rubric-modal__title">
{{ rubrik.name }} {{ rubrik.name }}
</div> </div>
<button <button class="button modal__close rubric-modal__close" @click="$emit('hideModal')"></button>
class="button modal__close rubric-modal__close"
@click="$emit('hideModal')"
></button>
</div> </div>
<div class="rubric-modal__cover"> <div class="rubric-modal__cover">
<img :src="`${selfUrl}${rubrik.img}`" alt="" /> <img :src="`${selfUrl}${rubrik.img}`" alt="" />
@ -30,9 +27,7 @@
<div class="rubric-modal__description"> <div class="rubric-modal__description">
{{ rubrik.description }} {{ rubrik.description }}
</div> </div>
<button class="button m--fit-content m--white m--arrow" v-if="user?.id"> <button class="button m--fit-content m--white m--arrow" v-if="user?.id">Написать</button>
Написать
</button>
</template> </template>
</vue-final-modal> </vue-final-modal>
</template> </template>

View File

@ -97,28 +97,16 @@ export default {
if (count <= 4) { if (count <= 4) {
items.push({ text: item, value: item }); items.push({ text: item, value: item });
} else { } else {
if ( if (item === 1 && this.currentPage !== item && this.currentPage - 1 !== 1 && this.currentPage - 2 !== 1) {
item === 1 &&
this.currentPage !== item &&
this.currentPage - 1 !== 1 &&
this.currentPage - 2 !== 1
) {
items.push({ text: '1', value: 1 }); items.push({ text: '1', value: 1 });
items.push({ text: '...', value: null }); items.push({ text: '...', value: null });
} else if ( } else if (item === count && this.currentPage + 1 !== count && this.currentPage + 2 !== count) {
item === count &&
this.currentPage + 1 !== count &&
this.currentPage + 2 !== count
) {
items.push({ text: '...', value: null }); items.push({ text: '...', value: null });
items.push({ text: count, value: count }); items.push({ text: count, value: count });
} else { } else {
let deltaPrev = count - this.currentPage <= 3 ? 3 : 2; let deltaPrev = count - this.currentPage <= 3 ? 3 : 2;
let deltaAfter = this.currentPage <= 3 ? 4 - this.currentPage : 2; let deltaAfter = this.currentPage <= 3 ? 4 - this.currentPage : 2;
if ( if (item > this.currentPage - deltaPrev && item < this.currentPage + deltaAfter) {
item > this.currentPage - deltaPrev &&
item < this.currentPage + deltaAfter
) {
console.log(item); console.log(item);
items.push({ text: item, value: item }); items.push({ text: item, value: item });
} }

View File

@ -4,31 +4,15 @@
<q-skeleton v-if="loaderPlay" height="100%" /> <q-skeleton v-if="loaderPlay" height="100%" />
<template v-else> <template v-else>
<img v-if="currentPlay.art" :src="currentPlay.art" alt="player" /> <img v-if="currentPlay.art" :src="currentPlay.art" alt="player" />
<img <img v-else :src="require('@/assets/img/mock/template-artist.png')" alt="player" />
v-else
:src="require('@/assets/img/mock/template-artist.png')"
alt="player"
/>
</template> </template>
</div> </div>
<div class="player__content"> <div class="player__content">
<div class="player__top"> <div class="player__top">
<q-skeleton <q-skeleton v-if="loaderPlay" type="circle" class="player__btn m--skeleton" />
v-if="loaderPlay"
type="circle"
class="player__btn m--skeleton"
/>
<template v-else> <template v-else>
<button <button v-if="currentPlay.isPlay" @click="handlerPause" class="button player__btn m--pause"></button>
v-if="currentPlay.isPlay" <button v-else @click="handlerPlay" class="button player__btn m--play"></button>
@click="handlerPause"
class="button player__btn m--pause"
></button>
<button
v-else
@click="handlerPlay"
class="button player__btn m--play"
></button>
</template> </template>
<div class="player__executor"> <div class="player__executor">
<q-skeleton v-if="loaderPlay" class="player__executor m--skeleton" /> <q-skeleton v-if="loaderPlay" class="player__executor m--skeleton" />
@ -44,12 +28,7 @@
</div> </div>
<div @click="handleAuthRequired"> <div @click="handleAuthRequired">
<q-skeleton v-if="loaderPlay" class="player__favorites m--skeleton" /> <q-skeleton v-if="loaderPlay" class="player__favorites m--skeleton" />
<div <div v-else class="player__favorites" :class="[isFavorites && 'm--active']" @click="handlerFavorites"></div>
v-else
class="player__favorites"
:class="[isFavorites && 'm--active']"
@click="handlerFavorites"
></div>
</div> </div>
<div class="player__tools"> <div class="player__tools">
<q-skeleton v-if="loaderPlay" class="player__tools m--skeleton" /> <q-skeleton v-if="loaderPlay" class="player__tools m--skeleton" />
@ -67,26 +46,14 @@
<span <span
ref="volumeIcon" ref="volumeIcon"
@click="toggleVolume" @click="toggleVolume"
:class=" :class="songVolume == 0 ? 'player__volume-off' : 'player__volume-on'"
songVolume == 0 ? 'player__volume-off' : 'player__volume-on'
"
/>
<input
type="range"
min="0"
max="1"
step="0.01"
v-model="songVolume"
@input="changeVolume"
/> />
<input type="range" min="0" max="1" step="0.01" v-model="songVolume" @input="changeVolume" />
</div> </div>
</div> </div>
</div> </div>
<div class="player__bottom"> <div class="player__bottom">
<div <div class="player__time" :class="!loaderPlay && !isUserMusic && 'm--ether'">
class="player__time"
:class="!loaderPlay && !isUserMusic && 'm--ether'"
>
<q-skeleton v-if="loaderPlay" /> <q-skeleton v-if="loaderPlay" />
<template v-else-if="isUserMusic"> <template v-else-if="isUserMusic">
{{ getTime(playerInfo.currentTime) }} / {{ getTime(playerInfo.currentTime) }} /
@ -96,12 +63,7 @@
</div> </div>
<div class="player__progress"> <div class="player__progress">
<q-skeleton v-if="loaderPlay" height="5px" /> <q-skeleton v-if="loaderPlay" height="5px" />
<input <input v-else :disabled="!isUserMusic" type="range" v-model="playerInfo.progress" />
v-else
:disabled="!isUserMusic"
type="range"
v-model="playerInfo.progress"
/>
</div> </div>
</div> </div>
</div> </div>
@ -196,9 +158,7 @@ export default {
...this.userSongList[this.currentPlay.currentIndex || 0], ...this.userSongList[this.currentPlay.currentIndex || 0],
live: false, live: false,
}); });
this.getAudio( this.getAudio(this.userSongList[this.currentPlay.currentIndex || 0]?.azura_id);
this.userSongList[this.currentPlay.currentIndex || 0]?.azura_id,
);
if (this.player.target) { if (this.player.target) {
this.player.target.addEventListener('timeupdate', this.updateProgress); this.player.target.addEventListener('timeupdate', this.updateProgress);
} }
@ -284,16 +244,12 @@ export default {
updateProgress(e) { updateProgress(e) {
this.playerInfo = { this.playerInfo = {
...this.playerInfo, ...this.playerInfo,
progress: progress: (this.player.target.currentTime / this.player.target.duration) * 100,
(this.player.target.currentTime / this.player.target.duration) * 100,
currentTime: this.player.target.currentTime, currentTime: this.player.target.currentTime,
}; };
if (this.player.target.currentTime === this.player.target.duration) { if (this.player.target.currentTime === this.player.target.duration) {
let currentIndex = this.currentPlay.currentIndex + 1; let currentIndex = this.currentPlay.currentIndex + 1;
if ( if (!this.userSongList[currentIndex]?.azura_id || currentIndex === null) {
!this.userSongList[currentIndex]?.azura_id ||
currentIndex === null
) {
currentIndex = 0; currentIndex = 0;
} }
this.$store.dispatch('setCurrentPlay', { this.$store.dispatch('setCurrentPlay', {
@ -333,9 +289,7 @@ export default {
if (this.user?.id) { if (this.user?.id) {
const params = { const params = {
...this.currentPlay, ...this.currentPlay,
azura_id: Number(this.currentPlay.id) azura_id: Number(this.currentPlay.id) ? this.currentPlay.azura_id : this.currentPlay.id,
? this.currentPlay.azura_id
: this.currentPlay.id,
}; };
if (!this.isFavorites) { if (!this.isFavorites) {
delete params.id; delete params.id;
@ -395,8 +349,7 @@ export default {
this.player.target.addEventListener('timeupdate', this.updateProgress); this.player.target.addEventListener('timeupdate', this.updateProgress);
blob.arrayBuffer().then((buffer) => { blob.arrayBuffer().then((buffer) => {
var audioContext = new (window.AudioContext || var audioContext = new (window.AudioContext || window.webkitAudioContext)();
window.webkitAudioContext)();
audioContext.decodeAudioData(buffer, (decodedData) => { audioContext.decodeAudioData(buffer, (decodedData) => {
this.playerInfo.duration = decodedData.duration; this.playerInfo.duration = decodedData.duration;
}); });

View File

@ -2,18 +2,13 @@
<div class="rubric-block"> <div class="rubric-block">
<div class="rubric-block__header"> <div class="rubric-block__header">
<h2 class="h2 rubric-block__header-title">Рубрики</h2> <h2 class="h2 rubric-block__header-title">Рубрики</h2>
<button <button class="button m--arrow rubric-block__link" v-if="$route.name !== 'rubric'" @click="next('rubric')">
class="button m--arrow rubric-block__link"
v-if="$route.name !== 'rubric'"
@click="next('rubric')"
>
Смотреть все Смотреть все
</button> </button>
<div class="p rubric-block__description"> <div class="p rubric-block__description">
IT-радио - это уникальная платформа для обмена опытом, знаниями и IT-радио - это уникальная платформа для обмена опытом, знаниями и обсуждения актуальных вопросов, связанных с
обсуждения актуальных вопросов, связанных с разработкой программного разработкой программного обеспечения, искусственного интеллекта, интернета вещей и других направлений
обеспечения, искусственного интеллекта, интернета вещей и других IT-индустрии
направлений IT-индустрии
</div> </div>
</div> </div>
<template v-if="showLoader"> <template v-if="showLoader">
@ -23,27 +18,14 @@
</div> </div>
</template> </template>
<div v-else class="rubric-block__list"> <div v-else class="rubric-block__list">
<div <div class="rubric-block__item" v-for="rubrik in rubriks" :key="`rubrik_${rubrik.id}`">
class="rubric-block__item"
v-for="rubrik in rubriks"
:key="`rubrik_${rubrik.id}`"
>
<div class="title rubric-block__title">{{ rubrik.name }}</div> <div class="title rubric-block__title">{{ rubrik.name }}</div>
<div class="p rubric-block__description m--50">{{ rubrik.title }}</div> <div class="p rubric-block__description m--50">{{ rubrik.title }}</div>
<button <button class="button m--arrow rubric-block__btn" @click="showModalRubric(rubrik.id)">Узнать больше</button>
class="button m--arrow rubric-block__btn"
@click="showModalRubric(rubrik.id)"
>
Узнать больше
</button>
</div> </div>
</div> </div>
</div> </div>
<RubricModal <RubricModal :showModal="isShowModalRubric" @hideModal="hiddenModalRubric" :selectRubric="ModalTemplate" />
:showModal="isShowModalRubric"
@hideModal="hiddenModalRubric"
:selectRubric="ModalTemplate"
/>
</template> </template>
<script> <script>

View File

@ -1,67 +1,32 @@
<template> <template>
<div <div class="song-item" :class="[selectSong && 'm--select']" @click="handlerSelectSong">
class="song-item"
:class="[selectSong && 'm--select']"
@click="handlerSelectSong"
>
<div class="song-item__selected" :class="[!isPlay && 'm--stop']"> <div class="song-item__selected" :class="[!isPlay && 'm--stop']">
<svg <svg width="33" height="28" viewBox="0 0 33 28" fill="none" xmlns="http://www.w3.org/2000/svg">
width="33"
height="28"
viewBox="0 0 33 28"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path <path
class="" class=""
d="M0 15C0 13.6193 1.11929 12.5 2.5 12.5C3.88071 12.5 5 13.6193 5 15V27.5H0V15Z" d="M0 15C0 13.6193 1.11929 12.5 2.5 12.5C3.88071 12.5 5 13.6193 5 15V27.5H0V15Z"
fill="#7138F4" fill="#7138F4"
/> />
<path <path d="M7 9C7 7.61929 8.11929 6.5 9.5 6.5C10.8807 6.5 12 7.61929 12 9V27.5H7V9Z" fill="#7138F4" />
d="M7 9C7 7.61929 8.11929 6.5 9.5 6.5C10.8807 6.5 12 7.61929 12 9V27.5H7V9Z" <path d="M14 12C14 10.6193 15.1193 9.5 16.5 9.5C17.8807 9.5 19 10.6193 19 12V27.5H14V12Z" fill="#7138F4" />
fill="#7138F4" <path d="M21 3C21 1.61929 22.1193 0.5 23.5 0.5C24.8807 0.5 26 1.61929 26 3V27.5H21V3Z" fill="#7138F4" />
/> <path d="M28 20C28 18.6193 29.1193 17.5 30.5 17.5C31.8807 17.5 33 18.6193 33 20V27.5H28V20Z" fill="#7138F4" />
<path
d="M14 12C14 10.6193 15.1193 9.5 16.5 9.5C17.8807 9.5 19 10.6193 19 12V27.5H14V12Z"
fill="#7138F4"
/>
<path
d="M21 3C21 1.61929 22.1193 0.5 23.5 0.5C24.8807 0.5 26 1.61929 26 3V27.5H21V3Z"
fill="#7138F4"
/>
<path
d="M28 20C28 18.6193 29.1193 17.5 30.5 17.5C31.8807 17.5 33 18.6193 33 20V27.5H28V20Z"
fill="#7138F4"
/>
</svg> </svg>
</div> </div>
<div> <div>
<button <button v-if="isPlay" @click.stop="handlerPause" class="button song-item__btn m--pause"></button>
v-if="isPlay" <button v-else @click.stop="handlerPlay" class="button song-item__btn m--play"></button>
@click.stop="handlerPause"
class="button song-item__btn m--pause"
></button>
<button
v-else
@click.stop="handlerPlay"
class="button song-item__btn m--play"
></button>
</div> </div>
<div class="song-item__info"> <div class="song-item__info">
<span>{{ song.title }}</span> <span>{{ song.title }}</span>
{{ song.artist }} {{ song.artist }}
</div> </div>
<div class="song-item__tools"> <div class="song-item__tools">
<button <button class="button song-item__btn m--small m--favorites" @click.stop="removeSong"></button>
class="button song-item__btn m--small m--favorites"
@click.stop="removeSong"
></button>
<button <button
class="button song-item__btn m--small m--add" class="button song-item__btn m--small m--add"
:class="songAlreadyAddPlaylist && 'm--already'" :class="songAlreadyAddPlaylist && 'm--already'"
@click.stop=" @click.stop="songAlreadyAddPlaylist ? removeToPlaylist() : addPlaylist()"
songAlreadyAddPlaylist ? removeToPlaylist() : addPlaylist()
"
></button> ></button>
</div> </div>
</div> </div>

View File

@ -4,9 +4,7 @@
v-for="song in songList" v-for="song in songList"
:key="song" :key="song"
:song="song" :song="song"
:playSong=" :playSong="song.azura_id === currentPlay.azura_id ? currentPlay.isPlay : false"
song.azura_id === currentPlay.azura_id ? currentPlay.isPlay : false
"
:selectSong="song.azura_id === currentPlay.azura_id" :selectSong="song.azura_id === currentPlay.azura_id"
:songAlreadyAddPlaylist="songAlreadyAdd" :songAlreadyAddPlaylist="songAlreadyAdd"
@selectSong="handlerSelectSong" @selectSong="handlerSelectSong"
@ -46,9 +44,7 @@ export default {
methods: { methods: {
handlerSelectSong(params) { handlerSelectSong(params) {
const data = { ...this.currentPlay, ...params, isLoader: true }; const data = { ...this.currentPlay, ...params, isLoader: true };
data.currentIndex = this.songList.findIndex( data.currentIndex = this.songList.findIndex((el) => el.azura_id === params.azura_id);
(el) => el.azura_id === params.azura_id,
);
this.$store.dispatch('setCurrentPlay', data); this.$store.dispatch('setCurrentPlay', data);
console.log('handlerSelectSong'); console.log('handlerSelectSong');
}, },

View File

@ -4,19 +4,17 @@
<div class="support-block__list"> <div class="support-block__list">
<div class="support-block__item m--one-circle"> <div class="support-block__item m--one-circle">
<div class="title">Донат</div> <div class="title">Донат</div>
Мы будем рады, если вы поддержите нас любой суммой! Все средства пойдут Мы будем рады, если вы поддержите нас любой суммой! Все средства пойдут на дальнейшее развитие проекта
на дальнейшее развитие проекта
</div> </div>
<div class="support-block__item m--two-circle"> <div class="support-block__item m--two-circle">
<div class="title">Дело</div> <div class="title">Дело</div>
Если вы фотографируете, монтируете, пишете, корректируете, занимаетесь Если вы фотографируете, монтируете, пишете, корректируете, занимаетесь продвижением или делаете еще что-нибудь
продвижением или делаете еще что-нибудь классное и думаете, что можете классное и думаете, что можете быть нам полезны на волонтерских началах свяжитесь с нами через форму
быть нам полезны на волонтерских началах свяжитесь с нами через форму
</div> </div>
<div class="support-block__item m--three-circle"> <div class="support-block__item m--three-circle">
<div class="title">Развитие</div> <div class="title">Развитие</div>
Расскажите о нашем проекте в соцсетях! Можно поделиться любым нашим Расскажите о нашем проекте в соцсетях! Можно поделиться любым нашим постом, видео в ютубе или рассказать о нас в
постом, видео в ютубе или рассказать о нас в своей аудитории своей аудитории
</div> </div>
</div> </div>
</div> </div>

View File

@ -3,9 +3,8 @@
<div class="team__header"> <div class="team__header">
<h2 class="h2 team__title">Наша команда</h2> <h2 class="h2 team__title">Наша команда</h2>
<div class="team__description"> <div class="team__description">
На IT волне команда профессионалов неутомимо трудится, чтобы дарить На IT волне команда профессионалов неутомимо трудится, чтобы дарить слушателям самые свежие и актуальные новости
слушателям самые свежие и актуальные новости из мира технологий, из мира технологий, отвечать на их вопросы и обсуждать горячие темы на IT радио.
отвечать на их вопросы и обсуждать горячие темы на IT радио.
</div> </div>
</div> </div>
<template v-if="showLoader"> <template v-if="showLoader">
@ -43,11 +42,7 @@
}" }"
class="team__slider" class="team__slider"
> >
<SwiperSlide <SwiperSlide class="team__item" v-for="employee in team" :key="employee.id">
class="team__item"
v-for="employee in team"
:key="employee.id"
>
<div class="team__cover"> <div class="team__cover">
<img :src="`${selfUrl + employee.img_person}`" alt="user" /> <img :src="`${selfUrl + employee.img_person}`" alt="user" />
</div> </div>
@ -61,9 +56,7 @@
<div class="team__progress" ref="progressBar"> <div class="team__progress" ref="progressBar">
<span></span> <span></span>
</div> </div>
<router-link :to="{ name: 'about' }" class="m--link"> <router-link :to="{ name: 'about' }" class="m--link"> Больше о нас </router-link>
Больше о нас
</router-link>
</div> </div>
</div> </div>
</template> </template>

View File

@ -1,11 +1,6 @@
import { route } from 'quasar/wrappers'; import { route } from 'quasar/wrappers';
import store from '@/store'; import store from '@/store';
import { import { createRouter, createMemoryHistory, createWebHistory, createWebHashHistory } from 'vue-router';
createRouter,
createMemoryHistory,
createWebHistory,
createWebHashHistory,
} from 'vue-router';
import routes from './routes'; import routes from './routes';
/* /*
@ -43,9 +38,7 @@ export default route(function (/* { store, ssrContext } */) {
// Leave this as is and make changes in quasar.conf.js instead! // Leave this as is and make changes in quasar.conf.js instead!
// quasar.conf.js -> build -> vueRouterMode // quasar.conf.js -> build -> vueRouterMode
// quasar.conf.js -> build -> publicPath // quasar.conf.js -> build -> publicPath
history: createHistory( history: createHistory(process.env.MODE === 'ssr' ? void 0 : process.env.VUE_ROUTER_BASE),
process.env.MODE === 'ssr' ? void 0 : process.env.VUE_ROUTER_BASE,
),
}); });
Router.beforeEach((to, from, next) => { Router.beforeEach((to, from, next) => {

View File

@ -1,12 +1,9 @@
import { urlPath as settings } from '@/settings'; import { urlPath as settings } from '@/settings';
import { REST, RESTError } from './rest'; import { REST, RESTError } from './rest';
// запросы на сервер Django
// console.log(settings); // console.log(settings);
export default class extends REST { export default class extends REST {
// export default class Django extends REST {
static get settings() { static get settings() {
return settings; return settings;
} }
@ -233,10 +230,7 @@ export default class extends REST {
return data; return data;
}) })
.catch((error) => { .catch((error) => {
throw new RESTError( throw new RESTError(error, 'Ошибка при получении информации о текущем треке');
error,
'Ошибка при получении информации о текущем треке',
);
}); });
} }

View File

@ -21,9 +21,7 @@ export default class extends REST {
}), }),
}); });
// console.log('sseUriParams', sseUriParams.toString()); // console.log('sseUriParams', sseUriParams.toString());
this.connection = new EventSource( this.connection = new EventSource(sseBaseUri + '?' + sseUriParams.toString());
sseBaseUri + '?' + sseUriParams.toString(),
);
// window.connection = this.connection; // window.connection = this.connection;
// this.connection.onopen = (e) => console.log('connected', e); // this.connection.onopen = (e) => console.log('connected', e);
} }

View File

@ -8,8 +8,7 @@ class RESTError extends Error {
let detail = let detail =
error.response && error.response &&
error.response.data && error.response.data &&
(error.response.data.detail || (error.response.data.detail || (error.response.data.error && error.response.data.error.detail));
(error.response.data.error && error.response.data.error.detail));
let header = (message || error.message) + (detail ? ': ' + detail : ''); let header = (message || error.message) + (detail ? ': ' + detail : '');
super(header); super(header);
@ -39,23 +38,8 @@ class REST {
static get settings() { static get settings() {
throw new Error('settings must be overridden'); throw new Error('settings must be overridden');
} }
static _get( static _get(url, params = {}, extraParams, use_cache = false, isBlob = false) {
url, return this._request('get', url, params, {}, {}, extraParams, use_cache, isBlob);
params = {},
extraParams,
use_cache = false,
isBlob = false,
) {
return this._request(
'get',
url,
params,
{},
{},
extraParams,
use_cache,
isBlob,
);
} }
static _post(url, params, data) { static _post(url, params, data) {
return this._request('post', url, params, data); return this._request('post', url, params, data);

View File

@ -24,10 +24,7 @@ export default class {
delete params.extraData; delete params.extraData;
} }
if (params.extraParams) { if (params.extraParams) {
params.params = this.__append_extra_params( params.params = this.__append_extra_params(params.params, params.extraParams);
params.params,
params.extraParams,
);
delete params.extraParams; delete params.extraParams;
} }
/* /*

View File

@ -5,23 +5,16 @@
<div class="page404__block"> <div class="page404__block">
<div class="page404__info"> <div class="page404__info">
<div class="page404__info-title">404</div> <div class="page404__info-title">404</div>
<div class="page404__info-subtitle"> <div class="page404__info-subtitle">Мы не можем найти то, что вы ищете</div>
Мы не можем найти то, что вы ищете
</div>
<div class="page404__info-content"> <div class="page404__info-content">
Возможно, запрашиваемая вами страница была перенесена или удалена. Возможно, запрашиваемая вами страница была перенесена или удалена. Также возможно, что вы допустили
Также возможно, что вы допустили небольшую опечатку при вводе небольшую опечатку при вводе адреса такое случается даже с нами, поэтому еще раз внимательно проверьте.
адреса такое случается даже с нами, поэтому еще раз внимательно
проверьте.
</div> </div>
<div class="page404__info-bottom"> <div class="page404__info-bottom">
Переходите на главную страницу, там вы сможете найти много Переходите на главную страницу, там вы сможете найти много полезной информации!
полезной информации!
</div> </div>
<div class="page404__info-button"> <div class="page404__info-button">
<button class="button button-blue" @click="next()"> <button class="button button-blue" @click="next()">На главную</button>
На главную
</button>
</div> </div>
</div> </div>
</div> </div>

View File

@ -6,17 +6,12 @@
<div class="page500__info"> <div class="page500__info">
<div class="page500__info-title">Упс!</div> <div class="page500__info-title">Упс!</div>
<div class="page500__info-subtitle">Что то пошло не так!</div> <div class="page500__info-subtitle">Что то пошло не так!</div>
<div class="page500__info-content"> <div class="page500__info-content">Мы уже знаем об этом и делаем все возможное!</div>
Мы уже знаем об этом и делаем все возможное!
</div>
<div class="page500__info-bottom"> <div class="page500__info-bottom">
Переходите на главную страницу, там вы сможете найти много Переходите на главную страницу, там вы сможете найти много полезной информации!
полезной информации!
</div> </div>
<div class="page500__info-button"> <div class="page500__info-button">
<button class="button button-blue" @click="next()"> <button class="button button-blue" @click="next()">На главную</button>
На главную
</button>
</div> </div>
</div> </div>
</div> </div>

View File

@ -13,26 +13,22 @@
<div class="about__header-left"> <div class="about__header-left">
<h1 class="h2">О нас</h1> <h1 class="h2">О нас</h1>
<div class="text about__header-description"> <div class="text about__header-description">
IT-радио это не просто обычная радиостанция, мы ваши партнеры в IT-радио это не просто обычная радиостанция, мы ваши партнеры в творчестве и современных технологиях.
творчестве и современных технологиях.
</div> </div>
</div> </div>
<div class="about__header-right"></div> <div class="about__header-right"></div>
</div> </div>
<div class="text about__header-bottom"> <div class="text about__header-bottom">
Наша миссия воплотить ваши мечты в реальность, шаг за шагом. Наша миссия воплотить ваши мечты в реальность, шаг за шагом. Благодаря разнообразной команде ведущих,
Благодаря разнообразной команде ведущих, журналистов, разработчиков и журналистов, разработчиков и новаторов, мы постоянно расширяем границы возможного в цифровом мире.
новаторов, мы постоянно расширяем границы возможного в цифровом мире.
</div> </div>
</div> </div>
<div class="about__description"> <div class="about__description">
<h2 class="h2">Мы здесь, чтобы открыть глаза на мир IT</h2> <h2 class="h2">Мы здесь, чтобы открыть глаза на мир IT</h2>
<div class="about__description-info"> <div class="about__description-info">
<div class="text about__description-item m--left"> <div class="text about__description-item m--left">
IT-радио это уникальный проект, который объединяет в себе самых IT-радио это уникальный проект, который объединяет в себе самых ярких представителей IT-индустрии, а также
ярких представителей IT-индустрии, а также экспертов из различных экспертов из различных областей, чтобы поделиться своими знаниями и опытом с широкой аудиторией.
областей, чтобы поделиться своими знаниями и опытом с широкой
аудиторией.
</div> </div>
<div class="text about__description-item"> <div class="text about__description-item">
Мы команда, которая верит в силу теплой улыбки и дружеской беседы. Мы команда, которая верит в силу теплой улыбки и дружеской беседы.
@ -45,14 +41,13 @@
<div class="about__description"> <div class="about__description">
<div class="about__description-info"> <div class="about__description-info">
<div class="text about__description-item m--left"> <div class="text about__description-item m--left">
Основанное с целью переосмыслить радио через призму современного и Основанное с целью переосмыслить радио через призму современного и инновационного подхода, мы стали больше,
инновационного подхода, мы стали больше, чем просто радиостанцией, чем просто радиостанцией, мы сообщество родственных душ, которые разделяют страсть к артистизму, развитию и
мы сообщество родственных душ, которые разделяют страсть к инновациям.
артистизму, развитию и инновациям.
</div> </div>
<div class="text about__description-item"> <div class="text about__description-item">
Каждое шоу на IT-радио включает в себя актуальные темы, новости, Каждое шоу на IT-радио включает в себя актуальные темы, новости, обзоры, интервью с экспертами и многое
обзоры, интервью с экспертами и многое другое. другое.
</div> </div>
</div> </div>
</div> </div>
@ -71,27 +66,19 @@
</div> </div>
<div class="about__history-list"> <div class="about__history-list">
<div class="about__history-item"> <div class="about__history-item">
<div class="title m--white about__history-title"> <div class="title m--white about__history-title">Событие кратко 1</div>
Событие кратко 1
</div>
<div class="about__history-date">Ноябрь 2023</div> <div class="about__history-date">Ноябрь 2023</div>
</div> </div>
<div class="about__history-item"> <div class="about__history-item">
<div class="title m--white about__history-title"> <div class="title m--white about__history-title">Событие кратко 2</div>
Событие кратко 2
</div>
<div class="about__history-date">Ноябрь 2023</div> <div class="about__history-date">Ноябрь 2023</div>
</div> </div>
<div class="about__history-item"> <div class="about__history-item">
<div class="title m--white about__history-title"> <div class="title m--white about__history-title">Событие кратко 3</div>
Событие кратко 3
</div>
<div class="about__history-date">Ноябрь 2023</div> <div class="about__history-date">Ноябрь 2023</div>
</div> </div>
<div class="about__history-item"> <div class="about__history-item">
<div class="title m--white about__history-title"> <div class="title m--white about__history-title">Событие кратко 4</div>
Событие кратко 4
</div>
<div class="about__history-date">Ноябрь 2023</div> <div class="about__history-date">Ноябрь 2023</div>
</div> </div>
</div> </div>

View File

@ -10,30 +10,20 @@
<div class="contacts__content"> <div class="contacts__content">
<div v-if="contacts" class="contacts__info"> <div v-if="contacts" class="contacts__info">
<div v-for="(item, index) in contactsField" :key="index"> <div v-for="(item, index) in contactsField" :key="index">
<div <div v-if="item.title !== dictionaryFields.socials" class="text contacts__item">
v-if="item.title !== dictionaryFields.socials"
class="text contacts__item"
>
<span class="title">{{ item.title }}</span> <span class="title">{{ item.title }}</span>
{{ item.data }} {{ item.data }}
</div> </div>
<div v-else class="contacts__socials"> <div v-else class="contacts__socials">
<span class="title">{{ item.title }}</span> <span class="title">{{ item.title }}</span>
<div <div v-for="(href, social) in item.data" :key="social" class="contacts__social">
v-for="(href, social) in item.data"
:key="social"
class="contacts__social"
>
<a :href="href" :class="['contacts__social', social]"></a> <a :href="href" :class="['contacts__social', social]"></a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="contacts__map"> <div class="contacts__map">
<div <div class="contacts__map-frame" style="position: relative; overflow: hidden">
class="contacts__map-frame"
style="position: relative; overflow: hidden"
>
<a <a
href="https://yandex.ru/maps/56/chelyabinsk/?utm_medium=mapframe&utm_source=maps" href="https://yandex.ru/maps/56/chelyabinsk/?utm_medium=mapframe&utm_source=maps"
style="color: #eee; font-size: 12px; position: absolute; top: 0px" style="color: #eee; font-size: 12px; position: absolute; top: 0px"

View File

@ -5,8 +5,7 @@
<p class="text home__subtitle"> <p class="text home__subtitle">
Мы цифровое <span>онлайн радио.</span><br /> Мы цифровое <span>онлайн радио.</span><br />
Помогаем разобраться в том, что такое <span>IT.</span><br /> Помогаем разобраться в том, что такое <span>IT.</span><br />
Находимся в <span>Челябинске</span>, но вещаем на весь <span>Мир</span Находимся в <span>Челябинске</span>, но вещаем на весь <span>Мир</span><br />
><br />
</p> </p>
<h1 class="home__title" ref="targetTitle"> <h1 class="home__title" ref="targetTitle">
IT-Радио IT-Радио
@ -30,31 +29,27 @@
<div class="text home__info--item"> <div class="text home__info--item">
IT-RADIO. 2023 IT-RADIO. 2023
<span> <span>
Сегодня IT-сфера развивается настолько быстро, что следить за Сегодня IT-сфера развивается настолько быстро, что следить за всеми новинками и изменениями в ней
всеми новинками и изменениями в ней становится все сложнее.<br /><br /> становится все сложнее.<br /><br />
Но есть способ всегда быть в курсе последних новостей и событий Но есть способ всегда быть в курсе последних новостей и событий это IT-радио.
это IT-радио.
</span> </span>
</div> </div>
<h2 class="h2 m--border"> <h2 class="h2 m--border">Открывая новые горизонты в мире технологий</h2>
Открывая новые горизонты в мире технологий
</h2>
<div class="text home__info--item m--circle"> <div class="text home__info--item m--circle">
<span> <span>
IT-радио это уникальный проект, который объединяет в себе IT-радио это уникальный проект, который объединяет в себе самых ярких представителей IT-индустрии, а
самых ярких представителей IT-индустрии, а также экспертов из также экспертов из различных областей, чтобы поделиться своими знаниями и опытом с широкой
различных областей, чтобы поделиться своими знаниями и опытом с аудиторией.<br /><br />
широкой аудиторией.<br /><br /> Каждое шоу на IT-радио включает в себя актуальные темы, новости, обзоры, интервью с экспертами и многое
Каждое шоу на IT-радио включает в себя актуальные темы, новости, другое.
обзоры, интервью с экспертами и многое другое.
</span> </span>
</div> </div>
</div> </div>
<div class="home__content"> <div class="home__content">
<div class="home__content--item m--one-circle"> <div class="home__content--item m--one-circle">
<span class="title">Музыка</span> <span class="title">Музыка</span>
Нам важно создать комфортную атмосферу, которая поможет Нам важно создать комфортную атмосферу, которая поможет сосредоточиться на задачах и улучшит
сосредоточиться на задачах и улучшит продуктивность. продуктивность.
</div> </div>
<div class="home__content--item m--two-circle"> <div class="home__content--item m--two-circle">
<span class="title">Подкасты</span> <span class="title">Подкасты</span>
@ -76,9 +71,8 @@
<div class="home__social--description"> <div class="home__social--description">
<h2 class="h2 m--white">Соц сети</h2> <h2 class="h2 m--white">Соц сети</h2>
<div class="text"> <div class="text">
Следите за обновлениями и новыми постами на IT Radio, чтобы быть в Следите за обновлениями и новыми постами на IT Radio, чтобы быть в курсе последних новостей и событий в
курсе последних новостей и событий в мире IT, а также следить за мире IT, а также следить за анонсами и обновлениями!
анонсами и обновлениями!
</div> </div>
</div> </div>
<div class="home__social--btns"> <div class="home__social--btns">
@ -125,8 +119,7 @@ export default {
}); });
gsap.to(this.$refs.targetTitle, { gsap.to(this.$refs.targetTitle, {
color: 'transparent', color: 'transparent',
backgroundImage: backgroundImage: 'linear-gradient(91.17deg, #C6F1F7 -4.01%, #F983E9 36.14%, #B877FF 77.44%, #C2E9CD 106.11%)',
'linear-gradient(91.17deg, #C6F1F7 -4.01%, #F983E9 36.14%, #B877FF 77.44%, #C2E9CD 106.11%)',
scrollTrigger: { scrollTrigger: {
trigger: this.$refs.targetWrapper, trigger: this.$refs.targetWrapper,
scrub: true, scrub: true,

View File

@ -15,18 +15,9 @@
<h1 class="h2 playlist__title m--margin"> <h1 class="h2 playlist__title m--margin">
{{ $route.name === 'playlist-create' ? 'Новый плейлист' : playlist.name }} {{ $route.name === 'playlist-create' ? 'Новый плейлист' : playlist.name }}
</h1> </h1>
<button class="playlist-edit__upload" @click="handlerUploadCover"> <button class="playlist-edit__upload" @click="handlerUploadCover">Добавить обложку</button>
Добавить обложку
</button>
<div class="field__input m--hidden"> <div class="field__input m--hidden">
<input <input id="cover" ref="coverInput" accept=".jpg,.png,.svg" class="input" type="file" name="logo" />
id="cover"
ref="coverInput"
accept=".jpg,.png,.svg"
class="input"
type="file"
name="logo"
/>
</div> </div>
<FormKit <FormKit
v-model="playlist.name" v-model="playlist.name"
@ -96,9 +87,7 @@ export default {
computed: { computed: {
songsFiltered() { songsFiltered() {
return this.songs.filter((song) => { return this.songs.filter((song) => {
const alreadyAdd = this.playlist.song.find( const alreadyAdd = this.playlist.song.find((item) => item.azura_id === song.azura_id);
(item) => item.azura_id === song.azura_id,
);
return !alreadyAdd; return !alreadyAdd;
}); });
}, },

View File

@ -10,12 +10,7 @@
<div class="playlist__header"> <div class="playlist__header">
<div class="playlist__back" @click="handlerBack"></div> <div class="playlist__back" @click="handlerBack"></div>
<div class="h2 playlist__title">{{ playlist.name }}</div> <div class="h2 playlist__title">{{ playlist.name }}</div>
<div <div class="playlist__edit" @click="next({ name: 'playlist-edit', params: { id: this.playlist.id } })"></div>
class="playlist__edit"
@click="
next({ name: 'playlist-edit', params: { id: this.playlist.id } })
"
></div>
</div> </div>
<SongList :songList="playlist.song" :songAlreadyAdd="true" /> <SongList :songList="playlist.song" :songAlreadyAdd="true" />
</template> </template>

View File

@ -1,10 +1,6 @@
<template> <template>
<div class="app__content profile"> <div class="app__content profile">
<template <template v-if="$route.name !== 'playlist-edit' && $route.name !== 'playlist-create'">
v-if="
$route.name !== 'playlist-edit' && $route.name !== 'playlist-create'
"
>
<AppBreadcrumbs <AppBreadcrumbs
:breadcrumbs="[ :breadcrumbs="[
{ name: 'Главная', route: { name: 'home' } }, { name: 'Главная', route: { name: 'home' } },
@ -12,9 +8,7 @@
]" ]"
/> />
<h1 class="h2 profile__title">{{ user.email }}</h1> <h1 class="h2 profile__title">{{ user.email }}</h1>
<button class="button m--text-link" @click="showRecovery"> <button class="button m--text-link" @click="showRecovery">Редактировать профиль</button>
Редактировать профиль
</button>
<div class="profile__tabs tabs m--btns"> <div class="profile__tabs tabs m--btns">
<button <button
v-for="item in tabsItems" v-for="item in tabsItems"
@ -35,11 +29,7 @@
Загрузка данных Загрузка данных
</div> </div>
</template> </template>
<SongList <SongList v-else :songList="userFavorite.songs" @removeSong="removeFavorites" />
v-else
:songList="userFavorite.songs"
@removeSong="removeFavorites"
/>
</template> </template>
<template v-if="currentTabsItem === 'playlists'"> <template v-if="currentTabsItem === 'playlists'">
<template v-if="showLoaderPlaylist"> <template v-if="showLoaderPlaylist">
@ -48,11 +38,7 @@
Загрузка данных Загрузка данных
</div> </div>
</template> </template>
<PlaylistRoster <PlaylistRoster v-else :list="userFavorite.playlist" @createPlaylist="createPlayList" />
v-else
:list="userFavorite.playlist"
@createPlaylist="createPlayList"
/>
</template> </template>
</template> </template>
<routerView v-else /> <routerView v-else />
@ -106,10 +92,7 @@ export default {
console.log('1'); console.log('1');
this.currentTabsItem = to?.hash.replace('#', '') || 'music'; this.currentTabsItem = to?.hash.replace('#', '') || 'music';
} }
if ( if ((to?.hash !== from?.hash && to?.name === from?.name) || (!from?.name && !from?.hash)) {
(to?.hash !== from?.hash && to?.name === from?.name) ||
(!from?.name && !from?.hash)
) {
console.log('2'); console.log('2');
if (to.hash) { if (to.hash) {
this.currentTabsItem = to?.hash.replace('#', '') || 'music'; this.currentTabsItem = to?.hash.replace('#', '') || 'music';