✨ Implemented thumbhash into MediaComponent and reduced content-shift in editor
This commit is contained in:
@@ -7,14 +7,17 @@ SPDX-License-Identifier: MPL-2.0
|
||||
<script lang="ts">
|
||||
import { browser } from '$app/environment';
|
||||
import { fade } from 'svelte/transition';
|
||||
import { thumbHashToDataURL } from 'thumbhash';
|
||||
|
||||
export let src: string;
|
||||
export let css_classes = 'max-h-64 h-auto w-auto';
|
||||
export let added_thumbhash_classes = 'h-full';
|
||||
export let muted = true;
|
||||
export let allow_fullscreen = true;
|
||||
let type: 'img' | 'video' | undefined = undefined;
|
||||
|
||||
let img_data;
|
||||
let thumbhash_data: string;
|
||||
|
||||
function base64ToBytes(base64: string): Uint8Array {
|
||||
const binString = atob(base64);
|
||||
@@ -31,11 +34,13 @@ SPDX-License-Identifier: MPL-2.0
|
||||
type = 'video';
|
||||
} else {
|
||||
type = 'img';
|
||||
thumbhash_data = thumbHashToDataURL(base64ToBytes(res.headers.get('x-thumbhash')));
|
||||
const data = await fetch(`/api/v1/storage/download/${src}`);
|
||||
img_data = {
|
||||
data: URL.createObjectURL(await data.blob()),
|
||||
alt_text: new TextDecoder().decode(base64ToBytes(res.headers.get('X-Alt-Text')))
|
||||
};
|
||||
thumbhash_data = undefined;
|
||||
}
|
||||
};
|
||||
const update_url = () => {
|
||||
@@ -58,10 +63,11 @@ SPDX-License-Identifier: MPL-2.0
|
||||
</script>
|
||||
|
||||
{#await media}
|
||||
<p>Placeholder</p>
|
||||
<img src={thumbhash_data} class={`${css_classes} ${added_thumbhash_classes}`} />
|
||||
{:then data}
|
||||
{#if type === 'img'}
|
||||
<img
|
||||
in:fade={{ duration: 300 }}
|
||||
src={img_data.data}
|
||||
alt={img_data.alt_text ?? 'Not available'}
|
||||
class={css_classes}
|
||||
|
||||
@@ -13,6 +13,7 @@ SPDX-License-Identifier: MPL-2.0
|
||||
import Spinner from '../Spinner.svelte';
|
||||
// import { createTippy } from 'svelte-tippy';
|
||||
import { getLocalization } from '$lib/i18n';
|
||||
import MediaComponent from '$lib/editor/MediaComponent.svelte';
|
||||
// import MediaComponent from "$lib/editor/MediaComponent.svelte";
|
||||
|
||||
const { t } = getLocalization();
|
||||
@@ -79,7 +80,7 @@ SPDX-License-Identifier: MPL-2.0
|
||||
*/
|
||||
</script>
|
||||
|
||||
<div class="w-full max-h-full pb-20 px-20 h-full">
|
||||
<div class="w-full max-h-full pb-10 px-10 h-full">
|
||||
<div class="rounded-lg bg-white w-full h-full border-gray-500 dark:bg-gray-700 shadow-2xl">
|
||||
<div class="h-12 bg-gray-300 rounded-t-lg dark:bg-gray-500">
|
||||
<div class="flex align-middle p-4 gap-3">
|
||||
@@ -123,9 +124,9 @@ SPDX-License-Identifier: MPL-2.0
|
||||
{/await}
|
||||
{/key}
|
||||
</div>
|
||||
{#if data.questions[selected_question].image != undefined && data.questions[selected_question].image !== ''}
|
||||
<div class="flex justify-center pt-10 w-full max-h-72">
|
||||
<div class="max-h-72 h-auto relative">
|
||||
{#if data.questions[selected_question].image}
|
||||
<div class="flex justify-center pt-10 w-full h-72">
|
||||
<div class="h-72 relative">
|
||||
<button
|
||||
class="rounded-full absolute -top-2 -right-2 opacity-70 hover:opacity-100 transition"
|
||||
type="button"
|
||||
@@ -148,9 +149,7 @@ SPDX-License-Identifier: MPL-2.0
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
{#await import('$lib/editor/MediaComponent.svelte') then c}
|
||||
<svelte:component this={c.default} bind:src={image_url} />
|
||||
{/await}
|
||||
<MediaComponent bind:src={image_url} />
|
||||
</div>
|
||||
</div>
|
||||
{:else}
|
||||
@@ -192,10 +191,10 @@ SPDX-License-Identifier: MPL-2.0
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex justify-center pt-10">
|
||||
<div class="flex justify-center py-5">
|
||||
<p>{type_to_name[String(data.questions[selected_question].type)]}</p>
|
||||
</div>
|
||||
<div class="flex justify-center py-10 w-full">
|
||||
<div class="flex justify-center w-full">
|
||||
{#if type === QuizQuestionType.ABCD || type === QuizQuestionType.CHECK}
|
||||
{#await import('$lib/editor/ABCDEditorPart.svelte')}
|
||||
<Spinner my_20={false} />
|
||||
|
||||
@@ -17,6 +17,7 @@ SPDX-License-Identifier: MPL-2.0
|
||||
import { fly } from 'svelte/transition';
|
||||
import StartGamePopup from '$lib/dashboard/start_game.svelte';
|
||||
import Analytics from './Analytics.svelte';
|
||||
import MediaComponent from '$lib/editor/MediaComponent.svelte';
|
||||
|
||||
// import GrayButton from "$lib/components/buttons/gray.svelte";
|
||||
|
||||
@@ -177,11 +178,15 @@ SPDX-License-Identifier: MPL-2.0
|
||||
>
|
||||
<div class="hidden lg:flex w-auto h-full items-center relative">
|
||||
{#if quiz.cover_image}
|
||||
<img
|
||||
<!-- <img
|
||||
src="/api/v1/storage/download/{quiz.cover_image}"
|
||||
alt="user provided"
|
||||
loading="lazy"
|
||||
class="shrink-0 max-w-full max-h-full absolute rounded"
|
||||
/>-->
|
||||
<MediaComponent
|
||||
src={quiz.cover_image}
|
||||
css_classes="shrink-0 max-w-full max-h-full absolute rounded"
|
||||
/>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user