agrupando logica en componentes

master
dev 1 year ago
parent d38ff4469f
commit 5f65fa1f88

Before

Width:  |  Height:  |  Size: 1.8 MiB

After

Width:  |  Height:  |  Size: 1.8 MiB

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

@ -6,7 +6,8 @@
import ConfiguradorView from "./lib/components/ConfiguradorView.svelte";
// Asumo que tienes un TestTailwind.svelte por la versión anterior
import TestTailwind from "./lib/components/test/TestTailwind.svelte";
import MaterialesView from "./lib/components/MaterialesView.svelte";
import SeleccionadosView from "./lib/components/SeleccionadosView.svelte";
import ModalWindow from "./lib/components/ModalWindow.svelte";
let activeSection = $state<ActiveSection>('proyecto')
@ -22,7 +23,7 @@
<!-- 1. Contenedor principal: min-h-screen y flex-col para forzar la estructura vertical -->
<main class="h-screen bg-gray-50 flex flex-col h-full">
<main class="bg-gray-50 flex flex-col h-screen">
<!-- Navegación: Ancho fijo (h-16), se mantiene arriba -->
<Navegacion {activeSection} onSectionChange={handleSectionChange} />
@ -37,12 +38,12 @@
<ConfiguradorView />
{:else}
<MaterialesView/>
{:else if activeSection === 'materiales'}
<SeleccionadosView />
{/if}
</div>
</main>
</main>
<ModalWindow />

@ -10,6 +10,7 @@ body {
min-height: 100%; /* O usa min-height: 100vh; para viewport directo */
margin: 0;
padding: 0;
overflow: hidden;
}

