| <script lang="ts"> | |
| import { Gradio } from "./gradio_helper"; | |
| import { onMount, createEventDispatcher, setContext } from "svelte"; | |
| import type { ComponentMeta, ThemeMode } from "./types"; | |
| export let root: string; | |
| export let component: ComponentMeta["component"]; | |
| export let instance_map: Record<number, ComponentMeta>; | |
| export let id: number; | |
| export let props: ComponentMeta["props"]; | |
| export let children: ComponentMeta["children"]; | |
| export let dynamic_ids: Set<number>; | |
| export let parent: string | null = null; | |
| export let target: HTMLElement; | |
| export let theme_mode: ThemeMode; | |
| export let version: string; | |
| export let autoscroll: boolean; | |
| const dispatch = createEventDispatcher<{ mount: number; destroy: number }>(); | |
| let filtered_children: ComponentMeta[] = []; | |
| onMount(() => { | |
| dispatch("mount", id); | |
| for (const child of filtered_children) { | |
| dispatch("mount", child.id); | |
| } | |
| return () => { | |
| dispatch("destroy", id); | |
| for (const child of filtered_children) { | |
| dispatch("mount", child.id); | |
| } | |
| }; | |
| }); | |
| $: children = | |
| children && | |
| children.filter((v) => { | |
| const valid_node = instance_map[v.id].type !== "statustracker"; | |
| if (!valid_node) { | |
| filtered_children.push(v); | |
| } | |
| return valid_node; | |
| }); | |
| setContext("BLOCK_KEY", parent); | |
| function handle_prop_change(e: { detail: Record<string, any> }): void { | |
| for (const k in e.detail) { | |
| instance_map[id].props[k] = e.detail[k]; | |
| } | |
| } | |
| $: { | |
| if (instance_map[id].type === "form") { | |
| if (children?.every((c) => !c.props.visible)) { | |
| props.visible = false; | |
| } else { | |
| props.visible = true; | |
| } | |
| } | |
| } | |
| </script> | |
| <svelte:component | |
| this={component} | |
| bind:this={instance_map[id].instance} | |
| bind:value={instance_map[id].props.value} | |
| elem_id={("elem_id" in props && props.elem_id) || `component-${id}`} | |
| elem_classes={("elem_classes" in props && props.elem_classes) || []} | |
| on:prop_change={handle_prop_change} | |
| {target} | |
| {...props} | |
| {theme_mode} | |
| {root} | |
| gradio={new Gradio(id, target, theme_mode, version, root, autoscroll)} | |
| > | |
| {#if children && children.length} | |
| {#each children as { component, id: each_id, props, children: _children, has_modes } (each_id)} | |
| <svelte:self | |
| {component} | |
| {target} | |
| id={each_id} | |
| {props} | |
| {root} | |
| {instance_map} | |
| children={_children} | |
| {dynamic_ids} | |
| {has_modes} | |
| {theme_mode} | |
| on:destroy | |
| on:mount | |
| /> | |
| {/each} | |
| {/if} | |
| </svelte:component> | |