@xhub-short/ui 0.1.0-beta.1 → 0.1.0-beta.11

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.
Files changed (76) hide show
  1. package/dist/CommentSheet.css-DyEc3Sro.d.ts +217 -0
  2. package/dist/VideoSlotPlayIndicator-DPs8Xt5C.d.ts +51 -0
  3. package/dist/chunk-3OB3OVYR.js +349 -0
  4. package/dist/{chunk-WKX2WBVO.js → chunk-3XPJHUYL.js} +1 -39
  5. package/dist/chunk-4RIMQOBR.js +58 -0
  6. package/dist/chunk-4TUBNA2X.js +180 -0
  7. package/dist/{chunk-4YDIRPIN.js → chunk-ANCP53F3.js} +3 -3
  8. package/dist/{chunk-UXMA4KJZ.js → chunk-CAWE42LH.js} +5 -3
  9. package/dist/{chunk-ANGBSV7L.js → chunk-CIIZ3IHV.js} +10 -5
  10. package/dist/chunk-DR7KR7OT.js +103 -0
  11. package/dist/chunk-DXLCQ4FH.js +102 -0
  12. package/dist/chunk-EDWS2IPH.js +1 -0
  13. package/dist/chunk-FR7UQSZP.js +570 -0
  14. package/dist/chunk-IWSBYOSS.js +91 -0
  15. package/dist/chunk-JEY6R4KJ.js +334 -0
  16. package/dist/chunk-KMJ3PQ7M.js +1262 -0
  17. package/dist/chunk-MFJS65C5.js +368 -0
  18. package/dist/{chunk-HW4LXTFT.js → chunk-OM4L7RE5.js} +18 -6
  19. package/dist/chunk-PBIH2F2Q.js +344 -0
  20. package/dist/chunk-PJ4NMVMY.js +326 -0
  21. package/dist/chunk-Q6MG7AVG.js +531 -0
  22. package/dist/chunk-QCKVF2DR.js +713 -0
  23. package/dist/chunk-QCRRF76W.js +75 -0
  24. package/dist/chunk-QUEJHA24.js +508 -0
  25. package/dist/chunk-VXW7AOGM.js +285 -0
  26. package/dist/chunk-YB7AXTX7.js +430 -0
  27. package/dist/chunk-ZGWSJ6Z5.js +601 -0
  28. package/dist/components/ActionBar/index.js +1 -1
  29. package/dist/components/AdvanceMenu/index.d.ts +78 -0
  30. package/dist/components/AdvanceMenu/index.js +1 -0
  31. package/dist/components/AuthorInfo/index.d.ts +5 -1
  32. package/dist/components/AuthorInfo/index.js +1 -1
  33. package/dist/components/BottomSheet/index.d.ts +82 -0
  34. package/dist/components/BottomSheet/index.js +1 -0
  35. package/dist/components/CleanModeOverlay/index.d.ts +60 -0
  36. package/dist/components/CleanModeOverlay/index.js +1 -0
  37. package/dist/components/CommentSheet/index.d.ts +164 -0
  38. package/dist/components/CommentSheet/index.js +1 -0
  39. package/dist/components/DetailView/index.d.ts +311 -0
  40. package/dist/components/DetailView/index.js +1 -0
  41. package/dist/components/ErrorBoundary/index.js +1 -1
  42. package/dist/components/ImageCarousel/index.d.ts +50 -0
  43. package/dist/components/ImageCarousel/index.js +1 -0
  44. package/dist/components/ImagePostSlot/index.d.ts +207 -0
  45. package/dist/components/ImagePostSlot/index.js +1 -0
  46. package/dist/components/ProgressBar/index.d.ts +30 -2
  47. package/dist/components/ProgressBar/index.js +1 -1
  48. package/dist/components/QualityPicker/index.d.ts +35 -0
  49. package/dist/components/QualityPicker/index.js +1 -0
  50. package/dist/components/ReportSheet/index.d.ts +68 -0
  51. package/dist/components/ReportSheet/index.js +1 -0
  52. package/dist/components/Skeleton/index.js +1 -1
  53. package/dist/components/SpeedPicker/index.d.ts +32 -0
  54. package/dist/components/SpeedPicker/index.js +1 -0
  55. package/dist/components/VideoFeed/index.d.ts +12 -1
  56. package/dist/components/VideoFeed/index.js +1 -1
  57. package/dist/components/VideoInfo/index.d.ts +4 -2
  58. package/dist/components/VideoInfo/index.js +1 -1
  59. package/dist/components/VideoPlayer/index.d.ts +14 -41
  60. package/dist/components/VideoPlayer/index.js +1 -1
  61. package/dist/components/VideoSlot/index.d.ts +84 -65
  62. package/dist/components/VideoSlot/index.js +2 -1
  63. package/dist/components/VirtualSlider/index.d.ts +339 -0
  64. package/dist/components/VirtualSlider/index.js +1 -0
  65. package/dist/components/icons/index.js +1 -1
  66. package/dist/index.d.ts +107 -95
  67. package/dist/index.js +84 -27
  68. package/package.json +51 -7
  69. package/dist/chunk-2PTMP65P.js +0 -738
  70. package/dist/chunk-4MN72OZH.js +0 -148
  71. package/dist/chunk-DHQJBXQW.js +0 -562
  72. package/dist/chunk-SSJDO24Q.js +0 -204
  73. package/dist/chunk-XAOEHLOX.js +0 -1326
  74. package/dist/chunk-YW23IBKF.js +0 -530
  75. package/dist/chunk-ZZDQKP4R.js +0 -418
  76. package/dist/use-gesture-react.esm-3SV4QLEJ.js +0 -1893
