Caroussel.vue 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. <!--
  2. Carrousel de la page d'accueil
  3. -->
  4. <template>
  5. <v-carousel
  6. ref="carousel"
  7. v-model="activeIndex"
  8. :show-arrows="false"
  9. :hide-delimiter-background="true"
  10. :show-delimiters="false"
  11. :touch="true"
  12. :height="lgAndUp ? 500 : 800"
  13. :interval="5000"
  14. >
  15. <v-carousel-item
  16. v-for="(item, index) in carouselItems"
  17. :key="index"
  18. >
  19. <v-row>
  20. <!-- Partie description (logo, description, bouton 'en savoir plus') -->
  21. <v-col cols="12" lg="6" class="col presentation">
  22. <v-img
  23. :src="item.logo"
  24. class="logo"
  25. />
  26. <p class="description" v-html="mdAndUp ? item.description : item.descriptionSm" />
  27. <v-row class="align-start pl-4">
  28. <v-btn
  29. :to="item.link"
  30. append-icon="fas fa-arrow-right"
  31. :class="['learn-more-btn', item.buttonClass]"
  32. >
  33. En savoir plus
  34. </v-btn>
  35. </v-row>
  36. </v-col>
  37. <!-- Partie Illustration -->
  38. <v-col cols="12" lg="6" class="col illustration">
  39. <v-row>
  40. <div
  41. class="background-rectangle"
  42. :style="{ backgroundColor: item.color }"
  43. />
  44. <v-card class="card" elevation="5">
  45. <v-img
  46. class="profile-image"
  47. :src="item.avatar"
  48. alt="Profile Image"
  49. contain
  50. rounded
  51. />
  52. <v-card-text>
  53. <v-card-title class="name">
  54. {{ item.name }}
  55. <p class="school">
  56. {{ item.school }}
  57. </p>
  58. </v-card-title>
  59. <p class="status">
  60. {{ item.status }}
  61. </p>
  62. </v-card-text>
  63. </v-card>
  64. <v-img
  65. :src="item.image"
  66. class="image"
  67. />
  68. </v-row>
  69. </v-col>
  70. </v-row>
  71. </v-carousel-item>
  72. <div class="custom-controls">
  73. <!--suppress JSUnusedLocalSymbols -->
  74. <div
  75. v-for="(_, index) in carouselItems"
  76. :key="index"
  77. :class="{ 'active-control': index === activeIndex }"
  78. @click="setActiveIndex(index)"
  79. />
  80. </div>
  81. </v-carousel>
  82. </template>
  83. <script setup lang="ts">
  84. import { useDisplay } from "vuetify";
  85. import type { CarouselItem } from "~/types/interface";
  86. const { smAndDown, mdAndDown, mdAndUp, lgAndUp } = useDisplay();
  87. // Index de la slide active
  88. let activeIndex: Ref<number> = ref(0);
  89. const setActiveIndex = (index: number) => {
  90. activeIndex.value = index;
  91. };
  92. const carouselItems: Ref<Array<CarouselItem>> = ref([
  93. {
  94. logo: "/images/logo/logiciels/School-noir.png",
  95. description:
  96. "Pour les petits comme pour les GRANDS établissements d’enseignement artistique tels que les écoles de musique, de danse, de théâtre, d'art, de cirque et conservatoire.<br> Il permet la gestion au quotidien et en temps réel de votre établissement, de gérer vos élèves et vos professeurs, vos emplois du temps, le suivi pédagogique, vos salles, la facturation et les encaissements…",
  97. descriptionSm:
  98. "Pour les petits comme pour les GRANDS établissements d’enseignement artistique tels que les écoles de musique, de danse, de théâtre, d'art, de cirque et conservatoire.",
  99. buttonClass: "btn-school",
  100. image:
  101. "/images/Home_logiciel/Logiciel_Opentalent_School-eleve-Conservatoire_de_Musique.png",
  102. color: "rgba(32, 147, 190, 0.4)",
  103. link: "/opentalent_school",
  104. name: "Cindy Blanchard",
  105. school: "Conservatoire de Musique",
  106. status: "élève",
  107. avatar: "/images/carousel/school/avatar.png",
  108. },
  109. {
  110. logo: "/images/logo/logiciels/Artist-noir.png",
  111. description:
  112. "Pour les structures culturelles pratiquantes telles que les orchestres, les chorales, les compagnies de danse, théâtre et cirque. <br> Gérez votre activité avec un logiciel de gestion et de communication au service de votre passion.",
  113. descriptionSm:
  114. "Pour les structures culturelles pratiquantes telles que les orchestres, les chorales, les compagnies de danse, théâtre et cirque.",
  115. buttonClass: "btn-artist",
  116. image:
  117. "/images/Home_logiciel/Logiciel_Opentalent_Artist-administrateur-Orchestre_d_harmonie.png",
  118. color: "rgba(250, 194, 10, 0.4)",
  119. link: "opentalent_artist",
  120. name: "Thierry Dupont ",
  121. school: "Orchestre d’harmonie",
  122. status: "Admin",
  123. avatar: "/images/carousel/artist/avatar.png",
  124. },
  125. {
  126. logo: "/images/logo/logiciels/Manager-noir.png",
  127. description:
  128. "La solution de mise en réseau des organisations culturelles.<br> Fédérations, confédérations et collectivités, utilisez une solution collaborative innovante et unique spécialement développée pour les réseaux culturels.",
  129. descriptionSm:
  130. "La solution de mise en réseau des organisations culturelles, telles que les fédérations, confédérations et collectivités.",
  131. buttonClass: "btn-manager",
  132. image:
  133. "/images/Home_logiciel/Logiciel_Opentalent_Managerl-Administrateur_Federation.png",
  134. color: "rgba(216, 5, 11, 0.4)",
  135. link: "opentalent_manager",
  136. name: "Marie Voisin",
  137. school: "Réseau d'organisations culturelles ",
  138. status: "ADMIN",
  139. avatar: "/images/carousel/manager/avatar.png",
  140. },
  141. ]);
  142. </script>
  143. <style scoped lang="scss">
  144. /* ============= CAROUSEL =============== */
  145. :deep(.v-carousel__controls) {
  146. display: none;
  147. }
  148. .custom-controls {
  149. position: absolute;
  150. top: 50%;
  151. right: 1vw;
  152. transform: translateY(-50%);
  153. display: flex;
  154. flex-direction: column;
  155. gap: 1vh;
  156. div {
  157. width: 0.6rem;
  158. height: 0.6rem;
  159. border-radius: 50%;
  160. background-color: var(--neutral-color-alt-strong);
  161. cursor: pointer;
  162. margin-bottom: 0.5rem;
  163. }
  164. .active-control {
  165. background-color: var(--on-neutral-color);
  166. margin-right: 2rem;
  167. }
  168. }
  169. /* ============= Colonne gauche - Description =============== */
  170. .col.presentation {
  171. .logo {
  172. width: 20rem;
  173. margin-top: 10px;
  174. margin-left: 6rem;
  175. @media (max-width: 600px) {
  176. width: 15rem;
  177. margin-left: 1rem;
  178. }
  179. }
  180. .description {
  181. text-align: justify;
  182. margin-top: 8px;
  183. margin-left: 7rem;
  184. width: 25vw;
  185. margin-bottom: 1rem;
  186. }
  187. .learn-more-btn {
  188. display: flex;
  189. align-items: center;
  190. margin-top: 16px;
  191. border-radius: 0.5rem;
  192. padding: 15px;
  193. gap: 9px;
  194. font-weight: 700;
  195. font-size: 0.7rem;
  196. line-height: 15px;
  197. width: 10rem;
  198. height: 2.5rem;
  199. margin-left: 7rem;
  200. @media (max-width: 600px) {
  201. width: 80%;
  202. margin: 15px auto;
  203. }
  204. }
  205. .learn-more-btn :deep(.v-btn__append) {
  206. color: var(--on-neutral-color);
  207. margin-left: 0;
  208. }
  209. .btn-school {
  210. background: var(--school-color-light);
  211. }
  212. .btn-artist {
  213. background: var(--artist-color-light);
  214. }
  215. .btn-manager {
  216. background: var(--manager-color-light);
  217. }
  218. @media (max-width: 1280px) {
  219. padding-bottom: 48px;
  220. min-height: 50%;
  221. .description {
  222. width: 80%;
  223. margin-left: auto;
  224. margin-right: auto;
  225. }
  226. }
  227. }
  228. /* ============= Colonne droite - Illustration =============== */
  229. .col.illustration {
  230. .card {
  231. position: relative;
  232. left: 10%;
  233. height: 100%;
  234. width: 27%;
  235. border-radius: 1rem;
  236. margin-top: 1rem;
  237. }
  238. .profile-image {
  239. width: 100%;
  240. height: 12vh;
  241. }
  242. .name {
  243. text-align: center;
  244. font-size: 0.9rem;
  245. white-space: normal;
  246. padding: 0 !important;
  247. }
  248. .school, .status {
  249. text-align: center;
  250. white-space: normal;
  251. }
  252. .school {
  253. color: var(--on-neutral-color-light);
  254. font-weight: normal !important;
  255. font-size: 0.8rem !important;
  256. margin-top: 0.2px;
  257. line-height: 1rem !important;
  258. }
  259. .status {
  260. text-transform: uppercase;
  261. font-weight: bold;
  262. color: var(--on-neutral-color);
  263. font-size: 100%;
  264. margin-top: 0.8rem;
  265. }
  266. .background-rectangle {
  267. position: absolute;
  268. width: 70%;
  269. height: 20rem;
  270. left: 72%;
  271. top: 50%;
  272. transform: translate(-50%, -50%);
  273. border-radius: 200px 0 0 15rem;
  274. z-index: -1;
  275. }
  276. .image {
  277. height: 35rem;
  278. right: 5rem;
  279. }
  280. @media (max-width: 1280px) {
  281. .background-rectangle {
  282. top: 60%;
  283. height: 14rem;
  284. }
  285. .image {
  286. height: 20rem;
  287. right: 0;
  288. }
  289. }
  290. }
  291. </style>