mirror of
https://github.com/wukko/cobalt.git
synced 2025-01-23 19:26:26 +01:00
web/picker: add item type icons and improve accessibility
This commit is contained in:
parent
7c5b703e37
commit
9787a04e19
3 changed files with 60 additions and 5 deletions
|
@ -1,3 +1,4 @@
|
||||||
{
|
{
|
||||||
"picker.item.generic": "media thumbnail"
|
"picker.item.photo": "photo thumbnail",
|
||||||
|
"picker.item.video": "video thumbnail"
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,6 +50,14 @@
|
||||||
open = true;
|
open = true;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// item id for alt text
|
||||||
|
let counter = 0;
|
||||||
|
|
||||||
|
const itemNumber = () => {
|
||||||
|
counter++
|
||||||
|
return counter
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<dialog
|
<dialog
|
||||||
|
@ -74,7 +82,7 @@
|
||||||
<div class="picker-body">
|
<div class="picker-body">
|
||||||
{#if items}
|
{#if items}
|
||||||
{#each items as item}
|
{#each items as item}
|
||||||
<PickerItem {item} />
|
<PickerItem {item} number={itemNumber()} />
|
||||||
{/each}
|
{/each}
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -6,9 +6,18 @@
|
||||||
|
|
||||||
import Skeleton from "$components/misc/Skeleton.svelte";
|
import Skeleton from "$components/misc/Skeleton.svelte";
|
||||||
|
|
||||||
|
import IconMovie from "@tabler/icons-svelte/IconMovie.svelte";
|
||||||
|
import IconPhoto from "@tabler/icons-svelte/IconPhoto.svelte";
|
||||||
|
|
||||||
export let item: DialogPickerItem;
|
export let item: DialogPickerItem;
|
||||||
|
export let number: number;
|
||||||
|
|
||||||
let imageLoaded = false;
|
let imageLoaded = false;
|
||||||
|
|
||||||
|
let itemType = item.type;
|
||||||
|
if (!itemType) {
|
||||||
|
itemType = "photo"
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
|
@ -17,20 +26,31 @@
|
||||||
downloadFile(item.url);
|
downloadFile(item.url);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
{#if item.type}
|
||||||
|
<div class="picker-type">
|
||||||
|
{#if item.type === "video"}
|
||||||
|
<IconMovie />
|
||||||
|
{:else if item.type === "photo"}
|
||||||
|
<IconPhoto />
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
|
||||||
<img
|
<img
|
||||||
class="picker-image"
|
class="picker-image"
|
||||||
src={item.thumb ? item.thumb : item.url}
|
src={item.thumb ? item.thumb : item.url}
|
||||||
|
|
||||||
class:loading={!imageLoaded}
|
class:loading={!imageLoaded}
|
||||||
on:load={() => (imageLoaded = true)}
|
on:load={() => (imageLoaded = true)}
|
||||||
alt={$t("a11y.dialog.picker.item.generic")}
|
|
||||||
height="100"
|
alt="{$t(`a11y.dialog.picker.item.${itemType}`)} {number}"
|
||||||
width="100"
|
|
||||||
/>
|
/>
|
||||||
<Skeleton class="picker-image" hidden={imageLoaded} />
|
<Skeleton class="picker-image" hidden={imageLoaded} />
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.picker-item {
|
.picker-item {
|
||||||
|
position: relative;
|
||||||
background: none;
|
background: none;
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
|
@ -62,4 +82,30 @@
|
||||||
opacity: 0.8;
|
opacity: 0.8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.picker-type {
|
||||||
|
position: absolute;
|
||||||
|
color: var(--white);
|
||||||
|
background: rgba(0, 0, 0, 0.5);
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
z-index: 9;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
|
||||||
|
top: 6px;
|
||||||
|
left: 6px;
|
||||||
|
|
||||||
|
border-radius: 4px;
|
||||||
|
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.picker-type :global(svg) {
|
||||||
|
width: 21px;
|
||||||
|
height: 21px;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
Loading…
Reference in a new issue