| <script lang="ts"> |
| import { BaseColorPicker } from "@gradio/colorpicker"; |
| import { BaseButton } from "@gradio/button"; |
| import { BaseDropdown } from "./patched_dropdown/Index.svelte"; |
| import { createEventDispatcher } from "svelte"; |
| import { onMount, onDestroy } from "svelte"; |
| |
| export let label = ""; |
| export let currentLabel = ""; |
| export let choices = []; |
| export let choicesColors = []; |
| export let color = ""; |
| export let currentColor = ""; |
| export let showRemove = true; |
| |
| const dispatch = createEventDispatcher<{ |
| change: object; |
| }>(); |
| |
| function dispatchChange(ret: number) { |
| dispatch("change", { |
| label: currentLabel, |
| color: currentColor, |
| ret: ret |
| }); |
| } |
| |
| function onDropDownChange(event) { |
| const { detail } = event; |
| let choice = detail; |
| |
| if (Number.isInteger(choice)) { |
| if (Array.isArray(choicesColors) && choice < choicesColors.length) { |
| currentColor = choicesColors[choice]; |
| } |
| if (Array.isArray(choices) && choice < choices.length) { |
| currentLabel = choices[choice][0]; |
| } |
| } else { |
| currentLabel = choice; |
| } |
| } |
| |
| function onColorChange(event) { |
| const { detail } = event; |
| currentColor = detail; |
| } |
| |
| function onDropDownEnter(event) { |
| onDropDownChange(event); |
| dispatchChange(1); |
| } |
| |
| function handleKeyPress(event: KeyboardEvent) { |
| switch (event.key) { |
| case "Enter": |
| dispatchChange(1); |
| break; |
| } |
| } |
| |
| onMount(() => { |
| document.addEventListener("keydown", handleKeyPress); |
| currentLabel = label; |
| currentColor = color; |
| }); |
| |
| onDestroy(() => { |
| document.removeEventListener("keydown", handleKeyPress); |
| }); |
| |
| </script> |
|
|
| <div class="modal" id="model-box-edit"> |
| <div class="modal-container"> |
| <span class="model-content"> |
| <div style="margin-right: 10px;"> |
| <BaseDropdown |
| value={currentLabel} |
| label="Label" |
| {choices} |
| show_label={false} |
| allow_custom_value={true} |
| on:change={onDropDownChange} |
| on:enter={onDropDownEnter} |
| /> |
| </div> |
| <div style="margin-right: 40px; margin-bottom: 8px;"> |
| <BaseColorPicker |
| value={currentColor} |
| label="Color" |
| show_label={false} |
| on:change={onColorChange} |
| /> |
| </div> |
| <div style="margin-right: 8px;"> |
| <BaseButton |
| on:click={() => dispatchChange(0)} |
| >Cancel</BaseButton> |
| </div> |
| {#if showRemove} |
| <div style="margin-right: 8px;"> |
| <BaseButton |
| variant="stop" |
| on:click={() => dispatchChange(-1)} |
| >Remove</BaseButton> |
| </div> |
| {/if} |
| <div> |
| <BaseButton |
| variant="primary" |
| on:click={() => dispatchChange(1)} |
| >OK</BaseButton> |
| </div> |
| </span> |
| </div> |
| </div> |
|
|
| <style> |
| .modal { |
| position: fixed; |
| left: 0; |
| top: 0; |
| width: 100%; |
| height: 100%; |
| z-index: var(--layer-top); |
| -webkit-backdrop-filter: blur(4px); |
| backdrop-filter: blur(4px); |
| } |
| |
| .modal-container { |
| border-style: solid; |
| border-width: var(--block-border-width); |
| border-color: var(--block-border-color); |
| margin-top: 10%; |
| padding: 20px; |
| box-shadow: var(--block-shadow); |
| border-color: var(--block-border-color); |
| border-radius: var(--block-radius); |
| background: var(--block-background-fill); |
| position: fixed; |
| left: 50%; |
| transform: translateX(-50%); |
| width: fit-content; |
| } |
| |
| .model-content { |
| display: flex; |
| align-items: flex-end; |
| } |
| </style> |
|
|