@saooti/octopus-sdk 40.2.3-SNAPSHOT → 40.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/plateform.conf +1 -1
- package/src/components/composable/useImageProxy.ts +4 -2
- package/src/components/display/filter/ProductorSearch.vue +0 -30
- package/src/components/display/podcasts/PodcastImage.vue +17 -9
- package/src/components/display/sharing/QrCode.vue +1 -1
- package/src/components/display/sharing/SharePlayerTypes.vue +6 -4
- package/src/components/misc/TopBar.vue +93 -98
- package/src/components/misc/TopBarMainContent.vue +17 -4
- package/src/locale/de.ts +1 -0
- package/src/locale/en.ts +1 -0
- package/src/locale/es.ts +1 -0
- package/src/locale/fr.ts +1 -0
- package/src/locale/it.ts +1 -0
- package/src/locale/sl.ts +1 -0
- package/src/style/transition.scss +4 -0
package/package.json
CHANGED
package/plateform.conf
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
dev2.saooti.org
|
|
@@ -3,7 +3,7 @@ export const useImageProxy = ()=>{
|
|
|
3
3
|
|
|
4
4
|
const apiStore = useApiStore();
|
|
5
5
|
|
|
6
|
-
function useProxyImageUrl(url: string|undefined, width: string, height?: string): string {
|
|
6
|
+
function useProxyImageUrl(url: string|undefined, width: string, height?: string, blur=false): string {
|
|
7
7
|
if (!url) {
|
|
8
8
|
return "";
|
|
9
9
|
}
|
|
@@ -13,10 +13,12 @@ export const useImageProxy = ()=>{
|
|
|
13
13
|
return (
|
|
14
14
|
apiStore.imageUrl +
|
|
15
15
|
"image/" +
|
|
16
|
+
(blur ? "noRedirect/":"")+
|
|
16
17
|
encode +
|
|
17
18
|
"?" +
|
|
18
19
|
size +
|
|
19
|
-
"&useWebp=true"
|
|
20
|
+
"&useWebp=true"+
|
|
21
|
+
(blur ? "&blur=true":"")
|
|
20
22
|
);
|
|
21
23
|
}
|
|
22
24
|
return url;
|
|
@@ -175,35 +175,5 @@ export default defineComponent({
|
|
|
175
175
|
margin-right: -18px;
|
|
176
176
|
animation: fadein 1s;
|
|
177
177
|
}
|
|
178
|
-
|
|
179
|
-
@keyframes fadein {
|
|
180
|
-
from {
|
|
181
|
-
opacity: 0;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
to {
|
|
185
|
-
opacity: 1;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
@keyframes fadein {
|
|
190
|
-
from {
|
|
191
|
-
opacity: 0;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
to {
|
|
195
|
-
opacity: 1;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
@keyframes fadein {
|
|
200
|
-
from {
|
|
201
|
-
opacity: 0;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
to {
|
|
205
|
-
opacity: 1;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
178
|
}
|
|
209
179
|
</style>
|
|
@@ -3,15 +3,23 @@
|
|
|
3
3
|
v-if="podcast"
|
|
4
4
|
class="img-box img-box-podcast mb-3 flex-column justify-content-start align-items-start position-relative flex-shrink-0 float-start"
|
|
5
5
|
>
|
|
6
|
-
<
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
6
|
+
<router-link
|
|
7
|
+
:to="{
|
|
8
|
+
name: 'podcast',
|
|
9
|
+
params: { podcastId: podcast.podcastId },
|
|
10
|
+
}"
|
|
11
|
+
:title="$t('Episode name page', { name: podcast.title })"
|
|
12
|
+
>
|
|
13
|
+
<img
|
|
14
|
+
v-lazy="useProxyImageUrl(podcast.imageUrl, '270')"
|
|
15
|
+
width="270"
|
|
16
|
+
height="270"
|
|
17
|
+
role="presentation"
|
|
18
|
+
alt=""
|
|
19
|
+
class="img-box img-box-podcast"
|
|
20
|
+
:title="$t('Episode name image', { name: podcast.title })"
|
|
21
|
+
/>
|
|
22
|
+
</router-link>
|
|
15
23
|
<div
|
|
16
24
|
v-if="isPodcastmaker"
|
|
17
25
|
:class="mainRubrique ? 'mainRubrique' : 'notMainRubrique'"
|
|
@@ -123,14 +123,16 @@ export default defineComponent({
|
|
|
123
123
|
},
|
|
124
124
|
},
|
|
125
125
|
created() {
|
|
126
|
-
if (this.isVideoPodcast) {
|
|
127
|
-
this.$emit("update:iFrameModel", "video");
|
|
128
|
-
}
|
|
129
126
|
if (this.isLive) {
|
|
130
127
|
return;
|
|
131
128
|
}
|
|
132
129
|
this.initCustomPlayers();
|
|
133
130
|
},
|
|
131
|
+
mounted(){
|
|
132
|
+
if (this.isVideoPodcast) {
|
|
133
|
+
this.$emit("update:iFrameModel", "video");
|
|
134
|
+
}
|
|
135
|
+
},
|
|
134
136
|
methods: {
|
|
135
137
|
isNumeric(value: string): boolean {
|
|
136
138
|
return /^-?\d+$/.test(value);
|
|
@@ -190,7 +192,7 @@ export default defineComponent({
|
|
|
190
192
|
const customPlayersForType = await this.fetchPlayerPaginate(type);
|
|
191
193
|
this.customPlayers = this.customPlayers.concat(customPlayersForType);
|
|
192
194
|
if (
|
|
193
|
-
|
|
195
|
+
!this.isVideoPodcast &&
|
|
194
196
|
selectIfPossible &&
|
|
195
197
|
customPlayersForType?.[0]?.selected
|
|
196
198
|
) {
|
|
@@ -1,29 +1,31 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<header
|
|
3
|
-
class="
|
|
4
|
-
:
|
|
3
|
+
class="header-saooti-play"
|
|
4
|
+
:style="headerBackgroundImage"
|
|
5
|
+
:class="[contentToDisplay ? 'header-img-bg':'header-color-bg', scrolled? 'scrolled':'', needToBlur ? 'header-force-blur':'']"
|
|
5
6
|
>
|
|
6
7
|
<TopBarMainContent
|
|
7
|
-
class="top-bar-z-index"
|
|
8
8
|
:is-phone="isPhone"
|
|
9
9
|
:scrolled="scrolled"
|
|
10
10
|
:title-display="titleToDisplay"
|
|
11
|
+
style="height: var(--header-size);"
|
|
12
|
+
:class="headerBackgroundImage.length ? 'header-opacity':''"
|
|
11
13
|
/>
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
</header>
|
|
15
|
+
<div v-if="contentToDisplay" class="header-content-bg" :style="headerBackgroundImage" :class="{ scrolled: scrolled, 'header-force-blur':needToBlur }" >
|
|
16
|
+
<div class="header-additional-content header-content">
|
|
17
|
+
<h1 v-if="!scrolled" class="text-truncate">
|
|
15
18
|
{{ titleToDisplay }}
|
|
16
19
|
</h1>
|
|
17
20
|
<SubscribeButtons
|
|
18
21
|
v-if="!isGarRole"
|
|
19
22
|
v-show="!scrolled"
|
|
20
|
-
class="top-bar-z-index"
|
|
21
23
|
:emission="emissionObject"
|
|
22
24
|
:playlist-id="contentToDisplay?.playlistId"
|
|
23
25
|
:window-width="windowWidth"
|
|
24
26
|
/>
|
|
25
|
-
</
|
|
26
|
-
</
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
27
29
|
</template>
|
|
28
30
|
|
|
29
31
|
<script lang="ts">
|
|
@@ -38,6 +40,7 @@ import { Emission } from "@/stores/class/general/emission";
|
|
|
38
40
|
import {useResizePhone} from "../composable/useResizePhone";
|
|
39
41
|
import { Playlist } from "@/stores/class/general/playlist";
|
|
40
42
|
import { Canal } from "@/stores/class/radio/canal";
|
|
43
|
+
import axios from "axios";
|
|
41
44
|
const SubscribeButtons = defineAsyncComponent(
|
|
42
45
|
() => import("../display/sharing/SubscribeButtons.vue"),
|
|
43
46
|
);
|
|
@@ -58,6 +61,8 @@ export default defineComponent({
|
|
|
58
61
|
scrolled: false as boolean,
|
|
59
62
|
oldScrollY: 0 as number,
|
|
60
63
|
minScroll: 0 as number,
|
|
64
|
+
headerBackgroundImage: "" as string,
|
|
65
|
+
needToBlur: false as boolean,
|
|
61
66
|
};
|
|
62
67
|
},
|
|
63
68
|
computed: {
|
|
@@ -71,15 +76,6 @@ export default defineComponent({
|
|
|
71
76
|
"radio" === this.$route.name
|
|
72
77
|
);
|
|
73
78
|
},
|
|
74
|
-
backgroundDisplay(): string {
|
|
75
|
-
if (!this.contentToDisplay) {
|
|
76
|
-
return "";
|
|
77
|
-
}
|
|
78
|
-
return `background-image: url('${this.useProxyImageUrl(
|
|
79
|
-
this.contentToDisplay.imageUrl,
|
|
80
|
-
"270",
|
|
81
|
-
)}');`;
|
|
82
|
-
},
|
|
83
79
|
titleToDisplay(): string {
|
|
84
80
|
if ((this.contentToDisplay as Podcast)?.podcastId) {
|
|
85
81
|
return (this.contentToDisplay as Podcast).emission.name;
|
|
@@ -105,6 +101,32 @@ export default defineComponent({
|
|
|
105
101
|
return null;
|
|
106
102
|
},
|
|
107
103
|
},
|
|
104
|
+
watch:{
|
|
105
|
+
contentToDisplay: {
|
|
106
|
+
deep: true,
|
|
107
|
+
immediate: true,
|
|
108
|
+
async handler() {
|
|
109
|
+
if(!this.contentToDisplay){
|
|
110
|
+
this.headerBackgroundImage = "";
|
|
111
|
+
this.needToBlur = false;
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const proxyUrl = this.useProxyImageUrl(this.contentToDisplay.imageUrl,"270", undefined, true);
|
|
115
|
+
try {
|
|
116
|
+
const result = await axios.get(proxyUrl);
|
|
117
|
+
this.headerBackgroundImage = `background-image: url('${result.data}');`;
|
|
118
|
+
if(result.data !== this.contentToDisplay.imageUrl){
|
|
119
|
+
this.needToBlur = false;
|
|
120
|
+
}else{
|
|
121
|
+
this.needToBlur = true;
|
|
122
|
+
}
|
|
123
|
+
} catch {
|
|
124
|
+
this.headerBackgroundImage = this.contentToDisplay.imageUrl ? `background-image: url('${this.contentToDisplay.imageUrl}');` : "";
|
|
125
|
+
this.needToBlur = true;
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
},
|
|
108
130
|
mounted() {
|
|
109
131
|
window.addEventListener("scroll", this.handleScroll);
|
|
110
132
|
},
|
|
@@ -140,104 +162,77 @@ export default defineComponent({
|
|
|
140
162
|
</script>
|
|
141
163
|
|
|
142
164
|
<style lang="scss">
|
|
143
|
-
|
|
144
|
-
|
|
145
165
|
.octopus-app {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
transition: height 0.7s;
|
|
162
|
-
box-shadow: 0 2px 15px 5px var(--octopus-shadow) !important;
|
|
163
|
-
|
|
164
|
-
.page-element-bg {
|
|
165
|
-
opacity: 0.5;
|
|
166
|
-
filter: blur(8px);
|
|
167
|
-
background-position: center;
|
|
166
|
+
--header-size: 5rem;
|
|
167
|
+
--header-additional-content-size: 22rem;
|
|
168
|
+
@media (width <= 650px) {
|
|
169
|
+
--header-size: 3.5rem;
|
|
170
|
+
}
|
|
171
|
+
@media (width <= 550px) {
|
|
172
|
+
--header-additional-content-size: 13rem;
|
|
173
|
+
}
|
|
174
|
+
.header-saooti-play{
|
|
175
|
+
z-index: 11;
|
|
176
|
+
position: sticky;
|
|
177
|
+
top: 0;
|
|
178
|
+
background-color: black;
|
|
179
|
+
&.header-img-bg{
|
|
180
|
+
background-position: center -20vw;
|
|
168
181
|
background-repeat: no-repeat;
|
|
169
182
|
background-size: cover;
|
|
170
|
-
width: 100%;
|
|
171
|
-
position: absolute;
|
|
172
|
-
transition: height 0.7s;
|
|
173
183
|
}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
}
|
|
184
|
+
&.header-color-bg{
|
|
185
|
+
background: var(--octopus-primary);
|
|
186
|
+
background: linear-gradient(
|
|
187
|
+
90deg,
|
|
188
|
+
var(--octopus-primary) 0%,
|
|
189
|
+
var(--octopus-tertiary) 100%
|
|
190
|
+
);
|
|
182
191
|
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
height: 5rem;
|
|
186
|
-
|
|
187
|
-
.page-element-bg {
|
|
188
|
-
height: 5rem;
|
|
189
|
-
}
|
|
192
|
+
&.header-color-bg, &.scrolled{
|
|
193
|
+
box-shadow: 0 2px 15px 5px var(--octopus-shadow) !important;
|
|
190
194
|
}
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
195
|
+
}
|
|
196
|
+
.header-content-bg{
|
|
197
|
+
background-position: center calc(calc(var(--header-size) * -1) - 20vw);
|
|
198
|
+
background-repeat: no-repeat;
|
|
199
|
+
background-size: cover;
|
|
200
|
+
width: 100%;
|
|
201
|
+
display: flex;
|
|
202
|
+
background-color: black;
|
|
203
|
+
transition: height 0.7s;
|
|
204
|
+
height: calc(var(--header-additional-content-size) - var(--header-size));
|
|
205
|
+
@starting-style {
|
|
206
|
+
height: 0rem;
|
|
194
207
|
}
|
|
195
|
-
|
|
196
208
|
&.scrolled {
|
|
197
|
-
|
|
198
|
-
position: sticky;
|
|
199
|
-
top: 0;
|
|
209
|
+
height: 0rem;
|
|
200
210
|
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
211
|
+
}
|
|
212
|
+
.header-additional-content{
|
|
213
|
+
display: flex;
|
|
214
|
+
flex-direction: column;
|
|
215
|
+
flex-grow: 1;
|
|
216
|
+
}
|
|
217
|
+
.header-additional-content, .header-opacity{
|
|
218
|
+
background: oklch(0 0 0 / 0.5);
|
|
219
|
+
}
|
|
220
|
+
.header-force-blur .header-additional-content, .header-force-blur .header-opacity{
|
|
221
|
+
backdrop-filter: blur(8px);
|
|
222
|
+
}
|
|
223
|
+
.header-content{
|
|
224
|
+
*:focus-visible {
|
|
225
|
+
box-shadow: 0 0 10px 1px white !important;
|
|
204
226
|
}
|
|
205
|
-
|
|
206
227
|
h1 {
|
|
207
228
|
color: white !important;
|
|
208
229
|
font-size: 1.8rem;
|
|
209
230
|
margin: 2rem 5rem;
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
@media (width <= 650px) {
|
|
213
|
-
height: 3.5rem;
|
|
214
|
-
|
|
215
|
-
&.content-top-bar.scrolled {
|
|
216
|
-
height: 3.5rem;
|
|
217
|
-
|
|
218
|
-
.page-element-bg {
|
|
219
|
-
height: 3.5rem;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
@media (width <= 550px) {
|
|
225
|
-
h1 {
|
|
231
|
+
@media (width <= 550px) {
|
|
226
232
|
font-size: 1rem;
|
|
227
233
|
margin: 1rem 0.5rem 0.5rem;
|
|
228
234
|
}
|
|
229
|
-
|
|
230
|
-
&.content-top-bar {
|
|
231
|
-
height: 13rem;
|
|
232
|
-
|
|
233
|
-
.page-element-bg {
|
|
234
|
-
height: 13rem;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
235
|
}
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
236
|
.admin-button:hover,
|
|
242
237
|
.share-btn:hover {
|
|
243
238
|
background: white;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div class="top-bar-grid" :class="{ scrolled: titleIsDisplayed }">
|
|
2
|
+
<div class="top-bar-grid header-content" :class="{ scrolled: titleIsDisplayed }">
|
|
3
3
|
<router-link
|
|
4
4
|
class="top-bar-logo d-flex align-items-center"
|
|
5
5
|
:to="{
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
:class="platformEducation ? 'education-logo' : ''"
|
|
30
30
|
/>
|
|
31
31
|
</router-link>
|
|
32
|
-
<h1 v-if="titleIsDisplayed" class="text-truncate m-0 align-self-center">
|
|
32
|
+
<h1 v-if="titleIsDisplayed" class="text-fadein text-truncate m-0 align-self-center">
|
|
33
33
|
{{ titleDisplay }}
|
|
34
34
|
</h1>
|
|
35
35
|
<div
|
|
@@ -73,6 +73,7 @@
|
|
|
73
73
|
<nav role="navigation" :aria-label="$t('Site menu')">
|
|
74
74
|
<ul class="d-flex">
|
|
75
75
|
<template v-for="link in routerLinkArray" :key="link.routeName">
|
|
76
|
+
<transition name="fade">
|
|
76
77
|
<li v-if="link.condition" class="li-style-none">
|
|
77
78
|
<router-link
|
|
78
79
|
v-show="!isPhone"
|
|
@@ -85,6 +86,7 @@
|
|
|
85
86
|
{{ link.title }}
|
|
86
87
|
</router-link>
|
|
87
88
|
</li>
|
|
89
|
+
</transition>
|
|
88
90
|
</template>
|
|
89
91
|
</ul>
|
|
90
92
|
</nav>
|
|
@@ -294,8 +296,7 @@ export default defineComponent({
|
|
|
294
296
|
.top-bar-grid {
|
|
295
297
|
display: grid;
|
|
296
298
|
grid-template-columns: 1fr 5fr;
|
|
297
|
-
|
|
298
|
-
padding: 0 1rem;
|
|
299
|
+
padding: 0.5rem 1rem 0 1rem;
|
|
299
300
|
|
|
300
301
|
&.scrolled {
|
|
301
302
|
grid-template-columns: 1fr 2fr 1fr;
|
|
@@ -341,6 +342,18 @@ export default defineComponent({
|
|
|
341
342
|
max-width: 30px !important;
|
|
342
343
|
}
|
|
343
344
|
}
|
|
345
|
+
.text-fadein{
|
|
346
|
+
animation: fadein 0.3s ease-in-out;
|
|
347
|
+
}
|
|
348
|
+
.fade-enter-active, .fade-leave-active {
|
|
349
|
+
transition: opacity 0.3s;
|
|
350
|
+
@starting-style {
|
|
351
|
+
opacity: 0;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
.fade-enter, .fade-leave-to {
|
|
355
|
+
opacity: 0;
|
|
356
|
+
}
|
|
344
357
|
}
|
|
345
358
|
}
|
|
346
359
|
</style>
|
package/src/locale/de.ts
CHANGED
package/src/locale/en.ts
CHANGED
package/src/locale/es.ts
CHANGED
package/src/locale/fr.ts
CHANGED
package/src/locale/it.ts
CHANGED
package/src/locale/sl.ts
CHANGED