@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?: (asset: AssetPreview, index: number) => void;
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 { assets: _assets, t = t_default, classControls = "", onDelete }: Props = $props();
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={`Go to image ${i + 1}`}
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) => void;
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, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marianmeres/stuic",
3
- "version": "2.40.0",
3
+ "version": "2.41.1",
4
4
  "files": [
5
5
  "dist",
6
6
  "!dist/**/*.test.*",