FilePreview
FilePreview is used to display upload progress for files.
Usage
import { FilePreview } from 'stwui';
import FilePreview from 'stwui/file-preview';
-
Screenshot 2023-02-24 at 3.19.17 PM.png
410.45 KB
-
Screenshot 2023-02-25 at 3.19.17 PM.png
410.45 KB
<script lang="ts">
import { FilePreview } from 'stwui';
import { slide } from 'svelte/transition';
import { UploadStatus } from 'stwui/enums';
import type { PickerPreviewFile } from 'stwui/types';
const files: PickerPreviewFile[] = [
{
file: {
lastModified: 1677269995370,
name: 'Screenshot 2023-02-24 at 3.19.17 PM.png',
size: 420305,
type: 'image/png'
},
src: 'https://images.unsplash.com/photo-1491528323818-fdd1faba62cc?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80',
progress: 25,
status: UploadStatus.UPLOADING
},
{
file: {
lastModified: 1677269995370,
name: 'Screenshot 2023-02-25 at 3.19.17 PM.png',
size: 420305,
type: 'image/png'
},
src: 'https://images.unsplash.com/photo-1500648767791-00dcc994a43e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80',
progress: undefined,
status: UploadStatus.PENDING
}
];
</script>
<FilePreview>
{#each files as currentFile, index (currentFile.src)}
{@const { file, src, progress, status } = currentFile}
<div transition:slide|local>
<FilePreview.Item
class="flex flex-row cursor-pointer"
>
<FilePreview.Item.Leading slot="leading" class="h-8 w-8 min-w-[2rem] min-h-[2rem]">
{#if file.type.startsWith('image/')}
<FilePreview.Item.Leading.Avatar slot="avatar" size="sm" {src} alt={file.name} />
{:else}
<FilePreview.Item.Leading.Icon slot="icon" data={file_document} class="h-5 w-5" />
{/if}
</FilePreview.Item.Leading>
<FilePreview.Item.FileContent slot="file-content">
<FilePreview.Item.FileContent.Title slot="title">
{file.name}
</FilePreview.Item.FileContent.Title>
<FilePreview.Item.FileContent.Description slot="description">
{formatFileSize(file.size)}
</FilePreview.Item.FileContent.Description>
</FilePreview.Item.FileContent>
</FilePreview.Item>
</div>
{/each}
</FilePreview>
-
Screenshot 2023-02-24 at 3.19.17 PM.png
410.45 KB
Uploading 25%
-
Screenshot 2023-02-25 at 3.19.17 PM.png
410.45 KB
Pending Upload
<script lang="ts">
import { FilePreview } from 'stwui';
import { slide } from 'svelte/transition';
import { UploadStatus } from 'stwui/enums';
import type { PickerPreviewFile } from 'stwui/types';
const files: PickerPreviewFile[] = [
{
file: {
lastModified: 1677269995370,
name: 'Screenshot 2023-02-24 at 3.19.17 PM.png',
size: 420305,
type: 'image/png'
},
src: 'https://images.unsplash.com/photo-1491528323818-fdd1faba62cc?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80',
progress: 25,
status: UploadStatus.UPLOADING
},
{
file: {
lastModified: 1677269995370,
name: 'Screenshot 2023-02-25 at 3.19.17 PM.png',
size: 420305,
type: 'image/png'
},
src: 'https://images.unsplash.com/photo-1500648767791-00dcc994a43e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80',
progress: undefined,
status: UploadStatus.PENDING
}
];
</script>
<FilePreview edgeToEdge>
{#each files as currentFile, index (currentFile.src)}
{@const { file, src, progress, status } = currentFile}
<div transition:slide|local>
<FilePreview.Item
class="flex flex-row cursor-pointer"
>
<FilePreview.Item.Leading slot="leading" class="h-8 w-8 min-w-[2rem] min-h-[2rem]">
{#if file.type.startsWith('image/')}
<FilePreview.Item.Leading.Avatar slot="avatar" size="sm" {src} alt={file.name} />
{:else}
<FilePreview.Item.Leading.Icon slot="icon" data={file_document} class="h-5 w-5" />
{/if}
</FilePreview.Item.Leading>
<FilePreview.Item.FileContent slot="file-content">
<FilePreview.Item.FileContent.Title slot="title">
{file.name}
</FilePreview.Item.FileContent.Title>
<FilePreview.Item.FileContent.Description slot="description">
{formatFileSize(file.size)}
</FilePreview.Item.FileContent.Description>
</FilePreview.Item.FileContent>
<FilePreview.Item.UploadContent slot="upload-content">
<FilePreview.Item.UploadContent.Status slot="status">
{#if status === UploadStatus.FAILED}
Upload Failed
{:else if status === UploadStatus.COMPLETE}
Upload Complete
{:else if status === UploadStatus.UPLOADING}
Uploading {#if progress}{progress.toFixed(0)}%{:else}0%{/if}
{:else if status === UploadStatus.REJECTED}
Upload Rejected
{:else if status === UploadStatus.PENDING}
Pending Upload
{/if}
</FilePreview.Item.UploadContent.Status>
</FilePreview.Item.UploadContent>
</FilePreview.Item>
</div>
{/each}
</FilePreview>
Kitchen Sink
-
Screenshot 2023-02-24 at 3.19.17 PM.png
410.45 KB
Uploading 25%
Tap to cancel
-
Screenshot 2023-02-25 at 3.19.17 PM.png
410.45 KB
Pending Upload
Tap to cancel
<script lang="ts">
import { FilePreview } from 'stwui';
import { slide } from 'svelte/transition';
import { UploadStatus } from 'stwui/enums';
import type { PickerPreviewFile } from 'stwui/types';
const files: PickerPreviewFile[] = [
{
file: {
lastModified: 1677269995370,
name: 'Screenshot 2023-02-24 at 3.19.17 PM.png',
size: 420305,
type: 'image/png'
},
src: 'https://images.unsplash.com/photo-1491528323818-fdd1faba62cc?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80',
progress: 25,
status: UploadStatus.UPLOADING
},
{
file: {
lastModified: 1677269995370,
name: 'Screenshot 2023-02-25 at 3.19.17 PM.png',
size: 420305,
type: 'image/png'
},
src: 'https://images.unsplash.com/photo-1500648767791-00dcc994a43e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80',
progress: undefined,
status: UploadStatus.PENDING
}
];
async function handleFileClick(file: PickerPreviewFile) {
if (file.status === UploadStatus.PENDING || file.status === UploadStatus.Uploading) {
console.log('Cancel Upload');
} else if (file.status === UploadStatus.COMPLETE) {
console.log('Remove Uploaded File');
} else if (file.status === UploadStatus.FAILED) {
console.log('Retry Upload');
} else if (file.status == UploadStatus.REJECTED) {
console.log('Remove Rejected File');
}
}
</script>
<FilePreview bordered class="rounded-md">
{#each files as currentFile, index (currentFile.src)}
{@const { file, src, progress, status } = currentFile}
<div transition:slide|local>
<FilePreview.Item
class="flex flex-row cursor-pointer"
on:click={() => handleFileClick(currentFile)}
>
<FilePreview.Item.Leading slot="leading" class="h-8 w-8 min-w-[2rem] min-h-[2rem]">
{#if file.type.startsWith('image/')}
<FilePreview.Item.Leading.Avatar slot="avatar" size="sm" {src} alt={file.name} />
{:else}
<FilePreview.Item.Leading.Icon slot="icon" data={file_document} class="h-5 w-5" />
{/if}
</FilePreview.Item.Leading>
<FilePreview.Item.FileContent slot="file-content">
<FilePreview.Item.FileContent.Title slot="title">
{file.name}
</FilePreview.Item.FileContent.Title>
<FilePreview.Item.FileContent.Description slot="description">
{formatFileSize(file.size)}
</FilePreview.Item.FileContent.Description>
</FilePreview.Item.FileContent>
<FilePreview.Item.UploadContent slot="upload-content">
<FilePreview.Item.UploadContent.Status slot="status">
{#if status === UploadStatus.FAILED}
Upload Failed
{:else if status === UploadStatus.COMPLETE}
Upload Complete
{:else if status === UploadStatus.UPLOADING}
Uploading {#if progress}{progress.toFixed(0)}%{:else}0%{/if}
{:else if status === UploadStatus.REJECTED}
Upload Rejected
{:else if status === UploadStatus.PENDING}
Pending Upload
{/if}
</FilePreview.Item.UploadContent.Status>
<FilePreview.Item.UploadContent.Action slot="action">
{#if status === UploadStatus.FAILED}
Tap to retry
{:else if status === UploadStatus.COMPLETE}
Tap to undo
{:else if status === UploadStatus.UPLOADING}
Tap to cancel
{:else if status === UploadStatus.REJECTED}
Tap to remove
{:else if status === UploadStatus.PENDING}
Tap to cancel
{/if}
</FilePreview.Item.UploadContent.Action>
</FilePreview.Item.UploadContent>
<FilePreview.Item.Extra
slot="extra"
placement="center"
class="justify-center items-center flex"
>
{#if status === UploadStatus.FAILED}
<FilePreview.Item.Extra.Failed />
{:else if status === UploadStatus.COMPLETE}
<FilePreview.Item.Extra.Complete />
{:else if status === UploadStatus.UPLOADING && progress !== undefined}
<FilePreview.Item.Extra.Uploading {progress} />
{:else if status === UploadStatus.REJECTED}
<FilePreview.Item.Extra.Rejected />
{:else if status === UploadStatus.PENDING}
<FilePreview.Item.Extra.Pending />
{/if}
</FilePreview.Item.Extra>
</FilePreview.Item>
</div>
{/each}
</FilePreview>
FilePreview Props
divided | boolean | true |
bordered | boolean | false |
edgeToEdge | boolean | false |
FilePreview Slots
default | <FilePreview.Item /> |
FilePreview.Item Slots
leading | <List.Item.Leading slot="leading" /> |
file-content | <FilePreview.Item.FileContent slot="file-content" /> |
upload-content | <FilePreview.Item.UploadContent slot="upload-content" /> |
default | <FilePreview.Item.Extra slot="extra" /> |
FilePreview.Item.Leading Slots
icon | <FilePreview.Item.Leading.Icon slot="icon" /> |
avatar | <FilePreview.Item.Leading.Avatar slot="avatar" /> |
default | |
FilePreview.Item.Leading.Icon Props
data | string (IconData) | |
viewBox | string | 0 0 24 24 |
size | string | 24px |
width | string | 24px |
height | string | 24px |
color | string | currentColor |
stroke | string | undefined | |
fill | string | currentColor |
FilePreview.Item.Leading.Avatar Props
src | string | |
alt | user-avatar | |
size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | md |
placeholder | boolean | true |
FilePreview.Item.FileContent Slots
title | <FilePreview.Item.FileContent.Title slot="title" /> |
description | <FilePreview.Item.FileContent.Description slot="description" /> |
default | |
FilePreview.Item.FileContent.Title Slots
FilePreview.Item.FileContent.Description Slots
FilePreview.Item.UploadContent Slots
status | <FilePreview.Item.UploadContent.Status slot="status" /> |
action | <FilePreview.Item.UploadContent.Action slot="action" /> |
FilePreview.Item.UploadContent.Status Slots
FilePreview.Item.UploadContent.Action Slots
FilePreview.Item.Extra Props
placement | 'start' | 'center' | 'end' | start |
FilePreview.Item.Extra Slots
pending | <FilePreview.Item.Extra.Pending slot="pending" /> |
complete | <FilePreview.Item.Extra.Complete slot="complete" /> |
uploading | <FilePreview.Item.Extra.Uploading slot="uploading" /> |
failed | <FilePreview.Item.Extra.Failed slot="failed" /> |
rejected | <FilePreview.Item.Extra.Rejected slot="rejected" /> |
default | |
FilePreview Class Identifiers
stwui-file-preview |
stwui-file-preview-item |
stwui-file-preview-item-leading |
stwui-file-preview-item-upload-content |
stwui-file-preview-item-file-content |
stwui-file-preview-item-extra |
stwui-file-preview-item-leading-avatar-wrapper |
stwui-file-preview-item-leading-avatar |
stwui-file-preview-item-leading-avatar-placeholder |
stwui-file-preview-item-file-content-title |
stwui-file-preview-item-file-content-description |
stwui-file-preview-item-upload-content-status |
stwui-file-preview-item-upload-content-action |
stwui-file-preview-item-extra-uploading |
stwui-file-preview-item-extra-rejected |
stwui-file-preview-item-extra-pending |
stwui-file-preview-item-extra-failed |
stwui-file-preview-item-extra-complete |