diff --git a/src/pages/app/Services.jsx b/src/pages/app/Services.jsx
index beb095a..28dfef1 100644
--- a/src/pages/app/Services.jsx
+++ b/src/pages/app/Services.jsx
@@ -1,45 +1,347 @@
import { useState, useEffect } from 'react';
-import { getMyServices, getServiceDetails, getHostingServiceDetails, resetHostingPassword, launchSSOGateway } from '../../services/api';
+import { getMyServices, getServiceDetails, getHostingServiceDetails, resetHostingPassword } from '../../services/api';
import { useVPC } from '../../services/useVPC';
-import { Server, Database, Cloud, Globe, Folder, Trash2, ExternalLink, Loader, Plus } from 'lucide-react';
+import { Server, Database, Cloud, Globe, Folder, Trash2, ExternalLink, Loader, Plus, Play } from 'lucide-react';
+// ============================================================================
+// COMPOSANT ISOLÉ : INSTANCE CARD
+// ============================================================================
+const InstanceCard = ({ service, vpcs, onAssignVpc, onRemoveVpc, onOpenConsole, isConnecting }) => {
+ const titleLower = (service.title || '').toLowerCase();
+ const isVPS = titleLower.includes('vps') || titleLower.includes('compute');
+ const isCloud = titleLower.includes('cloud') || titleLower.includes('nextcloud');
+ const isDB = titleLower.includes('db') || titleLower.includes('base') || titleLower.includes('sql');
+
+ // Vérification de l'état d'initialisation pour le VPS
+ const hasIP = service.hostingDetails?.ip && service.hostingDetails.ip !== '127.0.0.1' && service.hostingDetails.ip !== '';
+
+ // ------------------------------------------------------------------------
+ // DESIGN DES BOUTONS PAR TYPE DE SERVICE
+ // ------------------------------------------------------------------------
+ let buttonText = "CONSOLE D'ADMINISTRATION";
+ let ButtonIcon = ExternalLink;
+ let buttonStyle = "bg-cyan-400/10 hover:bg-cyan-400 text-cyan-400 hover:text-gray-900 border-cyan-400";
+
+ if (isVPS) {
+ if (hasIP) {
+ buttonText = "GÉRER L'INSTANCE";
+ ButtonIcon = ExternalLink;
+ } else {
+ buttonText = "INITIALISATION";
+ ButtonIcon = Play;
+ buttonStyle = "bg-yellow-500/10 text-yellow-500 hover:bg-yellow-500 hover:text-gray-900 border-yellow-500/50";
+ }
+ } else if (isCloud) {
+ buttonText = "ACCÉDER AU CLOUD";
+ ButtonIcon = ExternalLink;
+ buttonStyle = "bg-blue-400/10 hover:bg-blue-400 text-blue-400 hover:text-gray-900 border-blue-400";
+ } else if (isDB) {
+ buttonText = "PHPMYADMIN / CLUSTER";
+ ButtonIcon = Database;
+ buttonStyle = "bg-purple-400/10 hover:bg-purple-400 text-purple-400 hover:text-gray-900 border-purple-400";
+ }
+
+ const getServiceIcon = () => {
+ if (isVPS) return
+ {displayDomain} +
+ ) : ( ++ Non configuré +
+ )} +• Utilisateur: root
+• Pass: NexusGise2026! (à modifier)
+• Utilisateur: root
+• Pass: mot de passe d'initialisation
+Chargement du moteur xterm.js...
+Identifiant : root
+Mot de passe : Celui d'initialisation
+{service.domain || `ID: #${service.id}`}
-- Le pare-feu HestiaCP bloque les injections de session directes. Un mot de passe de session jetable vient d'être généré sur le métal. Copiez-le et connectez-vous. -
- +Le pare-feu HestiaCP bloque les injections de session directes. Un mot de passe de session jetable vient d'être généré sur le métal. Copiez-le et connectez-vous.
+ Configuration système : Ubuntu 26.04 LTS (Docker Ready) +
+ ++ Ce serveur est maintenant rattaché à votre compte. Vous pouvez vous y connecter en SSH via l'IP ou le domaine (une fois les DNS propagés). +
+PROVISIONNEMENT EN COURS...
+Votre serveur est en cours d'assemblage sur le VLAN 60. Cela prend environ 10 secondes.
+Votre VPS est prêt à être instancié !
+La facturation est activée. Veuillez configurer les accès initiaux pour lancer la création sur l'infrastructure (VLAN 60).
+