@marianmeres/stuic 2.40.0 → 2.41.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
import { tooltip } from "../../actions/index.js";
|
|
31
31
|
import { X } from "../X/index.js";
|
|
32
32
|
import { preloadImgs } from "../../utils/preload-img.js";
|
|
33
|
+
import { fade } from "svelte/transition";
|
|
33
34
|
|
|
34
35
|
export type AssetPreviewUrlObj = {
|
|
35
36
|
// o
|
|
@@ -59,7 +60,15 @@
|
|
|
59
60
|
/** Optional translate function */
|
|
60
61
|
t?: TranslateFn;
|
|
61
62
|
/** Optional delete handler - receives the current asset and its index */
|
|
62
|
-
onDelete?: (
|
|
63
|
+
onDelete?: (
|
|
64
|
+
asset: AssetPreview,
|
|
65
|
+
index: number,
|
|
66
|
+
controls: {
|
|
67
|
+
close: () => void;
|
|
68
|
+
}
|
|
69
|
+
) => void;
|
|
70
|
+
/** optional "do not display file name" switch flag */
|
|
71
|
+
noName?: boolean;
|
|
63
72
|
}
|
|
64
73
|
|
|
65
74
|
export function getAssetIcon(ext?: string) {
|
|
@@ -156,13 +165,20 @@
|
|
|
156
165
|
<script lang="ts">
|
|
157
166
|
const clog = createClog("AssetsPreview", { color: "auto" });
|
|
158
167
|
|
|
159
|
-
let {
|
|
168
|
+
let {
|
|
169
|
+
assets: _assets,
|
|
170
|
+
t = t_default,
|
|
171
|
+
classControls = "",
|
|
172
|
+
onDelete,
|
|
173
|
+
noName,
|
|
174
|
+
}: Props = $props();
|
|
160
175
|
|
|
161
176
|
let assets: AssetPreviewNormalized[] = $derived(
|
|
162
177
|
(_assets ?? []).map(normalizeInput).filter(Boolean) as AssetPreviewNormalized[]
|
|
163
178
|
);
|
|
164
179
|
let previewIdx = $state<number>(0);
|
|
165
180
|
let modal: Modal | undefined = $state();
|
|
181
|
+
let dotTooltip: string | undefined = $state();
|
|
166
182
|
|
|
167
183
|
// Zoom state
|
|
168
184
|
const ZOOM_LEVELS = [1, 1.5, 2, 3, 4] as const;
|
|
@@ -187,6 +203,9 @@
|
|
|
187
203
|
$effect(() => {
|
|
188
204
|
const visible = modal?.visibility().visible;
|
|
189
205
|
if (visible) {
|
|
206
|
+
// Reset preview index on modal open
|
|
207
|
+
previewIdx = 0;
|
|
208
|
+
|
|
190
209
|
// perhaps we should have some upper limit here...
|
|
191
210
|
const toPreload = (assets ?? [])
|
|
192
211
|
.map((asset) => (asset.isImage ? String(asset.url.full) : ""))
|
|
@@ -341,6 +360,10 @@
|
|
|
341
360
|
resetZoom();
|
|
342
361
|
}
|
|
343
362
|
|
|
363
|
+
function preview(idx: number) {
|
|
364
|
+
previewIdx = idx % assets.length;
|
|
365
|
+
}
|
|
366
|
+
|
|
344
367
|
// $inspect(assets).with(clog);
|
|
345
368
|
</script>
|
|
346
369
|
|
|
@@ -454,7 +477,7 @@
|
|
|
454
477
|
<button
|
|
455
478
|
class={twMerge(TOP_BUTTON_CLS, classControls)}
|
|
456
479
|
type="button"
|
|
457
|
-
onclick={() => onDelete(previewAsset, previewIdx)}
|
|
480
|
+
onclick={() => onDelete(previewAsset, previewIdx, { close })}
|
|
458
481
|
aria-label={t("delete")}
|
|
459
482
|
use:tooltip
|
|
460
483
|
>
|
|
@@ -486,15 +509,26 @@
|
|
|
486
509
|
</button>
|
|
487
510
|
</div>
|
|
488
511
|
|
|
489
|
-
{#if previewAsset?.name}
|
|
512
|
+
{#if !noName && previewAsset?.name}
|
|
490
513
|
<span class="absolute top-4 left-4 bg-white px-1 rounded">
|
|
491
514
|
{previewAsset?.name}
|
|
492
515
|
</span>
|
|
493
516
|
{/if}
|
|
494
517
|
|
|
495
518
|
{#if assets.length > 1}
|
|
519
|
+
{#if !noName && dotTooltip}
|
|
520
|
+
<div
|
|
521
|
+
class="absolute bottom-10 left-0 right-0 text-center"
|
|
522
|
+
transition:fade={{ duration: 100 }}
|
|
523
|
+
>
|
|
524
|
+
<span class="bg-white p-1 rounded opacity/75">
|
|
525
|
+
{dotTooltip}
|
|
526
|
+
</span>
|
|
527
|
+
</div>
|
|
528
|
+
{/if}
|
|
496
529
|
<div class="absolute bottom-4 left-1/2 -translate-x-1/2 flex items-center gap-3">
|
|
497
530
|
{#each assets as _, i}
|
|
531
|
+
<!-- svelte-ignore a11y_mouse_events_have_key_events -->
|
|
498
532
|
<button
|
|
499
533
|
type="button"
|
|
500
534
|
class={twMerge(
|
|
@@ -505,7 +539,13 @@
|
|
|
505
539
|
previewIdx = i;
|
|
506
540
|
resetZoom();
|
|
507
541
|
}}
|
|
508
|
-
aria-label={
|
|
542
|
+
aria-label={assets[i]?.name}
|
|
543
|
+
onmouseover={() => {
|
|
544
|
+
dotTooltip = assets[i]?.name;
|
|
545
|
+
}}
|
|
546
|
+
onmouseout={() => {
|
|
547
|
+
dotTooltip = undefined;
|
|
548
|
+
}}
|
|
509
549
|
></button>
|
|
510
550
|
{/each}
|
|
511
551
|
</div>
|
|
@@ -15,7 +15,11 @@ export interface Props {
|
|
|
15
15
|
/** Optional translate function */
|
|
16
16
|
t?: TranslateFn;
|
|
17
17
|
/** Optional delete handler - receives the current asset and its index */
|
|
18
|
-
onDelete?: (asset: AssetPreview, index: number
|
|
18
|
+
onDelete?: (asset: AssetPreview, index: number, controls: {
|
|
19
|
+
close: () => void;
|
|
20
|
+
}) => void;
|
|
21
|
+
/** optional "do not display file name" switch flag */
|
|
22
|
+
noName?: boolean;
|
|
19
23
|
}
|
|
20
24
|
export declare function getAssetIcon(ext?: string): CallableFunction;
|
|
21
25
|
declare const AssetsPreview: import("svelte").Component<Props, {
|