{#if isShowDeleteConfirmation} (isShowDeleteConfirmation = false)} onConfirm={() => handlePromiseError(trashOrDelete(true))} /> {/if} {#if isShowSelectDate} { isShowSelectDate = false; if (dateString.mode == 'absolute') { const asset = await timelineManager.getClosestAssetToDate( (DateTime.fromISO(dateString.date) as DateTime).toObject(), ); if (asset) { setFocusAsset(asset); } } }} onCancel={() => (isShowSelectDate = false)} /> {/if} {#if timelineManager.months.length > 0} { evt.preventDefault(); let amount = 50; if (shiftKeyIsDown) { amount = 500; } if (evt.key === 'ArrowUp') { amount = -amount; if (shiftKeyIsDown) { element?.scrollBy({ top: amount, behavior: 'smooth' }); } } else if (evt.key === 'ArrowDown') { element?.scrollBy({ top: amount, behavior: 'smooth' }); } }} /> {/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}
handleGroupSelect(timelineManager, title, assets)} onSelectAssetCandidates={handleSelectAssetCandidates} onSelectAssets={handleSelectAssets} onScrollCompensation={handleScrollCompensation} {customLayout} {onThumbnailClick} />
{/if} {/each}
{#if $showAssetViewer} {#await import('../asset-viewer/asset-viewer.svelte') then { default: AssetViewer }} {/await} {/if}