Spaces:
Running
Running
| <script lang="ts"> | |
| import { Block } from "@gradio/atoms"; | |
| import Column from "@gradio/column"; | |
| import { Gradio } from "@gradio/utils"; | |
| export let elem_id = ""; | |
| export let elem_classes: string[] = []; | |
| export let visible = false; | |
| export let allow_user_close = true; | |
| export let gradio: Gradio<{ | |
| blur: never; | |
| }>; | |
| let element: HTMLElement | null = null; | |
| let inner_element: HTMLElement | null = null; | |
| const close = () => { | |
| visible = false; | |
| gradio.dispatch("blur"); | |
| }; | |
| document.addEventListener("keydown", (evt: KeyboardEvent) => { | |
| if (allow_user_close && evt.key === "Escape") { | |
| close(); | |
| } | |
| }); | |
| </script> | |
| <!-- svelte-ignore a11y-click-events-have-key-events --> | |
| <div | |
| class="modal {elem_classes.join(' ')}" | |
| bind:this={element} | |
| class:hide={!visible} | |
| id={elem_id} | |
| on:click={(evt) => { | |
| if (allow_user_close && (evt.target === element || evt.target === inner_element)) { | |
| close(); | |
| } | |
| }} | |
| > | |
| <div class="modal-container" bind:this={inner_element} > | |
| <Block allow_overflow={false} elem_classes={["modal-block"]}> | |
| {#if allow_user_close} | |
| <div class="close" on:click={close}> | |
| <svg | |
| width="10" | |
| height="10" | |
| viewBox="0 0 10 10" | |
| fill="none" | |
| xmlns="http://www.w3.org/2000/svg" | |
| > | |
| <path | |
| d="M1 1L9 9" | |
| stroke="currentColor" | |
| stroke-width="2" | |
| stroke-linecap="round" | |
| stroke-linejoin="round" | |
| /> | |
| <path | |
| d="M9 1L1 9" | |
| stroke="currentColor" | |
| stroke-width="2" | |
| stroke-linecap="round" | |
| stroke-linejoin="round" | |
| /> | |
| </svg> | |
| </div> | |
| {/if} | |
| <Column> | |
| <slot /> | |
| </Column> | |
| </Block> | |
| </div> | |
| </div> | |
| <style> | |
| @media (min-width: 640px) { | |
| .modal-container { | |
| max-width: 640px; | |
| } | |
| } | |
| @media (min-width: 768px) { | |
| .modal-container { | |
| max-width: 768px; | |
| } | |
| } | |
| @media (min-width: 1024px) { | |
| .modal-container { | |
| max-width: 1024px; | |
| } | |
| } | |
| @media (min-width: 1280px) { | |
| .modal-container { | |
| max-width: 1280px; | |
| } | |
| } | |
| @media (min-width: 1536px) { | |
| .modal-container { | |
| max-width: 1536px; | |
| } | |
| } | |
| .modal { | |
| position: fixed; /* Stay in place */ | |
| z-index: 100; /* Sit on top */ | |
| left: 0; | |
| top: 0; | |
| width: 100%; /* Full width */ | |
| height: 100%; /* Full height */ | |
| z-index: 100; | |
| background-color: rgb(0, 0, 0); /* Fallback color */ | |
| background-color: rgba(0, 0, 0, 0.4); /* Black w/ opacity */ | |
| backdrop-filter: blur(4px); | |
| } | |
| .modal-container { | |
| position: relative; | |
| padding: 0 var(--size-8); | |
| margin: var(--size-8) auto; | |
| height: 100%; | |
| max-height: calc(100% - var(--size-16)); | |
| overflow-y: hidden; | |
| } | |
| .close { | |
| display: flex; | |
| position: absolute; | |
| top: var(--block-label-margin); | |
| right: var(--block-label-margin); | |
| align-items: center; | |
| box-shadow: var(--shadow-drop); | |
| border: 1px solid var(--border-color-primary); | |
| border-top: none; | |
| border-right: none; | |
| border-radius: var(--block-label-right-radius); | |
| background: var(--block-label-background-fill); | |
| padding: 6px; | |
| height: 24px; | |
| overflow: hidden; | |
| color: var(--block-label-text-color); | |
| font: var(--font); | |
| font-size: var(--button-small-text-size); | |
| cursor: pointer; | |
| } | |
| .modal :global(.modal-block) { | |
| max-height: 100%; | |
| overflow-y: auto ; | |
| } | |
| .hide { | |
| display: none; | |
| } | |
| </style> | |