@ -54,19 +54,17 @@ export const proyecto : Proyecto = {
nombre : "Mueble Madera",
ref : 'mueble_roble',
thumb : './imgs/quaddro2/mat/tn_mueble_roble.jpg',
imagen : './imgs/quaddro2/mat/mueble_roble.jpg'
imagen : 'null'
},
'mueble_blanco' : {
nombre : 'Mueble Blanco',
ref : 'mueble_blanco',
thumb : './imgs/quaddro2/mat/tn_mueble_blanco.jpg',
imagen : './imgs/quaddro2/mat/mueble_blanco.jpg'
},
'mueble_topo' : {
nombre : 'Mueble_Blanco',
ref : 'mueble_topo',
thumb : './imgs/quaddro2/mat/tn_mueble_topo.jpg',
imagen : './imgs/quaddro2/mat/mueble_topo.jpg'
},
'ducha_viggo_roble' : {
nombre : 'Ducha Viggo Roble',
@ -80,29 +78,39 @@ export const proyecto : Proyecto = {
thumb : './imgs/quaddro2/mat/tn_ducha_viggo_fresno.jpg',
imagen : './imgs/quaddro2/mat/ducha_viggo_fresno.jpg'
},
'ducha_madera': {
nombre : 'Ducha Madera',
ref : 'ducha_madera',
thumb : './imgs/quaddro2/mat/tn_ducha_madera.jpg',
imagen : './imgs/quaddro2/mat/ducha_madera.jpg'
},
'alicatado_agar' : {
nombre : 'Alicatado Agar Mate',
ref : 'alicatado_agar',
thumb : './imgs/quaddro2/mat/tn_alicatado_agar_mate.jpg',
imagen : './imgs/quaddro2/mat/alicatado_agar_mate.jpg'
},
'madera_palilleria' : {
'reves_palilleria' : {
nombre : 'Palilleria',
ref : 'reves_palilleria',
thumb : './imgs/quaddro2/mat/tn_reves_palilleria.jpg',
imagen : './imgs/quaddro2/mat/reves_palilleria.jpg'
},
'reves_sinpalilleria' : {
nombre : 'Palilleria',
ref : 'madera_palilleria',
thumb : './imgs/quaddro2/mat/tn_madera_palilleria.jpg',
imagen : './imgs/quaddro2/mat/madera_palilleria.jpg'
ref : 'reves_palilleria',
thumb : './imgs/quaddro2/mat/tn_reves_sinpalilleria.png',
},
'ducha' : {
nombre : 'Baño con Ducha',
ref : 'ducha',
thumb : './imgs/quaddro2/mat/tn_ducha.jpg',
imagen : './imgs/quaddro2/mat/ducha.jpg'
},
'banera' : {
nombre : 'Baño con Bañera',
ref : 'banera',
thumb : './imgs/quaddro2/mat/tn_banera.jpg',
imagen : './imgs/quaddro2/mat/banera.jpg'
},
},
@ -181,12 +189,12 @@ export const proyecto : Proyecto = {
{
nombre : 'Sin Palilleria',
value : 'resi',
material: null,
material: 'reves_sinpalilleria',
},
{
nombre : 'Con Palilleria',
value : 'repa',
material: 'madera_palilleria',
material: 'reves_palilleria',
}
]
},
@ -240,7 +248,7 @@ export const proyecto : Proyecto = {
opciones: [
{
nombre : 'Imitación Madera',
material: null,
material: 'ducha_madera',
value : 'alma',
},
{
@ -275,7 +283,7 @@ export const proyecto : Proyecto = {
imagen : null,
opciones: [
{
nombre : 'Disposiciones',
nombre : 'Formato',
opciones: [
{
nombre: 'Con Ducha',

@ -34,7 +34,7 @@ export interface Material {
export interface Opcion {
nombre : string;
value : string;
material: string|null;
material: string;
texto? : string;
}

@ -0,0 +1,60 @@
<script lang="ts">
import {appState, getAvailableGroups, imageSrc, selectedAdds, selections} from "../stores/sel.svelte";
import { openModal } from "../stores/modal.svelte";
import {proyecto} from "../../data/data_proyecto";
import BotonModalMaterial from "./BotonModalMaterial.svelte";
let { estancia, border } = $props<{ estancia : string, border: boolean | undefined }>();
</script>
<!-- RESUMEN DE ACABADOS -->
<div class="mt-6 p-4 bg-blue-50 border-gray-400"
class:border={border}
class:border-gray-400={border}
>
<!-- OPCIONES -->
<h5 class="text-xs text-left font-medium text-gray-800 mb-2 uppercase tracking-wide">Acabados Seleccionados</h5>
<div class="space-y-1 mb-4 min-h-[5rem]
">
{#each getAvailableGroups(estancia) as grupo}
<div class="flex justify-between text-xs text-gray-800">
<span class="text-gray-600">{grupo.nombre}</span>
{#each grupo.opciones as opcion}
{#if selections[estancia]?.[grupo.nombre] === opcion.value}
{#if proyecto.materiales[opcion.material]?.imagen }
<BotonModalMaterial nombre={opcion.nombre} titulo={opcion.nombre} imagen={proyecto.materiales[opcion.material].imagen} />
{:else}
<span class="font-medium text-gray-900">{opcion.nombre}</span>
{/if}
{/if}
{/each}
</div>
{/each}
</div>
<!-- ADDS -->
{#if proyecto.estancias[estancia].adds && Object.values(selectedAdds[estancia] ?? {}).some(value => value)}
{@const adds = proyecto.estancias[estancia].adds }
<div>
<h5 class="text-xs font-medium text-left text-gray-800 uppercase tracking-wide">Otras Opciones</h5>
<div class="space-y-1 text-right pt-2">
{#each Object.entries(adds) as [addKey, add]}
{#if selectedAdds[estancia][addKey] }
<BotonModalMaterial nombre={add.nombre} titulo={add.nombre} imagen={add.imagen} />
{/if}
{/each}
</div>
</div>
{/if}
</div>

@ -1,14 +0,0 @@
<script lang="ts">
// Eliminamos 'content' ya que se usa <slot/> y solo requerimos 'title'
let {title} = $props<{
title: string;
}>();
</script>
<div class="hidden lg:block">
<div class="w-80 bg-white shadow-xl border-l border-gray-200 flex flex-col h-full overflow-hidden">
<slot />
</div>
</div>

@ -18,8 +18,8 @@
type="button"
class="group relative p-2 rounded-lg border transition-all duration-200
{seleccionada
? 'border-primary-500 bg-blue-50 ring-1 ring-blue-500'
: 'border-gray-200 hover:border-gray-400'
? 'border-blue-200 bg-blue-50 ring-1 ring-blue-400'
: 'border-gray-400 hover:border-gray-600'
}"
aria-pressed={seleccionada}
onclick={onclick}
@ -30,6 +30,7 @@
<p class="text-xs text-center font-medium text-gray-700 leading-tight">{nombre}</p>
{#if seleccionada}
<div class="absolute -top-1 -right-1 w-5 h-5 bg-blue-600 rounded-full flex items-center justify-center shadow-md">
<svg class="w-3 h-3 text-white" fill="currentColor" viewBox="0 0 20 20">

@ -9,20 +9,14 @@
<button type="button"
class="w-full text-left p-2 rounded-lg border transition-all duration-200 text-primary-700"
class:border-blue-500={seleccionada}
class:border-blue-300={seleccionada}
class:bg-blue-50={seleccionada}
class:border-gray-300={!seleccionada}
class:bg-gray-50={!seleccionada}
onclick={onclick}
>
<div class="flex items-center space-x-3">
<!--
<div class="flex-shrink-0">
<img src="https://placehold.co/32x32" alt="Espacio Principal" class="w-6 h-6 object-cover rounded border">
</div>
-->
<div class="flex-1 min-w-0">
<div class="flex-1 min-w-0">
<p class="text-sm font-medium truncate">{ nombre }</p>
</div>
{#if seleccionada }

@ -0,0 +1,24 @@
<script lang="ts">
import {openModal} from "../stores/modal.svelte";
let { nombre, titulo, imagen } = $props <{
nombre: string;
titulo: string;
imagen?: string;
}>();
</script>
<div role="button"
tabindex="0"
class="group flex items-center justify-between p-2 rounded-lg bg-cyan-100 hover:bg-cyan-400 cursor-pointer transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-cyan-500 text-gray-900 hover:text-white"
onclick={() => { openModal(imagen , titulo ?? 'Sin Nombre'); }}
onkeydown={(e) => { if (e.key === 'Enter' || e.key === 'Space') { openModal(imagen ?? 'https://placehold.co/400x400', titulo ?? 'Sin Nombre'); } }}
>
<span class="text-xs font-medium">{nombre ?? 'Sin Nombre'}</span>
</div>

@ -1,50 +1,23 @@
<script lang="ts">
import BarraLateral from "../components/BarraLateral.svelte";
import BotonAcabado from "./BotonAcabado.svelte";
import BotonEstancia from "./BotonEstancia.svelte";
import {selections, appState, getAvailableGroups, imageSrc, selectedAdds} from '../stores/sel.svelte';
import { openModal } from "../stores/modal.svelte";
import { selections, appState, getAvailableGroups, imageSrc, selectedAdds } from '../stores/sel.svelte.js';
import { proyecto } from '../../data/data_proyecto';
import {onMount} from "svelte";
import {empresaData} from "../../data/data_empresa.js";
import {proyecto} from '../../data/data_proyecto';
import AcabadosEstancia from "./AcabadosEstancia.svelte";
const DEFAULT_IMAGE = "https://placehold.co/80x40/cccccc/333333?text=N/A";
function handleKeydown(event : KeyboardEvent) : void {
if (modalInfo && event.key === 'Escape') {
closeModal();
}
}
onMount(() => {
document.addEventListener('keydown', handleKeydown);
});
// Use $state for modal state in Svelte 5
let modalInfo = $state<{ texto : string, imagen: string} | null>()
// Function to open modal with image
function openModal(imagen: string, texto: string) {
modalInfo = { imagen,texto }
}
// Function to close modal
function closeModal() {
modalInfo = null
}
const handleModalClick = (e : MouseEvent) => {
e.stopPropagation();
};
</script>
</script>
<div class="h-full bg-gray-50 flex justify-center">
<div class="h-screen bg-gray-50 flex justify-center">
<!-- IMAGEN CENTRAL -->
<div class="flex-1 h-full p-4 sm:p-6 bg-white rounded-l-xl shadow-lg border-r border-gray-200">
<img
src={imageSrc()[appState.estanciaSeleccionada]}
@ -53,145 +26,98 @@
/>
</div>
<BarraLateral title="Opciones de Personalización">
<div class="p-4 border-b bg-gray-50">
<div>
<h2 class="text-lg font-semibold text-gray-900 mb-1">Estancias</h2>
<p class="text-sm mb-4 text-gray-600">Seleccione la estancia a configurar</p>
</div>
<div class="space-y-2">
{#each Object.keys(proyecto.estancias) as estanciaKey}
<!-- ASIDE DERECHA CON BARRA SCROOL -->
<div class="hidden lg:block h-full min-h-0">
<div class="w-80 bg-white shadow-xl border-l border-gray-200 flex flex-col h-full overflow-hidden">
<div class="p-4 border-b bg-gray-50 border-gray-300">
<div>
<h2 class="text-lg font-semibold text-gray-900 mb-1">Estancias</h2>
<p class="text-sm mb-4 text-gray-600">Seleccione la estancia a configurar</p>
</div>
<div class="space-y-2">
{#each Object.keys(proyecto.estancias) as estanciaKey}
<BotonEstancia seleccionada={appState.estanciaSeleccionada === estanciaKey}
onclick={() => (appState.estanciaSeleccionada = estanciaKey)}
nombre={proyecto.estancias[estanciaKey].nombre}
onclick={() => (appState.estanciaSeleccionada = estanciaKey)}
nombre={proyecto.estancias[estanciaKey].nombre}
/>
{/each}
{/each}
</div>
</div>
</div>
<div class="flex-1 overflow-y-auto p-4">
<div class="flex-1 overflow-y-auto p-4 mb-20">
<div>
<h2 class="text-sm font-medium text-gray-900 mb-1 uppercase tracking-wide">Opciones para {proyecto.estancias[appState.estanciaSeleccionada].nombre}</h2>
<p class="text-sm text-gray-600 mb-4">Seleccione los acabados y materiales</p>
<h2 class="text-sm font-medium text-gray-900 mb-1 uppercase tracking-wide">Opciones
para {proyecto.estancias[appState.estanciaSeleccionada].nombre}</h2>
<p class="text-sm text-gray-600 mb-4">Seleccione los acabados y materiales</p>
</div>
{#each getAvailableGroups(appState.estanciaSeleccionada) as grupo}
<div class="mb-6"><h4 class="text-sm font-medium text-gray-800 mb-3">{grupo.nombre}</h4>
<div class="grid grid-cols-2 gap-2">
{#each grupo.opciones as opcion }
<BotonAcabado
nombre={opcion.nombre}
imagenSrc={proyecto.materiales[opcion?.material]?.thumb || DEFAULT_IMAGE }
seleccionada={selections[appState.estanciaSeleccionada]?.[grupo.nombre] === opcion.value}
onclick={() => { selections[appState.estanciaSeleccionada][grupo.nombre] = opcion.value; }}
/>
{/each}
</div>
</div>
{/each}
{#if proyecto.estancias[appState.estanciaSeleccionada].adds}
{@const adds = proyecto.estancias[appState.estanciaSeleccionada].adds }
{#if adds && typeof adds === 'object' && !Array.isArray(adds) }
<div class="mt-8 border-t border-gray-200 pt-6">
<h3 class="text-sm font-medium text-gray-700 mb-4 uppercase tracking-wide">Otras Opciones</h3>
<div class="space-y-4">
{#each Object.entries(adds) as [addKey, add]}
<div class="bg-white rounded-lg shadow-sm p-4 space-y-3">
<label class="flex items-center cursor-pointer group">
<input
type="checkbox"
checked={selectedAdds[appState.estanciaSeleccionada]?.[addKey] ?? false}
onchange={() => (selectedAdds[appState.estanciaSeleccionada][addKey] = !selectedAdds[appState.estanciaSeleccionada][addKey])}
class="w-5 h-5 text-blue-600 border-gray-300 rounded focus:ring-blue-500"
/>
<span class="ml-3 text-sm font-medium text-gray-800 group-hover:text-gray-900">{add.nombre}</span>
</label>
<button
type="button"
class="p-0 border-none bg-transparent cursor-pointer"
onclick={() => openModal(add.imagen,add.nombre,)}
>
<img
src={add.thumb}
alt={`Vista previa de ${add.nombre}`}
class="mt-2 w-[100px] h-[100px] object-cover rounded-lg shadow-md hover:opacity-90 transition-opacity duration-200"
/>
</button>
</div>
{#each getAvailableGroups(appState.estanciaSeleccionada) as grupo}
<div class="mb-6"><h4 class="text-sm font-medium text-gray-800 mb-3">{grupo.nombre}</h4>
<div class="grid grid-cols-2 gap-2">
{#each grupo.opciones as opcion }
<BotonAcabado
nombre={opcion.nombre}
imagenSrc={opcion.material && proyecto.materiales[opcion.material]?.thumb || DEFAULT_IMAGE }
seleccionada={selections[appState.estanciaSeleccionada]?.[grupo.nombre] === opcion.value}
onclick={() => { selections[appState.estanciaSeleccionada][grupo.nombre] = opcion.value; }}
/>
{/each}
</div>
</div>
{/if}
{/if}
{/each}
<div class="mt-6 p-3 bg-gray-50 rounded-lg border">
<h5 class="text-xs font-medium text-gray-800 mb-2 uppercase tracking-wide">Acabados
Seleccionados</h5>
<div class="space-y-1">
<div class="flex items-center justify-between text-xs">
<span class="text-gray-600">Pavimentos:</span>
<span class="font-medium text-gray-900">Cerámico Gris</span>
{#if proyecto.estancias[appState.estanciaSeleccionada].adds}
{@const adds = proyecto.estancias[appState.estanciaSeleccionada].adds }
{#if adds && typeof adds === 'object' && !Array.isArray(adds) }
<div class="mt-8 border-t border-gray-200 pt-6">
<h3 class="text-sm font-medium text-gray-700 mb-4 uppercase tracking-wide">Otras
Opciones</h3>
<div class="space-y-4">
{#each Object.entries(adds) as [addKey, add]}
<div class="bg-white rounded-lg shadow-sm p-4 space-y-3">
<label class="flex items-center cursor-pointer group">
<input
type="checkbox"
checked={selectedAdds[appState.estanciaSeleccionada]?.[addKey] ?? false}
onchange={() => (selectedAdds[appState.estanciaSeleccionada][addKey] = !selectedAdds[appState.estanciaSeleccionada][addKey])}
class="w-5 h-5 text-blue-600 border-gray-300 rounded focus:ring-blue-500"
/>
<span class="ml-3 text-sm font-medium text-gray-800 group-hover:text-gray-900">{add.nombre}</span>
</label>
<button
type="button"
class="p-0 border-none bg-transparent cursor-pointer"
onclick={() => openModal(add.imagen,add.nombre,)}
>
<img
src={add.thumb}
alt={`Vista previa de ${add.nombre}`}
class="mt-2 w-[100px] h-[100px] object-cover rounded-lg shadow-md hover:opacity-90 transition-opacity duration-200"
/>
</button>
</div>
{/each}
</div>
</div>
<div class="flex items-center justify-between text-xs">
<span class="text-gray-600">Revestimientos:</span>
<span class="font-medium text-gray-900">Ladrillo Visto</span>
</div>
<div class="flex items-center justify-between text-xs">
<span class="text-gray-600">Mobiliario:</span>
<span class="font-medium text-gray-900">Moderno Blanco</span>
</div>
</div>
</div>
{/if}
{/if}
<AcabadosEstancia estancia={appState.estanciaSeleccionada} border/>
</div>
</div>
</div>
</BarraLateral>
</div>
</div>
{#if modalInfo}
<div
class="fixed inset-0 bg-black/80 flex items-center justify-center z-50 transition-opacity duration-300 {modalInfo?.imagen ? 'opacity-100' : 'opacity-0'}"
onclick={closeModal} onkeydown={ (e) => { if (e.key === 'Escape')
closeModal() } }
role="dialog"
aria-modal="true"
tabindex="0">
<div
class="bg-white p-6 rounded-xl shadow-2xl max-w-4xl w-full max-h-[90vh] overflow-auto transform transition-transform duration-300 scale-100"
onclick={(e) => e.stopPropagation()}
role="button"
tabindex="0"
onkeydown={ (e) => { if (e.key === 'Escape') closeModal() }}
>
<h2 class="text-2xl font-bold text-center mb-4 text-gray-800">Opción de {modalInfo.texto} </h2>
<img src={modalInfo?.imagen} alt="Imagen ampliada" class="w-full max-h-[70vh] object-contain rounded-lg mb-4" />
<button
class="w-full px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 focus:ring-4 focus:ring-blue-300 font-medium transition-all duration-200"
onclick={closeModal} >
Cerrar
</button>
</div>
</div>
{/if}

@ -1,27 +0,0 @@
<script lang="ts">
import {proyecto} from "../../data/data_proyecto";
</script>
<div class="mx-auto text-center bg-amber-50 min-h-[calc(100vh-4.3rem)] bg-cover bg-center">
<div class="max-w-7xl w-full h-full mx-auto flex">
<div class="flex-1 p-4 sm:p-6 text-center">
<!--
<h1 class="text-2xl sm:text-3xl font-bold text-white mb-6">Exploración del Proyecto</h1>
<div class="bg-black bg-opacity-40 p-8 rounded-lg h-[calc(100%-4rem)] flex flex-col items-center justify-center">
<p class="text-white text-xl font-semibold">
Visualizador 3D.
</p>
</div>
-->
</div>
</div>
</div>

@ -0,0 +1,49 @@
<script lang="ts">
import { getModalInfo, closeModal } from '../stores/modal.svelte';
// Depuración para verificar cambios en modalInfo
$effect(() => {
console.log('modalInfo cambió:', getModalInfo());
});
</script>
{#if getModalInfo()}
<div
class="fixed inset-0 bg-black/80 flex items-center justify-center z-50 transition-opacity duration-300"
onclick={closeModal}
onkeydown={(e) => { if (e.key === 'Escape') closeModal(); }}
role="dialog"
aria-modal="true"
tabindex="0"
>
<div
class="bg-white p-6 rounded-xl shadow-2xl max-w-4xl w-full max-h-[90vh] overflow-auto transform transition-transform duration-300 scale-100"
onclick={(e) => { e.stopPropagation(); closeModal(); }}
onkeydown={(e) => { if (e.key === 'Escape') closeModal(); }}
role="dialog"
tabindex="0"
>
<h2 class="text-2xl font-bold text-center mb-4 text-gray-800">Opción de {getModalInfo()!.texto}</h2>
<img
src={getModalInfo()!.imagen}
alt="Imagen ampliada"
class="w-full max-h-[70vh] object-contain rounded-lg mb-4"
/>
<button
class="w-full px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 focus:ring-4 focus:ring-blue-300 font-medium transition-all duration-200"
onclick={closeModal}
>
Cerrar
</button>
</div>
</div>
{/if}
<style>
.max-h-\[90vh\] {
max-height: 90vh;
}
</style>

@ -0,0 +1,63 @@
<script lang="ts">
import { selections, getAvailableGroups, imageSrc } from "../stores/sel.svelte";
import { proyecto } from "../../data/data_proyecto";
import AcabadosEstancia from "./AcabadosEstancia.svelte";
// Definir tipos para los datos
interface Estancia {
nombre: string;
grupos?: { nombre: string; opciones: { nombre: string; value: string }[] }[];
}
interface Proyecto {
estancias: Record<string, Estancia>;
}
interface Selections {
[estancia: string]: { [grupo: string]: string };
}
// Inicializar selections para todas las estancias
$effect(() => {
for (const estanciaKey of Object.keys(proyecto.estancias)) {
if (!selections[estanciaKey]) {
selections[estanciaKey] = {};
}
}
});
</script>
<div class="mx-auto text-center bg-white min-h-[calc(100vh-4.3rem)] bg-cover bg-center">
<div class="max-w-7xl w-full h-full mx-auto flex">
<div class="flex-1 p-4 sm:p-6 text-center">
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
{#each Object.entries(proyecto.estancias) as [estanciaKey, estancia]}
<div class="bg-white rounded-lg border border-gray-200 hover:border-cyan-500 shadow-sm overflow-hidden" >
<h2 class="text-lg font-semibold text-gray-900 p-4">{estancia.nombre}</h2>
<!-- Imagen de la estancia -->
<img
src={imageSrc()[estanciaKey] || "https://placehold.co/400x200/cccccc/333333?text=N/A"}
alt={`Vista de ${estancia.nombre}`}
class="w-full h-48 object-contain"
/>
<div class="bg-blue-50 h-full">
<!-- Resumen de acabados -->
<AcabadosEstancia estancia={estanciaKey} border={false} />
</div>
</div>
{/each}
</div>
</div>
</div>
</div>

@ -0,0 +1,27 @@
// Define la estructura de la información del modal
export type ModalInfo = {
texto: string;
imagen: string;
} | null;
// Estado interno del modal usando $state
let modalInfo = $state<ModalInfo>(null);
// Exportar una función getter para acceder al estado
export function getModalInfo() {
return modalInfo;
}
// Función para abrir el modal
export function openModal(imagen: string, texto: string) {
console.log("Abriendo modal con texto:", texto, "e imagen:", imagen);
modalInfo = { imagen, texto };
}
// Función para cerrar el modal
export function closeModal() {
modalInfo = null;
}

@ -1,10 +1,8 @@
// stores/sel.svelte.ts
import { type Opcion } from '../../data/data_types';
import { proyecto } from '../../data/data_proyecto';
interface Opcion {
value: string;
nombre: string;
}
interface Grupo {
nombre: string;

Loading…
Cancel
Save

Powered by TurnKey Linux.