Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
TheLazySquid
GitHub Repository: TheLazySquid/GimkitCheat
Path: blob/main/src/hud/Group.svelte
4172 views
<script lang="ts">
    import { onMount } from "svelte";
    import { findMatchingParent } from "../utils";
    import Button from "./components/Button.svelte";

    export let name: string;

    let groupEl: HTMLDivElement;
    let lastGroupEl: HTMLDivElement;
    let parentMenu: HTMLDivElement;

    function slide(el: HTMLElement, direction: 'in' | 'out', side: 'left' | 'right') {
        el.style.animation = `slide-${direction}-${side} 0.2s ease-in-out forwards`;

        if(direction == 'out') {
            el.classList.remove('open');
            setTimeout(() => {
                el.style.display = 'none';
            }, 200);
        } else {
            el.style.display = 'flex';
            el.classList.add('open');
        }
    }

    function openGroup() {
        // find the previously opened group
        lastGroupEl = parentMenu.querySelector('.groupContent.open') as HTMLDivElement;
        // slide it out to the left
        if(lastGroupEl) slide(lastGroupEl, 'out', 'left');

        slide(groupEl, 'in', 'right');
    }

    function closeGroup() {
        slide(groupEl, 'out', 'right');
        if(lastGroupEl) slide(lastGroupEl, 'in', 'left');
    }

    onMount(() => {
        parentMenu = findMatchingParent(groupEl, '.menu .children') as HTMLDivElement;
        parentMenu.appendChild(groupEl);
    })
</script>

<Button on:click={openGroup}>
    {name}
</Button>

<div class="groupContent" bind:this={groupEl}>
    <Button on:click={closeGroup}>
        Close
    </Button>
    <slot />
</div>

<style lang="scss">
    .groupContent {
        transform: translateX(100%);
        opacity: 0;
        pointer-events: none;
        display: none;
    }

    @mixin slide($name, $entering: false, $start: 0%, $end: 100%) {
        @keyframes #{$name} {
            0% {
                transform: translateX($start);
                @if $entering {
                    opacity: 0;
                    pointer-events: none;
                } @else {
                    opacity: 1;
                    pointer-events: all;
                }
            }
    
            100% {
                transform: translateX($end);
                @if $entering {
                    opacity: 1;
                    pointer-events: all;
                } @else {
                    opacity: 0;
                    pointer-events: none;
                }
            }
        }
    }

    @include slide('-global-slide-in-left', true, -100%, 0%);
    @include slide('-global-slide-out-left', false, 0%, -100%);
    @include slide('-global-slide-in-right', true, 100%, 0%);
    @include slide('-global-slide-out-right', false, 0%, 100%);
</style>