mirror of
https://github.com/gradio-app/gradio.git
synced 2025-03-25 12:10:31 +08:00
Allow users to return dicts for values (#1373)
* changes * changes * add visible flag
This commit is contained in:
parent
0ab254b82f
commit
3a7f9a3b1a
32
demo/blocks_form/run.py
Normal file
32
demo/blocks_form/run.py
Normal file
@ -0,0 +1,32 @@
|
||||
import gradio as gr
|
||||
|
||||
with gr.Blocks() as demo:
|
||||
error_box = gr.Textbox(label="Error", visible=False)
|
||||
|
||||
name_box = gr.Textbox(label="Name")
|
||||
age_box = gr.Number(label="Age")
|
||||
symptoms_box = gr.CheckboxGroup(["Cough", "Fever", "Runny Nose"])
|
||||
submit_btn = gr.Button("Submit")
|
||||
|
||||
diagnosis_box = gr.Textbox(label="Diagnosis")
|
||||
patient_summary_box = gr.Textbox(label="Patient Summary")
|
||||
|
||||
def submit(name, age, symptoms):
|
||||
if len(name) == 0:
|
||||
return {error_box: gr.update(value="Enter name", visible=True)}
|
||||
if age < 0 or age > 200:
|
||||
return {error_box: gr.update(value="Enter valid age", visible=True)}
|
||||
return {
|
||||
diagnosis_box: "covid" if "Cough" in symptoms else "flu",
|
||||
patient_summary_box: f"{name}, {age} y/o",
|
||||
}
|
||||
|
||||
submit_btn.click(
|
||||
submit,
|
||||
[name_box, age_box, symptoms_box],
|
||||
[error_box, diagnosis_box, patient_summary_box],
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
demo.launch()
|
@ -5,7 +5,7 @@ import gradio.inputs as inputs
|
||||
import gradio.outputs as outputs
|
||||
import gradio.processing_utils
|
||||
import gradio.templates
|
||||
from gradio.blocks import Blocks
|
||||
from gradio.blocks import Blocks, skip, update
|
||||
from gradio.components import (
|
||||
HTML,
|
||||
JSON,
|
||||
@ -39,7 +39,6 @@ from gradio.components import (
|
||||
Variable,
|
||||
Video,
|
||||
component,
|
||||
update,
|
||||
)
|
||||
from gradio.external import load_interface
|
||||
from gradio.flagging import (
|
||||
|
@ -167,6 +167,20 @@ class BlockFunction:
|
||||
self.total_runs = 0
|
||||
|
||||
|
||||
def update(**kwargs) -> dict:
|
||||
"""
|
||||
Updates component parameters
|
||||
@param kwargs: Updating component parameters
|
||||
@return: Updated component parameters
|
||||
"""
|
||||
kwargs["__type__"] = "generic_update"
|
||||
return kwargs
|
||||
|
||||
|
||||
def skip() -> dict:
|
||||
return update()
|
||||
|
||||
|
||||
class Blocks(BlockContext):
|
||||
"""
|
||||
The Blocks class is a low-level API that allows you to create custom web
|
||||
@ -278,6 +292,22 @@ class Blocks(BlockContext):
|
||||
duration = time.time() - start
|
||||
block_fn.total_runtime += duration
|
||||
block_fn.total_runs += 1
|
||||
if type(predictions) is dict and len(predictions) > 0:
|
||||
keys_are_blocks = [isinstance(key, Block) for key in predictions.keys()]
|
||||
if all(keys_are_blocks):
|
||||
reordered_predictions = [skip() for _ in dependency["outputs"]]
|
||||
for component, value in predictions.items():
|
||||
if component._id not in dependency["outputs"]:
|
||||
return ValueError(
|
||||
f"Returned component {component} not specified as output of function."
|
||||
)
|
||||
output_index = dependency["outputs"].index(component._id)
|
||||
reordered_predictions[output_index] = value
|
||||
predictions = reordered_predictions
|
||||
elif any(keys_are_blocks):
|
||||
raise ValueError(
|
||||
"Returned dictionary included some keys as Components. Either all keys must be Components to assign Component values, or return a List of values to assign output values in order."
|
||||
)
|
||||
if len(dependency["outputs"]) == 1:
|
||||
predictions = (predictions,)
|
||||
if block_fn.postprocess:
|
||||
|
@ -3733,13 +3733,3 @@ DataFrame = Dataframe
|
||||
Highlightedtext = HighlightedText
|
||||
Checkboxgroup = CheckboxGroup
|
||||
TimeSeries = Timeseries
|
||||
|
||||
|
||||
def update(**kwargs) -> dict:
|
||||
"""
|
||||
Updates component parameters
|
||||
@param kwargs: Updating component parameters
|
||||
@return: Updated component parameters
|
||||
"""
|
||||
kwargs["__type__"] = "generic_update"
|
||||
return kwargs
|
||||
|
@ -15,6 +15,7 @@
|
||||
import { _ } from "svelte-i18n";
|
||||
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let mode: "static" | "dynamic";
|
||||
export let value: null | FileData | string = null;
|
||||
export let name: string;
|
||||
@ -41,6 +42,7 @@
|
||||
color={dragging ? "green" : "grey"}
|
||||
padding={false}
|
||||
{elem_id}
|
||||
{visible}
|
||||
>
|
||||
<StatusTracker {...loading_status} />
|
||||
|
||||
|
@ -4,10 +4,11 @@
|
||||
export let style: Record<string, any> = {};
|
||||
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let value: string;
|
||||
export let variant: "primary" | "secondary" = "primary";
|
||||
</script>
|
||||
|
||||
<Button {variant} {elem_id} {style} on:click>
|
||||
<Button {variant} {elem_id} {visible} {style} on:click>
|
||||
{$_(value)}
|
||||
</Button>
|
||||
|
@ -4,10 +4,11 @@
|
||||
import type { LoadingStatus } from "../StatusTracker/types";
|
||||
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let loading_status: LoadingStatus;
|
||||
</script>
|
||||
|
||||
<Carousel {elem_id} on:change>
|
||||
<Carousel {elem_id} {visible} on:change>
|
||||
<StatusTracker {...loading_status} />
|
||||
|
||||
<slot />
|
||||
|
@ -5,13 +5,14 @@
|
||||
import type { LoadingStatus } from "../StatusTracker/types";
|
||||
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let value: Array<[string, string]> = [];
|
||||
export let color_map: Array<[string, string]>;
|
||||
|
||||
export let loading_status: LoadingStatus;
|
||||
</script>
|
||||
|
||||
<Block padding={false} {elem_id}>
|
||||
<Block padding={false} {elem_id} {visible}>
|
||||
<StatusTracker {...loading_status} />
|
||||
<ChatBot {value} {color_map} on:change />
|
||||
</Block>
|
||||
|
@ -5,6 +5,7 @@
|
||||
import type { LoadingStatus } from "../StatusTracker/types";
|
||||
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let value: boolean = false;
|
||||
export let label: string = "Checkbox";
|
||||
export let mode: "static" | "dynamic";
|
||||
@ -15,7 +16,7 @@
|
||||
export let loading_status: LoadingStatus;
|
||||
</script>
|
||||
|
||||
<Block {form_position} {elem_id} {style}>
|
||||
<Block {form_position} {elem_id} {visible} {style}>
|
||||
<StatusTracker {...loading_status} />
|
||||
|
||||
<Checkbox
|
||||
|
@ -5,6 +5,7 @@
|
||||
import type { LoadingStatus } from "../StatusTracker/types";
|
||||
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let value: Array<string> = [];
|
||||
export let choices: Array<string>;
|
||||
export let style: Record<string, any> = {};
|
||||
@ -17,7 +18,7 @@
|
||||
export let loading_status: LoadingStatus;
|
||||
</script>
|
||||
|
||||
<Block {form_position} {elem_id} {style} type="fieldset">
|
||||
<Block {form_position} {elem_id} {visible} {style} type="fieldset">
|
||||
<StatusTracker {...loading_status} />
|
||||
|
||||
<CheckboxGroup
|
||||
|
@ -2,6 +2,7 @@
|
||||
import { create_classes } from "@gradio/utils";
|
||||
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let variant: "default" | "panel" = "default";
|
||||
export let parent: string | null = null;
|
||||
export let style: Record<string, unknown> = {};
|
||||
@ -9,6 +10,7 @@
|
||||
|
||||
<div
|
||||
id={elem_id}
|
||||
class:hidden={visible === false}
|
||||
class:bg-gray-50={variant === "panel"}
|
||||
class:p-2={variant === "panel"}
|
||||
class:rounded-lg={variant === "panel"}
|
||||
|
@ -9,6 +9,7 @@
|
||||
|
||||
export let headers: Headers = [];
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let value: Data | { data: Data; headers: Headers } = [["", "", ""]];
|
||||
export let mode: "static" | "dynamic";
|
||||
export let col_count: [number, "fixed" | "dynamic"];
|
||||
@ -39,6 +40,7 @@
|
||||
|
||||
<div
|
||||
id={elem_id}
|
||||
class:hidden={visible === false}
|
||||
class="relative overflow-hidden"
|
||||
class:flex-1={parent === "row" || !parent}
|
||||
>
|
||||
|
@ -6,6 +6,7 @@
|
||||
export let headers: Array<string>;
|
||||
export let samples: Array<Array<any>>;
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let value: Number | null = null;
|
||||
export let root: string;
|
||||
export let samples_per_page: number = 10;
|
||||
@ -50,7 +51,11 @@
|
||||
}
|
||||
</script>
|
||||
|
||||
<div id={elem_id} class="mt-4 inline-block max-w-full text-gray-700 w-full">
|
||||
<div
|
||||
id={elem_id}
|
||||
class:hidden={visible === false}
|
||||
class="mt-4 inline-block max-w-full text-gray-700 w-full"
|
||||
>
|
||||
<div class="text-xs mb-2 flex items-center text-gray-500">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
|
@ -6,6 +6,7 @@
|
||||
|
||||
export let label: string = "Dropdown";
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let value: string = "";
|
||||
export let choices: Array<string>;
|
||||
export let form_position: "first" | "last" | "mid" | "single" = "single";
|
||||
@ -17,7 +18,7 @@
|
||||
export let mode: "static" | "dynamic";
|
||||
</script>
|
||||
|
||||
<Block {form_position} {elem_id} {style}>
|
||||
<Block {form_position} {elem_id} {visible} {style}>
|
||||
<StatusTracker {...loading_status} />
|
||||
|
||||
<Dropdown
|
||||
|
@ -9,6 +9,7 @@
|
||||
import { _ } from "svelte-i18n";
|
||||
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let value: null | FileData = null;
|
||||
export let mode: "static" | "dynamic";
|
||||
export let root: string;
|
||||
@ -28,6 +29,7 @@
|
||||
color={dragging ? "green" : "grey"}
|
||||
padding={false}
|
||||
{elem_id}
|
||||
{visible}
|
||||
>
|
||||
<StatusTracker {...loading_status} />
|
||||
|
||||
|
@ -10,6 +10,7 @@
|
||||
export let show_label: boolean;
|
||||
export let label: string;
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let value: Array<string> | null = null;
|
||||
export let style: Record<string, unknown> = {};
|
||||
|
||||
@ -86,7 +87,7 @@
|
||||
|
||||
<svelte:window bind:innerHeight={window_height} />
|
||||
|
||||
<Block variant="solid" color="grey" padding={false} {elem_id}>
|
||||
<Block variant="solid" color="grey" padding={false} {elem_id} {visible}>
|
||||
<StatusTracker {...loading_status} />
|
||||
<BlockLabel {show_label} Icon={Image} label={label || "Gallery"} />
|
||||
{#if value === null}
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
export let label: string;
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let value: string = "";
|
||||
|
||||
const dispatch = createEventDispatcher<{ change: undefined }>();
|
||||
@ -11,4 +12,4 @@
|
||||
$: label, dispatch("change");
|
||||
</script>
|
||||
|
||||
<HTML {value} {elem_id} on:change />
|
||||
<HTML {value} {elem_id} {visible} on:change />
|
||||
|
@ -7,6 +7,7 @@
|
||||
import type { LoadingStatus } from "../StatusTracker/types";
|
||||
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let value: Array<[string, string | number]>;
|
||||
export let show_legend: boolean;
|
||||
export let color_map: Record<string, string> = {};
|
||||
@ -19,7 +20,7 @@
|
||||
$: value, dispatch("change");
|
||||
</script>
|
||||
|
||||
<Block {elem_id}>
|
||||
<Block {elem_id} {visible}>
|
||||
<StatusTracker {...loading_status} />
|
||||
{#if label}
|
||||
<BlockLabel Icon={TextHighlight} {label} />
|
||||
|
@ -6,6 +6,7 @@
|
||||
import { Component as StatusTracker } from "../StatusTracker/";
|
||||
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let value: null | string = null;
|
||||
export let source: "canvas" | "webcam" | "upload" = "upload";
|
||||
export let tool: "editor" | "select" = "editor";
|
||||
@ -32,6 +33,7 @@
|
||||
color={dragging ? "green" : "grey"}
|
||||
padding={false}
|
||||
{elem_id}
|
||||
{visible}
|
||||
>
|
||||
<StatusTracker {...loading_status} />
|
||||
{#if mode === "static"}
|
||||
|
@ -8,6 +8,7 @@
|
||||
import type { LoadingStatus } from "../StatusTracker/types";
|
||||
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let value: any;
|
||||
export let loading_status: LoadingStatus;
|
||||
export let label: string;
|
||||
@ -17,7 +18,7 @@
|
||||
$: value, dispatch("change");
|
||||
</script>
|
||||
|
||||
<Block test_id="json" {elem_id}>
|
||||
<Block test_id="json" {elem_id} {visible}>
|
||||
{#if label}
|
||||
<BlockLabel Icon={JSONIcon} {label} />
|
||||
{/if}
|
||||
|
@ -7,6 +7,7 @@
|
||||
import type { LoadingStatus } from "../StatusTracker/types";
|
||||
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let value: {
|
||||
label: string;
|
||||
confidences?: Array<{ label: string; confidence: number }>;
|
||||
@ -21,7 +22,7 @@
|
||||
$: value, dispatch("change");
|
||||
</script>
|
||||
|
||||
<Block {elem_id}>
|
||||
<Block {elem_id} {visible}>
|
||||
<StatusTracker {...loading_status} />
|
||||
<BlockLabel Icon={LabelIcon} {label} />
|
||||
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
export let label: string;
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let value: string = "";
|
||||
|
||||
const dispatch = createEventDispatcher<{ change: undefined }>();
|
||||
@ -11,4 +12,4 @@
|
||||
$: label, dispatch("change");
|
||||
</script>
|
||||
|
||||
<Markdown {value} on:change />
|
||||
<Markdown {value} {elem_id} {visible} on:change />
|
||||
|
@ -9,6 +9,7 @@
|
||||
import { _ } from "svelte-i18n";
|
||||
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let value: null | FileData = null;
|
||||
export let mode: "static" | "dynamic";
|
||||
export let root: string;
|
||||
@ -29,6 +30,7 @@
|
||||
color={dragging ? "green" : "grey"}
|
||||
padding={false}
|
||||
{elem_id}
|
||||
{visible}
|
||||
>
|
||||
<StatusTracker {...loading_status} />
|
||||
|
||||
|
@ -6,6 +6,7 @@
|
||||
|
||||
export let label: string = "Number";
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let style: Record<string, any> = {};
|
||||
export let value: number = 0;
|
||||
export let form_position: "first" | "last" | "mid" | "single" = "single";
|
||||
@ -15,7 +16,7 @@
|
||||
export let mode: "static" | "dynamic";
|
||||
</script>
|
||||
|
||||
<Block {form_position} {elem_id} {style}>
|
||||
<Block {form_position} {elem_id} {visible} {style}>
|
||||
<StatusTracker {...loading_status} />
|
||||
|
||||
<Number
|
||||
|
@ -6,6 +6,7 @@
|
||||
|
||||
export let label: string = "Radio";
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let value: string = "";
|
||||
export let choices: Array<string> = [];
|
||||
export let mode: "static" | "dynamic";
|
||||
@ -16,7 +17,7 @@
|
||||
export let loading_status: LoadingStatus;
|
||||
</script>
|
||||
|
||||
<Block {form_position} type="fieldset" {elem_id} {style}>
|
||||
<Block {form_position} type="fieldset" {elem_id} {visible} {style}>
|
||||
<StatusTracker {...loading_status} />
|
||||
|
||||
<Radio
|
||||
|
@ -5,6 +5,7 @@
|
||||
import type { LoadingStatus } from "../StatusTracker/types";
|
||||
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let value: number = 0;
|
||||
export let label: string = "Slider";
|
||||
export let style: Record<string, any> = {};
|
||||
@ -19,7 +20,7 @@
|
||||
export let loading_status: LoadingStatus;
|
||||
</script>
|
||||
|
||||
<Block {form_position} {elem_id} {style}>
|
||||
<Block {form_position} {elem_id} {visible} {style}>
|
||||
<StatusTracker {...loading_status} />
|
||||
|
||||
<Range
|
||||
|
@ -2,9 +2,10 @@
|
||||
import { TabItem } from "@gradio/tabs";
|
||||
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let label: string;
|
||||
</script>
|
||||
|
||||
<TabItem {elem_id} name={label} on:select>
|
||||
<TabItem {elem_id} {visible} name={label} on:select>
|
||||
<slot />
|
||||
</TabItem>
|
||||
|
@ -2,8 +2,9 @@
|
||||
import { Tabs } from "@gradio/tabs";
|
||||
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
</script>
|
||||
|
||||
<Tabs on:change>
|
||||
<Tabs {elem_id} {visible} on:change>
|
||||
<slot />
|
||||
</Tabs>
|
||||
|
@ -8,6 +8,7 @@
|
||||
|
||||
export let label: string = "Textbox";
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let value: string = "";
|
||||
export let lines: number;
|
||||
export let placeholder: string = "";
|
||||
@ -25,6 +26,7 @@
|
||||
<Block
|
||||
{form_position}
|
||||
{elem_id}
|
||||
{visible}
|
||||
disable={typeof style.container === "boolean" && !style.container}
|
||||
>
|
||||
<StatusTracker {...loading_status} />
|
||||
|
@ -29,6 +29,7 @@
|
||||
}
|
||||
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let value: null | Data;
|
||||
export let y: Array<string>;
|
||||
export let x: string;
|
||||
@ -118,6 +119,7 @@
|
||||
color={"grey"}
|
||||
padding={false}
|
||||
{elem_id}
|
||||
{visible}
|
||||
>
|
||||
<BlockLabel {show_label} Icon={ChartIcon} label={label || "TimeSeries"} />
|
||||
<StatusTracker {...loading_status} />
|
||||
|
@ -9,6 +9,7 @@
|
||||
import { _ } from "svelte-i18n";
|
||||
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let value: FileData | null | string = null;
|
||||
export let label: string;
|
||||
export let source: string;
|
||||
@ -31,6 +32,7 @@
|
||||
color={dragging ? "green" : "grey"}
|
||||
padding={false}
|
||||
{elem_id}
|
||||
{visible}
|
||||
>
|
||||
<StatusTracker {...loading_status} />
|
||||
|
||||
|
@ -6,6 +6,7 @@
|
||||
|
||||
export let style: Record<string, any> = {};
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let variant: "solid" | "dashed" | "none" = "solid";
|
||||
export let color: "grey" | "green" = "grey";
|
||||
export let padding: boolean = true;
|
||||
@ -53,6 +54,7 @@
|
||||
this={tag}
|
||||
data-testid={test_id}
|
||||
id={elem_id}
|
||||
class:hidden={visible === false}
|
||||
class={"w-full overflow-hidden " +
|
||||
styles[variant] +
|
||||
" " +
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
export let style: Record<string, any> = {};
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let variant: "primary" | "secondary" = "secondary";
|
||||
export let size: "sm" | "lg" = "lg";
|
||||
</script>
|
||||
@ -12,6 +13,7 @@
|
||||
class={`gr-button gr-button-${size} gr-button-${variant} self-start` +
|
||||
create_classes(style)}
|
||||
id={elem_id}
|
||||
class:hidden={visible === false}
|
||||
>
|
||||
<slot />
|
||||
</button>
|
||||
|
@ -7,6 +7,7 @@
|
||||
import { writable } from "svelte/store";
|
||||
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
|
||||
const dispatch = createEventDispatcher<{
|
||||
change: undefined;
|
||||
@ -45,7 +46,11 @@
|
||||
};
|
||||
</script>
|
||||
|
||||
<div class="output-carousel flex flex-col relative" id={elem_id}>
|
||||
<div
|
||||
class="output-carousel flex flex-col relative"
|
||||
id={elem_id}
|
||||
class:hidden={visible === false}
|
||||
>
|
||||
<slot />
|
||||
|
||||
<div
|
||||
|
@ -2,6 +2,7 @@
|
||||
import { createEventDispatcher } from "svelte";
|
||||
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let value: string;
|
||||
|
||||
const dispatch = createEventDispatcher<{ change: undefined }>();
|
||||
@ -9,6 +10,6 @@
|
||||
$: value, dispatch("change");
|
||||
</script>
|
||||
|
||||
<div class="output-html" id={elem_id}>
|
||||
<div class="output-html" id={elem_id} class:hidden={visible === false}>
|
||||
{@html value}
|
||||
</div>
|
||||
|
@ -3,6 +3,7 @@
|
||||
import "./typography.css";
|
||||
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let value: string;
|
||||
|
||||
const dispatch = createEventDispatcher<{ change: undefined }>();
|
||||
@ -10,6 +11,11 @@
|
||||
$: value, dispatch("change");
|
||||
</script>
|
||||
|
||||
<div id={elem_id} class="output-markdown gr-prose" style="max-width: 100%">
|
||||
<div
|
||||
id={elem_id}
|
||||
class:hidden={visible === false}
|
||||
class="output-markdown gr-prose"
|
||||
style="max-width: 100%"
|
||||
>
|
||||
{@html value}
|
||||
</div>
|
||||
|
@ -12,6 +12,7 @@
|
||||
|
||||
<script lang="ts">
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let value: null | string;
|
||||
export let theme: string;
|
||||
import { afterUpdate, onMount} from "svelte";
|
||||
|
@ -3,6 +3,7 @@
|
||||
import { TABS } from "./Tabs.svelte";
|
||||
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
export let name: string;
|
||||
|
||||
const dispatch = createEventDispatcher<{ select: undefined }>();
|
||||
@ -22,6 +23,7 @@
|
||||
{#if $selected_tab === id}
|
||||
<div
|
||||
id={elem_id}
|
||||
class:hidden={visible === false}
|
||||
class="tabitem p-2 border-2 border-t-0 border-gray-200 relative flex"
|
||||
>
|
||||
<div
|
||||
|
@ -12,6 +12,7 @@
|
||||
}
|
||||
|
||||
export let elem_id: string = "";
|
||||
export let visible: boolean = true;
|
||||
|
||||
const tabs: Array<Tab> = [];
|
||||
|
||||
@ -40,7 +41,11 @@
|
||||
}
|
||||
</script>
|
||||
|
||||
<div class="tabs flex flex-col my-4" id={elem_id}>
|
||||
<div
|
||||
class="tabs flex flex-col my-4"
|
||||
id={elem_id}
|
||||
class:hidden={visible === false}
|
||||
>
|
||||
<div class="flex border-b-2 dark:border-gray-700">
|
||||
{#each tabs as t, i}
|
||||
{#if t.id === $selected_tab}
|
||||
|
Loading…
x
Reference in New Issue
Block a user