@@ -0,0 +1,334 @@
1
+ import { useDoubleTap, VideoSlotPlayIndicatorInner } from './chunk-MFJS65C5.js';
2
+ import { ImageCarouselHeadless } from './chunk-Q6MG7AVG.js';
3
+ import { clsx2 } from './chunk-EDWS2IPH.js';
4
+ import { injectComponentCSS } from './chunk-CAWE42LH.js';
5
+ import { createContext, memo, useInsertionEffect, useState, useRef, useCallback, useMemo, useContext } from 'react';
6
+ import { jsx, jsxs } from 'react/jsx-runtime';
7
+
8
+ // src/components/ImagePostSlot/ImagePostSlot.css.ts
9
+ var IMAGE_POST_SLOT_CSS = `.sv-image-post-slot{position:relative;width:100%;height:100%;overflow:hidden;background:var(--sv-image-post-bg,#000);touch-action:pan-y;user-select:none;-webkit-user-select:none}.sv-image-post-slot--active{z-index:1}.sv-image-post-slot__images{position:absolute;inset:0;display:flex;align-items:center;justify-content:center}.sv-image-post-slot__overlay{position:absolute;inset:0;pointer-events:none;display:flex;flex-direction:column;z-index:2}.sv-image-post-slot__overlay>*{pointer-events:auto}.sv-image-post-slot__gradient{position:absolute;left:0;right:0;pointer-events:none}.sv-image-post-slot__gradient--top{top:0;height:120px;background:linear-gradient(to bottom,rgba(0,0,0,.5)0%,rgba(0,0,0,.3)50%,transparent 100%)}.sv-image-post-slot__gradient--bottom{bottom:0;height:200px;background:linear-gradient(to top,rgba(0,0,0,.7)0%,rgba(0,0,0,.4)50%,transparent 100%)}.sv-image-post-slot__top-bar{position:absolute;top:0;left:0;right:0;padding:var(--sv-image-post-top-padding,16px);display:flex;justify-content:space-between;align-items:flex-start;z-index:10}.sv-image-post-slot__counter{padding:4px 10px;background:var(--sv-image-post-counter-bg,rgba(0,0,0,.6));border-radius:12px;font-size:var(--sv-image-post-counter-font-size,12px);font-weight:500;color:var(--sv-image-post-counter-color,#fff)}.sv-image-post-slot__badge{padding:4px 8px;background:var(--sv-image-post-badge-bg,rgba(255,255,255,.2));border-radius:4px;font-size:var(--sv-image-post-badge-font-size,11px);font-weight:500;color:var(--sv-image-post-badge-color,#fff);text-transform:uppercase;letter-spacing:.5px}.sv-image-post-slot__bottom{position:absolute;bottom:0;left:0;right:var(--sv-image-post-action-bar-width,72px);padding:var(--sv-image-post-bottom-padding,16px);display:flex;flex-direction:column;gap:12px;z-index:5}.sv-image-post-slot__author{display:flex;align-items:center;gap:10px}.sv-image-post-slot__author-avatar{width:var(--sv-image-post-avatar-size,40px);height:var(--sv-image-post-avatar-size,40px);border-radius:50%;object-fit:cover;border:2px solid var(--sv-image-post-avatar-border,rgba(255,255,255,.3))}.sv-image-post-slot__author-name{font-size:var(--sv-image-post-author-font-size,15px);font-weight:600;color:var(--sv-image-post-author-color,#fff);text-shadow:0 1px 2px rgba(0,0,0,.5)}.sv-image-post-slot__caption{font-size:var(--sv-image-post-caption-font-size,14px);line-height:1.4;color:var(--sv-image-post-caption-color,#fff);text-shadow:0 1px 2px rgba(0,0,0,.5);display:-webkit-box;-webkit-line-clamp:var(--sv-image-post-caption-lines,2);-webkit-box-orient:vertical;overflow:hidden}.sv-image-post-slot__caption--expanded{-webkit-line-clamp:unset;overflow:visible}.sv-image-post-slot__read-more{display:inline-flex;align-items:center;gap:4px;padding:8px 16px;background:var(--sv-image-post-read-more-bg,rgba(255,255,255,.2));border:0;border-radius:20px;font-size:var(--sv-image-post-read-more-font-size,13px);font-weight:500;color:var(--sv-image-post-read-more-color,#fff);cursor:pointer;transition:background .2s ease;width:fit-content}.sv-image-post-slot__read-more:hover{background:var(--sv-image-post-read-more-hover-bg,rgba(255,255,255,.3))}.sv-image-post-slot__read-more svg{width:16px;height:16px}.sv-image-post-slot__actions{position:absolute;right:0;bottom:0;width:var(--sv-image-post-action-bar-width,72px);padding:var(--sv-image-post-actions-padding,16px 8px);display:flex;flex-direction:column;align-items:center;gap:20px;z-index:5}.sv-image-post-slot__music{overflow:hidden;aspect-ratio:1/1;background:transparent;width:fit-content;height:fit-content;border:0}.sv-image-post-slot__music-cover{width:44px;height:44px;object-fit:cover;border-radius:999px;border:2px solid var(--sv-image-post-music-border,rgba(255,255,255,.3))}.sv-image-post-slot__music-cover--playing{animation:sv-music-rotate 4s linear infinite}@keyframes sv-music-rotate{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}.sv-image-post-slot__like-animation{position:absolute;inset:0;pointer-events:none;z-index:20}.sv-image-post-slot--clean-mode .sv-image-post-slot__overlay,.sv-image-post-slot--clean-mode .sv-image-post-slot__top-bar,.sv-image-post-slot--clean-mode .sv-image-post-slot__bottom,.sv-image-post-slot--clean-mode .sv-image-post-slot__actions,.sv-image-post-slot--clean-mode .sv-image-post-slot__gradient{opacity:0;transition:opacity .3s ease}.sv-image-post-slot--loading .sv-image-post-slot__skeleton{position:absolute;inset:0;background:linear-gradient(90deg,rgba(255,255,255,.05)25%,rgba(255,255,255,.1)50%,rgba(255,255,255,.05)75%);background-size:200% 100%;animation:sv-image-post-shimmer 1.5s infinite}@keyframes sv-image-post-shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}.sv-image-post-slot:focus-visible{outline:2px solid var(--sv-image-post-focus-color,#4dabff);outline-offset:-2px}.sv-image-post-slot__sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}`;
10
+ var cssInjected = false;
11
+ function injectImagePostSlotCSS() {
12
+ if (cssInjected) return void 0;
13
+ cssInjected = true;
14
+ return injectComponentCSS("image-post-slot", IMAGE_POST_SLOT_CSS);
15
+ }
16
+ var IMAGE_POST_SLOT_CLASS = "sv-image-post-slot";
17
+ var IMAGE_POST_SLOT_ACTIVE_CLASS = "sv-image-post-slot--active";
18
+ var IMAGE_POST_SLOT_CLEAN_MODE_CLASS = "sv-image-post-slot--clean-mode";
19
+ var IMAGE_POST_ID_ATTR = "data-image-post-id";
20
+ var IMAGE_POST_ACTIVE_ATTR = "data-active";
21
+ var ImagePostSlotContext = createContext(null);
22
+ function useImagePostSlotContext() {
23
+ const context = useContext(ImagePostSlotContext);
24
+ if (!context) {
25
+ throw new Error("useImagePostSlotContext must be used within ImagePostSlotHeadless");
26
+ }
27
+ return context;
28
+ }
29
+ function useOptionalImagePostSlotContext() {
30
+ return useContext(ImagePostSlotContext);
31
+ }
32
+ var ANIMATION_SELECTOR = '[data-like-animation="true"]';
33
+ function ImagePostSlotHeadlessBase({
34
+ imagePost,
35
+ isActive = false,
36
+ currentImageIndex: controlledIndex,
37
+ onImageIndexChange,
38
+ music,
39
+ isMusicPlaying = false,
40
+ onToggleMusic,
41
+ lastMusicToggleTime: controlledToggleTime,
42
+ isCleanMode = false,
43
+ onTap,
44
+ onDoubleTap,
45
+ onLongPress,
46
+ onReadMoreClick,
47
+ disableTap = false,
48
+ enableZoom = false,
49
+ showCounter = true,
50
+ showIndicators = true,
51
+ className,
52
+ children
53
+ }) {
54
+ useInsertionEffect(() => {
55
+ return injectImagePostSlotCSS();
56
+ }, []);
57
+ const [internalIndex, setInternalIndex] = useState(0);
58
+ const currentIndex = controlledIndex ?? internalIndex;
59
+ const [internalToggleTime, setInternalToggleTime] = useState(0);
60
+ const lastMusicToggleTime = controlledToggleTime ?? internalToggleTime;
61
+ const containerRef = useRef(null);
62
+ const totalImages = imagePost.images.length;
63
+ const handleImageIndexChange = useCallback(
64
+ (index) => {
65
+ setInternalIndex(index);
66
+ onImageIndexChange?.(index);
67
+ },
68
+ [onImageIndexChange]
69
+ );
70
+ const goToImage = useCallback(
71
+ (index) => {
72
+ const clampedIndex = Math.max(0, Math.min(totalImages - 1, index));
73
+ handleImageIndexChange(clampedIndex);
74
+ },
75
+ [totalImages, handleImageIndexChange]
76
+ );
77
+ const nextImage = useCallback(() => {
78
+ if (currentIndex < totalImages - 1) {
79
+ goToImage(currentIndex + 1);
80
+ }
81
+ }, [currentIndex, totalImages, goToImage]);
82
+ const prevImage = useCallback(() => {
83
+ if (currentIndex > 0) {
84
+ goToImage(currentIndex - 1);
85
+ }
86
+ }, [currentIndex, goToImage]);
87
+ const toggleMusic = useCallback(() => {
88
+ if (controlledToggleTime === void 0) {
89
+ setInternalToggleTime(Date.now());
90
+ }
91
+ onToggleMusic?.();
92
+ }, [onToggleMusic, controlledToggleTime]);
93
+ const expandCaption = useCallback(() => {
94
+ onReadMoreClick?.();
95
+ }, [onReadMoreClick]);
96
+ const triggerLikeAnimation = useCallback((position) => {
97
+ const container = containerRef.current;
98
+ if (!container) return;
99
+ const animationEl = container.querySelector(ANIMATION_SELECTOR);
100
+ if (!animationEl) return;
101
+ const ref = animationEl.__likeAnimation;
102
+ if (ref?.triggerHeart) {
103
+ ref.triggerHeart(position.x, position.y);
104
+ }
105
+ }, []);
106
+ const { handlers: doubleTapHandlers } = useDoubleTap({
107
+ containerRef,
108
+ disabled: disableTap,
109
+ onSingleTap: onTap,
110
+ onDoubleTap: (position) => {
111
+ triggerLikeAnimation(position);
112
+ onDoubleTap?.();
113
+ },
114
+ onLongPress: onLongPress ? () => onLongPress() : void 0,
115
+ longPressDelay: 500
116
+ });
117
+ const contextValue = useMemo(
118
+ () => ({
119
+ imagePost,
120
+ currentImageIndex: currentIndex,
121
+ totalImages,
122
+ isActive,
123
+ isCleanMode,
124
+ lastMusicToggleTime,
125
+ music,
126
+ isMusicPlaying,
127
+ toggleMusic,
128
+ goToImage,
129
+ nextImage,
130
+ prevImage,
131
+ expandCaption
132
+ }),
133
+ [
134
+ imagePost,
135
+ currentIndex,
136
+ totalImages,
137
+ isActive,
138
+ isCleanMode,
139
+ lastMusicToggleTime,
140
+ music,
141
+ isMusicPlaying,
142
+ toggleMusic,
143
+ goToImage,
144
+ nextImage,
145
+ prevImage,
146
+ expandCaption
147
+ ]
148
+ );
149
+ const containerClassName = clsx2(
150
+ IMAGE_POST_SLOT_CLASS,
151
+ isActive && IMAGE_POST_SLOT_ACTIVE_CLASS,
152
+ isCleanMode && IMAGE_POST_SLOT_CLEAN_MODE_CLASS,
153
+ className
154
+ );
155
+ return /* @__PURE__ */ jsx(ImagePostSlotContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsxs(
156
+ "div",
157
+ {
158
+ ref: containerRef,
159
+ className: containerClassName,
160
+ ...{ [IMAGE_POST_ID_ATTR]: imagePost.id },
161
+ ...{ [IMAGE_POST_ACTIVE_ATTR]: isActive ? "true" : "false" },
162
+ ...doubleTapHandlers,
163
+ "aria-label": `Image post by ${imagePost.author?.name ?? "Unknown"}, ${totalImages} images`,
164
+ children: [
165
+ /* @__PURE__ */ jsx("div", { className: "sv-image-post-slot__images", children: /* @__PURE__ */ jsx(
166
+ ImageCarouselHeadless,
167
+ {
168
+ images: imagePost.images,
169
+ currentIndex,
170
+ onIndexChange: handleImageIndexChange,
171
+ showIndicators: showIndicators && totalImages > 1,
172
+ indicatorStyle: "dots",
173
+ enableZoom,
174
+ lazyLoad: true
175
+ }
176
+ ) }),
177
+ /* @__PURE__ */ jsx("div", { className: "sv-image-post-slot__gradient sv-image-post-slot__gradient--top" }),
178
+ /* @__PURE__ */ jsx("div", { className: "sv-image-post-slot__gradient sv-image-post-slot__gradient--bottom" }),
179
+ showCounter && totalImages > 1 && /* @__PURE__ */ jsx("div", { className: "sv-image-post-slot__top-bar", children: /* @__PURE__ */ jsxs("div", { className: "sv-image-post-slot__counter", children: [
180
+ currentIndex + 1,
181
+ "/",
182
+ totalImages
183
+ ] }) }),
184
+ typeof children === "function" ? children(contextValue) : children
185
+ ]
186
+ }
187
+ ) });
188
+ }
189
+ var ImagePostSlotHeadless = memo(ImagePostSlotHeadlessBase);
190
+ ImagePostSlotHeadless.displayName = "ImagePostSlotHeadless";
191
+ function ImagePostSlotOverlay({
192
+ children,
193
+ className
194
+ }) {
195
+ return /* @__PURE__ */ jsx("div", { className: clsx2("sv-image-post-slot__overlay", className), children });
196
+ }
197
+ function ImagePostSlotBottom({
198
+ children,
199
+ className,
200
+ onClick
201
+ }) {
202
+ return (
203
+ // biome-ignore lint/a11y/useKeyWithClickEvents: <explanation>
204
+ /* @__PURE__ */ jsx("div", { className: clsx2("sv-image-post-slot__bottom", className), onClick, children })
205
+ );
206
+ }
207
+ function ImagePostSlotActions({
208
+ children,
209
+ className
210
+ }) {
211
+ return /* @__PURE__ */ jsx("div", { className: clsx2("sv-image-post-slot__actions", className), children });
212
+ }
213
+ function ImagePostSlotCaption({
214
+ maxLines = 2,
215
+ expanded = false,
216
+ className
217
+ }) {
218
+ const { imagePost } = useImagePostSlotContext();
219
+ return /* @__PURE__ */ jsx(
220
+ "p",
221
+ {
222
+ className: clsx2(
223
+ "sv-image-post-slot__caption",
224
+ expanded && "sv-image-post-slot__caption--expanded",
225
+ className
226
+ ),
227
+ style: { WebkitLineClamp: expanded ? "unset" : maxLines },
228
+ children: imagePost.caption
229
+ }
230
+ );
231
+ }
232
+ function ImagePostSlotReadMore({
233
+ label = "Read More",
234
+ className,
235
+ onClick
236
+ }) {
237
+ const { expandCaption } = useImagePostSlotContext();
238
+ const handleClick = useCallback(() => {
239
+ onClick?.() ?? expandCaption();
240
+ }, [onClick, expandCaption]);
241
+ return /* @__PURE__ */ jsxs(
242
+ "button",
243
+ {
244
+ type: "button",
245
+ className: clsx2("sv-image-post-slot__read-more", className),
246
+ onClick: handleClick,
247
+ children: [
248
+ label,
249
+ /* @__PURE__ */ jsx("svg", { "aria-hidden": "true", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: /* @__PURE__ */ jsx("polyline", { points: "9 6 15 12 9 18" }) })
250
+ ]
251
+ }
252
+ );
253
+ }
254
+ function MusicCoverFallback({ className }) {
255
+ return /* @__PURE__ */ jsxs(
256
+ "svg",
257
+ {
258
+ viewBox: "0 0 48 48",
259
+ fill: "none",
260
+ xmlns: "http://www.w3.org/2000/svg",
261
+ className,
262
+ "aria-hidden": "true",
263
+ children: [
264
+ /* @__PURE__ */ jsx("circle", { cx: "24", cy: "24", r: "22", fill: "#1a1a1a", stroke: "#333", strokeWidth: "2" }),
265
+ /* @__PURE__ */ jsx("circle", { cx: "24", cy: "24", r: "18", fill: "none", stroke: "#2a2a2a", strokeWidth: "1" }),
266
+ /* @__PURE__ */ jsx("circle", { cx: "24", cy: "24", r: "14", fill: "none", stroke: "#2a2a2a", strokeWidth: "1" }),
267
+ /* @__PURE__ */ jsx("circle", { cx: "24", cy: "24", r: "10", fill: "none", stroke: "#2a2a2a", strokeWidth: "1" }),
268
+ /* @__PURE__ */ jsx("circle", { cx: "24", cy: "24", r: "6", fill: "#ff4757" }),
269
+ /* @__PURE__ */ jsx("circle", { cx: "24", cy: "24", r: "2", fill: "#1a1a1a" }),
270
+ /* @__PURE__ */ jsx(
271
+ "path",
272
+ {
273
+ d: "M26 21v5.5c0 1.38-1.12 2.5-2.5 2.5S21 27.88 21 26.5s1.12-2.5 2.5-2.5c.41 0 .79.1 1.13.27V21h1.37z",
274
+ fill: "white"
275
+ }
276
+ )
277
+ ]
278
+ }
279
+ );
280
+ }
281
+ function ImagePostSlotMusic({
282
+ className,
283
+ onClick,
284
+ fallbackCover
285
+ }) {
286
+ const { music, isMusicPlaying } = useImagePostSlotContext();
287
+ const [hasError, setHasError] = useState(false);
288
+ if (!music) return null;
289
+ const coverClassName = clsx2(
290
+ "sv-image-post-slot__music-cover",
291
+ isMusicPlaying && "sv-image-post-slot__music-cover--playing"
292
+ );
293
+ const renderFallback = () => {
294
+ if (fallbackCover) {
295
+ return /* @__PURE__ */ jsx("span", { className: coverClassName, children: fallbackCover });
296
+ }
297
+ return /* @__PURE__ */ jsx(MusicCoverFallback, { className: coverClassName });
298
+ };
299
+ return /* @__PURE__ */ jsx(
300
+ "button",
301
+ {
302
+ type: "button",
303
+ className: clsx2("sv-image-post-slot__music", className),
304
+ onClick: (e) => {
305
+ e.stopPropagation();
306
+ onClick?.();
307
+ },
308
+ children: music.cover && !hasError ? /* @__PURE__ */ jsx(
309
+ "img",
310
+ {
311
+ src: music.cover,
312
+ alt: "",
313
+ className: coverClassName,
314
+ onError: () => setHasError(true)
315
+ }
316
+ ) : renderFallback()
317
+ }
318
+ );
319
+ }
320
+ function ImagePostSlotPlayIndicator(props) {
321
+ const context = useOptionalImagePostSlotContext();
322
+ if (!context || !context.music) return null;
323
+ return /* @__PURE__ */ jsx(
324
+ VideoSlotPlayIndicatorInner,
325
+ {
326
+ ...props,
327
+ lastUserToggleTime: context.lastMusicToggleTime,
328
+ isPlaying: context.isMusicPlaying
329
+ }
330
+ );
331
+ }
332
+ ImagePostSlotPlayIndicator.displayName = "ImagePostSlotPlayIndicator";
333
+
334
+ export { IMAGE_POST_ACTIVE_ATTR, IMAGE_POST_ID_ATTR, IMAGE_POST_SLOT_ACTIVE_CLASS, IMAGE_POST_SLOT_CLASS, IMAGE_POST_SLOT_CLEAN_MODE_CLASS, IMAGE_POST_SLOT_CSS, ImagePostSlotActions, ImagePostSlotBottom, ImagePostSlotCaption, ImagePostSlotHeadless, ImagePostSlotMusic, ImagePostSlotOverlay, ImagePostSlotPlayIndicator, ImagePostSlotReadMore, useImagePostSlotContext, useOptionalImagePostSlotContext };