Spaces:
Running
Running
| <script lang="ts"> | |
| type HighlightedTextType = { | |
| token: string; | |
| class_or_confidence: string | number | null; | |
| }; | |
| export let value: HighlightedTextType[]; | |
| export let category: string | number | null; | |
| export let active: string; | |
| export let labelToEdit: number; | |
| export let indexOfLabel: number; | |
| export let text: string; | |
| export let handleValueChange: () => void; | |
| export let isScoresMode = false; | |
| export let _color_map: Record<string, { primary: string; secondary: string }>; | |
| let _input_value = category; | |
| function handleInput(e: Event): void { | |
| let target = e.target as HTMLInputElement; | |
| if (target) { | |
| _input_value = target.value; | |
| } | |
| } | |
| function updateLabelValue( | |
| e: Event, | |
| elementIndex: number, | |
| text: string | |
| ): void { | |
| let target = e.target as HTMLInputElement; | |
| value = [ | |
| ...value.slice(0, elementIndex), | |
| { | |
| token: text, | |
| class_or_confidence: | |
| target.value === "" | |
| ? null | |
| : isScoresMode | |
| ? Number(target.value) | |
| : target.value | |
| }, | |
| ...value.slice(elementIndex + 1) | |
| ]; | |
| handleValueChange(); | |
| } | |
| function clearPlaceHolderOnFocus(e: FocusEvent): void { | |
| let target = e.target as HTMLInputElement; | |
| if (target && target.placeholder) target.placeholder = ""; | |
| } | |
| </script> | |
| <!-- svelte-ignore a11y-autofocus --> | |
| <!-- autofocus should not be disorienting for a screen reader users | |
| as input is only rendered once a new label is created --> | |
| {#if !isScoresMode} | |
| <input | |
| class="label-input" | |
| autofocus | |
| id={`label-input-${indexOfLabel}`} | |
| type="text" | |
| placeholder="label" | |
| value={category} | |
| style:background-color={category === null || (active && active !== category) | |
| ? "" | |
| : _color_map[category].primary} | |
| style:width={_input_value | |
| ? _input_value.toString()?.length + 4 + "ch" | |
| : "8ch"} | |
| on:input={handleInput} | |
| on:blur={(e) => updateLabelValue(e, indexOfLabel, text)} | |
| on:keydown={(e) => { | |
| if (e.key === "Enter") { | |
| updateLabelValue(e, indexOfLabel, text); | |
| labelToEdit = -1; | |
| } | |
| }} | |
| on:focus={clearPlaceHolderOnFocus} | |
| /> | |
| {:else} | |
| <input | |
| class="label-input" | |
| autofocus | |
| type="number" | |
| step="0.1" | |
| style={"background-color: rgba(" + | |
| (typeof category === "number" && category < 0 | |
| ? "128, 90, 213," + -category | |
| : "239, 68, 60," + category) + | |
| ")"} | |
| value={category} | |
| style:width="7ch" | |
| on:input={handleInput} | |
| on:blur={(e) => updateLabelValue(e, indexOfLabel, text)} | |
| on:keydown={(e) => { | |
| if (e.key === "Enter") { | |
| updateLabelValue(e, indexOfLabel, text); | |
| labelToEdit = -1; | |
| } | |
| }} | |
| /> | |
| {/if} | |
| <style> | |
| .label-input { | |
| transition: 150ms; | |
| margin-top: 1px; | |
| margin-right: calc(var(--size-1)); | |
| border-radius: var(--radius-xs); | |
| padding: 1px 5px; | |
| color: black; | |
| font-weight: var(--weight-bold); | |
| font-size: var(--text-sm); | |
| text-transform: uppercase; | |
| line-height: 1; | |
| color: white; | |
| } | |
| .label-input::placeholder { | |
| color: rgba(1, 1, 1, 0.5); | |
| } | |
| </style> | |