Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
www
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
PLN
www
Commits
133e522c
Commit
133e522c
authored
May 12, 2025
by
PLN (Algolia)
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
iter1: fixed1
parent
2d5d43f9
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
176 additions
and
106 deletions
+176
-106
38c3_toilet.md
next/content/lives/2024/38c3_toilet.md
+1
-1
parvagues.js
next/pages/parvagues.js
+109
-103
favicon.ico
next/public/images/parvagues/favicon.ico
+0
-0
logo_big.png
next/public/images/parvagues/logo_big.png
+0
-0
logo_text.png
next/public/images/parvagues/logo_text.png
+0
-0
globals.css
next/styles/globals.css
+20
-2
parvagues.module.css
next/styles/parvagues.module.css
+46
-0
No files found.
next/content/lives/2024/38c3_toilet.md
View file @
133e522c
---
---
title
:
"
[38C3]
Secret
Toilet
Rave"
title
:
"
[38C3]
Secret
Toilet
Rave"
date
:
"
202
5
-12-28"
date
:
"
202
4
-12-28"
time
:
"
01:37"
time
:
"
01:37"
location
:
"
Hamburg,
Germany"
location
:
"
Hamburg,
Germany"
address
:
"
CCH,
Hamburg"
address
:
"
CCH,
Hamburg"
...
...
next/pages/parvagues.js
View file @
133e522c
...
@@ -60,33 +60,31 @@ export default function ParVagues({ lives }) {
...
@@ -60,33 +60,31 @@ export default function ParVagues({ lives }) {
const
[
tidalCode
,
setTidalCode
]
=
useState
(
''
);
const
[
tidalCode
,
setTidalCode
]
=
useState
(
''
);
const
[
showPlayers
,
setShowPlayers
]
=
useState
({});
const
[
showPlayers
,
setShowPlayers
]
=
useState
({});
const
[
isPlaying
,
setIsPlaying
]
=
useState
(
false
);
const
[
isPlaying
,
setIsPlaying
]
=
useState
(
false
);
const
[
selectedSection
,
setSelectedSection
]
=
useState
(
'
code
'
);
const
[
selectedSection
,
setSelectedSection
]
=
useState
(
'
potentiel
'
);
const
[
sectionImages
,
setSectionImages
]
=
useState
([]);
const
[
sectionImages
,
setSectionImages
]
=
useState
([]);
const
[
currentImageIndex
,
setCurrentImageIndex
]
=
useState
(
0
);
const
[
currentImageIndex
,
setCurrentImageIndex
]
=
useState
(
0
);
const
[
currentAlbumIndex
,
setCurrentAlbumIndex
]
=
useState
(
0
);
const
[
currentAlbumIndex
,
setCurrentAlbumIndex
]
=
useState
(
0
);
const
backgroundRef
=
useRef
(
null
);
const
backgroundRef
=
useRef
(
null
);
const
audioRef
=
useRef
(
null
);
const
audioRef
=
useRef
(
null
);
// Filter future events
const
futureEvents
=
lives
.
filter
(
live
=>
{
return
new
Date
(
live
.
date
)
>
new
Date
();
});
// Define section content
// Define section content
const
sections
=
{
const
sections
=
{
code
:
{
potentiel
:
{
type
:
'image'
,
type
:
'image'
,
image
:
'/images/parvagues/samples.png'
image
:
'/images/parvagues/samples.png'
},
},
midi
:
{
composition
:
{
type
:
'carousel'
,
type
:
'image'
,
images
:
[
image
:
'/images/parvagues/gear1.jpg'
'/images/parvagues/studio1.jpg'
,
'/images/parvagues/gear1.jpg'
,
'/images/parvagues/gear2.jpg'
]
},
},
performance
:
{
performance
:
{
type
:
'carousel'
,
type
:
'image'
,
images
:
[
image
:
'/images/parvagues/live.jpg'
'/images/parvagues/live.jpg'
,
'/images/parvagues/code_overlay.jpg'
]
}
}
};
};
...
@@ -228,76 +226,18 @@ d4 $ note ("<e3 fs3 <gs3 d4> <a3 df4>>" - 12)
...
@@ -228,76 +226,18 @@ d4 $ note ("<e3 fs3 <gs3 d4> <a3 df4>>" - 12)
const
sectionContent
=
sections
[
selectedSection
];
const
sectionContent
=
sections
[
selectedSection
];
if
(
!
sectionContent
)
return
null
;
if
(
!
sectionContent
)
return
null
;
switch
(
sectionContent
.
type
)
{
// For any section type, display the image
case
'image'
:
return
(
return
(
<
div
className
=
"relative w-full aspect-video rounded-lg overflow-hidden shadow-xl"
>
<
div
className
=
"relative w-full aspect-video rounded-lg overflow-hidden shadow-xl"
>
<
Image
<
Image
src
=
{
sectionContent
.
image
}
src
=
{
sectionContent
.
image
}
alt
=
{
selectedSection
}
alt
=
{
selectedSection
}
fill
fill
className
=
"object-cover"
className
=
"object-cover"
priority
=
{
true
}
/>
/
>
<
/div
>
<
/div
>
);
);
case
'carousel'
:
return
(
<
div
className
=
"relative w-full aspect-video rounded-lg overflow-hidden shadow-xl group"
>
{
albums
.
map
((
album
,
index
)
=>
(
<
div
key
=
{
album
.
id
}
className
=
"absolute inset-0"
>
<
Image
src
=
{
album
.
image
}
alt
=
{
album
.
title
}
fill
className
=
{
`object-cover transition-all duration-500 group-hover:blur-sm group-hover:opacity-40
${
index
===
currentAlbumIndex
?
'opacity-100'
:
'opacity-0'
}
`
}
/
>
{
index
===
currentAlbumIndex
&&
(
<
div
className
=
"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity duration-500 flex items-center justify-center"
>
<
div
className
=
"text-white text-center"
>
<
h3
className
=
"text-2xl font-bold mb-4"
>
{
album
.
title
}
<
/h3
>
<
div
className
=
"flex justify-center space-x-4"
>
{
album
.
links
.
map
((
link
)
=>
(
<
a
key
=
{
link
.
platform
}
href
=
{
link
.
url
}
target
=
"_blank"
rel
=
"noopener noreferrer"
className
=
"text-3xl hover:text-purple-400 transition-colors"
>
{
link
.
icon
}
<
/a
>
))}
<
/div
>
<
/div
>
<
/div
>
)}
<
/div
>
))}
<
div
className
=
"absolute bottom-4 left-1/2 transform -translate-x-1/2 flex gap-2"
>
{
albums
.
map
((
_
,
index
)
=>
(
<
div
key
=
{
index
}
className
=
{
`w-2 h-2 rounded-full transition-all
${
index
===
currentAlbumIndex
?
'bg-purple-400 w-6'
:
'bg-gray-400'
}
`
}
/
>
))}
<
/div
>
<
/div
>
);
case
'code'
:
return
(
<
CodeBlock
height
=
"400px"
isTerminal
=
{
true
}
>
{
sectionContent
.
content
||
'Chargement du code...'
}
<
/CodeBlock
>
);
default
:
return
null
;
}
};
};
return
(
return
(
...
@@ -353,9 +293,17 @@ d4 $ note ("<e3 fs3 <gs3 d4> <a3 df4>>" - 12)
...
@@ -353,9 +293,17 @@ d4 $ note ("<e3 fs3 <gs3 d4> <a3 df4>>" - 12)
<
p
className
=
{
styles
.
heroSubtitle
}
>
<
p
className
=
{
styles
.
heroSubtitle
}
>
Livecoding
de
musique
open
-
source
avec
TidalCycles
et
contr
ô
leur
MIDI
Livecoding
de
musique
open
-
source
avec
TidalCycles
et
contr
ô
leur
MIDI
<
/p
>
<
/p
>
<
a
href
=
"#section1"
onClick
=
{
scrollToSection
}
className
=
{
styles
.
plungeButton
}
>
<
div
className
=
"flex flex-col sm:flex-row gap-4 mt-6"
>
Plonger
↓
<
a
href
=
"#section1"
onClick
=
{
scrollToSection
}
className
=
{
styles
.
plungeButton
}
>
<
/a
>
Plonger
↓
<
/a
>
{
futureEvents
.
length
>
0
&&
(
<
Link
href
=
"#performances"
className
=
{
`
${
styles
.
outlineButton
}
group`
}
>
<
span
>
LIVE
<
/span
>
<
div
className
=
"absolute inset-x-0 bottom-0 h-0.5 bg-gradient-to-r from-purple-500 to-pink-500 transform scale-x-0 group-hover:scale-x-100 transition-transform origin-left"
><
/div
>
<
/Link
>
)}
<
/div
>
<
/div
>
<
/div
>
{
/* Right side: Code sample with play overlay */
}
{
/* Right side: Code sample with play overlay */
}
...
@@ -429,42 +377,100 @@ d4 $ note ("<e3 fs3 <gs3 d4> <a3 df4>>" - 12)
...
@@ -429,42 +377,100 @@ d4 $ note ("<e3 fs3 <gs3 d4> <a3 df4>>" - 12)
Tracks
Tracks
<
/span
>
<
/span
>
<
/h2
>
<
/h2
>
<
div
className
=
{
styles
.
albumGrid
}
>
<
div
className
=
"grid grid-cols-1 md:grid-cols-2 gap-8"
>
{
albums
.
map
(
album
=>
(
{
albums
.
map
(
album
=>
(
<
div
<
div
key
=
{
album
.
id
}
key
=
{
album
.
id
}
className
=
{
`
${
styles
.
albumCard
}
group relative overflow-hidden aspect-square`
}
className
=
"relative rounded-lg overflow-hidden shadow-lg transition-transform duration-300 hover:transform hover:scale-[1.02] group"
>
>
<
Image
<
div
className
=
"relative aspect-square w-full"
>
src
=
{
album
.
image
}
<
Image
alt
=
{
album
.
title
}
src
=
{
album
.
image
}
fill
alt
=
{
album
.
title
}
className
=
{
`
${
styles
.
albumImage
}
object-cover transition-opacity duration-300 group-hover:opacity-50`
}
fill
/
>
className
=
"object-cover transition-all duration-300 group-hover:brightness-75"
<
div
className
=
"absolute inset-0 flex flex-col justify-center items-center opacity-0 group-hover:opacity-100 transition-opacity duration-300 bg-black/60"
>
/>
<
div
className
=
{
styles
.
playerContainer
}
>
<
div
className
=
"absolute inset-0 bg-gradient-to-t from-black/80 to-transparent opacity-70"
><
/div
>
<
/div
>
<
div
className
=
"absolute bottom-0 left-0 right-0 p-4"
>
<
h3
className
=
"text-xl font-bold text-white mb-2"
>
{
album
.
title
}
<
/h3
>
<
div
className
=
"flex flex-wrap gap-2 mt-3"
>
{
album
.
links
.
map
(
link
=>
(
{
album
.
links
.
map
(
link
=>
(
<
a
<
a
key
=
{
link
.
platform
}
key
=
{
link
.
platform
}
href
=
{
link
.
url
}
href
=
{
link
.
url
}
target
=
"_blank"
target
=
"_blank"
rel
=
"noopener noreferrer"
rel
=
"noopener noreferrer"
className
=
{
`
${
styles
.
playerButton
}
text-white hover:text-purple-400`
}
className
=
"bg-black/50 backdrop-blur-sm hover:bg-purple-500/70 text-white rounded-full p-2 transition-all duration-300 hover:shadow-glow"
title
=
{
link
.
platform
}
>
>
{
link
.
icon
}
<
span
className
=
"text-xl"
>
{
link
.
icon
}
<
/span
>
<
span
className
=
"ml-2"
>
{
link
.
platform
}
<
/span
>
<
/a
>
<
/a
>
))}
))}
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
h3
className
=
"absolute bottom-0 left-0 right-0 p-2 text-lg font-semibold text-white bg-black/50 text-center group-hover:hidden"
>
{
album
.
title
}
{
/* Shine effect overlay */
}
<
/h3
>
<
div
className
=
"absolute inset-0 bg-gradient-to-r from-transparent via-white/20 to-transparent -translate-x-full group-hover:animate-shine pointer-events-none"
><
/div
>
<
/div
>
<
/div
>
))}
))}
<
/div
>
<
/div
>
<
div
className
=
"flex justify-center mt-10"
>
<
a
href
=
"https://www.open.audio/parvagues"
target
=
"_blank"
rel
=
"noopener noreferrer"
className
=
{
styles
.
outlineButton
}
>
Tous
les
albums
<
/a
>
<
/div
>
<
/section
>
<
/section
>
{
/* Section: Performances */
}
{
futureEvents
.
length
>
0
&&
(
<
section
id
=
"performances"
className
=
{
styles
.
sectionContainer
}
>
<
h2
className
=
"text-3xl font-bold mb-8 text-center"
>
<
span
className
=
"bg-gradient-to-r from-purple-400 to-pink-600 bg-clip-text text-transparent"
>
Prochains
É
v
é
nements
<
/span
>
<
/h2
>
<
div
className
=
"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"
>
{
futureEvents
.
slice
(
0
,
3
).
map
(
live
=>
(
<
Link
href
=
{
`/parvagues/lives/
${
live
.
slug
}
`
}
key
=
{
live
.
slug
}
legacyBehavior
>
<
a
className
=
"block bg-black/30 border border-purple-500/20 rounded-lg overflow-hidden hover:border-purple-500/70 transition-all hover:shadow-glow hover:-translate-y-1"
>
<
div
className
=
"relative h-40"
>
<
Image
src
=
{
`/images/parvagues/lives/
${
live
.
year
}
/
${
live
.
slug
}
/poster.jpg`
}
alt
=
{
live
.
title
}
fill
className
=
"object-cover"
/>
<
div
className
=
"absolute top-2 right-2 bg-black/60 text-white text-xs px-2 py-1 rounded"
>
{
new
Date
(
live
.
date
).
toLocaleDateString
(
'fr-FR'
,
{
day
:
'numeric'
,
month
:
'short'
,
year
:
'numeric'
})}
<
/div
>
<
/div
>
<
div
className
=
"p-4"
>
<
h3
className
=
"text-lg font-bold text-white"
>
{
live
.
title
}
<
/h3
>
<
p
className
=
"text-purple-300 text-sm mt-1"
>
{
live
.
location
}
<
/p
>
<
p
className
=
"text-gray-400 text-sm mt-2 line-clamp-2"
>
{
live
.
description
}
<
/p
>
<
/div
>
<
/a
>
<
/Link
>
))}
<
/div
>
<
div
className
=
"flex justify-center mt-10"
>
<
Link
href
=
"/parvagues/lives"
className
=
{
styles
.
outlineButton
}
>
Voir
tous
les
é
v
é
nements
<
/Link
>
<
/div
>
<
/section
>
)}
{
/* Section 3: About */
}
{
/* Section 3: About */
}
<
section
id
=
"about"
className
=
{
`
${
styles
.
sectionContainer
}
pb-24`
}
>
<
section
id
=
"about"
className
=
{
`
${
styles
.
sectionContainer
}
pb-24`
}
>
<
h2
className
=
"text-3xl font-bold mb-8 text-center"
>
<
h2
className
=
"text-3xl font-bold mb-8 text-center"
>
...
...
next/public/images/parvagues/favicon.ico
View file @
133e522c
No preview for this file type
next/public/images/parvagues/logo_big.png
deleted
100644 → 0
View file @
2d5d43f9
288 KB
next/public/images/parvagues/logo_text.png
deleted
100644 → 0
View file @
2d5d43f9
125 KB
next/styles/globals.css
View file @
133e522c
...
@@ -6,4 +6,23 @@
...
@@ -6,4 +6,23 @@
--coral
:
#ff3d7b
;
--coral
:
#ff3d7b
;
--biomod
:
#5bc091
;
--biomod
:
#5bc091
;
--cigarette
:
#ff8c00
;
--cigarette
:
#ff8c00
;
}
}
\ No newline at end of file
/* Shine animation for album covers */
@keyframes
shine
{
0
%
{
transform
:
translateX
(
-100%
);
}
100
%
{
transform
:
translateX
(
100%
);
}
}
:global
(
.hover
\
:shadow-glow:hover
)
{
box-shadow
:
0
0
15px
rgba
(
217
,
0
,
255
,
0.7
);
}
:global
(
.animate-shine
)
{
animation
:
shine
1.5s
ease-in-out
;
}
next/styles/parvagues.module.css
View file @
133e522c
...
@@ -168,6 +168,30 @@
...
@@ -168,6 +168,30 @@
box-shadow
:
0
10px
20px
rgba
(
217
,
0
,
255
,
0.3
);
box-shadow
:
0
10px
20px
rgba
(
217
,
0
,
255
,
0.3
);
}
}
.outlineButton
{
display
:
inline-flex
;
align-items
:
center
;
justify-content
:
center
;
padding
:
1rem
2rem
;
border-radius
:
0.5rem
;
font-weight
:
600
;
text-decoration
:
none
;
color
:
white
;
border
:
1px
solid
rgba
(
217
,
0
,
255
,
0.5
);
background
:
rgba
(
217
,
0
,
255
,
0.1
);
transition
:
all
0.3s
ease
;
position
:
relative
;
overflow
:
hidden
;
}
.outlineButton
:hover
{
background
:
rgba
(
217
,
0
,
255
,
0.2
);
border-color
:
var
(
--neon-high
);
color
:
var
(
--neon-high
);
transform
:
translateY
(
-2px
);
box-shadow
:
0
5px
15px
rgba
(
217
,
0
,
255
,
0.2
);
}
.sectionContainer
{
.sectionContainer
{
padding
:
5rem
1rem
;
padding
:
5rem
1rem
;
max-width
:
1200px
;
max-width
:
1200px
;
...
@@ -508,3 +532,24 @@
...
@@ -508,3 +532,24 @@
height
:
auto
;
height
:
auto
;
filter
:
drop-shadow
(
0
0
10px
rgba
(
217
,
0
,
255
,
0.5
));
filter
:
drop-shadow
(
0
0
10px
rgba
(
217
,
0
,
255
,
0.5
));
}
}
/* Shine animation for album covers
NOTE: KEPT HERE FOR REFERENCE, THESE ARE COPIED IN THE MAIN GLOBAL.CSS
AS MODULE CSS FORBIDS ROOT VARIABLES
@keyframes shine {
0% {
transform: translateX(-100%);
}
100% {
transform: translateX(100%);
}
}
:global(.hover\:shadow-glow:hover) {
box-shadow: 0 0 15px rgba(217, 0, 255, 0.7);
}
:global(.animate-shine) {
animation: shine 1.5s ease-in-out;
}
*/
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment