Spaces:
Running
Running
| <script lang="ts"> | |
| import { Container, Text } from "threlte-uikit"; | |
| interface Props { | |
| title?: string; | |
| subtitle?: string; | |
| description?: string; | |
| color?: string; | |
| variant?: "primary" | "secondary" | "tertiary"; | |
| size?: "sm" | "md" | "lg"; | |
| align?: "left" | "center" | "right"; | |
| children?: import("svelte").Snippet; | |
| } | |
| let { | |
| title, | |
| subtitle, | |
| description, | |
| color = "rgb(221, 214, 254)", | |
| variant = "primary", | |
| size = "md", | |
| align = "center", | |
| children | |
| }: Props = $props(); | |
| // Predefined opacity levels for consistency | |
| const opacityLevels = { | |
| primary: { title: 1.0, subtitle: 0.9, description: 0.8 }, | |
| secondary: { title: 0.9, subtitle: 0.8, description: 0.7 }, | |
| tertiary: { title: 0.8, subtitle: 0.7, description: 0.6 } | |
| }; | |
| // Predefined size configurations | |
| const sizeConfigs = { | |
| sm: { title: 10, subtitle: 9, description: 8, gap: 1, padding: 6 }, | |
| md: { title: 12, subtitle: 10, description: 9, gap: 2, padding: 8 }, | |
| lg: { title: 14, subtitle: 12, description: 10, gap: 3, padding: 10 } | |
| }; | |
| const config = sizeConfigs[size]; | |
| const opacities = opacityLevels[variant]; | |
| const flexAlign = align === "left" ? "flex-start" : align === "right" ? "flex-end" : "center"; | |
| </script> | |
| <Container padding={config.padding} marginBottom={4} width="100%"> | |
| {#if children} | |
| {@render children()} | |
| {:else} | |
| <Container | |
| flexDirection="column" | |
| alignItems={flexAlign} | |
| justifyContent="center" | |
| gap={config.gap} | |
| width="100%" | |
| > | |
| {#if title} | |
| <Text | |
| text={title} | |
| fontSize={config.title} | |
| {color} | |
| opacity={opacities.title} | |
| textAlign={align} | |
| width="100%" | |
| /> | |
| {/if} | |
| {#if subtitle} | |
| <Text | |
| text={subtitle} | |
| fontSize={config.subtitle} | |
| fontWeight="normal" | |
| {color} | |
| opacity={opacities.subtitle} | |
| textAlign={align} | |
| width="100%" | |
| /> | |
| {/if} | |
| {#if description} | |
| <Text | |
| text={description} | |
| fontSize={config.description} | |
| fontWeight="light" | |
| {color} | |
| opacity={opacities.description} | |
| textAlign={align} | |
| width="100%" | |
| /> | |
| {/if} | |
| </Container> | |
| {/if} | |
| </Container> | |