update
|
After Width: | Height: | Size: 2.7 MiB |
|
After Width: | Height: | Size: 1.9 MiB |
|
After Width: | Height: | Size: 7.1 KiB |
|
After Width: | Height: | Size: 577 KiB |
|
After Width: | Height: | Size: 454 KiB |
|
After Width: | Height: | Size: 552 KiB |
|
After Width: | Height: | Size: 508 KiB |
@@ -165,23 +165,37 @@ export const mockups = {
|
|||||||
import writingBG from "./UI/writingBG.png";
|
import writingBG from "./UI/writingBG.png";
|
||||||
import studioBG from "./UI/studioBG.png";
|
import studioBG from "./UI/studioBG.png";
|
||||||
import studioBG2 from "./UI/studioBG2.png";
|
import studioBG2 from "./UI/studioBG2.png";
|
||||||
|
import productionBG from "./UI/productionBG.png";
|
||||||
|
import productionBG2 from "./UI/productionBG2.png";
|
||||||
|
import playbackBG from "./UI/playbackBG.png";
|
||||||
|
import playbackBG2 from "./UI/playbackBG2.png";
|
||||||
|
|
||||||
export const background = {
|
export const background = {
|
||||||
writingBG,
|
writingBG,
|
||||||
studioBG,
|
studioBG,
|
||||||
studioBG2,
|
studioBG2,
|
||||||
|
productionBG,
|
||||||
|
productionBG2,
|
||||||
|
playbackBG,
|
||||||
|
playbackBG2,
|
||||||
};
|
};
|
||||||
|
|
||||||
import nathalie from "./UI/nathalie.png";
|
import nathalie from "./UI/nathalie.png";
|
||||||
import theo from "./UI/theo.png";
|
import theo from "./UI/theo.png";
|
||||||
|
import bena from "./UI/bena.png";
|
||||||
|
import john from "./UI/john.png";
|
||||||
|
|
||||||
export const ai = {
|
export const ai = {
|
||||||
nathalie,
|
nathalie,
|
||||||
theo,
|
theo,
|
||||||
|
bena,
|
||||||
|
john,
|
||||||
};
|
};
|
||||||
|
|
||||||
import placeholder from "./UI/placeholder.jpg";
|
import placeholder from "./UI/placeholder.jpg";
|
||||||
|
import placeholder2 from "./UI/placeholder2.jpg";
|
||||||
|
|
||||||
export const img = {
|
export const img = {
|
||||||
placeholder,
|
placeholder,
|
||||||
|
placeholder2,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,137 @@
|
|||||||
|
import { View, Text, ScrollView, StyleSheet, Dimensions } from "react-native";
|
||||||
|
import React, { useState } from "react";
|
||||||
|
import Animated, {
|
||||||
|
runOnJS,
|
||||||
|
useAnimatedGestureHandler,
|
||||||
|
useAnimatedStyle,
|
||||||
|
useSharedValue,
|
||||||
|
withSpring,
|
||||||
|
} from "react-native-reanimated";
|
||||||
|
import { PanGestureHandler } from "react-native-gesture-handler";
|
||||||
|
|
||||||
|
const { width } = Dimensions.get("window");
|
||||||
|
|
||||||
|
const DragDropTest = () => {
|
||||||
|
const [leftItems, setLeftItems] = useState([
|
||||||
|
"fortnite",
|
||||||
|
"apex",
|
||||||
|
"callofduty",
|
||||||
|
]);
|
||||||
|
const [rightItems, setRightItems] = useState([]);
|
||||||
|
|
||||||
|
const draggingItem = useSharedValue(null);
|
||||||
|
const translateX = useSharedValue(0);
|
||||||
|
const translateY = useSharedValue(0);
|
||||||
|
|
||||||
|
const moveItem = (item) => {
|
||||||
|
setLeftItems((items) => items.filter((i) => i !== item));
|
||||||
|
setRightItems((items) => [...items, item]);
|
||||||
|
};
|
||||||
|
|
||||||
|
const gestureHandler = useAnimatedGestureHandler({
|
||||||
|
onStart: (_, ctx) => {
|
||||||
|
ctx.startX = translateX.value;
|
||||||
|
ctx.startY = translateY.value;
|
||||||
|
},
|
||||||
|
onActive: (event, ctx) => {
|
||||||
|
translateX.value = ctx.startX + event.translationX;
|
||||||
|
translateY.value = ctx.startY + event.translationY;
|
||||||
|
},
|
||||||
|
onEnd: () => {
|
||||||
|
if (translateX.value > width / 2) {
|
||||||
|
runOnJS(moveItem)(draggingItem.value);
|
||||||
|
}
|
||||||
|
translateX.value = withSpring(0);
|
||||||
|
translateY.value = withSpring(0);
|
||||||
|
draggingItem.value = null;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const renderDraggable = (item) => {
|
||||||
|
const style = useAnimatedStyle(() => ({
|
||||||
|
transform: [
|
||||||
|
{ translateX: draggingItem.value === item ? translateX.value : 0 },
|
||||||
|
{ translateY: draggingItem.value === item ? translateY.value : 0 },
|
||||||
|
],
|
||||||
|
zIndex: draggingItem.value === item ? 10 : 0,
|
||||||
|
}));
|
||||||
|
|
||||||
|
return (
|
||||||
|
<PanGestureHandler
|
||||||
|
key={item}
|
||||||
|
onGestureEvent={gestureHandler}
|
||||||
|
onHandlerStateChange={() => {
|
||||||
|
draggingItem.value = item;
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Animated.View style={[styles.item, style]}>
|
||||||
|
<Text style={styles.text}>{item}</Text>
|
||||||
|
</Animated.View>
|
||||||
|
</PanGestureHandler>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View style={styles.scrollWrapper}>
|
||||||
|
<ScrollView
|
||||||
|
style={{
|
||||||
|
...styles.scroll,
|
||||||
|
zIndex: 2,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Text style={styles.title}>Left</Text>
|
||||||
|
{leftItems.map(renderDraggable)}
|
||||||
|
</ScrollView>
|
||||||
|
|
||||||
|
<ScrollView
|
||||||
|
style={{
|
||||||
|
...styles.scroll,
|
||||||
|
zIndex: -1,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Text style={styles.title}>Right</Text>
|
||||||
|
{rightItems.map((item) => (
|
||||||
|
<View key={item} style={[styles.item, { backgroundColor: "#bdf" }]}>
|
||||||
|
<Text style={styles.text}>{item}</Text>
|
||||||
|
</View>
|
||||||
|
))}
|
||||||
|
</ScrollView>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default DragDropTest;
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
container: {
|
||||||
|
flex: 1,
|
||||||
|
paddingTop: 50,
|
||||||
|
},
|
||||||
|
scrollWrapper: {
|
||||||
|
flexDirection: "row",
|
||||||
|
justifyContent: "space-around",
|
||||||
|
},
|
||||||
|
scroll: {
|
||||||
|
width: width / 2.2,
|
||||||
|
height: "90%",
|
||||||
|
backgroundColor: "#f0f0f0",
|
||||||
|
borderRadius: 10,
|
||||||
|
margin: 5,
|
||||||
|
padding: 10,
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
fontWeight: "bold",
|
||||||
|
fontSize: 16,
|
||||||
|
marginBottom: 10,
|
||||||
|
},
|
||||||
|
item: {
|
||||||
|
backgroundColor: "#aaf",
|
||||||
|
padding: 15,
|
||||||
|
marginVertical: 5,
|
||||||
|
borderRadius: 10,
|
||||||
|
},
|
||||||
|
text: {
|
||||||
|
color: "#333",
|
||||||
|
textAlign: "center",
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -33,6 +33,186 @@ export const EMOTION_CONVEY = [
|
|||||||
"déclare une frustration, ressentiment, énergie tournée vers la révolte.",
|
"déclare une frustration, ressentiment, énergie tournée vers la révolte.",
|
||||||
color: ["#FF0000", "#99999900"],
|
color: ["#FF0000", "#99999900"],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: "La Peur",
|
||||||
|
description:
|
||||||
|
"suggère l’anxiété, incertitude, perception du monde comme dangereux, tendance à l’évitement.",
|
||||||
|
color: ["#0900FF", "#99999900"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "L’humour",
|
||||||
|
description:
|
||||||
|
"insinue par allusions, sous-entendus, voire absurdité et jeux de mots. Plaisante sur le contexte.",
|
||||||
|
color: ["#FFFFFF", "#99999900"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Le Courage",
|
||||||
|
description:
|
||||||
|
"invoque la force et la capacité d’avancer malgré la peur. Volonté d’affronté la vie, ouverture au changement positif.",
|
||||||
|
color: ["#FF441E", "#99999900"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "L’llumination",
|
||||||
|
description:
|
||||||
|
"évoque la conscience pure, unité avec le tout, symbole de pureté et sagesse ultime.",
|
||||||
|
color: ["#CBD074", "#99999900"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "La Paix",
|
||||||
|
description:
|
||||||
|
"suggére la paix intérieure inébranlable, la sérénite, la tranquilité profonde.",
|
||||||
|
color: ["#6CF0FF", "#99999900"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "La Raison",
|
||||||
|
description:
|
||||||
|
"expose l'utilisation optimale de la logique, discernement, prise de décisions objectives et détachées. Clarté mentale.",
|
||||||
|
color: ["#4437A9", "#99999900"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "L’Acceptation",
|
||||||
|
description:
|
||||||
|
"laisse entendre l'arrêt de la résistance, l'équilibre obtenu, la capacité à changer ou à d'accepter ce qui ne peut lʼêtre.",
|
||||||
|
color: ["#80D475", "#99999900"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "La Volonté",
|
||||||
|
description:
|
||||||
|
"déclare ma motivation à agir, l'énergie, l'autodiscipline, la recherche dʼamélioration et dʼefficacité.",
|
||||||
|
color: ["#FF9E1E", "#99999900"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Le Désir",
|
||||||
|
description:
|
||||||
|
"laisse entendre un attachement à l’acquisition, la passion, la dépendance à des besoins, des personnes ou des objets extérieurs.",
|
||||||
|
color: ["#8C3F2C", "#99999900"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "La Neutralité",
|
||||||
|
description:
|
||||||
|
"mentionne l’acceptation de la vie telle qu’elle est, détachement émotionnel, l’absence de jugement.",
|
||||||
|
color: ["#AFAFAF", "#99999900"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "La Fierté",
|
||||||
|
description:
|
||||||
|
"expose un sentiment de supériorité, un besoin de reconnaissance externe.",
|
||||||
|
color: ["#D0BE00", "#99999900"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Le Chagrin",
|
||||||
|
description:
|
||||||
|
"exprime la tristesse profonde, perte, état de deuil ou de dépression, la mélancolie.",
|
||||||
|
color: ["#53519F", "#99999900"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "L’Apathie",
|
||||||
|
description:
|
||||||
|
"laisse entendre l’absence d’émotion, le désespoir, absence d’énergie, neutralité des réactions, résignation face à la vie.",
|
||||||
|
color: ["#565656", "#99999900"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "La Culpabilité",
|
||||||
|
description:
|
||||||
|
"sous-entends l’auto-blâme, l’incapacité à se pardonner, excuses répétées, des justifications alambiquées.",
|
||||||
|
color: ["#7B1B1B", "#99999900"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "La Honte",
|
||||||
|
description:
|
||||||
|
"insinue un sentiment d’humiliation profonde, perte d’estime de soi, tendance à l’auto-dépréciation.",
|
||||||
|
color: ["#8E4746", "#99999900"],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export const SONG_STYLE = [
|
||||||
|
{
|
||||||
|
title: "Upbeat",
|
||||||
|
description: "Pour une ambiance joyeuse et rythmée",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Grandios(e)",
|
||||||
|
description: "Pour un sentiment de grandeur",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Chill",
|
||||||
|
description: "Pour une ambiance détendue ou apaisante, relax",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Epic",
|
||||||
|
description: "Pour un sentiment grandiose et héroïque",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Dramatic",
|
||||||
|
description: "Utilisé pour des effets théâtraux ou intenses",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Comedic",
|
||||||
|
description: "Pour un ton humoristique",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Theatrical",
|
||||||
|
description: "Pour un style musical qui évoque le théâtre",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Flamboyant",
|
||||||
|
description: "Pour un style exubérant ",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Melancholic",
|
||||||
|
description: "ambiance mélancolique",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Introspective",
|
||||||
|
description: "Pour un caractère introspectif",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Urban Tragedy",
|
||||||
|
description: "Pour une ambiance de tragédie urbaine",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Eerie",
|
||||||
|
description: "Pour une ambiance étrange ou inquiétante",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Mysterious",
|
||||||
|
description: "Pour un sentiment de mystère",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Melancholic",
|
||||||
|
description: "ambiance mélancolique",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export const CUSTOM_SONG_STRUCTURE = [
|
||||||
|
"Introduction instrumentale courte.",
|
||||||
|
"Introduction instrumentale longue.",
|
||||||
|
"Ajoute un pré-refrain intrumental.",
|
||||||
|
"Utilisé pour une section contrastant avec les couplets et refrains.",
|
||||||
|
"Indique une section avec un solo Guitare.",
|
||||||
|
"Indique une section avec un solo Guitare électrique.",
|
||||||
|
"Indique une section avec un solo Batterie.",
|
||||||
|
"Indique une section avec un solo Saxo.",
|
||||||
|
"Indique une section avec un solo Violon.",
|
||||||
|
"Indique un moment de pause ou de changement.",
|
||||||
|
"Indique un interlude.",
|
||||||
|
"Indique un interlude mélodique.",
|
||||||
|
"Désigne une grande finition, un apogée.",
|
||||||
|
"Indique un arrêt net de la musique.",
|
||||||
|
"Permet de terminer la chanson en baissant le volume progressivement.",
|
||||||
|
"Indique une transition douce vers le silence.",
|
||||||
|
];
|
||||||
|
|
||||||
|
export const SONG_STRUCTURE = [
|
||||||
|
"1 couplet, 1 refrain, 1 couplet, 1 refrain",
|
||||||
|
"1 couplet, 1 refrain, 1 couplet, 2 refrains",
|
||||||
|
"1 couplet, 1 refrain, 2 couplets, 1 refrain",
|
||||||
|
"2 couplets, 1 refrain, 2 couplets, 1 refrain",
|
||||||
|
"2 couplets, 1 refrain, 2 couplets, 2 refrains",
|
||||||
|
"2 couplets, 1 refrain, 2 couplets, 1 refrain, 2 couplets, 1 refrain",
|
||||||
|
"2 couplets, 1 refrain, 2 couplets, 1 refrain, 2 couplets, 2 refrains",
|
||||||
|
"3 couplets, 2 refrains (metal)",
|
||||||
|
"Pas de couplet pas de refrain, juste un texte",
|
||||||
];
|
];
|
||||||
|
|
||||||
export const CHOOSE_GENRE = [
|
export const CHOOSE_GENRE = [
|
||||||
@@ -55,49 +235,234 @@ export const CHOOSE_GENRE = [
|
|||||||
title: "Blues",
|
title: "Blues",
|
||||||
description: "Structure simple, thèmes sur les épreuves de la vie.",
|
description: "Structure simple, thèmes sur les épreuves de la vie.",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: "Folk",
|
||||||
|
description:
|
||||||
|
"Instruments acoustiques, narration, ancrage dans la tradition populaire.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Punk",
|
||||||
|
description:
|
||||||
|
"Énergie brute, textes contestataires, structures simples. Mouvement contre-culturel majeur.musique rebelle aux influences sociales et politiques fortes.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Dance",
|
||||||
|
description:
|
||||||
|
"Musique rythmée, conçue pour la danse, souvent électronique ou pop.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Grunge",
|
||||||
|
description:
|
||||||
|
"Sous-genre du rock, sons sales, textes introspectifs, popularisé par Nirvana.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "EDM",
|
||||||
|
description:
|
||||||
|
"Musique électronique dynamique orientée clubs et festivals.Style Tomorrowland.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Trap",
|
||||||
|
description:
|
||||||
|
"Sous-genre du rap caractérisé par ses beats lourds et son attitude street. Popularisé à Atlanta, il domine le rap mainstream actuel.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Latino",
|
||||||
|
description:
|
||||||
|
"Reggaeton, salsa, bachata et autres styles hispaniques, rythmes dansants et festifs.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Dancehall",
|
||||||
|
description:
|
||||||
|
"Style jamaïcain rythmé dérivé du reggae, apprécié pour son énergie festive et sensuelle.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Latin Pop",
|
||||||
|
description:
|
||||||
|
"Musique pop Caribbean, Salsa, Merengue, rythmes latinos festifs et dansants.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Raggaeton",
|
||||||
|
description:
|
||||||
|
"Mélange latino de reggae, rap et dancehall aux rythmes entraînants. sons latinos modernes.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Rock",
|
||||||
|
description:
|
||||||
|
"Genre énergique dérivé du rock'n'roll, porté par guitares électriques et batterie puissante.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Rock progressif",
|
||||||
|
description:
|
||||||
|
"Rock complexe, longues compositions, virtuosité instrumentale.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Hard Rock",
|
||||||
|
description: "Rock énergique, guitares puissantes, voix souvent rauques.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Metal",
|
||||||
|
description:
|
||||||
|
"Dérivé extrême du rock avec des guitares saturées, une batterie énergique et des thèmes souvent sombres.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "R&B",
|
||||||
|
description: "Genre doux et mélodieux issu du blues, jazz et gospel.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Phonk",
|
||||||
|
description:
|
||||||
|
"Samples funk, des voix rap vintage de Memphis, production hachées et vissées, combine à des éléments de jazz. atmosphère sombre et rythmes hypnotiques.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "House",
|
||||||
|
description:
|
||||||
|
"Style électronique entraînant, rythmiques régulières et grooves dansants. Ambiance clubs, radio et festivals occidentaux.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Alternative",
|
||||||
|
description:
|
||||||
|
"Version expérimentale et variée du rock traditionnel, populaire en festivals indé. Caractérisé par attitude anti-mainstream.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Indie",
|
||||||
|
description:
|
||||||
|
"Musique indépendante variée, mettant en avant créativité et originalité.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Country",
|
||||||
|
description: "Musique traditionnelle américaine d'origine rurale.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Synthwave",
|
||||||
|
description:
|
||||||
|
"Musique électronique inspirée de l'esthétique années 80, nostalgique et futuriste. son revival esthétique.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Afrobeat",
|
||||||
|
description:
|
||||||
|
"Mélange de musique traditionnelle nigériane, de jazz, du highlife ghanéen, de funk et de chant, accompagné de percussions et de styles vocaux.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "K-Pop",
|
||||||
|
description:
|
||||||
|
"Genre musical originaire de Corée du Sud qui combine divers styles comme la pop, le hip-hop, le R&B et l'électro. Mélodies accrocheuses.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Techno",
|
||||||
|
description:
|
||||||
|
"Musique électronique répétitive originaire de Détroit, tempo rapide, underground. Ambiance club.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Funk",
|
||||||
|
description:
|
||||||
|
"Musique rythmique marquée par des basses puissantes et grooves entraînants. pop moderne.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Disco",
|
||||||
|
description:
|
||||||
|
"Genre dance festif des années 70 caractérisé par des rythmes répétitifs et entraînants. Vit un revival puissant avec des références pop moderne.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "New wave",
|
||||||
|
description:
|
||||||
|
"Fusion de punk, pop et électronique, esthétique expérimentale des années 80.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Jazz",
|
||||||
|
description:
|
||||||
|
"Genre basé sur l’improvisation et l’expression musicale complexe.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Lo-Fi",
|
||||||
|
description:
|
||||||
|
"Musique relaxante à basse qualité sonore, souvent instrumentale et appréciée pour l'étude ou la détente.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Bedroom Pop",
|
||||||
|
description:
|
||||||
|
"Pop intimiste. sonorités douces, dream pop, avec une prédominance d'instruments acoustiques, de synthétiseurs et de voix feutrées.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Ambient",
|
||||||
|
description:
|
||||||
|
"Musique atmosphérique et immersive privilégiant textures sonores et ambiances relaxantes. recherche de calme.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Dream Pop",
|
||||||
|
description:
|
||||||
|
"Pop éthérée aux mélodies oniriques, souvent caractérisée par des effets de guitares et synthés. Adorée pour son esthétique mélancolique dans l'indie occidental.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Grime",
|
||||||
|
description:
|
||||||
|
"Genre électronique urbain britannique aux paroles incisives et flow rapide.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Hyperpop",
|
||||||
|
description:
|
||||||
|
"Musique expérimentale maximaliste combinant pop, EDM et distorsions vocales exagérées. Gen-Z.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Gospel",
|
||||||
|
description:
|
||||||
|
"Musique religieuse afro-américaine, chœurs puissants, influence sur soul et R&B.",
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
export const VOICE = [
|
export const VOICE = [
|
||||||
"Une voix féminine interpretra ta chanson.",
|
{
|
||||||
"Une voix masculine interpretera ta chanson.",
|
title: "base",
|
||||||
"Deux voix pour interpreter ta chanson.",
|
data: [
|
||||||
"Solo vocal puissant et dramatique.",
|
"Une voix féminine interpretra ta chanson.",
|
||||||
"Un chœur gospel pour (dimension spirituelle ou émotionnelle).",
|
"Une voix masculine interpretera ta chanson.",
|
||||||
"Un cri brut et puissant (émotion intense).",
|
"Deux voix pour interpreter ta chanson.",
|
||||||
"Un couplet interprété en rap.",
|
"Solo vocal puissant et dramatique.",
|
||||||
"Voix qui raconte une histoire, souvent sans chanter.",
|
"Un chœur gospel pour (dimension spirituelle ou émotionnelle).",
|
||||||
"Paroles déclamées plutôt que chantées, souvent dans un style poétique ou de slam.",
|
"Un cri brut et puissant (émotion intense).",
|
||||||
"Technique vocale entre parler et chanter, typique de la musique expressionniste.",
|
"Un couplet interprété en rap.",
|
||||||
"Sensibilité ",
|
"Voix qui raconte une histoire, souvent sans chanter.",
|
||||||
"Voix séduisante et sensuelle.",
|
"Paroles déclamées plutôt que chantées, souvent dans un style poétique ou de slam.",
|
||||||
"Voix profonde et résonnante.",
|
"Technique vocale entre parler et chanter, typique de la musique expressionniste.",
|
||||||
"Voix légère et aérienne.",
|
],
|
||||||
"Voix relaxante et sophistiquée.",
|
},
|
||||||
"Voix synthétique.",
|
{
|
||||||
"Voix découpées pour un style EDM ou future bass.",
|
title: "Sensibilité",
|
||||||
"Effet de distorsion (rendu + agressif).",
|
data: [
|
||||||
"Slam (Chant parlé).",
|
"Voix séduisante et sensuelle.",
|
||||||
"Rap moderne.",
|
"Voix profonde et résonnante.",
|
||||||
"Technique",
|
"Voix légère et aérienne.",
|
||||||
"Chant chargé d'émotion.",
|
"Voix relaxante et sophistiquée.",
|
||||||
"Technique vocale rugueuse pour le métal ou le rock.",
|
"Voix synthétique.",
|
||||||
"Voix robotisée ou mécanique, genres électro ou futuristes.",
|
"Voix découpées pour un style EDM ou future bass.",
|
||||||
"Voix étrange (atmosphère de science-fiction ou de mystère).",
|
"Effet de distorsion (rendu + agressif).",
|
||||||
"Voix grave et intimidante (effet dramatique).",
|
"Slam (Chant parlé).",
|
||||||
"Voix pure et céleste, évoquant la tranquillité ou le divin.",
|
"Rap moderne.",
|
||||||
"Voix douce et aérienne, avec une touche d'intimité.",
|
],
|
||||||
"Voix chantée dans une tonalité plus aiguë que la normale.",
|
},
|
||||||
"Voix d'enfant (+ d'innocence).",
|
{
|
||||||
"Chant en murmure (+ intime).",
|
title: "Technique",
|
||||||
"Multiples voix superposées (effet harmonique riche).",
|
data: [
|
||||||
"Voix légère et innocente.",
|
"Chant chargé d'émotion.",
|
||||||
"Voix soprano puissante (style opéra).",
|
"Technique vocale rugueuse pour le métal ou le rock.",
|
||||||
"Chant puissant (styles pop et Broadway).",
|
"Voix robotisée ou mécanique, genres électro ou futuristes.",
|
||||||
"Mélange subtil de chuchotements et d’harmoniques.",
|
"Voix étrange (atmosphère de science-fiction ou de mystère).",
|
||||||
"Voix rauque et granuleuse, utilisée dans le blues ou le rock.",
|
"Voix grave et intimidante (effet dramatique).",
|
||||||
"Chœur avec une tonalité légère et céleste.",
|
"Voix pure et céleste, évoquant la tranquillité ou le divin.",
|
||||||
"Inspiration et expiration sonores (effets dramatiques).",
|
"Voix douce et aérienne, avec une touche d'intimité.",
|
||||||
"Changements de volume ou de tonalité dans une même phrase.",
|
"Voix chantée dans une tonalité plus aiguë que la normale.",
|
||||||
|
"Voix d'enfant (+ d'innocence).",
|
||||||
|
"Chant en murmure (+ intime).",
|
||||||
|
"Multiples voix superposées (effet harmonique riche).",
|
||||||
|
"Voix légère et innocente.",
|
||||||
|
"Voix soprano puissante (style opéra).",
|
||||||
|
"Chant puissant (styles pop et Broadway).",
|
||||||
|
"Mélange subtil de chuchotements et d’harmoniques.",
|
||||||
|
"Voix rauque et granuleuse, utilisée dans le blues ou le rock.",
|
||||||
|
"Chœur avec une tonalité légère et céleste.",
|
||||||
|
"Inspiration et expiration sonores (effets dramatiques).",
|
||||||
|
"Changements de volume ou de tonalité dans une même phrase.",
|
||||||
|
],
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
export const INSTRUMENTS = [
|
export const INSTRUMENTS = [
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ import PouchReady from "../screens/Studio/PouchReady";
|
|||||||
import PhotoCover from "../screens/Studio/PhotoCover";
|
import PhotoCover from "../screens/Studio/PhotoCover";
|
||||||
import AddPhotoCover from "../screens/Studio/AddPhotoCover";
|
import AddPhotoCover from "../screens/Studio/AddPhotoCover";
|
||||||
import FinishCompose from "../screens/Studio/FinishCompose";
|
import FinishCompose from "../screens/Studio/FinishCompose";
|
||||||
|
import Production from "../screens/Production/Production";
|
||||||
|
import ProductionOnboarding from "../screens/Production/ProductionOnboarding";
|
||||||
|
|
||||||
const screenOptions = {
|
const screenOptions = {
|
||||||
headerShown: false,
|
headerShown: false,
|
||||||
@@ -133,6 +135,14 @@ const screens = [
|
|||||||
name: Routes.FinishCompose,
|
name: Routes.FinishCompose,
|
||||||
component: FinishCompose,
|
component: FinishCompose,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: Routes.ProductionOnboarding,
|
||||||
|
component: ProductionOnboarding,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: Routes.Production,
|
||||||
|
component: Production,
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
export default function Main() {
|
export default function Main() {
|
||||||
|
|||||||
@@ -39,4 +39,7 @@ export const Routes = {
|
|||||||
PhotoCover: "PhotoCover",
|
PhotoCover: "PhotoCover",
|
||||||
AddPhotoCover: "AddPhotoCover",
|
AddPhotoCover: "AddPhotoCover",
|
||||||
FinishCompose: "FinishCompose",
|
FinishCompose: "FinishCompose",
|
||||||
|
|
||||||
|
ProductionOnboarding: "ProductionOnboarding",
|
||||||
|
Production: "Production",
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ export default ({ navigation }) => {
|
|||||||
>
|
>
|
||||||
<Button text="WRITING" onPress={() => navigate(Routes.Writing)} />
|
<Button text="WRITING" onPress={() => navigate(Routes.Writing)} />
|
||||||
<Button text="STUDIO" onPress={() => navigate(Routes.Studio)} />
|
<Button text="STUDIO" onPress={() => navigate(Routes.Studio)} />
|
||||||
|
<Button text="PRODUCTION" onPress={() => navigate(Routes.ProductionOnboarding)} />
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
import { View, Text } from "react-native";
|
||||||
|
import React from "react";
|
||||||
|
|
||||||
|
const DownloadSongs = () => {
|
||||||
|
return (
|
||||||
|
<View>
|
||||||
|
<Text>DownloadSongs</Text>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default DownloadSongs;
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
import { View } from "react-native";
|
||||||
|
import React from "react";
|
||||||
|
import Page from "../../layouts/Page";
|
||||||
|
import { background } from "../../assets";
|
||||||
|
import { gutters } from "../../styles";
|
||||||
|
import GradientButton from "../../components/GradientButton";
|
||||||
|
import MusicLandHeader from "../../components/MusicLandHeader";
|
||||||
|
import { goBack } from "../../navigation/NavigationService";
|
||||||
|
import BorderGradientButton from "../../components/BorderGradientButton";
|
||||||
|
|
||||||
|
const Production = () => {
|
||||||
|
return (
|
||||||
|
<Page headerType="NONE" backgroundImg={background.productionBG}>
|
||||||
|
<MusicLandHeader onPressBack={goBack} progress={9} />
|
||||||
|
<View
|
||||||
|
style={{
|
||||||
|
flex: 1,
|
||||||
|
paddingBottom: gutters * 2,
|
||||||
|
justifyContent: "flex-end",
|
||||||
|
gap: 37,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<BorderGradientButton title="Je télécharge ma chanson" />
|
||||||
|
<View style={{ gap: 12 }}>
|
||||||
|
<GradientButton title="Je veux devenir Playbacker" />
|
||||||
|
<BorderGradientButton title="Voir exemples" />
|
||||||
|
</View>
|
||||||
|
<View style={{ gap: 12 }}>
|
||||||
|
<GradientButton title="Je veux créer un Clip" />
|
||||||
|
<BorderGradientButton title="Voir exemples" />
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</Page>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Production;
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
import { View, Text } from "react-native";
|
||||||
|
import React from "react";
|
||||||
|
import Page from "../../layouts/Page";
|
||||||
|
import { background } from "../../assets";
|
||||||
|
import { gutters } from "../../styles";
|
||||||
|
import GradientButton from "../../components/GradientButton";
|
||||||
|
import { navigate } from "../../navigation/NavigationService";
|
||||||
|
import { Routes } from "../../navigation";
|
||||||
|
|
||||||
|
const ProductionOnboarding = () => {
|
||||||
|
return (
|
||||||
|
<Page headerType="NONE" backgroundImg={background.productionBG}>
|
||||||
|
<View
|
||||||
|
style={{
|
||||||
|
flex: 1,
|
||||||
|
paddingBottom: gutters * 2,
|
||||||
|
justifyContent: "flex-end",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<GradientButton
|
||||||
|
title="Commence"
|
||||||
|
onPress={() => navigate(Routes.Production)}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
</Page>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ProductionOnboarding;
|
||||||
@@ -1,76 +1,78 @@
|
|||||||
import { View, Text, StyleSheet, FlatList } from "react-native";
|
import { View, Text, FlatList } from "react-native";
|
||||||
import React from "react";
|
import React, { useState } from "react";
|
||||||
import CreateLyricsHeader from "../Writing/components/CreateLyricsHeader";
|
import CreateLyricsHeader from "../Writing/components/CreateLyricsHeader";
|
||||||
import { responsiveHeight } from "react-native-responsive-dimensions";
|
import { responsiveHeight } from "react-native-responsive-dimensions";
|
||||||
import { BlurView } from "expo-blur";
|
|
||||||
import { FONT_FAMILY } from "../../styles/Fonts";
|
import { FONT_FAMILY } from "../../styles/Fonts";
|
||||||
import { Palette } from "../../styles";
|
import { Palette } from "../../styles";
|
||||||
import { CHOOSE_GENRE } from "../../data/data";
|
import { CHOOSE_GENRE } from "../../data/data";
|
||||||
import ItemContainer from "../../components/ItemContainer/ItemContainer";
|
import ItemContainer from "../../components/ItemContainer/ItemContainer";
|
||||||
|
|
||||||
const ChooseGenre = () => {
|
const ChooseGenre = () => {
|
||||||
|
const [containerLayout, setContainerLayout] = useState(null);
|
||||||
|
const [selected, setSelected] = useState(null);
|
||||||
|
|
||||||
|
const onPressSelect = (item) => {
|
||||||
|
if (selected === item) {
|
||||||
|
setSelected(null);
|
||||||
|
} else {
|
||||||
|
setSelected(item);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View style={{ flex: 1, gap: 10, paddingTop: 16 }}>
|
<View style={{ flex: 1, gap: 10, paddingTop: 16 }}>
|
||||||
<CreateLyricsHeader
|
<CreateLyricsHeader
|
||||||
title="Choisis un genre"
|
title="Choisis un genre"
|
||||||
subTitle="Tu peux choisir jusqu’à 2 genres différents"
|
subTitle="Tu peux choisir jusqu’à 2 genres différents"
|
||||||
/>
|
/>
|
||||||
<ItemContainer height={responsiveHeight(55)}>
|
<View
|
||||||
<FlatList
|
style={{ flex: 1 }}
|
||||||
data={CHOOSE_GENRE}
|
onLayout={(event) => setContainerLayout(event.nativeEvent.layout)}
|
||||||
contentContainerStyle={{
|
>
|
||||||
gap: 16,
|
<ItemContainer height={containerLayout?.height}>
|
||||||
flexGrow: 1,
|
<FlatList
|
||||||
zIndex: 2,
|
data={CHOOSE_GENRE}
|
||||||
}}
|
contentContainerStyle={{
|
||||||
renderItem={({ item, index }) => (
|
gap: 16,
|
||||||
<View style={{ borderRadius: 14, overflow: "hidden" }}>
|
flexGrow: 1,
|
||||||
<BlurView
|
zIndex: 2,
|
||||||
intensity={30}
|
paddingTop: 5,
|
||||||
style={{ paddingVertical: 14, paddingHorizontal: 12 }}
|
}}
|
||||||
>
|
renderItem={({ item, index }) => {
|
||||||
<Text
|
const selectedItem = selected === item.title;
|
||||||
style={{
|
|
||||||
fontSize: 16,
|
return (
|
||||||
color: Palette.white,
|
<View style={{ paddingHorizontal: 5 }}>
|
||||||
fontFamily: FONT_FAMILY.InterRegular,
|
<CreateLyricsHeader
|
||||||
}}
|
colors={
|
||||||
>
|
selectedItem
|
||||||
<Text style={{ fontFamily: FONT_FAMILY.InterBold }}>
|
? ["#FFFFFF00", "#FFFFFF"]
|
||||||
{item.title}
|
: [Palette.tran, Palette.tran]
|
||||||
</Text>{" "}
|
}
|
||||||
: {item.description}
|
tint={selectedItem ? "default" : "dark"}
|
||||||
</Text>
|
onPress={() => onPressSelect(item.title)}
|
||||||
</BlurView>
|
>
|
||||||
</View>
|
<Text
|
||||||
)}
|
style={{
|
||||||
/>
|
fontSize: 16,
|
||||||
</ItemContainer>
|
color: Palette.white,
|
||||||
|
fontFamily: FONT_FAMILY.InterRegular,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Text style={{ fontFamily: FONT_FAMILY.InterBold }}>
|
||||||
|
{item.title}
|
||||||
|
</Text>{" "}
|
||||||
|
: {item.description}
|
||||||
|
</Text>
|
||||||
|
</CreateLyricsHeader>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</ItemContainer>
|
||||||
|
</View>
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default ChooseGenre;
|
export default ChooseGenre;
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
|
||||||
borderGradientStyle: {
|
|
||||||
borderWidth: 1,
|
|
||||||
borderRadius: 20,
|
|
||||||
shadowColor: "#000",
|
|
||||||
shadowOffset: {
|
|
||||||
width: 0,
|
|
||||||
height: 2,
|
|
||||||
},
|
|
||||||
shadowOpacity: 0.25,
|
|
||||||
shadowRadius: 3.84,
|
|
||||||
elevation: 100,
|
|
||||||
position: "absolute",
|
|
||||||
width: "100%",
|
|
||||||
},
|
|
||||||
blurContainer: {
|
|
||||||
borderRadius: 20,
|
|
||||||
overflow: "hidden",
|
|
||||||
zIndex: 1,
|
|
||||||
maxHeight: responsiveHeight(55),
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|||||||
@@ -9,6 +9,15 @@ import { INSTRUMENTS } from "../../data/data";
|
|||||||
|
|
||||||
const ChooseInstruments = () => {
|
const ChooseInstruments = () => {
|
||||||
const [containerLayout, setContainerLayout] = useState(null);
|
const [containerLayout, setContainerLayout] = useState(null);
|
||||||
|
const [selected, setSelected] = useState(null);
|
||||||
|
|
||||||
|
const onPressSelect = (item) => {
|
||||||
|
if (selected === item) {
|
||||||
|
setSelected(null);
|
||||||
|
} else {
|
||||||
|
setSelected(item);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View style={{ flex: 1, gap: 10, paddingTop: 16 }}>
|
<View style={{ flex: 1, gap: 10, paddingTop: 16 }}>
|
||||||
@@ -25,21 +34,33 @@ const ChooseInstruments = () => {
|
|||||||
data={INSTRUMENTS}
|
data={INSTRUMENTS}
|
||||||
showsVerticalScrollIndicator={false}
|
showsVerticalScrollIndicator={false}
|
||||||
contentContainerStyle={styles.contentContainer}
|
contentContainerStyle={styles.contentContainer}
|
||||||
renderItem={({ item }) => (
|
renderItem={({ item }) => {
|
||||||
<View style={styles.itemContainer}>
|
const selectedItem = selected === item;
|
||||||
<BlurView
|
|
||||||
intensity={30}
|
return (
|
||||||
style={{
|
<CreateLyricsHeader
|
||||||
flex: 1,
|
onPress={() => onPressSelect(item)}
|
||||||
backgroundColor: Palette.glass,
|
tint={selectedItem ? "default" : "dark"}
|
||||||
paddingHorizontal: 12,
|
colors={
|
||||||
justifyContent: "center",
|
selectedItem
|
||||||
|
? ["#FFFFFF00", "#FFFFFF"]
|
||||||
|
: [Palette.tran, Palette.tran]
|
||||||
|
}
|
||||||
|
containerStyle={{
|
||||||
|
...styles.itemContainer,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Text style={styles.itemText}>{item}</Text>
|
<View
|
||||||
</BlurView>
|
style={{
|
||||||
</View>
|
height: 40,
|
||||||
)}
|
justifyContent: "center",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Text style={styles.itemText}>{item}</Text>
|
||||||
|
</View>
|
||||||
|
</CreateLyricsHeader>
|
||||||
|
);
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</ItemContainer>
|
</ItemContainer>
|
||||||
</View>
|
</View>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { View, Text, FlatList, StyleSheet } from "react-native";
|
import { View, Text, FlatList, StyleSheet } from "react-native";
|
||||||
import React from "react";
|
import React, { useState } from "react";
|
||||||
import CreateLyricsHeader from "../Writing/components/CreateLyricsHeader";
|
import CreateLyricsHeader from "../Writing/components/CreateLyricsHeader";
|
||||||
import ItemContainer from "../../components/ItemContainer/ItemContainer";
|
import ItemContainer from "../../components/ItemContainer/ItemContainer";
|
||||||
import { BlurView } from "expo-blur";
|
import { BlurView } from "expo-blur";
|
||||||
@@ -8,6 +8,16 @@ import { FONT_FAMILY } from "../../styles/Fonts";
|
|||||||
import { RHYTHM } from "../../data/data";
|
import { RHYTHM } from "../../data/data";
|
||||||
|
|
||||||
const ChooseRhythm = () => {
|
const ChooseRhythm = () => {
|
||||||
|
const [selected, setSelected] = useState(null);
|
||||||
|
|
||||||
|
const onPressSelect = (item) => {
|
||||||
|
if (selected === item) {
|
||||||
|
setSelected(null);
|
||||||
|
} else {
|
||||||
|
setSelected(item);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View style={{ flex: 1, gap: 10, paddingTop: 16 }}>
|
<View style={{ flex: 1, gap: 10, paddingTop: 16 }}>
|
||||||
<CreateLyricsHeader title="Choisis un rythme" />
|
<CreateLyricsHeader title="Choisis un rythme" />
|
||||||
@@ -17,21 +27,33 @@ const ChooseRhythm = () => {
|
|||||||
data={RHYTHM}
|
data={RHYTHM}
|
||||||
showsVerticalScrollIndicator={false}
|
showsVerticalScrollIndicator={false}
|
||||||
contentContainerStyle={styles.contentContainer}
|
contentContainerStyle={styles.contentContainer}
|
||||||
renderItem={({ item }) => (
|
renderItem={({ item }) => {
|
||||||
<View style={styles.itemContainer}>
|
const selectedItem = selected === item;
|
||||||
<BlurView
|
|
||||||
intensity={30}
|
return (
|
||||||
style={{
|
<CreateLyricsHeader
|
||||||
flex: 1,
|
onPress={() => onPressSelect(item)}
|
||||||
backgroundColor: Palette.glass,
|
tint={selectedItem ? "default" : "dark"}
|
||||||
paddingHorizontal: 12,
|
colors={
|
||||||
justifyContent: "center",
|
selectedItem
|
||||||
|
? ["#FFFFFF00", "#FFFFFF"]
|
||||||
|
: [Palette.tran, Palette.tran]
|
||||||
|
}
|
||||||
|
containerStyle={{
|
||||||
|
...styles.itemContainer,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Text style={styles.itemText}>{item}</Text>
|
<View
|
||||||
</BlurView>
|
style={{
|
||||||
</View>
|
height: 40,
|
||||||
)}
|
justifyContent: "center",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Text style={styles.itemText}>{item}</Text>
|
||||||
|
</View>
|
||||||
|
</CreateLyricsHeader>
|
||||||
|
);
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</ItemContainer>
|
</ItemContainer>
|
||||||
</View>
|
</View>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { View, Text, FlatList, StyleSheet } from "react-native";
|
import { View, Text, FlatList, StyleSheet, SectionList } from "react-native";
|
||||||
import React, { useState } from "react";
|
import React, { useState } from "react";
|
||||||
import CreateLyricsHeader from "../Writing/components/CreateLyricsHeader";
|
import CreateLyricsHeader from "../Writing/components/CreateLyricsHeader";
|
||||||
import ItemContainer from "../../components/ItemContainer/ItemContainer";
|
import ItemContainer from "../../components/ItemContainer/ItemContainer";
|
||||||
@@ -9,6 +9,15 @@ import { VOICE } from "../../data/data";
|
|||||||
|
|
||||||
const CustomizeVoice = () => {
|
const CustomizeVoice = () => {
|
||||||
const [containerLayout, setContainerLayout] = useState(null);
|
const [containerLayout, setContainerLayout] = useState(null);
|
||||||
|
const [selected, setSelected] = useState(null);
|
||||||
|
|
||||||
|
const onPressSelect = (item) => {
|
||||||
|
if (selected === item) {
|
||||||
|
setSelected(null);
|
||||||
|
} else {
|
||||||
|
setSelected(item);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View style={{ flex: 1, gap: 10, paddingTop: 16 }}>
|
<View style={{ flex: 1, gap: 10, paddingTop: 16 }}>
|
||||||
@@ -22,35 +31,47 @@ const CustomizeVoice = () => {
|
|||||||
>
|
>
|
||||||
<ItemContainer height={containerLayout?.height}>
|
<ItemContainer height={containerLayout?.height}>
|
||||||
<View style={{ flex: 1, gap: 10 }}>
|
<View style={{ flex: 1, gap: 10 }}>
|
||||||
<Text
|
<SectionList
|
||||||
style={{
|
sections={VOICE}
|
||||||
fontSize: 16,
|
|
||||||
color: Palette.white,
|
|
||||||
fontFamily: FONT_FAMILY.InterBold,
|
|
||||||
left: 16,
|
|
||||||
marginTop: 5,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Base
|
|
||||||
</Text>
|
|
||||||
<FlatList
|
|
||||||
data={VOICE}
|
|
||||||
showsVerticalScrollIndicator={false}
|
showsVerticalScrollIndicator={false}
|
||||||
contentContainerStyle={styles.contentContainer}
|
contentContainerStyle={styles.contentContainer}
|
||||||
renderItem={({ item }) => (
|
renderItem={({ item }) => {
|
||||||
<View style={styles.itemContainer}>
|
const selectedItem = selected === item;
|
||||||
<BlurView
|
|
||||||
intensity={30}
|
return (
|
||||||
style={{
|
<CreateLyricsHeader
|
||||||
flex: 1,
|
onPress={() => onPressSelect(item)}
|
||||||
backgroundColor: Palette.glass,
|
tint={selectedItem ? "default" : "dark"}
|
||||||
paddingHorizontal: 12,
|
colors={
|
||||||
paddingVertical: 14,
|
selectedItem
|
||||||
|
? ["#FFFFFF00", "#FFFFFF"]
|
||||||
|
: [Palette.tran, Palette.tran]
|
||||||
|
}
|
||||||
|
containerStyle={{
|
||||||
|
...styles.itemContainer,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Text style={styles.itemText}>{item}</Text>
|
<View
|
||||||
</BlurView>
|
style={{
|
||||||
</View>
|
paddingVertical: 6,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Text style={styles.itemText}>{item}</Text>
|
||||||
|
</View>
|
||||||
|
</CreateLyricsHeader>
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
renderSectionHeader={({ section: { title } }) => (
|
||||||
|
<Text
|
||||||
|
style={{
|
||||||
|
fontSize: 16,
|
||||||
|
color: Palette.white,
|
||||||
|
fontFamily: FONT_FAMILY.InterBold,
|
||||||
|
left: 10,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{title}
|
||||||
|
</Text>
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
</View>
|
</View>
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ const CreatingLyrics = ({ active }) => {
|
|||||||
>
|
>
|
||||||
<BlurView
|
<BlurView
|
||||||
intensity={40}
|
intensity={40}
|
||||||
|
tint="dark"
|
||||||
style={{ flex: 1, padding: 10, paddingBottom: 20 }}
|
style={{ flex: 1, padding: 10, paddingBottom: 20 }}
|
||||||
>
|
>
|
||||||
<Pressable
|
<Pressable
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ import { BlurView } from "expo-blur";
|
|||||||
import { Palette } from "../../styles";
|
import { Palette } from "../../styles";
|
||||||
import { FONT_FAMILY } from "../../styles/Fonts";
|
import { FONT_FAMILY } from "../../styles/Fonts";
|
||||||
import ItemContainer from "../../components/ItemContainer/ItemContainer";
|
import ItemContainer from "../../components/ItemContainer/ItemContainer";
|
||||||
|
import { CUSTOM_SONG_STRUCTURE } from "../../data/data";
|
||||||
|
import DragDropTest from "../../components/DragDropTest";
|
||||||
|
|
||||||
const CustomizeSongStructure = () => {
|
const CustomizeSongStructure = () => {
|
||||||
const [containerLayout, setContainerLayout] = useState(null);
|
const [containerLayout, setContainerLayout] = useState(null);
|
||||||
@@ -15,7 +17,7 @@ const CustomizeSongStructure = () => {
|
|||||||
title="Personnalise la structure de ta chanson"
|
title="Personnalise la structure de ta chanson"
|
||||||
subTitle="Intègre en Drag and drop"
|
subTitle="Intègre en Drag and drop"
|
||||||
/>
|
/>
|
||||||
<View style={{ flex: 1, gap: 10 }}>
|
{/* <View style={{ flex: 1, gap: 10 }}>
|
||||||
<View
|
<View
|
||||||
style={{ flex: 1 }}
|
style={{ flex: 1 }}
|
||||||
onLayout={(e) => {
|
onLayout={(e) => {
|
||||||
@@ -24,18 +26,20 @@ const CustomizeSongStructure = () => {
|
|||||||
>
|
>
|
||||||
<ItemContainer height={containerLayout?.height}>
|
<ItemContainer height={containerLayout?.height}>
|
||||||
<ScrollView contentContainerStyle={{ gap: 10, paddingBottom: 20 }}>
|
<ScrollView contentContainerStyle={{ gap: 10, paddingBottom: 20 }}>
|
||||||
{Array.from({ length: 10 }).map((_, index) => (
|
{["Couplet", "Refrain", "Couplet", "Refrain"].map(
|
||||||
<View key={index} style={styles.dropzoneContainer}>
|
(item, index) => (
|
||||||
<Text style={styles.dropzone}>Couplet</Text>
|
<View key={index} style={styles.dropzoneContainer}>
|
||||||
</View>
|
<Text style={styles.dropzone}>{item}</Text>
|
||||||
))}
|
</View>
|
||||||
|
)
|
||||||
|
)}
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
</ItemContainer>
|
</ItemContainer>
|
||||||
</View>
|
</View>
|
||||||
<View style={{ flex: 1 }}>
|
<View style={{ flex: 1 }}>
|
||||||
<ItemContainer height={containerLayout?.height}>
|
<ItemContainer height={containerLayout?.height}>
|
||||||
<ScrollView contentContainerStyle={{ gap: 10, paddingBottom: 20 }}>
|
<ScrollView contentContainerStyle={{ gap: 10, paddingBottom: 20 }}>
|
||||||
{Array.from({ length: 10 }).map((_, index) => (
|
{CUSTOM_SONG_STRUCTURE.map((item, index) => (
|
||||||
<View key={index} style={styles.itemContainer}>
|
<View key={index} style={styles.itemContainer}>
|
||||||
<BlurView
|
<BlurView
|
||||||
intensity={30}
|
intensity={30}
|
||||||
@@ -46,15 +50,16 @@ const CustomizeSongStructure = () => {
|
|||||||
paddingHorizontal: 12,
|
paddingHorizontal: 12,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Text style={styles.dropzone}>
|
<Text style={styles.dropzone}>{item}</Text>
|
||||||
Introduction instrumentale longue.
|
|
||||||
</Text>
|
|
||||||
</BlurView>
|
</BlurView>
|
||||||
</View>
|
</View>
|
||||||
))}
|
))}
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
</ItemContainer>
|
</ItemContainer>
|
||||||
</View>
|
</View>
|
||||||
|
</View> */}
|
||||||
|
<View style={{ flex: 1 }}>
|
||||||
|
<DragDropTest />
|
||||||
</View>
|
</View>
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { View, Text, FlatList } from "react-native";
|
import { View, Text, FlatList } from "react-native";
|
||||||
import React from "react";
|
import React, { useState } from "react";
|
||||||
import CreateLyricsHeader from "./components/CreateLyricsHeader";
|
import CreateLyricsHeader from "./components/CreateLyricsHeader";
|
||||||
import { responsiveHeight } from "react-native-responsive-dimensions";
|
import { responsiveHeight } from "react-native-responsive-dimensions";
|
||||||
import { Palette } from "../../styles";
|
import { Palette } from "../../styles";
|
||||||
@@ -8,6 +8,17 @@ import { EMOTION_CONVEY } from "../../data/data";
|
|||||||
import ItemContainer from "../../components/ItemContainer/ItemContainer";
|
import ItemContainer from "../../components/ItemContainer/ItemContainer";
|
||||||
|
|
||||||
const EmotionConvey = () => {
|
const EmotionConvey = () => {
|
||||||
|
const [containerLayout, setContainerLayout] = useState(null);
|
||||||
|
const [selected, setSelected] = useState(null);
|
||||||
|
|
||||||
|
const onPressSelect = (item) => {
|
||||||
|
if (selected === item) {
|
||||||
|
setSelected(null);
|
||||||
|
} else {
|
||||||
|
setSelected(item);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View style={{ flex: 1, gap: 10, marginTop: 16 }}>
|
<View style={{ flex: 1, gap: 10, marginTop: 16 }}>
|
||||||
<CreateLyricsHeader
|
<CreateLyricsHeader
|
||||||
@@ -15,35 +26,48 @@ const EmotionConvey = () => {
|
|||||||
subTitle="Sélectionne tes intentions émotionnelles. (2 max)"
|
subTitle="Sélectionne tes intentions émotionnelles. (2 max)"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<ItemContainer height={responsiveHeight(50)}>
|
<View
|
||||||
<FlatList
|
style={{ flex: 1 }}
|
||||||
data={EMOTION_CONVEY}
|
onLayout={(event) => setContainerLayout(event.nativeEvent.layout)}
|
||||||
contentContainerStyle={{
|
>
|
||||||
gap: 16,
|
<ItemContainer height={containerLayout?.height}>
|
||||||
flexGrow: 1,
|
<FlatList
|
||||||
zIndex: 2,
|
data={EMOTION_CONVEY}
|
||||||
paddingTop: 5,
|
contentContainerStyle={{
|
||||||
}}
|
gap: 16,
|
||||||
renderItem={({ item, index }) => (
|
flexGrow: 1,
|
||||||
<View style={{ paddingHorizontal: 5 }}>
|
zIndex: 2,
|
||||||
<CreateLyricsHeader colors={item.color} intensity={30} >
|
paddingTop: 5,
|
||||||
<Text
|
}}
|
||||||
style={{
|
renderItem={({ item, index }) => {
|
||||||
fontSize: 16,
|
const selectedItem = selected === item.title;
|
||||||
color: Palette.white,
|
|
||||||
fontFamily: FONT_FAMILY.InterRegular,
|
return (
|
||||||
}}
|
<View style={{ paddingHorizontal: 5 }}>
|
||||||
>
|
<CreateLyricsHeader
|
||||||
<Text style={{ fontFamily: FONT_FAMILY.InterBold }}>
|
colors={item.color}
|
||||||
{item.title}
|
tint={selectedItem ? "default" : "dark"}
|
||||||
</Text>{" "}
|
onPress={() => onPressSelect(item.title)}
|
||||||
: {item.description}
|
>
|
||||||
</Text>
|
<Text
|
||||||
</CreateLyricsHeader>
|
style={{
|
||||||
</View>
|
fontSize: 16,
|
||||||
)}
|
color: Palette.white,
|
||||||
/>
|
fontFamily: FONT_FAMILY.InterRegular,
|
||||||
</ItemContainer>
|
}}
|
||||||
|
>
|
||||||
|
<Text style={{ fontFamily: FONT_FAMILY.InterBold }}>
|
||||||
|
{item.title}
|
||||||
|
</Text>{" "}
|
||||||
|
: {item.description}
|
||||||
|
</Text>
|
||||||
|
</CreateLyricsHeader>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</ItemContainer>
|
||||||
|
</View>
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,14 +1,23 @@
|
|||||||
import { View, Text, FlatList, StyleSheet, Pressable } from "react-native";
|
import { View, Text, FlatList, StyleSheet, Pressable } from "react-native";
|
||||||
import React from "react";
|
import React, { useState } from "react";
|
||||||
import CreateLyricsHeader from "./components/CreateLyricsHeader";
|
import CreateLyricsHeader from "./components/CreateLyricsHeader";
|
||||||
import { Palette, Style } from "../../styles";
|
import { Palette, Style } from "../../styles";
|
||||||
import { BlurView } from "expo-blur";
|
|
||||||
import { GOALS } from "../../data/data";
|
import { GOALS } from "../../data/data";
|
||||||
import { FONT_FAMILY } from "../../styles/Fonts";
|
import { FONT_FAMILY } from "../../styles/Fonts";
|
||||||
import CustomInput from "./components/CustomInput";
|
import CustomInput from "./components/CustomInput";
|
||||||
import ItemContainer from "../../components/ItemContainer/ItemContainer";
|
import ItemContainer from "../../components/ItemContainer/ItemContainer";
|
||||||
|
|
||||||
const Goals = () => {
|
const Goals = () => {
|
||||||
|
const [selected, setSelected] = useState(null);
|
||||||
|
|
||||||
|
const onPressSelect = (item) => {
|
||||||
|
if (selected === item) {
|
||||||
|
setSelected(null);
|
||||||
|
} else {
|
||||||
|
setSelected(item);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View style={{ flex: 1, gap: 16, marginTop: 16 }}>
|
<View style={{ flex: 1, gap: 16, marginTop: 16 }}>
|
||||||
<View style={{ gap: 10 }}>
|
<View style={{ gap: 10 }}>
|
||||||
@@ -18,21 +27,33 @@ const Goals = () => {
|
|||||||
data={GOALS}
|
data={GOALS}
|
||||||
showsVerticalScrollIndicator={false}
|
showsVerticalScrollIndicator={false}
|
||||||
contentContainerStyle={styles.contentContainer}
|
contentContainerStyle={styles.contentContainer}
|
||||||
renderItem={({ item }) => (
|
renderItem={({ item }) => {
|
||||||
<Pressable style={styles.itemContainer}>
|
const selectedItem = selected === item;
|
||||||
<BlurView
|
|
||||||
intensity={30}
|
return (
|
||||||
style={{
|
<CreateLyricsHeader
|
||||||
flex: 1,
|
onPress={() => onPressSelect(item)}
|
||||||
backgroundColor: Palette.glass,
|
tint={selectedItem ? "default" : "dark"}
|
||||||
paddingHorizontal: 12,
|
colors={
|
||||||
...Style.containerCenter,
|
selectedItem
|
||||||
|
? ["#FFFFFF00", "#FFFFFF"]
|
||||||
|
: [Palette.tran, Palette.tran]
|
||||||
|
}
|
||||||
|
containerStyle={{
|
||||||
|
...styles.itemContainer,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Text style={styles.itemText}>{item}</Text>
|
<View
|
||||||
</BlurView>
|
style={{
|
||||||
</Pressable>
|
height: 40,
|
||||||
)}
|
...Style.containerCenter,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Text style={styles.itemText}>{item}</Text>
|
||||||
|
</View>
|
||||||
|
</CreateLyricsHeader>
|
||||||
|
);
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</ItemContainer>
|
</ItemContainer>
|
||||||
</View>
|
</View>
|
||||||
@@ -55,10 +76,7 @@ const styles = StyleSheet.create({
|
|||||||
paddingBottom: 50,
|
paddingBottom: 50,
|
||||||
},
|
},
|
||||||
itemContainer: {
|
itemContainer: {
|
||||||
height: 54,
|
|
||||||
backgroundColor: Palette.glass,
|
|
||||||
borderRadius: 14,
|
borderRadius: 14,
|
||||||
overflow: "hidden",
|
|
||||||
shadowColor: "#00000040",
|
shadowColor: "#00000040",
|
||||||
shadowOffset: {
|
shadowOffset: {
|
||||||
width: 0,
|
width: 0,
|
||||||
|
|||||||
@@ -1,34 +1,58 @@
|
|||||||
import { View, Text, StyleSheet } from "react-native";
|
import { View, Text, StyleSheet } from "react-native";
|
||||||
import React from "react";
|
import React, { useState } from "react";
|
||||||
import CreateLyricsHeader from "./components/CreateLyricsHeader";
|
import CreateLyricsHeader from "./components/CreateLyricsHeader";
|
||||||
import { BlurView } from "expo-blur";
|
import { BlurView } from "expo-blur";
|
||||||
import { Palette } from "../../styles";
|
import { Palette, Style } from "../../styles";
|
||||||
import { FONT_FAMILY } from "../../styles/Fonts";
|
import { FONT_FAMILY } from "../../styles/Fonts";
|
||||||
import ItemContainer from "../../components/ItemContainer/ItemContainer";
|
import ItemContainer from "../../components/ItemContainer/ItemContainer";
|
||||||
|
|
||||||
const Rhymes = () => {
|
const Rhymes = () => {
|
||||||
|
const [selected, setSelected] = useState(null);
|
||||||
|
|
||||||
|
const onPressSelect = (item) => {
|
||||||
|
if (selected === item) {
|
||||||
|
setSelected(null);
|
||||||
|
} else {
|
||||||
|
setSelected(item);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View style={{ flex: 1, gap: 10, marginTop: 16 }}>
|
<View style={{ flex: 1, gap: 10, marginTop: 16 }}>
|
||||||
<CreateLyricsHeader title="Avec ou sans rimes" />
|
<CreateLyricsHeader title="Avec ou sans rimes" />
|
||||||
<ItemContainer height={200}>
|
<ItemContainer height={200}>
|
||||||
<View style={{ gap: 10 }}>
|
<View style={{ gap: 10 }}>
|
||||||
{Array.from({ length: 3 }).map((_, index) => (
|
{["Avec rimes", "Sans rimes", "Mélange des deux"].map(
|
||||||
<View key={index} style={styles.itemContainer}>
|
(item, index) => {
|
||||||
<BlurView
|
const selectedItem = selected === item;
|
||||||
intensity={30}
|
|
||||||
style={{
|
return (
|
||||||
flex: 1,
|
<CreateLyricsHeader
|
||||||
backgroundColor: Palette.glass,
|
key={index}
|
||||||
justifyContent: "center",
|
onPress={() => onPressSelect(item)}
|
||||||
paddingHorizontal: 12,
|
tint={selectedItem ? "default" : "dark"}
|
||||||
}}
|
colors={
|
||||||
>
|
selectedItem
|
||||||
<Text style={styles.dropzone}>
|
? ["#FFFFFF00", "#FFFFFF"]
|
||||||
Introduction instrumentale longue.
|
: [Palette.tran, Palette.tran]
|
||||||
</Text>
|
}
|
||||||
</BlurView>
|
containerStyle={{
|
||||||
</View>
|
...styles.itemContainer,
|
||||||
))}
|
}}
|
||||||
|
>
|
||||||
|
<View
|
||||||
|
style={{
|
||||||
|
height: 40,
|
||||||
|
...Style.containerCenter,
|
||||||
|
paddingHorizontal: 14,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Text style={styles.dropzone}>{item}</Text>
|
||||||
|
</View>
|
||||||
|
</CreateLyricsHeader>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
)}
|
||||||
</View>
|
</View>
|
||||||
</ItemContainer>
|
</ItemContainer>
|
||||||
</View>
|
</View>
|
||||||
@@ -56,5 +80,6 @@ const styles = StyleSheet.create({
|
|||||||
fontSize: 16,
|
fontSize: 16,
|
||||||
color: Palette.white,
|
color: Palette.white,
|
||||||
fontFamily: FONT_FAMILY.InterRegular,
|
fontFamily: FONT_FAMILY.InterRegular,
|
||||||
|
textAlign: "center",
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,13 +1,23 @@
|
|||||||
import { View, Text, StyleSheet, FlatList, Pressable } from "react-native";
|
import { View, Text, StyleSheet, FlatList, Pressable } from "react-native";
|
||||||
import React from "react";
|
import React, { useState } from "react";
|
||||||
import CreateLyricsHeader from "./components/CreateLyricsHeader";
|
import CreateLyricsHeader from "./components/CreateLyricsHeader";
|
||||||
import { BlurView } from "expo-blur";
|
import { BlurView } from "expo-blur";
|
||||||
import { GOALS } from "../../data/data";
|
import { GOALS, SONG_STRUCTURE } from "../../data/data";
|
||||||
import { Palette, Style } from "../../styles";
|
import { Palette, Style } from "../../styles";
|
||||||
import { FONT_FAMILY } from "../../styles/Fonts";
|
import { FONT_FAMILY } from "../../styles/Fonts";
|
||||||
import ItemContainer from "../../components/ItemContainer/ItemContainer";
|
import ItemContainer from "../../components/ItemContainer/ItemContainer";
|
||||||
|
|
||||||
const SongStructure = () => {
|
const SongStructure = () => {
|
||||||
|
const [selected, setSelected] = useState(null);
|
||||||
|
|
||||||
|
const onPressSelect = (item) => {
|
||||||
|
if (selected === item) {
|
||||||
|
setSelected(null);
|
||||||
|
} else {
|
||||||
|
setSelected(item);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View style={{ flex: 1, gap: 10, marginTop: 16 }}>
|
<View style={{ flex: 1, gap: 10, marginTop: 16 }}>
|
||||||
<CreateLyricsHeader
|
<CreateLyricsHeader
|
||||||
@@ -16,23 +26,37 @@ const SongStructure = () => {
|
|||||||
/>
|
/>
|
||||||
<ItemContainer>
|
<ItemContainer>
|
||||||
<FlatList
|
<FlatList
|
||||||
data={GOALS}
|
data={SONG_STRUCTURE}
|
||||||
showsVerticalScrollIndicator={false}
|
showsVerticalScrollIndicator={false}
|
||||||
contentContainerStyle={styles.contentContainer}
|
contentContainerStyle={styles.contentContainer}
|
||||||
renderItem={({ item }) => (
|
renderItem={({ item }) => {
|
||||||
<Pressable style={styles.itemContainer}>
|
const selectedItem = selected === item;
|
||||||
<BlurView
|
|
||||||
intensity={30}
|
return (
|
||||||
style={{
|
<CreateLyricsHeader
|
||||||
flex: 1,
|
onPress={() => onPressSelect(item)}
|
||||||
backgroundColor: Palette.glass,
|
tint={selectedItem ? "default" : "dark"}
|
||||||
...Style.containerCenter,
|
colors={
|
||||||
|
selectedItem
|
||||||
|
? ["#FFFFFF00", "#FFFFFF"]
|
||||||
|
: [Palette.tran, Palette.tran]
|
||||||
|
}
|
||||||
|
containerStyle={{
|
||||||
|
...styles.itemContainer,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Text style={styles.itemText}>{item}</Text>
|
<View
|
||||||
</BlurView>
|
style={{
|
||||||
</Pressable>
|
height: 40,
|
||||||
)}
|
paddingHorizontal: 14,
|
||||||
|
justifyContent: "center",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Text style={styles.itemText}>{item}</Text>
|
||||||
|
</View>
|
||||||
|
</CreateLyricsHeader>
|
||||||
|
);
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</ItemContainer>
|
</ItemContainer>
|
||||||
</View>
|
</View>
|
||||||
@@ -51,9 +75,7 @@ const styles = StyleSheet.create({
|
|||||||
},
|
},
|
||||||
itemContainer: {
|
itemContainer: {
|
||||||
height: 54,
|
height: 54,
|
||||||
backgroundColor: Palette.glass,
|
|
||||||
borderRadius: 14,
|
borderRadius: 14,
|
||||||
overflow: "hidden",
|
|
||||||
shadowColor: "#00000040",
|
shadowColor: "#00000040",
|
||||||
shadowOffset: {
|
shadowOffset: {
|
||||||
width: 0,
|
width: 0,
|
||||||
|
|||||||
@@ -1,14 +1,24 @@
|
|||||||
import { View, Text, FlatList, Pressable, StyleSheet } from "react-native";
|
import { View, Text, FlatList, Pressable, StyleSheet } from "react-native";
|
||||||
import React from "react";
|
import React, { useState } from "react";
|
||||||
import CreateLyricsHeader from "./components/CreateLyricsHeader";
|
import CreateLyricsHeader from "./components/CreateLyricsHeader";
|
||||||
import { BlurView } from "expo-blur";
|
import { BlurView } from "expo-blur";
|
||||||
import { GOALS } from "../../data/data";
|
import { GOALS, SONG_STYLE } from "../../data/data";
|
||||||
import { Palette, Style } from "../../styles";
|
import { Palette, Style } from "../../styles";
|
||||||
import CustomInput from "./components/CustomInput";
|
import CustomInput from "./components/CustomInput";
|
||||||
import { FONT_FAMILY } from "../../styles/Fonts";
|
import { FONT_FAMILY } from "../../styles/Fonts";
|
||||||
import ItemContainer from "../../components/ItemContainer/ItemContainer";
|
import ItemContainer from "../../components/ItemContainer/ItemContainer";
|
||||||
|
|
||||||
const SongStyle = () => {
|
const SongStyle = () => {
|
||||||
|
const [selected, setSelected] = useState(null);
|
||||||
|
|
||||||
|
const onPressSelect = (item) => {
|
||||||
|
if (selected === item) {
|
||||||
|
setSelected(null);
|
||||||
|
} else {
|
||||||
|
setSelected(item);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View style={{ flex: 1, gap: 16, marginTop: 16 }}>
|
<View style={{ flex: 1, gap: 16, marginTop: 16 }}>
|
||||||
<View style={{ gap: 10 }}>
|
<View style={{ gap: 10 }}>
|
||||||
@@ -18,24 +28,42 @@ const SongStyle = () => {
|
|||||||
/>
|
/>
|
||||||
<ItemContainer>
|
<ItemContainer>
|
||||||
<FlatList
|
<FlatList
|
||||||
data={GOALS}
|
data={SONG_STYLE}
|
||||||
showsVerticalScrollIndicator={false}
|
showsVerticalScrollIndicator={false}
|
||||||
contentContainerStyle={styles.contentContainer}
|
contentContainerStyle={styles.contentContainer}
|
||||||
renderItem={({ item }) => (
|
renderItem={({ item }) => {
|
||||||
<Pressable style={styles.itemContainer}>
|
const selectedItem = selected === item.title;
|
||||||
<BlurView
|
|
||||||
intensity={30}
|
return (
|
||||||
style={{
|
<CreateLyricsHeader
|
||||||
flex: 1,
|
colors={
|
||||||
backgroundColor: Palette.glass,
|
selectedItem
|
||||||
paddingHorizontal: 14,
|
? ["#FFFFFF00", "#FFFFFF"]
|
||||||
...Style.containerCenter,
|
: [Palette.tran, Palette.tran]
|
||||||
|
}
|
||||||
|
tint={selectedItem ? "default" : "dark"}
|
||||||
|
onPress={() => onPressSelect(item.title)}
|
||||||
|
containerStyle={{
|
||||||
|
...styles.itemContainer,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Text style={styles.itemText}>{item}</Text>
|
<View style={{ paddingVertical: 6 }}>
|
||||||
</BlurView>
|
<Text
|
||||||
</Pressable>
|
style={{
|
||||||
)}
|
fontSize: 16,
|
||||||
|
color: Palette.white,
|
||||||
|
fontFamily: FONT_FAMILY.InterRegular,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Text style={{ fontFamily: FONT_FAMILY.InterBold }}>
|
||||||
|
{item.title}
|
||||||
|
</Text>{" "}
|
||||||
|
: {item.description}
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
</CreateLyricsHeader>
|
||||||
|
);
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</ItemContainer>
|
</ItemContainer>
|
||||||
</View>
|
</View>
|
||||||
@@ -58,10 +86,7 @@ const styles = StyleSheet.create({
|
|||||||
paddingBottom: 50,
|
paddingBottom: 50,
|
||||||
},
|
},
|
||||||
itemContainer: {
|
itemContainer: {
|
||||||
height: 54,
|
|
||||||
backgroundColor: Palette.glass,
|
|
||||||
borderRadius: 14,
|
borderRadius: 14,
|
||||||
overflow: "hidden",
|
|
||||||
shadowColor: "#00000040",
|
shadowColor: "#00000040",
|
||||||
shadowOffset: {
|
shadowOffset: {
|
||||||
width: 0,
|
width: 0,
|
||||||
|
|||||||
@@ -14,12 +14,14 @@ const CreateLyricsHeader = ({
|
|||||||
gradientProps,
|
gradientProps,
|
||||||
intensity = 40,
|
intensity = 40,
|
||||||
tint = "dark",
|
tint = "dark",
|
||||||
|
containerStyle = {},
|
||||||
|
onPress,
|
||||||
}) => {
|
}) => {
|
||||||
const [onLayout, setOnLayout] = useState(null);
|
const [onLayout, setOnLayout] = useState(null);
|
||||||
const { isWeb } = useLayoutType();
|
const { isWeb } = useLayoutType();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View>
|
<Pressable onPress={onPress}>
|
||||||
<BorderGradient
|
<BorderGradient
|
||||||
gradientProps={{
|
gradientProps={{
|
||||||
colors: colors,
|
colors: colors,
|
||||||
@@ -33,21 +35,21 @@ const CreateLyricsHeader = ({
|
|||||||
top: isWeb ? -1 : 0,
|
top: isWeb ? -1 : 0,
|
||||||
right: isWeb ? -1 : 0,
|
right: isWeb ? -1 : 0,
|
||||||
borderWidth: 1,
|
borderWidth: 1,
|
||||||
borderRadius: 18,
|
borderRadius: containerStyle?.borderRadius ?? 18,
|
||||||
position: "absolute",
|
position: "absolute",
|
||||||
width: "100%",
|
width: "100%",
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<Pressable
|
<View
|
||||||
style={{
|
style={{
|
||||||
backgroundColor: Palette.glass,
|
backgroundColor: Palette.glass,
|
||||||
borderRadius: 18,
|
borderRadius: 18,
|
||||||
overflow: "hidden",
|
overflow: "hidden",
|
||||||
|
...containerStyle,
|
||||||
}}
|
}}
|
||||||
onLayout={(event) => {
|
onLayout={(event) => {
|
||||||
setOnLayout(event.nativeEvent.layout);
|
setOnLayout(event.nativeEvent.layout);
|
||||||
}}
|
}}
|
||||||
onPress={() => console.log("PRESSED")}
|
|
||||||
>
|
>
|
||||||
<BlurView
|
<BlurView
|
||||||
intensity={intensity}
|
intensity={intensity}
|
||||||
@@ -82,8 +84,8 @@ const CreateLyricsHeader = ({
|
|||||||
)}
|
)}
|
||||||
{children}
|
{children}
|
||||||
</BlurView>
|
</BlurView>
|
||||||
</Pressable>
|
</View>
|
||||||
</View>
|
</Pressable>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||