Skip to content

Commit 5dfb985

Browse files
committed
🎉 initial commit
1 parent 3f4324c commit 5dfb985

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+293
-19981
lines changed

LICENSE

Lines changed: 21 additions & 674 deletions
Large diffs are not rendered by default.

README.md

Lines changed: 23 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,105 +1,37 @@
1-
# Portfolio - Mathéo PICHOT-MOÏSE
1+
# 🚀 ORATIS
22

3-
Bienvenue sur mon portfolio ! Ce projet met en avant mes compétences, mes réalisations et mes services en tant que développeur passionné par les expériences interactives et le design innovant.
3+
## 📜 Description
44

5-
## 🎯 Objectif
5+
**ORATIS** est un groupe de développement créatif et innovant, dédié à la création de solutions technologiques avancées. Ce projet constitue le site web officiel du groupe, présentant son équipe, ses valeurs, et des informations clés.
66

7-
Ce site a pour but de :
8-
9-
- Présenter mon parcours et mes compétences techniques.
10-
- Mettre en avant mes projets en développement web, logiciels et intelligence artificielle.
11-
- Offrir un accès simple à mes services et à mon expertise.
12-
- Faciliter la prise de contact avec moi.
13-
14-
## 🌐 Démo
15-
16-
Vous pouvez consulter une démo en ligne de mon portfolio [ici](https://www.matheo-pichotmoise.fr)
17-
18-
## 🛠 Technologies Utilisées
19-
20-
Ce projet a été développé avec les technologies suivantes :
21-
22-
- **React.js** - Bibliothèque JavaScript pour la construction d'interfaces utilisateur dynamiques
23-
- **Material UI** - Composants React pour une interface utilisateur moderne
24-
- **CSS3 & Tailwind CSS** - Style et mise en page
25-
- **JavaScript (ES6+)** - Fonctionnalités interactives et animations avancées
26-
- **Framer Motion & GSAP** - Animations fluides et effets interactifs
27-
- **EmailJS** - Gestion de l'envoi des emails depuis le formulaire de contact
28-
29-
## 📌 Fonctionnalités
30-
31-
- **Interface immersive** avec animations modernes et interactions avancées.
32-
- **Sections dynamiques** : Accueil, À propos, Projets, Parcours, et Contact.
33-
- **Affichage interactif des projets** avec détails et animations.
34-
- **Formulaire de contact fonctionnel** avec envoi d'email via EmailJS.
35-
- **Optimisation mobile** pour une expérience fluide sur tous les supports.
36-
- **Navigation interactive** avec un menu fixe en version desktop et un menu bottom pour mobile.
37-
38-
## 📂 Structure du projet
7+
## 📂 Structure du Projet
398

409
```
41-
portfolio/
42-
├── public/
43-
│ ├── index.html # Fichier HTML principal
44-
├── src/
45-
│ ├── Components/ # Composants
46-
│ ├── Images/ # Ressources
47-
│ ├── Styles/ # Feuilles de style CSS
48-
│ ├── App.js # Composant principal
49-
│ ├── index.js # Point d'entrée de l'application React
50-
│ ├── data.js # Données des projets et informations personnelles
51-
│ ├── ScrollToTop.jsx # Gestion du scrolling dynamique
52-
├── .gitignore # Fichiers à ignorer par Git
53-
├── CNAME # Configuration du domaine personnalisé
54-
├── CODE_OF_CONDUCT.md # Code de conduite du projet
55-
├── CONTRIBUTING.md # Guide de contribution
56-
├── LICENSE # Licence du projet
57-
├── package-lock.json # Dépendances verrouillées
58-
├── package.json # Dépendances et scripts
59-
└── README.md # Documentation du projet
10+
ORATIS/
11+
├── assets/ # Contient les ressources multimédia (images, vidéos, icônes)
12+
├── bot/ # Contient les pages liées au bot (privacy, terms, etc.)
13+
│ ├── privacy.html # Politique de confidentialité
14+
│ ├── styles.css # Feuille de style pour la mise en page
15+
│ └── terms.html # Conditions d'utilisation
16+
├── CNAME # Nom de domaine personnalisé pour GitHub Pages
17+
├── docs.html # Documentation technique et utilisateur
18+
├── index.html # Page d'accueil du site ORATIS
19+
├── kuco.html # Page dédiée à Kuco (fondateur du projet)
20+
└── sadnesse.html # Page dédiée à SadNesse (collaborateur)
6021
```
6122

62-
## 🚀 Installation et Exécution
63-
64-
1. Cloner ce dépôt :
65-
```bash
66-
git clone https://github.com/KucoDEV/portfolio.git
67-
```
68-
2. Installer les dépendances :
69-
```bash
70-
cd portfolio
71-
npm install
72-
```
73-
3. Lancer l'application en local :
74-
```bash
75-
npm start
76-
```
77-
4. Accéder à (`http://localhost:3000`)[http://localhost:3000] dans votre navigateur.
23+
## 🌐 Site Web
7824

79-
## 🚢 Déploiement sur GitHub Pages
25+
📍 [**Lien**](https://www.oratis.fr)<br>📍 [**Documentation**](https://www.oratis.fr/docs)
8026

81-
1. Assurez-vous que `gh-pages` est bien installé et que les scripts suivants sont déjà ajoutés dans `package.json` :
82-
```json
83-
"scripts": {
84-
"predeploy": "npm run build",
85-
"deploy": "gh-pages -d build"
86-
}
87-
```
27+
## 🚀 Installation et Utilisation
8828

89-
2. Déployer le projet avec la commande :
90-
```bash
91-
npm run deploy
29+
1. Clonez ce repository :
30+
```sh
31+
git clone https://github.com/KucoDEV/ORATIS.git
9232
```
93-
94-
3. Configurer GitHub Pages :
95-
- Aller dans les paramètres du dépôt GitHub.
96-
- Accéder à la section **Pages**.
97-
- Vérifier que la branche `gh-pages` est bien sélectionnée comme source de déploiement.
33+
2. Ouvrez `index.html` dans votre navigateur pour accéder au site web localement.
9834

9935
## 📜 Licence
10036

101-
Ce projet est sous licence **GNU General Public License v3.0 (GPL-3.0)**.
102-
Vous êtes libre d'utiliser, modifier et distribuer ce projet tant que vous respectez les termes de la licence.
103-
Cela inclut notamment l'obligation de **rendre publiques les modifications** si vous redistribuez le projet.
104-
105-
Pour plus d’informations, consultez la licence complète ici : [GPL-3.0 License](https://www.gnu.org/licenses/gpl-3.0.html).
37+
Ce projet est sous licence MIT. Vous êtes libre de le modifier et de le redistribuer.

assets/background.mp3

2.38 MB
Binary file not shown.

assets/fonts/ROF.ttf

35.8 KB
Binary file not shown.

assets/github.png

778 Bytes
Loading

assets/scripts.js

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
/* =========================
2+
MEDIA
3+
========================= */
4+
const overlay = document.getElementById("overlay");
5+
const audio = document.getElementById("background-audio");
6+
const volumeIcon = document.getElementById("volume-icon");
7+
const volumeSlider = document.getElementById("volume");
8+
9+
function startMedia(){ overlay.classList.add("hidden"); audio?.play?.(); }
10+
function setVolume(v){
11+
v = Math.max(0, Math.min(1, Number(v)));
12+
if (audio) audio.volume = v;
13+
if (volumeIcon) volumeIcon.src = v > 0 ? "assets/vol_on.png" : "assets/vol_off.png";
14+
}
15+
function toggleMute(){ setVolume(((audio?.volume||0)>0)?0:1); if (volumeSlider) volumeSlider.value = (audio?.volume||0); }
16+
window.addEventListener("load", ()=>{ const v = Number(localStorage.getItem("vol")||0.5); setVolume(v); if (volumeSlider) volumeSlider.value = v; });
17+
if (volumeSlider) volumeSlider.addEventListener("input", e=>{ setVolume(e.target.value); localStorage.setItem("vol", e.target.value); });
18+
19+
/* =========================
20+
MAP / ZOOM
21+
========================= */
22+
const svg = document.getElementById("got-map");
23+
const panzoom = document.getElementById("panzoom");
24+
const backBtn = document.getElementById("back-btn");
25+
26+
let activeRegion = null;
27+
28+
function computeZoomToBBox(bbox, factor=0.82){
29+
const viewW = svg.clientWidth;
30+
const viewH = svg.clientHeight;
31+
const scale = Math.min((viewW*factor)/bbox.width, (viewH*factor)/bbox.height);
32+
const cx = bbox.x + bbox.width/2;
33+
const cy = bbox.y + bbox.height/2;
34+
const tx = (viewW/2) - (cx*scale);
35+
const ty = (viewH/2) - (cy*scale);
36+
return { scale, tx, ty };
37+
}
38+
39+
function zoomToRegion(regionEl){
40+
const bbox = regionEl.getBBox();
41+
const {scale, tx, ty} = computeZoomToBBox(bbox);
42+
panzoom.style.transform = `translate(${tx}px, ${ty}px) scale(${scale})`;
43+
// Reveal island info AFTER the zoom finishes
44+
setTimeout(()=>{
45+
regionEl.classList.add("active");
46+
activeRegion = regionEl;
47+
backBtn.classList.add("show");
48+
}, 650);
49+
}
50+
51+
function resetZoom(){
52+
panzoom.style.transform = `translate(0px, 0px) scale(1)`;
53+
if (activeRegion) activeRegion.classList.remove("active");
54+
activeRegion = null;
55+
backBtn.classList.remove("show");
56+
}
57+
58+
/* Enable: clicking island zooms + reveals in-island info (About/Contact);
59+
Projects also zooms, and only then cities become clickable */
60+
document.querySelectorAll(".region").forEach(region=>{
61+
region.addEventListener("click", ()=>{
62+
// If already active -> do nothing (let Back handle zoom out)
63+
if (activeRegion === region) return;
64+
// Reset current active region first
65+
if (activeRegion) { activeRegion.classList.remove("active"); }
66+
zoomToRegion(region);
67+
});
68+
});
69+
70+
/* Cities: only clickable when Projects island is the active region */
71+
const modal = document.getElementById("modal");
72+
const modalTitle = document.getElementById("modal-title");
73+
const modalBody = document.getElementById("modal-body");
74+
const modalClose = document.getElementById("modal-close");
75+
76+
function openModal(title, content){
77+
modalTitle.textContent = title;
78+
modalBody.innerHTML = content;
79+
modal.classList.add("open");
80+
}
81+
function closeModal(){ modal.classList.remove("open"); }
82+
83+
document.querySelectorAll(".city").forEach(city=>{
84+
city.addEventListener("click", (e)=>{
85+
e.stopPropagation();
86+
if (!activeRegion || activeRegion.dataset.key !== "projects") return;
87+
openModal(city.dataset.title, city.dataset.content);
88+
});
89+
});
90+
91+
modalClose.addEventListener("click", closeModal);
92+
93+
/* Global handlers */
94+
backBtn.addEventListener("click", ()=>{ closeModal(); resetZoom(); });
95+
window.addEventListener("keydown", (e)=>{ if (e.key === "Escape") { closeModal(); resetZoom(); }});
96+
window.addEventListener("resize", ()=>{ if (activeRegion){ const b = activeRegion.getBBox(); const {scale, tx, ty} = computeZoomToBBox(b); panzoom.style.transform = `translate(${tx}px, ${ty}px) scale(${scale})`; }});

assets/styles.css

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
*{margin:0;padding:0;box-sizing:border-box}
2+
html,body{height:100%;width:100%;overflow:hidden;background:#0b1220;color:#fff;font-family:sans-serif}
3+
4+
/* Overlay */
5+
#overlay{position:fixed;inset:0;z-index:1000;background:#000;display:flex;align-items:center;justify-content:center;cursor:pointer}
6+
#overlay.hidden{display:none}
7+
#overlay span{font:800 2.5rem sans-serif;color:#fff}
8+
9+
/* Controls */
10+
.controls{position:fixed;top:20px;left:20px;z-index:1001;display:flex;flex-direction:column;gap:14px}
11+
.volume-control,.github-link{display:flex;align-items:center;gap:10px;background:#0009;padding:8px;border-radius:12px}
12+
.volume-control img,.github-link img{width:28px;cursor:pointer}
13+
.volume-bar{max-width:0;overflow:hidden;opacity:0;transition:.3s}
14+
.volume-control:hover .volume-bar{max-width:150px;opacity:1}
15+
.volume-bar input{width:150px}
16+
17+
/* Back button */
18+
.back-btn{position:fixed;top:20px;right:20px;z-index:1001;background:#0009;color:#fff;border:none;padding:8px 14px;border-radius:8px;font-weight:700;cursor:pointer;display:none}
19+
.back-btn.show{display:block}
20+
21+
/* Map */
22+
.map-container{position:fixed;inset:0}
23+
#got-map{width:100%;height:100%}
24+
.panzoom{transform-origin:0 0;transition:transform .6s cubic-bezier(.22,.61,.36,1)}
25+
26+
.land{fill:#d1c7a3;stroke:#2f2a1f;stroke-width:3;cursor:pointer}
27+
.region:hover .land{filter:drop-shadow(0 0 10px #a78bfa)}
28+
29+
.region-label{font:800 46px sans-serif;fill:#fff;stroke:#000;stroke-width:3;text-anchor:middle;pointer-events:none}
30+
.poi-label{font:700 14px sans-serif;fill:#fff;text-shadow:0 1px 3px #000}
31+
32+
/* Modal (Projects cities) */
33+
.modal{position:fixed;inset:0;background:#000c;display:none;align-items:center;justify-content:center;z-index:1002}
34+
.modal.open{display:flex}
35+
.modal-content{background:#1e293b;padding:20px;border-radius:12px;max-width:500px;width:90%;color:#fff;position:relative}
36+
.modal-close{position:absolute;top:10px;right:10px;background:#000;color:#fff;border:none;border-radius:50%;width:28px;height:28px;cursor:pointer}
37+
#modal-title{font:700 24px sans-serif;margin-bottom:10px}
38+
#modal-body{font:500 16px sans-serif}
39+
#modal-body img{margin-top:10px;max-width:100%;border-radius:6px}
40+
41+
/* Info Panel (About/Contact) */
42+
.info-panel{position:fixed;top:0;right:0;height:100%;width:400px;background:#111827;transform:translateX(100%);transition:.4s ease;z-index:1003;padding:20px;overflow-y:auto}
43+
.info-panel.open{transform:translateX(0)}
44+
.panel-close{position:absolute;top:10px;left:10px;background:#000;color:#fff;border:none;border-radius:50%;width:28px;height:28px;cursor:pointer}
45+
#panel-title{font:700 28px sans-serif;margin-bottom:10px}
46+
#panel-body section{margin-bottom:20px}
47+
#panel-body h3{margin-bottom:6px;font-size:18px;font-weight:700}
48+
#panel-body ul{list-style:none;padding-left:0}
49+
#panel-body li{margin-bottom:4px}

assets/vol_off.png

3.92 KB
Loading

assets/vol_on.png

6.62 KB
Loading

index.html

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8"/>
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
6+
<title>Cyrex Realm — Mathéo</title>
7+
<link rel="stylesheet" href="assets/styles.css"/>
8+
</head>
9+
<body>
10+
<!-- Overlay -->
11+
<div id="overlay" onclick="startMedia()">
12+
<span>CLICK TO ENTER…</span>
13+
</div>
14+
15+
<!-- Controls -->
16+
<div class="controls">
17+
<div class="volume-control">
18+
<img id="volume-icon" src="assets/vol_on.png" alt="Volume" onclick="toggleMute()"/>
19+
<div class="volume-bar">
20+
<input id="volume" type="range" min="0" max="1" step="0.01" value="0.5" oninput="setVolume(this.value)"/>
21+
</div>
22+
</div>
23+
<div class="github-link">
24+
<a href="https://github.com/KucoDEV" target="_blank">
25+
<img src="assets/github.png" alt="GitHub"/>
26+
</a>
27+
</div>
28+
</div>
29+
30+
<!-- Back button -->
31+
<button id="back-btn" class="back-btn">⟵ Back</button>
32+
33+
<!-- Info Panel -->
34+
<aside id="info-panel" class="info-panel">
35+
<button id="panel-close" class="panel-close"></button>
36+
<h2 id="panel-title"></h2>
37+
<div id="panel-body"></div>
38+
</aside>
39+
40+
<!-- Modal (Projects cities) -->
41+
<div id="modal" class="modal">
42+
<div class="modal-content">
43+
<button id="modal-close" class="modal-close"></button>
44+
<h2 id="modal-title"></h2>
45+
<div id="modal-body"></div>
46+
</div>
47+
</div>
48+
49+
<!-- Map -->
50+
<div class="map-container">
51+
<svg id="got-map" viewBox="0 0 1600 900" xmlns="http://www.w3.org/2000/svg">
52+
<defs>
53+
<radialGradient id="sea" cx="50%" cy="50%" r="70%">
54+
<stop offset="0%" stop-color="#182a5a"/>
55+
<stop offset="100%" stop-color="#0b1220"/>
56+
</radialGradient>
57+
<g id="icon-city"><circle r="7" fill="#f8fafc" stroke="#111827" stroke-width="2"/></g>
58+
</defs>
59+
60+
<rect x="0" y="0" width="1600" height="900" fill="url(#sea)"/>
61+
62+
<g id="panzoom" class="panzoom">
63+
<!-- ABOUT ISLAND -->
64+
<g class="region panel-region" data-key="about" data-title="ABOUT">
65+
<path class="land" d="M250,500 C250,330 470,260 650,300 C800,330 880,460 850,600 C820,740 640,800 470,760 C300,720 250,640 250,500 Z"/>
66+
<text class="region-label" x="520" y="480">ABOUT</text>
67+
</g>
68+
69+
<!-- PROJECTS ISLAND -->
70+
<g class="region" data-key="projects">
71+
<path class="land" d="M900,250 C900,170 1080,120 1240,180 C1360,230 1380,350 1260,400 C1140,440 980,400 920,320 C900,300 900,280 900,250 Z"/>
72+
<text class="region-label" x="1100" y="280">PROJECTS</text>
73+
74+
<g class="city" data-title="Project 1" data-content="<p>Placeholder Project 1</p><img src='https://via.placeholder.com/300x150?text=Project+1'/>" transform="translate(1020,330)">
75+
<use href="#icon-city"/><text class="poi-label" x="12" y="-10">Project 1</text>
76+
</g>
77+
<g class="city" data-title="Project 2" data-content="<p>Placeholder Project 2</p><img src='https://via.placeholder.com/300x150?text=Project+2'/>" transform="translate(1150,340)">
78+
<use href="#icon-city"/><text class="poi-label" x="12" y="-10">Project 2</text>
79+
</g>
80+
<g class="city" data-title="Project 3" data-content="<p>Placeholder Project 3</p><img src='https://via.placeholder.com/300x150?text=Project+3'/>" transform="translate(1060,380)">
81+
<use href="#icon-city"/><text class="poi-label" x="12" y="-10">Project 3</text>
82+
</g>
83+
<g class="city" data-title="Project 4" data-content="<p>Placeholder Project 4</p><img src='https://via.placeholder.com/300x150?text=Project+4'/>" transform="translate(1200,310)">
84+
<use href="#icon-city"/><text class="poi-label" x="12" y="-10">Project 4</text>
85+
</g>
86+
</g>
87+
88+
<!-- CONTACT ISLAND -->
89+
<g class="region panel-region" data-key="contact" data-title="CONTACT">
90+
<path class="land" d="M1100,600 C1100,500 1240,480 1360,520 C1450,560 1480,660 1400,720 C1320,780 1180,780 1120,720 C1100,700 1100,650 1100,600 Z"/>
91+
<text class="region-label" x="1260" y="600">CONTACT</text>
92+
</g>
93+
</g>
94+
</svg>
95+
</div>
96+
97+
<!-- Media -->
98+
<audio id="background-audio" loop>
99+
<source src="assets/background.mp3" type="audio/mpeg"/>
100+
</audio>
101+
102+
<script src="assets/scripts.js"></script>
103+
</body>
104+
</html>

0 commit comments

Comments
 (0)