Spaces:
Running
Running
| <script lang="ts"> | |
| import type { Robot } from "$lib/elements/robot/Robot.svelte.js"; | |
| import { ICON } from "$lib/utils/icon"; | |
| import { BaseStatusBox, StatusHeader, StatusContent, StatusButton } from "$lib/components/3d/ui"; | |
| interface Props { | |
| robot: Robot; | |
| onOutputBoxClick: (robot: Robot) => void; | |
| } | |
| let { robot, onOutputBoxClick }: Props = $props(); | |
| function handleClick() { | |
| onOutputBoxClick(robot); | |
| } | |
| // Output theme color (blue) | |
| const outputColor = "rgb(59, 130, 246)"; | |
| </script> | |
| <!-- | |
| Event info here | |
| https://github.com/threlte/threlte-uikit/blob/13b34172656cd49b9e2f38d7a9c41305e435daa1/src/lib/Events.ts#L30 | |
| --> | |
| <BaseStatusBox | |
| color={outputColor} | |
| borderOpacity={robot.outputDriverCount > 0 ? 0.8 : 0.4} | |
| backgroundOpacity={robot.outputDriverCount > 0 ? 0.3 : 0.15} | |
| opacity={robot.outputDriverCount > 0 ? 1 : 0.7} | |
| onclick={handleClick} | |
| > | |
| {#if robot.outputDriverCount > 0} | |
| <!-- Connected Outputs State --> | |
| <StatusHeader | |
| icon={ICON["icon-[material-symbols--upload]"].svg} | |
| text="OUTPUT" | |
| color={outputColor} | |
| opacity={0.9} | |
| /> | |
| <!-- Outputs Count --> | |
| <StatusContent | |
| title={`${robot.outputDriverCount} Outputs Active`} | |
| color="rgb(191, 219, 254)" | |
| variant="primary" | |
| /> | |
| {#if robot.producers.length > 0} | |
| <!-- Outputs List --> | |
| <StatusContent | |
| color={outputColor} | |
| variant="secondary" | |
| > | |
| {#snippet children()} | |
| {#each robot.producers.slice(0, 2) as producer} | |
| <StatusContent | |
| title={producer.name.slice(0, 20)} | |
| subtitle={producer.constructor.name.replace("Producer", "").slice(0, 15)} | |
| color={outputColor} | |
| variant="tertiary" | |
| size="sm" | |
| /> | |
| {/each} | |
| {#if robot.producers.length > 2} | |
| <StatusContent | |
| title={`+${robot.producers.length - 2} more`} | |
| color={outputColor} | |
| variant="tertiary" | |
| size="sm" | |
| /> | |
| {/if} | |
| {/snippet} | |
| </StatusContent> | |
| {/if} | |
| {:else} | |
| <!-- No Outputs State --> | |
| <StatusHeader | |
| icon={ICON["icon-[material-symbols--upload]"].svg} | |
| text="NO OUTPUT" | |
| color={outputColor} | |
| opacity={0.7} | |
| /> | |
| <StatusContent | |
| title="Click to Connect" | |
| color={outputColor} | |
| variant="secondary" | |
| /> | |
| <StatusButton | |
| icon={ICON["icon-[mdi--plus]"].svg} | |
| text="Add Outputs" | |
| color={outputColor} | |
| textOpacity={0.7} | |
| /> | |
| {/if} | |
| </BaseStatusBox> |