106 lines
2.0 KiB
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>
|