diff --git a/dev/prod/public/config-worker.json b/dev/prod/public/config-worker.json index bc432606f0..56985b9199 100644 --- a/dev/prod/public/config-worker.json +++ b/dev/prod/public/config-worker.json @@ -31,7 +31,7 @@ "MODEL_VERSION": "", - "PREVIEW_CONFIG": "https://dl.hc.engineering/image/fit=scale-down,width=:size/:workspace/:blobId", + "PREVIEW_CONFIG": "image|https://dl.hc.engineering/image/fit=scale-down,width=:width,height=:height,dpr=:dpr/:workspace/:blobId;video|https://dl.hc.engineering/video/:workspace/:blobId/meta", "PRINT_URL": "https://print.hc.engineering", diff --git a/packages/presentation/src/components/Image.svelte b/packages/presentation/src/components/Image.svelte new file mode 100644 index 0000000000..305766a251 --- /dev/null +++ b/packages/presentation/src/components/Image.svelte @@ -0,0 +1,39 @@ + + + +{#await getBlobRef(blob, alt, width, height) then blobSrc} + +{/await} diff --git a/packages/presentation/src/index.ts b/packages/presentation/src/index.ts index 0a6f29a548..baefdbb1c1 100644 --- a/packages/presentation/src/index.ts +++ b/packages/presentation/src/index.ts @@ -50,6 +50,7 @@ export { default as DownloadFileButton } from './components/DownloadFileButton.s export { default as FileTypeIcon } from './components/FileTypeIcon.svelte' export { default as DrawingBoard } from './components/DrawingBoard.svelte' export { default as DrawingBoardToolbar } from './components/DrawingBoardToolbar.svelte' +export { default as Image } from './components/Image.svelte' export { default } from './plugin' export * from './types' export * from './utils' diff --git a/packages/presentation/src/preview.ts b/packages/presentation/src/preview.ts index 7c633ba983..256a9cd1c1 100644 --- a/packages/presentation/src/preview.ts +++ b/packages/presentation/src/preview.ts @@ -63,26 +63,32 @@ export function getPreviewConfig (): PreviewConfig { export async function getBlobRef ( file: Ref, name?: string, - width?: number + width?: number, + height?: number ): Promise<{ src: string srcset: string }> { return { src: getFileUrl(file, name), - srcset: getSrcSet(file, width) + srcset: getSrcSet(file, width, height) } } -export async function getBlobSrcSet (file: Ref, width?: number): Promise { - return getSrcSet(file, width) +export async function getBlobSrcSet (file: Ref, width?: number, height?: number): Promise { + return getSrcSet(file, width, height) } -export function getSrcSet (_blob: Ref, width?: number): string { - return blobToSrcSet(getPreviewConfig(), _blob, width) +export function getSrcSet (_blob: Ref, width?: number, height?: number): string { + return blobToSrcSet(getPreviewConfig(), _blob, width, height) } -function blobToSrcSet (cfg: PreviewConfig, blob: Ref, width: number | undefined): string { +function blobToSrcSet ( + cfg: PreviewConfig, + blob: Ref, + width: number | undefined, + height: number | undefined +): string { if (blob.includes('://')) { return '' } @@ -98,25 +104,32 @@ function blobToSrcSet (cfg: PreviewConfig, blob: Ref, width: number | unde url = url.replaceAll(':blobId', encodeURIComponent(blob)) let result = '' - const fu = url if (width !== undefined) { result += - fu.replaceAll(':size', `${width}`) + + formatImageSize(url, width, height ?? width, 1) + ' 1x , ' + - fu.replaceAll(':size', `${width * 2}`) + + formatImageSize(url, width, height ?? width, 2) + ' 2x, ' + - fu.replaceAll(':size', `${width * 3}`) + + formatImageSize(url, width, height ?? width, 3) + ' 3x' } return result } +function formatImageSize (url: string, width: number, height: number, dpr: number): string { + return url + .replaceAll(':size', `${width * dpr}`) + .replaceAll(':width', `${width}`) + .replaceAll(':height', `${height}`) + .replaceAll(':dpr', `${dpr}`) +} + /*** * @deprecated, please use Blob direct operations. */ -export function getFileSrcSet (_blob: Ref, width?: number): string { - return blobToSrcSet(getPreviewConfig(), _blob, width) +export function getFileSrcSet (_blob: Ref, width?: number, height?: number): string { + return blobToSrcSet(getPreviewConfig(), _blob, width, height) } /** diff --git a/packages/presentation/src/utils.ts b/packages/presentation/src/utils.ts index 0df27c7174..64308238b6 100644 --- a/packages/presentation/src/utils.ts +++ b/packages/presentation/src/utils.ts @@ -506,6 +506,11 @@ export function getCurrentWorkspaceUrl (): string { return wsId } +export function remToPx (rem: number): number { + const fontSize = parseFloat(getComputedStyle(document.documentElement).fontSize) + return rem * fontSize +} + export function sizeToWidth (size: string): number | undefined { let width: number | undefined switch (size) { @@ -515,22 +520,22 @@ export function sizeToWidth (size: string): number | undefined { case 'x-small': case 'smaller': case 'small': - width = 32 + width = 2 break case 'medium': - width = 64 + width = 2.5 break case 'large': - width = 256 + width = 4.5 break case 'x-large': - width = 512 + width = 7.5 break case '2x-large': - width = 1024 + width = 10 break } - return width + return width !== undefined ? remToPx(width) : undefined } /** diff --git a/packages/ui/src/components/Image.svelte b/packages/ui/src/components/Image.svelte new file mode 100644 index 0000000000..b5ac78abf9 --- /dev/null +++ b/packages/ui/src/components/Image.svelte @@ -0,0 +1,56 @@ + + + + + + diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts index b87eb0e280..35c1970e3a 100644 --- a/packages/ui/src/index.ts +++ b/packages/ui/src/index.ts @@ -285,6 +285,7 @@ export { default as NestedMenu } from './components/NestedMenu.svelte' export { default as NestedDropdown } from './components/NestedDropdown.svelte' export { default as Dock } from './components/Dock.svelte' +export { default as Image } from './components/Image.svelte' export * from './types' export * from './location' diff --git a/plugins/attachment-resources/src/components/AttachmentDocList.svelte b/plugins/attachment-resources/src/components/AttachmentDocList.svelte index 64ea754006..5a8edd049e 100644 --- a/plugins/attachment-resources/src/components/AttachmentDocList.svelte +++ b/plugins/attachment-resources/src/components/AttachmentDocList.svelte @@ -23,7 +23,7 @@ export let value: Doc & { attachments?: number } export let attachments: Attachment[] | undefined = undefined - export let imageSize: AttachmentImageSize = 'auto' + export let imageSize: AttachmentImageSize = 'x-large' export let videoPreload = true export let isOwn = false diff --git a/plugins/attachment-resources/src/components/AttachmentImagePreview.svelte b/plugins/attachment-resources/src/components/AttachmentImagePreview.svelte index 611003711b..3c39ba9d3d 100644 --- a/plugins/attachment-resources/src/components/AttachmentImagePreview.svelte +++ b/plugins/attachment-resources/src/components/AttachmentImagePreview.svelte @@ -14,18 +14,19 @@ --> -
- {#await getBlobRef(value.file, value.name, sizeToWidth(urlSize)) then blobSrc} - {value.name} - {/await} +
+ {#if loading} +
+ +
+ {/if} + + {#if error} +
+ +
+ {/if} + + {value.name}
diff --git a/plugins/attachment-resources/src/components/icons/BrokenImage.svelte b/plugins/attachment-resources/src/components/icons/BrokenImage.svelte new file mode 100644 index 0000000000..d9ef4ba393 --- /dev/null +++ b/plugins/attachment-resources/src/components/icons/BrokenImage.svelte @@ -0,0 +1,25 @@ + + + + + + diff --git a/plugins/chunter-resources/src/components/chat-message/ChatMessagePresenter.svelte b/plugins/chunter-resources/src/components/chat-message/ChatMessagePresenter.svelte index 82886d9c82..c433d51c1f 100644 --- a/plugins/chunter-resources/src/components/chat-message/ChatMessagePresenter.svelte +++ b/plugins/chunter-resources/src/components/chat-message/ChatMessagePresenter.svelte @@ -47,7 +47,7 @@ export let inline = false export let hoverStyles: 'borderedHover' | 'filledHover' = 'borderedHover' export let withShowMore: boolean = true - export let attachmentImageSize: AttachmentImageSize = 'auto' + export let attachmentImageSize: AttachmentImageSize = 'x-large' export let videoPreload = true export let hideLink = false export let compact = false diff --git a/plugins/drive-resources/src/components/GridItem.svelte b/plugins/drive-resources/src/components/GridItem.svelte index c76ac3edbe..7aaef02bb7 100644 --- a/plugins/drive-resources/src/components/GridItem.svelte +++ b/plugins/drive-resources/src/components/GridItem.svelte @@ -66,7 +66,7 @@ }} >
- +
diff --git a/plugins/drive-resources/src/components/Thumbnail.svelte b/plugins/drive-resources/src/components/Thumbnail.svelte index 97f00471a7..9c4678cb3f 100644 --- a/plugins/drive-resources/src/components/Thumbnail.svelte +++ b/plugins/drive-resources/src/components/Thumbnail.svelte @@ -15,14 +15,14 @@