Spaces:
Running
Running
<script lang="ts"> | |
interface TimelineExample { | |
groups: Array<{id: number, content: string}>; | |
items: Array<{ | |
id: number | string, | |
content: string, | |
group?: number, | |
start: string, | |
end?: string | |
}>; | |
description?: string; | |
} | |
export let value: TimelineExample; | |
export let type: "gallery" | "table"; | |
export let selected = false; | |
export let options: Record<string, any> | undefined = undefined; | |
export let preserve_old_content_on_value_change: boolean | undefined = undefined; | |
export let label: string | undefined = undefined; | |
export let interactive: boolean | undefined = undefined; | |
export let visible: boolean | undefined = undefined; | |
export let elem_id: string | undefined = undefined; | |
export let elem_classes: string[] | undefined = undefined; | |
export let key: string | undefined = undefined; | |
export let samples_dir: string | undefined = undefined; | |
export let index: number | undefined = undefined; | |
export let root: any = undefined; | |
function formatSummary(example: TimelineExample): string { | |
const itemCount = example.items.length; | |
const groupCount = example.groups.length; | |
const dateRange = getDateRange(example.items); | |
const summary = example.description | |
? example.description | |
: `${itemCount} item${itemCount !== 1 ? 's' : ''} in ${groupCount} group${groupCount !== 1 ? 's' : ''}`; | |
return `${summary}\n${dateRange}`; | |
} | |
function getDateRange(items: TimelineExample['items']): string { | |
if (items.length === 0) return ''; | |
const dates = items.flatMap(item => [new Date(item.start), item.end ? new Date(item.end) : null]) | |
.filter((date): date is Date => date !== null); | |
const minDate = new Date(Math.min(...dates.map(d => d.getTime()))); | |
const maxDate = new Date(Math.max(...dates.map(d => d.getTime()))); | |
if (minDate.getTime() === maxDate.getTime()) { | |
return formatDate(minDate, true); | |
} | |
return `${formatDate(minDate)} - ${formatDate(maxDate)}`; | |
} | |
function formatDate(date: Date, fullFormat: boolean = false): string { | |
if (fullFormat) { | |
return date.toLocaleDateString('en-US', { | |
month: 'long', | |
day: 'numeric', | |
year: 'numeric' | |
}); | |
} | |
return date.toLocaleDateString('en-US', { | |
month: 'short', | |
day: 'numeric', | |
year: 'numeric' | |
}); | |
} | |
</script> | |
<div | |
class:table={type === "table"} | |
class:gallery={type === "gallery"} | |
class:selected | |
class="example-container" | |
> | |
<div class="example-content"> | |
{formatSummary(value)} | |
</div> | |
</div> | |
<style> | |
.example-container { | |
border: var(--button-border-width) solid var(--button-secondary-border-color) ; | |
background: var(--button-secondary-background-fill) ; | |
color: var(--button-secondary-text-color) ; | |
border-radius: var(--button-large-radius) ; | |
transition: all 0.2s ease; | |
cursor: pointer; | |
overflow: hidden; | |
} | |
.example-content { | |
padding: var(--spacing-md); | |
font-size: var(--text-sm); | |
white-space: pre-line; | |
line-height: 1.4; | |
} | |
.selected { | |
border: var(--button-border-width) solid var(--button-secondary-border-color-hover) ; | |
background: var(--button-secondary-background-fill-hover) ; | |
color: var(--button-secondary-text-color-hover) ; | |
border-radius: var(--button-large-radius) ; | |
} | |
.gallery { | |
min-width: 100px; | |
} | |
</style> |