scrollToAsset(asset) ?? false} {timelineManager} {assetInteraction} bind:isShowDeleteConfirmation {onEscape} /> {#if timelineManager.months.length > 0} {/if}
((timelineManager.viewportWidth = v), updateSlidingWindow())} bind:this={element} onscroll={() => (handleTimelineScroll(), updateSlidingWindow(), updateIsScrolling())} >
{@render children?.()} {#if isEmpty} {@render empty?.()} {/if}
{#each timelineManager.months as monthGroup (monthGroup.viewId)} {@const display = monthGroup.intersecting} {@const absoluteHeight = monthGroup.top} {#if !monthGroup.isLoaded}
{:else if display}
{#snippet content({ onAssetOpen, onAssetSelect, onAssetHover })} {#snippet content({ onDayGroupSelect, onDayGroupAssetSelect })} {#snippet thumbnail({ asset, position, dayGroup, groupIndex })} {@const isAssetSelectionCandidate = assetInteraction.hasSelectionCandidate(asset.id)} {@const isAssetSelected = assetInteraction.hasSelectedAsset(asset.id) || timelineManager.albumAssets.has(asset.id)} {@const isAssetDisabled = timelineManager.albumAssets.has(asset.id)} onAssetOpen(asset)} onSelect={() => onDayGroupAssetSelect(dayGroup, asset)} onMouseEvent={(isMouseOver) => { if (isMouseOver) { onAssetHover(asset); } else { onAssetHover(null); } }} selected={isAssetSelected} selectionCandidate={isAssetSelectionCandidate} disabled={isAssetDisabled} thumbnailWidth={position.width} thumbnailHeight={position.height} /> {/snippet} {/snippet} {/snippet}
{/if} {/each}
{#if $showAssetViewer} {/if}