+
+
- {/* Columna derecha: Fines */}
-
);
diff --git a/frontend/src/pages/AdvancedMode.jsx b/frontend/src/pages/AdvancedMode.jsx
index 1ed2711..8ae287b 100644
--- a/frontend/src/pages/AdvancedMode.jsx
+++ b/frontend/src/pages/AdvancedMode.jsx
@@ -1,4 +1,4 @@
-import React, { useState } from 'react';
+import React, { useState, useEffect, useRef } from 'react';
import CriterionInput from '../components/CriterionInput';
import CardEditor from '../components/CardEditor';
import BlankCardsCounter from '../components/BlankCardsCounter';
@@ -22,6 +22,28 @@ export default function AdvancedMode() {
// Estado para controlar la lupa (Zoom)
const [isZoomActive, setIsZoomActive] = useState(true);
+ // Medición exacta con Refs
+ const containerRef = useRef(null);
+ const tableRef = useRef(null);
+ const [dimensions, setDimensions] = useState({ container: 1000, table: 0 });
+
+ useEffect(() => {
+ const updateMeasurements = () => {
+ if (containerRef.current && tableRef.current) {
+ setDimensions({
+ container: containerRef.current.offsetWidth,
+ table: tableRef.current.scrollWidth
+ });
+ }
+ };
+ const timeoutId = setTimeout(updateMeasurements, 50);
+ window.addEventListener('resize', updateMeasurements);
+ return () => {
+ clearTimeout(timeoutId);
+ window.removeEventListener('resize', updateMeasurements);
+ };
+ }, [levels, blankCards, step]);
+
// Estados Fase 2 (Franjas)
const [baseScale, setBaseScale] = useState({});
const [selectedTerm, setSelectedTerm] = useState(null);
@@ -56,7 +78,6 @@ export default function AdvancedMode() {
} catch (error) { alert("Error: " + error); } finally { setIsLoading(false); }
};
- // Manejadores de Franjas
const updateCurrentMf = (field, value) => {
if (!selectedTerm) return;
let numValue = parseFloat(value);
@@ -64,7 +85,6 @@ export default function AdvancedMode() {
setMfDefinitions(prev => {
const scaleKeys = Object.keys(baseScale);
const selectedIndex = scaleKeys.indexOf(selectedTerm);
-
let prevCoreEnd = 0, prevSupportEnd = 0, nextCoreStart = 1, nextSupportStart = 1;
if (selectedIndex > 0) {
@@ -100,66 +120,62 @@ export default function AdvancedMode() {
const scaleKeys = Object.keys(baseScale);
const selectedColor = COLORS[scaleKeys.indexOf(selectedTerm) % COLORS.length] || '#2563eb';
- const totalElements = levels.length;
- const dynamicScale = totalElements > 6 ? 6.2 / totalElements : 1;
- const currentScale = isZoomActive ? Math.max(0.4, dynamicScale) : 1;
+ const needsZoom = dimensions.table > dimensions.container;
+ const dynamicScale = needsZoom ? (dimensions.container / dimensions.table) * 0.95 : 1;
+ const currentScale = isZoomActive && needsZoom ? dynamicScale : 1;
return (
{/* PASO 1 */}
{step === 1 && (
-
+
-
-
+
+
Paso 1: Escala de Referencia (Mesa)
-
- {totalElements > 6 && (
-
-
-
-
- {levels.map((level, index) => (
-
- 3} />
-
- {index < levels.length - 1 && (
-
- )}
-
- ))}
+
+
+
+
+ {levels.map((level, index) => (
+
+
+
+ 3} />
+
+
+ {index < levels.length - 1 && (
+
+ )}
+
+ ))}
+
+
+
+
+
+
+
-
-
+
+
{isLoading ? 'Calculando...' : 'Generar Gráfica Continua'}
@@ -168,19 +184,19 @@ export default function AdvancedMode() {
{/* PASO 2 */}
{step === 2 && (
-
-
-
Paso 2: Modelar Conceptos Difusos
-
setStep(1)} className="text-slate-500 hover:text-blue-600 font-semibold underline">← Volver a las cartas
+
+
+
Paso 2: Modelar Conceptos Difusos
+ setStep(1)} className="text-slate-500 hover:text-blue-600 text-sm font-semibold underline">← Volver a las cartas
-
+
{scaleKeys.map((name, index) => {
const color = COLORS[index % COLORS.length];
const isSelected = selectedTerm === name;
return (
-
setSelectedTerm(name)} style={isSelected ? { backgroundColor: color, borderColor: color, color: '#fff' } : { borderColor: color, color: '#475569' }} className={`px-6 py-3 rounded-xl font-bold border-2 transition-all duration-300 flex flex-col items-center shadow-sm hover:shadow-md ${isSelected ? 'transform scale-105' : 'bg-white opacity-80 hover:opacity-100'}`}>
- {name}(X: {baseScale[name].toFixed(2)})
+ setSelectedTerm(name)} style={isSelected ? { backgroundColor: color, borderColor: color, color: '#fff' } : { borderColor: color, color: '#475569' }} className={`px-5 py-2 rounded-lg font-bold border-2 transition-all duration-300 flex flex-col items-center shadow-sm hover:shadow-md ${isSelected ? 'transform scale-105' : 'bg-white opacity-80 hover:opacity-100'}`}>
+ {name}(X: {baseScale[name].toFixed(2)})
);
})}
@@ -188,16 +204,10 @@ export default function AdvancedMode() {
-
-
-
+
+
+
+
Guardar Todo el Espectro Difuso
diff --git a/frontend/src/routers/AppRouter.jsx b/frontend/src/routers/AppRouter.jsx
index b59dc41..3259cfb 100644
--- a/frontend/src/routers/AppRouter.jsx
+++ b/frontend/src/routers/AppRouter.jsx
@@ -1,21 +1,16 @@
-import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom';
-import BasicMode from '../pages/BasicMode';
+import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom';
+import MainLayout from '../components/layout/MainLayout';
import AdvancedMode from '../pages/AdvancedMode';
-import { MainLayout } from '../components/layout/MainLayout';
-export const AppRouter = () => {
+export function AppRouter() {
return (
-
-
-
- }>
- } />
- } />
-
-
- } />
-
-
-
+
+
+ }>
+ } />
+ } />
+
+
+
);
-};
\ No newline at end of file
+}
\ No newline at end of file