generateur_v3/frontend/src/context/Modal.svelte

106 lines
2.0 KiB
Svelte

<script lang="ts">
import { onDestroy, setContext, SvelteComponent } from 'svelte';
let visible = false;
let props = {};
let component: ConstructorOfATypedSvelteComponent | undefined;
let closed = true;
let onClose: Function = () => {};
function show(
c: ConstructorOfATypedSvelteComponent,
p: Object,
newOnClose: Function = () => {},
editing: boolean = false
) {
if (editing == false && closed === false) return;
visible = true;
closed = false;
component = c;
console.log('edi', editing, c, p)
if (editing) {
console.log('EDITINGF', props)
props = { ...props, ...p };
console.log(props)
} else {
props = p;
}
onClose = newOnClose;
}
function addContext (key: string, value: any) {
setContext(key, value)
}
function close() {
visible = false;
onClose();
setTimeout(() => {
component = undefined;
props = {};
closed = true;
}, 500);
}
setContext('modal', { show, close, addContext });
function keyPress(e: KeyboardEvent) {
console.log('HOP');
if (e.key == 'Escape' && visible == true) {
visible = false;
}
}
</script>
<slot />
<div
class="overlay"
on:click={() => close()}
class:visible={!closed}
class:closing={!visible && !closed}
on:keypress={keyPress}
/>
<div id="modal" class:visible on:keypress={keyPress}>
<svelte:component this={component} {...props} />
</div>
<style lang="scss">
#modal {
position: fixed;
top: 50%;
left: 50%;
width: 50%;
transform: translateX(-50%) translateY(-50%) scale(0.7);
visibility: hidden;
transition: 0.4s;
opacity: 0;
z-index: 1000;
&.visible {
visibility: visible !important;
transform: translateX(-50%) translateY(-50%) scale(1) !important;
opacity: 1 !important;
}
}
.overlay {
background-color: black;
opacity: 0;
z-index: 999;
width: 100%;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
visibility: hidden;
transition: 0.3s;
&.visible {
opacity: 0.7;
visibility: visible;
}
}
.closing {
opacity: 0 !important;
}
</style>