@linktr.ee/messaging-react 1.27.0 → 1.28.0-rc-1776225927

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaPlayer-DE9MC6k6.js","sources":["../src/components/LockedAttachment/utils/mimeType.ts","../src/components/LockedAttachment/utils/icons.ts","../../../node_modules/react-player/dist/patterns.js","../../../node_modules/react-player/dist/HtmlPlayer.js","../../../node_modules/react-player/dist/players.js","../../../node_modules/react-player/dist/props.js","../../../node_modules/react-player/dist/Player.js","../../../node_modules/react-player/dist/ReactPlayer.js","../../../node_modules/react-player/dist/index.js","../src/components/LockedAttachment/components/MediaPlayer.tsx"],"sourcesContent":["export type AttachmentSourceType = 'image' | 'audio' | 'video' | 'document'\n\nexport type DocumentIconType =\n | 'pdf'\n | 'doc'\n | 'xls'\n | 'csv'\n | 'ppt'\n | 'zip'\n | 'text'\n | 'markdown'\n | 'generic'\n\nconst DOCUMENT_ICON_PATTERNS: Array<[RegExp, DocumentIconType]> = [\n [/pdf/, 'pdf'],\n [/wordprocessingml|msword|\\.doc/, 'doc'],\n [/spreadsheetml|ms-excel|\\.xls/, 'xls'],\n [/csv/, 'csv'],\n [/presentationml|ms-powerpoint|\\.ppt/, 'ppt'],\n [/zip|x-rar|x-7z|x-tar|x-gzip/, 'zip'],\n [/plain|rtf/, 'text'],\n [/markdown/, 'markdown'],\n]\n\nexport function getSourceType(mimeType: string): AttachmentSourceType {\n if (mimeType.startsWith('video/')) return 'video'\n if (mimeType.startsWith('audio/')) return 'audio'\n if (mimeType.startsWith('image/')) return 'image'\n return 'document'\n}\n\nexport function getDocumentIconType(mimeType: string): DocumentIconType {\n const match = DOCUMENT_ICON_PATTERNS.find(([pattern]) =>\n pattern.test(mimeType)\n )\n return match ? match[1] : 'generic'\n}\n","import {\n FileIcon,\n FileCsvIcon,\n FileDocIcon,\n FileMdIcon,\n FilePdfIcon,\n FilePptIcon,\n FileTextIcon,\n FileXlsIcon,\n FileZipIcon,\n ImageIcon,\n SpeakerHighIcon,\n VideoCameraIcon,\n IconProps,\n} from '@phosphor-icons/react'\nimport React from 'react'\n\nimport { getDocumentIconType, getSourceType } from './mimeType'\nimport type { AttachmentSourceType } from './mimeType'\n\nexport const MEDIA_TYPE_ICON: Record<AttachmentSourceType, React.ElementType> =\n {\n video: VideoCameraIcon,\n audio: SpeakerHighIcon,\n image: ImageIcon,\n document: FileIcon,\n }\n\nconst DOCUMENT_ICON_COMPONENT = {\n pdf: FilePdfIcon,\n doc: FileDocIcon,\n xls: FileXlsIcon,\n csv: FileCsvIcon,\n ppt: FilePptIcon,\n zip: FileZipIcon,\n text: FileTextIcon,\n markdown: FileMdIcon,\n generic: FileIcon,\n} as const\n\nexport function getTypeIcon(mimeType: string): React.ElementType {\n const sourceType = getSourceType(mimeType)\n if (sourceType !== 'document') return MEDIA_TYPE_ICON[sourceType]\n return DOCUMENT_ICON_COMPONENT[getDocumentIconType(mimeType)]\n}\n\n/** Use instead of `<TypeIcon />` where TypeIcon = getTypeIcon(mime) to satisfy react-hooks/static-components. */\nexport function renderTypeIcon(\n mimeType: string,\n props: IconProps\n): React.ReactElement {\n return React.createElement(getTypeIcon(mimeType), props)\n}\n","const AUDIO_EXTENSIONS = /\\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3a|wav|weba|aac|oga|spx)($|\\?)/i;\nconst VIDEO_EXTENSIONS = /\\.(mp4|og[gv]|webm|mov|m4v)(#t=[,\\d+]+)?($|\\?)/i;\nconst HLS_EXTENSIONS = /\\.(m3u8)($|\\?)/i;\nconst DASH_EXTENSIONS = /\\.(mpd)($|\\?)/i;\nconst MATCH_URL_MUX = /stream\\.mux\\.com\\/(?!\\w+\\.m3u8)(\\w+)/;\nconst MATCH_URL_YOUTUBE = /(?:youtu\\.be\\/|youtube(?:-nocookie|education)?\\.com\\/(?:embed\\/|v\\/|watch\\/|watch\\?v=|watch\\?.+&v=|shorts\\/|live\\/))((\\w|-){11})|youtube\\.com\\/playlist\\?list=|youtube\\.com\\/user\\//;\nconst MATCH_URL_VIMEO = /vimeo\\.com\\/(?!progressive_redirect).+/;\nconst MATCH_URL_WISTIA = /(?:wistia\\.(?:com|net)|wi\\.st)\\/(?:medias|embed)\\/(?:iframe\\/)?([^?]+)/;\nconst MATCH_URL_SPOTIFY = /open\\.spotify\\.com\\/(\\w+)\\/(\\w+)/i;\nconst MATCH_URL_TWITCH = /(?:www\\.|go\\.)?twitch\\.tv\\/([a-zA-Z0-9_]+|(videos?\\/|\\?video=)\\d+)($|\\?)/;\nconst MATCH_URL_TIKTOK = /tiktok\\.com\\/(?:player\\/v1\\/|share\\/video\\/|@[^/]+\\/video\\/)([0-9]+)/;\nconst canPlayFile = (url, test) => {\n if (Array.isArray(url)) {\n for (const item of url) {\n if (typeof item === \"string\" && canPlayFile(item, test)) {\n return true;\n }\n if (canPlayFile(item.src, test)) {\n return true;\n }\n }\n return false;\n }\n return test(url);\n};\nconst canPlay = {\n html: (url) => canPlayFile(url, (u) => AUDIO_EXTENSIONS.test(u) || VIDEO_EXTENSIONS.test(u)),\n hls: (url) => canPlayFile(url, (u) => HLS_EXTENSIONS.test(u)),\n dash: (url) => canPlayFile(url, (u) => DASH_EXTENSIONS.test(u)),\n mux: (url) => MATCH_URL_MUX.test(url),\n youtube: (url) => MATCH_URL_YOUTUBE.test(url),\n vimeo: (url) => MATCH_URL_VIMEO.test(url) && !VIDEO_EXTENSIONS.test(url) && !HLS_EXTENSIONS.test(url),\n wistia: (url) => MATCH_URL_WISTIA.test(url),\n spotify: (url) => MATCH_URL_SPOTIFY.test(url),\n twitch: (url) => MATCH_URL_TWITCH.test(url),\n tiktok: (url) => MATCH_URL_TIKTOK.test(url)\n};\nexport {\n AUDIO_EXTENSIONS,\n DASH_EXTENSIONS,\n HLS_EXTENSIONS,\n MATCH_URL_MUX,\n MATCH_URL_SPOTIFY,\n MATCH_URL_TIKTOK,\n MATCH_URL_TWITCH,\n MATCH_URL_VIMEO,\n MATCH_URL_WISTIA,\n MATCH_URL_YOUTUBE,\n VIDEO_EXTENSIONS,\n canPlay\n};\n","import React from \"react\";\nimport { AUDIO_EXTENSIONS } from \"./patterns.js\";\nconst HtmlPlayer = React.forwardRef((props, ref) => {\n const Media = AUDIO_EXTENSIONS.test(`${props.src}`) ? \"audio\" : \"video\";\n return /* @__PURE__ */ React.createElement(Media, { ...props, ref }, props.children);\n});\nvar HtmlPlayer_default = HtmlPlayer;\nexport {\n HtmlPlayer_default as default\n};\n","import { lazy } from \"react\";\nimport { canPlay } from \"./patterns.js\";\nimport HtmlPlayer from \"./HtmlPlayer.js\";\nconst Players = [\n {\n key: \"hls\",\n name: \"hls.js\",\n canPlay: canPlay.hls,\n canEnablePIP: () => true,\n player: lazy(\n () => import(\n /* webpackChunkName: 'reactPlayerHls' */\n \"hls-video-element/react\"\n )\n )\n },\n {\n key: \"dash\",\n name: \"dash.js\",\n canPlay: canPlay.dash,\n canEnablePIP: () => true,\n player: lazy(\n () => import(\n /* webpackChunkName: 'reactPlayerDash' */\n \"dash-video-element/react\"\n )\n )\n },\n {\n key: \"mux\",\n name: \"Mux\",\n canPlay: canPlay.mux,\n canEnablePIP: () => true,\n player: lazy(\n () => import(\n /* webpackChunkName: 'reactPlayerMux' */\n \"@mux/mux-player-react\"\n )\n )\n },\n {\n key: \"youtube\",\n name: \"YouTube\",\n canPlay: canPlay.youtube,\n player: lazy(\n () => import(\n /* webpackChunkName: 'reactPlayerYouTube' */\n \"youtube-video-element/react\"\n )\n )\n },\n {\n key: \"vimeo\",\n name: \"Vimeo\",\n canPlay: canPlay.vimeo,\n player: lazy(\n () => import(\n /* webpackChunkName: 'reactPlayerVimeo' */\n \"vimeo-video-element/react\"\n )\n )\n },\n {\n key: \"wistia\",\n name: \"Wistia\",\n canPlay: canPlay.wistia,\n canEnablePIP: () => true,\n player: lazy(\n () => import(\n /* webpackChunkName: 'reactPlayerWistia' */\n \"wistia-video-element/react\"\n )\n )\n },\n {\n key: \"spotify\",\n name: \"Spotify\",\n canPlay: canPlay.spotify,\n canEnablePIP: () => false,\n player: lazy(\n () => import(\n /* webpackChunkName: 'reactPlayerSpotify' */\n \"spotify-audio-element/react\"\n )\n )\n },\n {\n key: \"twitch\",\n name: \"Twitch\",\n canPlay: canPlay.twitch,\n canEnablePIP: () => false,\n player: lazy(\n () => import(\n /* webpackChunkName: 'reactPlayerTwitch' */\n \"twitch-video-element/react\"\n )\n )\n },\n {\n key: \"tiktok\",\n name: \"TikTok\",\n canPlay: canPlay.tiktok,\n canEnablePIP: () => false,\n player: lazy(\n () => import(\n /* webpackChunkName: 'reactPlayerTiktok' */\n \"tiktok-video-element/react\"\n )\n )\n },\n {\n key: \"html\",\n name: \"html\",\n canPlay: canPlay.html,\n canEnablePIP: () => true,\n player: HtmlPlayer\n }\n];\nvar players_default = Players;\nexport {\n players_default as default\n};\n","const defaultProps = {\n // Falsy values don't need to be defined\n //\n // native video attrs\n // src: undefined,\n // preload: undefined,\n // crossOrigin: undefined,\n // autoPlay: false,\n // muted: false,\n // loop: false,\n // controls: false,\n // playsInline: false,\n // disableRemotePlayback: false,\n width: \"320px\",\n height: \"180px\",\n // native video props\n volume: 1,\n playbackRate: 1,\n // custom props\n // playing: undefined,\n // pip: false,\n // light: false,\n // fallback: null,\n previewTabIndex: 0,\n previewAriaLabel: \"\",\n oEmbedUrl: \"https://noembed.com/embed?url={url}\"\n};\nexport {\n defaultProps\n};\n","import React, { useCallback, useEffect, useRef } from \"react\";\nconst Player = React.forwardRef((props, ref) => {\n const { playing, pip } = props;\n const Player2 = props.activePlayer;\n const playerRef = useRef(null);\n const startOnPlayRef = useRef(true);\n useEffect(() => {\n var _a, _b;\n if (!playerRef.current) return;\n if (playerRef.current.paused && playing === true) {\n playerRef.current.play();\n }\n if (!playerRef.current.paused && playing === false) {\n playerRef.current.pause();\n }\n playerRef.current.playbackRate = (_a = props.playbackRate) != null ? _a : 1;\n playerRef.current.volume = (_b = props.volume) != null ? _b : 1;\n });\n useEffect(() => {\n var _a, _b, _c, _d, _e;\n if (!playerRef.current || !globalThis.document) return;\n if (pip && !document.pictureInPictureElement) {\n try {\n (_b = (_a = playerRef.current).requestPictureInPicture) == null ? void 0 : _b.call(_a);\n } catch (err) {\n }\n }\n if (!pip && document.pictureInPictureElement) {\n try {\n (_d = (_c = playerRef.current).exitPictureInPicture) == null ? void 0 : _d.call(_c);\n (_e = document.exitPictureInPicture) == null ? void 0 : _e.call(document);\n } catch (err) {\n }\n }\n }, [pip]);\n const handleLoadStart = (event) => {\n var _a, _b;\n startOnPlayRef.current = true;\n (_a = props.onReady) == null ? void 0 : _a.call(props);\n (_b = props.onLoadStart) == null ? void 0 : _b.call(props, event);\n };\n const handlePlay = (event) => {\n var _a, _b;\n if (startOnPlayRef.current) {\n startOnPlayRef.current = false;\n (_a = props.onStart) == null ? void 0 : _a.call(props, event);\n }\n (_b = props.onPlay) == null ? void 0 : _b.call(props, event);\n };\n if (!Player2) {\n return null;\n }\n const eventProps = {};\n const reactPlayerEventHandlers = [\"onReady\", \"onStart\"];\n for (const key in props) {\n if (key.startsWith(\"on\") && !reactPlayerEventHandlers.includes(key)) {\n eventProps[key] = props[key];\n }\n }\n return /* @__PURE__ */ React.createElement(\n Player2,\n {\n ...eventProps,\n style: props.style,\n className: props.className,\n slot: props.slot,\n ref: useCallback(\n (node) => {\n playerRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref !== null) {\n ref.current = node;\n }\n },\n [ref]\n ),\n src: props.src,\n crossOrigin: props.crossOrigin,\n preload: props.preload,\n controls: props.controls,\n muted: props.muted,\n autoPlay: props.autoPlay,\n loop: props.loop,\n playsInline: props.playsInline,\n disableRemotePlayback: props.disableRemotePlayback,\n config: props.config,\n onLoadStart: handleLoadStart,\n onPlay: handlePlay\n },\n props.children\n );\n});\nPlayer.displayName = \"Player\";\nvar Player_default = Player;\nexport {\n Player_default as default\n};\n","import React, { lazy, Suspense, useEffect, useState } from \"react\";\nimport { defaultProps } from \"./props.js\";\nimport Player from \"./Player.js\";\nconst Preview = lazy(() => import(\n /* webpackChunkName: 'reactPlayerPreview' */\n \"./Preview.js\"\n));\nconst customPlayers = [];\nconst createReactPlayer = (players, playerFallback) => {\n const getActivePlayer = (src) => {\n for (const player of [...customPlayers, ...players]) {\n if (src && player.canPlay(src)) {\n return player;\n }\n }\n if (playerFallback) {\n return playerFallback;\n }\n return null;\n };\n const ReactPlayer = React.forwardRef((_props, ref) => {\n const props = { ...defaultProps, ..._props };\n const { src, slot, className, style, width, height, fallback, wrapper } = props;\n const [showPreview, setShowPreview] = useState(!!props.light);\n useEffect(() => {\n if (props.light) {\n setShowPreview(true);\n } else {\n setShowPreview(false);\n }\n }, [props.light]);\n const handleClickPreview = (e) => {\n var _a;\n setShowPreview(false);\n (_a = props.onClickPreview) == null ? void 0 : _a.call(props, e);\n };\n const renderPreview = (src2) => {\n if (!src2) return null;\n const { light, playIcon, previewTabIndex, oEmbedUrl, previewAriaLabel } = props;\n return /* @__PURE__ */ React.createElement(\n Preview,\n {\n src: src2,\n light,\n playIcon,\n previewTabIndex,\n previewAriaLabel,\n oEmbedUrl,\n onClickPreview: handleClickPreview\n }\n );\n };\n const renderActivePlayer = (src2) => {\n var _a, _b;\n const player = getActivePlayer(src2);\n if (!player) return null;\n const { style: style2, width: width2, height: height2, wrapper: wrapper2 } = props;\n const config = (_a = props.config) == null ? void 0 : _a[player.key];\n return /* @__PURE__ */ React.createElement(\n Player,\n {\n ...props,\n ref,\n activePlayer: (_b = player.player) != null ? _b : player,\n slot: wrapper2 ? void 0 : slot,\n className: wrapper2 ? void 0 : className,\n style: wrapper2 ? { display: \"block\", width: \"100%\", height: \"100%\" } : { display: \"block\", width: width2, height: height2, ...style2 },\n config\n }\n );\n };\n const Wrapper = wrapper == null ? ForwardChildren : wrapper;\n const UniversalSuspense = fallback === false ? ForwardChildren : Suspense;\n return /* @__PURE__ */ React.createElement(Wrapper, { slot, className, style: { width, height, ...style } }, /* @__PURE__ */ React.createElement(UniversalSuspense, { fallback }, showPreview ? renderPreview(src) : renderActivePlayer(src)));\n });\n ReactPlayer.displayName = \"ReactPlayer\";\n ReactPlayer.addCustomPlayer = (player) => {\n customPlayers.push(player);\n };\n ReactPlayer.removeCustomPlayers = () => {\n customPlayers.length = 0;\n };\n ReactPlayer.canPlay = (src) => {\n if (src) {\n for (const Player2 of [...customPlayers, ...players]) {\n if (Player2.canPlay(src)) {\n return true;\n }\n }\n }\n return false;\n };\n ReactPlayer.canEnablePIP = (src) => {\n var _a;\n if (src) {\n for (const Player2 of [...customPlayers, ...players]) {\n if (Player2.canPlay(src) && ((_a = Player2.canEnablePIP) == null ? void 0 : _a.call(Player2))) {\n return true;\n }\n }\n }\n return false;\n };\n return ReactPlayer;\n};\nconst ForwardChildren = ({ children }) => children;\nexport {\n createReactPlayer\n};\n","\"use client\";\nimport players from \"./players.js\";\nimport { createReactPlayer } from \"./ReactPlayer.js\";\nconst fallback = players[players.length - 1];\nvar src_default = createReactPlayer(players, fallback);\nexport {\n src_default as default\n};\n","import { CircleNotchIcon, PauseIcon, PlayIcon } from '@phosphor-icons/react'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\nimport ReactPlayer from 'react-player'\n\nimport { isDevBuild } from '../../../utils/isDevBuild'\nimport { renderTypeIcon } from '../utils/icons'\nimport { getSourceType, type AttachmentSourceType } from '../utils/mimeType'\n\nconst getPlayerBg = (sourceType: AttachmentSourceType, poster?: string) =>\n sourceType === 'audio' && !poster ? 'bg-black/5' : 'bg-black'\n\nfunction getClientXFromEvent(\n e: MouseEvent | TouchEvent | React.MouseEvent | React.TouchEvent\n): number {\n if ('touches' in e) {\n return e.touches[0]?.clientX ?? e.changedTouches[0]?.clientX ?? 0\n }\n return e.clientX\n}\n\nexport interface MediaPlayerProps {\n source: string\n mimeType: string\n poster?: string\n autoPlay?: boolean\n /** Controlled playing state. When provided, syncs to internal play/pause. */\n playing?: boolean\n loop?: boolean\n controls?: boolean\n showProgress?: boolean\n onContainerClick?: () => void\n /** When true, requests muted playback (helps autoplay policies on video). */\n muted?: boolean\n}\n\nconst MediaPlayer: React.FC<MediaPlayerProps> = ({\n source,\n mimeType,\n poster,\n autoPlay = false,\n playing: playingProp,\n loop = false,\n controls = true,\n showProgress = false,\n onContainerClick,\n muted = false,\n}) => {\n const sourceType = getSourceType(mimeType)\n const [playing, setPlaying] = useState(autoPlay)\n\n // Sync controlled playing prop to internal state\n const prevPlayingPropRef = useRef(playingProp)\n useEffect(() => {\n if (\n playingProp !== undefined &&\n playingProp !== prevPlayingPropRef.current\n ) {\n prevPlayingPropRef.current = playingProp\n setPlaying(playingProp)\n }\n }, [playingProp])\n const [played, setPlayed] = useState(0)\n const [seeking, setSeeking] = useState(false)\n const [scrubberHovered, setScrubberHovered] = useState(false)\n const [videoAspect, setVideoAspect] = useState<number | null>(null)\n const [buffering, setBuffering] = useState(false)\n /** Set when autoplay/play() was rejected so user can start via gesture (no controls UI). */\n const [manualPlayRequired, setManualPlayRequired] = useState(false)\n const playerRef = useRef<HTMLVideoElement>(null)\n const trackRef = useRef<HTMLDivElement>(null)\n const rafRef = useRef<number | null>(null)\n\n useEffect(() => {\n setManualPlayRequired(false)\n }, [source])\n\n useEffect(() => {\n if (!playing) {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current)\n rafRef.current = null\n }\n return\n }\n const tick = () => {\n const el = playerRef.current\n if (el && el.duration && !seeking) setPlayed(el.currentTime / el.duration)\n rafRef.current = requestAnimationFrame(tick)\n }\n rafRef.current = requestAnimationFrame(tick)\n return () => {\n if (rafRef.current !== null) cancelAnimationFrame(rafRef.current)\n }\n }, [playing, seeking])\n\n // ReactPlayer v3 uses native HTML media elements and does not support a\n // declarative `playing` prop — playback must be driven imperatively.\n useEffect(() => {\n const el = playerRef.current\n if (!el) return\n if (playing) {\n void el.play().catch((err) => {\n setPlaying(false)\n setManualPlayRequired(true)\n if (isDevBuild()) {\n console.debug('[MediaPlayer] play() failed', err)\n }\n })\n } else {\n el.pause()\n }\n }, [playing])\n\n const startPlaybackFromGesture = useCallback(() => {\n setManualPlayRequired(false)\n setPlaying(true)\n }, [])\n\n const getFraction = useCallback(\n (e: MouseEvent | TouchEvent | React.MouseEvent | React.TouchEvent) => {\n const track = trackRef.current\n if (!track) return 0\n const rect = track.getBoundingClientRect()\n return Math.max(\n 0,\n Math.min(1, (getClientXFromEvent(e) - rect.left) / rect.width)\n )\n },\n []\n )\n\n const seekTo = useCallback((fraction: number) => {\n const el = playerRef.current\n if (el && el.duration) el.currentTime = fraction * el.duration\n }, [])\n\n const handleTrackPointerDown = (\n e: React.MouseEvent<HTMLDivElement> | React.TouchEvent<HTMLDivElement>\n ) => {\n e.stopPropagation()\n setSeeking(true)\n const fraction = getFraction(e)\n setPlayed(fraction)\n seekTo(fraction)\n }\n\n useEffect(() => {\n if (!seeking) return\n const onMove = (e: MouseEvent | TouchEvent) => setPlayed(getFraction(e))\n const onUp = (e: MouseEvent | TouchEvent) => {\n setSeeking(false)\n seekTo(getFraction(e))\n }\n window.addEventListener('mousemove', onMove)\n window.addEventListener('mouseup', onUp)\n window.addEventListener('touchmove', onMove, { passive: true })\n window.addEventListener('touchend', onUp)\n return () => {\n window.removeEventListener('mousemove', onMove)\n window.removeEventListener('mouseup', onUp)\n window.removeEventListener('touchmove', onMove)\n window.removeEventListener('touchend', onUp)\n }\n }, [seeking, getFraction, seekTo])\n\n // Use natural aspect ratio once metadata loads, fall back to 16:9 before then.\n const aspectStyle = videoAspect\n ? { aspectRatio: String(videoAspect) }\n : undefined\n const aspectClass = !videoAspect ? ' aspect-video' : ''\n const scrubberPercent = Math.round(played * 100)\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n className={`relative cursor-pointer overflow-hidden ${getPlayerBg(sourceType, poster)}${aspectClass}`}\n style={aspectStyle}\n onClick={() => {\n if (manualPlayRequired) return\n if (onContainerClick) {\n onContainerClick()\n return\n }\n if (controls) setPlaying((p) => !p)\n }}\n onKeyDown={(e) => {\n if (e.key !== 'Enter' && e.key !== ' ') return\n e.preventDefault()\n if (manualPlayRequired) return\n if (onContainerClick) {\n onContainerClick()\n return\n }\n if (controls) setPlaying((p) => !p)\n }}\n >\n {poster && (\n <img\n src={poster}\n alt=\"\"\n className=\"absolute inset-0 h-full w-full object-cover\"\n />\n )}\n {!poster && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n {renderTypeIcon(mimeType, {\n className: 'size-12 text-black/20',\n weight: 'regular',\n })}\n </div>\n )}\n <div className=\"absolute inset-0\">\n <ReactPlayer\n ref={playerRef}\n src={source}\n poster={poster}\n loop={loop}\n muted={muted}\n playsInline\n width=\"100%\"\n height=\"100%\"\n onLoadStart={() => setBuffering(true)}\n onCanPlay={() => setBuffering(false)}\n onWaiting={() => setBuffering(true)}\n onPlay={() => setManualPlayRequired(false)}\n onLoadedMetadata={() => {\n const el = playerRef.current\n if (el && el.videoWidth && el.videoHeight) {\n setVideoAspect(el.videoWidth / el.videoHeight)\n }\n }}\n onEnded={() => {\n if (!loop) {\n setPlaying(false)\n setPlayed(0)\n }\n }}\n />\n </div>\n\n {buffering && !manualPlayRequired && (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center\">\n <CircleNotchIcon\n className=\"size-8 animate-spin text-white/80\"\n weight=\"bold\"\n />\n </div>\n )}\n\n {manualPlayRequired && !controls && (\n <div\n className=\"absolute inset-0 z-30 flex cursor-pointer items-center justify-center bg-black/35\"\n role=\"button\"\n tabIndex={0}\n aria-label=\"Play preview\"\n onClick={(e) => {\n e.stopPropagation()\n startPlaybackFromGesture()\n }}\n onKeyDown={(e) => {\n if (e.key !== 'Enter' && e.key !== ' ') return\n e.preventDefault()\n e.stopPropagation()\n startPlaybackFromGesture()\n }}\n >\n <span className=\"flex size-16 items-center justify-center rounded-full bg-white/20 text-white backdrop-blur-sm\">\n <PlayIcon className=\"size-9 translate-x-0.5\" weight=\"fill\" />\n </span>\n </div>\n )}\n\n {showProgress && !controls && (\n <div className=\"absolute inset-x-0 bottom-0 px-3 pb-2.5 pt-6 bg-gradient-to-t from-black/40 to-transparent\">\n <div\n role=\"slider\"\n aria-label=\"Playback position\"\n aria-valuenow={scrubberPercent}\n aria-valuemin={0}\n aria-valuemax={100}\n tabIndex={0}\n ref={trackRef}\n className=\"relative flex h-4 w-full cursor-pointer items-center\"\n onMouseDown={handleTrackPointerDown}\n onTouchStart={handleTrackPointerDown}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n if (e.key === 'ArrowRight') seekTo(Math.min(1, played + 0.05))\n if (e.key === 'ArrowLeft') seekTo(Math.max(0, played - 0.05))\n }}\n >\n <div className=\"w-full overflow-hidden rounded-full bg-white/30 h-1\">\n <div\n className=\"h-full rounded-full bg-white\"\n style={{ width: `${scrubberPercent}%` }}\n />\n </div>\n </div>\n </div>\n )}\n\n {controls && (\n <div className=\"absolute inset-x-0 bottom-0 flex items-center gap-2 bg-gradient-to-t from-black/60 to-transparent px-3 pb-2.5 pt-6 transition-all duration-200\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n setPlaying((p) => !p)\n }}\n className=\"shrink-0 text-white\"\n aria-label={playing ? 'Pause' : 'Play'}\n >\n {playing ? (\n <PauseIcon className=\"size-5\" weight=\"fill\" />\n ) : (\n <PlayIcon className=\"size-5 translate-x-px\" weight=\"fill\" />\n )}\n </button>\n\n <div\n role=\"slider\"\n aria-label=\"Playback position\"\n aria-valuenow={scrubberPercent}\n aria-valuemin={0}\n aria-valuemax={100}\n tabIndex={0}\n ref={trackRef}\n className=\"relative flex h-4 w-full cursor-pointer items-center\"\n onMouseDown={handleTrackPointerDown}\n onTouchStart={handleTrackPointerDown}\n onClick={(e) => e.stopPropagation()}\n onMouseEnter={() => setScrubberHovered(true)}\n onMouseLeave={() => setScrubberHovered(false)}\n onKeyDown={(e) => {\n if (e.key === 'ArrowRight') seekTo(Math.min(1, played + 0.05))\n if (e.key === 'ArrowLeft') seekTo(Math.max(0, played - 0.05))\n }}\n >\n <div\n className={`w-full overflow-hidden rounded-full bg-white/30 transition-all duration-200 ${scrubberHovered || seeking ? 'h-1.5' : 'h-1'}`}\n >\n <div\n className=\"h-full rounded-full bg-white\"\n style={{ width: `${scrubberPercent}%` }}\n />\n </div>\n <div\n className={`absolute size-3 -translate-x-1/2 rounded-full bg-white shadow transition-[opacity,transform] duration-200 ${scrubberHovered || seeking ? 'scale-100 opacity-100' : 'scale-0 opacity-0'}`}\n style={{ left: `${scrubberPercent}%` }}\n />\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport default MediaPlayer\n"],"names":["DOCUMENT_ICON_PATTERNS","getSourceType","mimeType","getDocumentIconType","match","pattern","MEDIA_TYPE_ICON","VideoCameraIcon","SpeakerHighIcon","ImageIcon","FileIcon","DOCUMENT_ICON_COMPONENT","FilePdfIcon","FileDocIcon","FileXlsIcon","FileCsvIcon","FilePptIcon","FileZipIcon","FileTextIcon","FileMdIcon","getTypeIcon","sourceType","renderTypeIcon","props","React","AUDIO_EXTENSIONS","VIDEO_EXTENSIONS","HLS_EXTENSIONS","DASH_EXTENSIONS","MATCH_URL_MUX","MATCH_URL_YOUTUBE","MATCH_URL_VIMEO","MATCH_URL_WISTIA","MATCH_URL_SPOTIFY","MATCH_URL_TWITCH","MATCH_URL_TIKTOK","canPlayFile","url","test","item","canPlay","u","HtmlPlayer","ref","Media","HtmlPlayer_default","Players","lazy","players_default","defaultProps","Player","playing","pip","Player2","playerRef","useRef","startOnPlayRef","useEffect","_a","_b","_c","_d","_e","handleLoadStart","event","handlePlay","eventProps","reactPlayerEventHandlers","key","useCallback","node","Player_default","Preview","customPlayers","createReactPlayer","players","playerFallback","getActivePlayer","src","player","ReactPlayer","_props","slot","className","style","width","height","fallback","wrapper","showPreview","setShowPreview","useState","handleClickPreview","e","renderPreview","src2","light","playIcon","previewTabIndex","oEmbedUrl","previewAriaLabel","renderActivePlayer","style2","width2","height2","wrapper2","config","Wrapper","ForwardChildren","UniversalSuspense","Suspense","children","src_default","getPlayerBg","poster","getClientXFromEvent","MediaPlayer","source","autoPlay","playingProp","loop","controls","showProgress","onContainerClick","muted","setPlaying","prevPlayingPropRef","played","setPlayed","seeking","setSeeking","scrubberHovered","setScrubberHovered","videoAspect","setVideoAspect","buffering","setBuffering","manualPlayRequired","setManualPlayRequired","trackRef","rafRef","tick","el","err","startPlaybackFromGesture","getFraction","track","rect","seekTo","fraction","handleTrackPointerDown","onMove","onUp","aspectStyle","aspectClass","scrubberPercent","jsxs","p","jsx","CircleNotchIcon","PlayIcon","PauseIcon"],"mappings":";;;AAaA,MAAMA,KAA4D;AAAA,EAChE,CAAC,OAAO,KAAK;AAAA,EACb,CAAC,iCAAiC,KAAK;AAAA,EACvC,CAAC,gCAAgC,KAAK;AAAA,EACtC,CAAC,OAAO,KAAK;AAAA,EACb,CAAC,sCAAsC,KAAK;AAAA,EAC5C,CAAC,+BAA+B,KAAK;AAAA,EACrC,CAAC,aAAa,MAAM;AAAA,EACpB,CAAC,YAAY,UAAU;AACzB;AAEO,SAASC,GAAcC,GAAwC;AACpE,SAAIA,EAAS,WAAW,QAAQ,IAAU,UACtCA,EAAS,WAAW,QAAQ,IAAU,UACtCA,EAAS,WAAW,QAAQ,IAAU,UACnC;AACT;AAEO,SAASC,GAAoBD,GAAoC;AACtE,QAAME,IAAQJ,GAAuB;AAAA,IAAK,CAAC,CAACK,CAAO,MACjDA,EAAQ,KAAKH,CAAQ;AAAA,EAAA;AAEvB,SAAOE,IAAQA,EAAM,CAAC,IAAI;AAC5B;AChBO,MAAME,KACX;AAAA,EACE,OAAOC;AAAA,EACP,OAAOC;AAAA,EACP,OAAOC;AAAA,EACP,UAAUC;AACZ,GAEIC,KAA0B;AAAA,EAC9B,KAAKC;AAAA,EACL,KAAKC;AAAA,EACL,KAAKC;AAAA,EACL,KAAKC;AAAA,EACL,KAAKC;AAAA,EACL,KAAKC;AAAA,EACL,MAAMC;AAAA,EACN,UAAUC;AAAA,EACV,SAAST;AACX;AAEO,SAASU,GAAYlB,GAAqC;AAC/D,QAAMmB,IAAapB,GAAcC,CAAQ;AACzC,SAAImB,MAAe,aAAmBf,GAAgBe,CAAU,IACzDV,GAAwBR,GAAoBD,CAAQ,CAAC;AAC9D;AAGO,SAASoB,GACdpB,GACAqB,GACoB;AACpB,SAAOC,EAAM,cAAcJ,GAAYlB,CAAQ,GAAGqB,CAAK;AACzD;ACpDA,MAAME,KAAmB,0EACnBC,IAAmB,mDACnBC,IAAiB,mBACjBC,KAAkB,kBAClBC,KAAgB,wCAChBC,KAAoB,uLACpBC,KAAkB,0CAClBC,KAAmB,0EACnBC,KAAoB,qCACpBC,KAAmB,4EACnBC,KAAmB,wEACnBC,IAAc,CAACC,GAAKC,MAAS;AACjC,MAAI,MAAM,QAAQD,CAAG,GAAG;AACtB,eAAWE,KAAQF;AAIjB,UAHI,OAAOE,KAAS,YAAYH,EAAYG,GAAMD,CAAI,KAGlDF,EAAYG,EAAK,KAAKD,CAAI;AAC5B,eAAO;AAGX,WAAO;AAAA,EACT;AACA,SAAOA,EAAKD,CAAG;AACjB,GACMG,IAAU;AAAA,EACd,MAAM,CAACH,MAAQD,EAAYC,GAAK,CAACI,MAAMhB,GAAiB,KAAKgB,CAAC,KAAKf,EAAiB,KAAKe,CAAC,CAAC;AAAA,EAC3F,KAAK,CAACJ,MAAQD,EAAYC,GAAK,CAACI,MAAMd,EAAe,KAAKc,CAAC,CAAC;AAAA,EAC5D,MAAM,CAACJ,MAAQD,EAAYC,GAAK,CAACI,MAAMb,GAAgB,KAAKa,CAAC,CAAC;AAAA,EAC9D,KAAK,CAACJ,MAAQR,GAAc,KAAKQ,CAAG;AAAA,EACpC,SAAS,CAACA,MAAQP,GAAkB,KAAKO,CAAG;AAAA,EAC5C,OAAO,CAACA,MAAQN,GAAgB,KAAKM,CAAG,KAAK,CAACX,EAAiB,KAAKW,CAAG,KAAK,CAACV,EAAe,KAAKU,CAAG;AAAA,EACpG,QAAQ,CAACA,MAAQL,GAAiB,KAAKK,CAAG;AAAA,EAC1C,SAAS,CAACA,MAAQJ,GAAkB,KAAKI,CAAG;AAAA,EAC5C,QAAQ,CAACA,MAAQH,GAAiB,KAAKG,CAAG;AAAA,EAC1C,QAAQ,CAACA,MAAQF,GAAiB,KAAKE,CAAG;AAC5C,GClCMK,KAAalB,EAAM,WAAW,CAACD,GAAOoB,MAAQ;AAClD,QAAMC,IAAQnB,GAAiB,KAAK,GAAGF,EAAM,GAAG,EAAE,IAAI,UAAU;AAChE,SAAuBC,gBAAAA,EAAM,cAAcoB,GAAO,EAAE,GAAGrB,GAAO,KAAAoB,EAAG,GAAIpB,EAAM,QAAQ;AACrF,CAAC;AACD,IAAIsB,KAAqBH;ACHzB,MAAMI,KAAU;AAAA,EACd;AAAA,IACE,KAAK;AAAA,IACL,MAAM;AAAA,IACN,SAASN,EAAQ;AAAA,IACjB,cAAc,MAAM;AAAA,IACpB,QAAQO;AAAA,MACN,MAAM;AAAA;AAAA,QAEJ;AAAA,MACR;AAAA,IACA;AAAA,EACA;AAAA,EACE;AAAA,IACE,KAAK;AAAA,IACL,MAAM;AAAA,IACN,SAASP,EAAQ;AAAA,IACjB,cAAc,MAAM;AAAA,IACpB,QAAQO;AAAA,MACN,MAAM;AAAA;AAAA,QAEJ;AAAA,MACR;AAAA,IACA;AAAA,EACA;AAAA,EACE;AAAA,IACE,KAAK;AAAA,IACL,MAAM;AAAA,IACN,SAASP,EAAQ;AAAA,IACjB,cAAc,MAAM;AAAA,IACpB,QAAQO;AAAA,MACN,MAAM;AAAA;AAAA,QAEJ;AAAA,MACR;AAAA,IACA;AAAA,EACA;AAAA,EACE;AAAA,IACE,KAAK;AAAA,IACL,MAAM;AAAA,IACN,SAASP,EAAQ;AAAA,IACjB,QAAQO;AAAA,MACN,MAAM;AAAA;AAAA,QAEJ;AAAA,MACR;AAAA,IACA;AAAA,EACA;AAAA,EACE;AAAA,IACE,KAAK;AAAA,IACL,MAAM;AAAA,IACN,SAASP,EAAQ;AAAA,IACjB,QAAQO;AAAA,MACN,MAAM;AAAA;AAAA,QAEJ;AAAA,MACR;AAAA,IACA;AAAA,EACA;AAAA,EACE;AAAA,IACE,KAAK;AAAA,IACL,MAAM;AAAA,IACN,SAASP,EAAQ;AAAA,IACjB,cAAc,MAAM;AAAA,IACpB,QAAQO;AAAA,MACN,MAAM;AAAA;AAAA,QAEJ;AAAA,MACR;AAAA,IACA;AAAA,EACA;AAAA,EACE;AAAA,IACE,KAAK;AAAA,IACL,MAAM;AAAA,IACN,SAASP,EAAQ;AAAA,IACjB,cAAc,MAAM;AAAA,IACpB,QAAQO;AAAA,MACN,MAAM;AAAA;AAAA,QAEJ;AAAA,MACR;AAAA,IACA;AAAA,EACA;AAAA,EACE;AAAA,IACE,KAAK;AAAA,IACL,MAAM;AAAA,IACN,SAASP,EAAQ;AAAA,IACjB,cAAc,MAAM;AAAA,IACpB,QAAQO;AAAA,MACN,MAAM;AAAA;AAAA,QAEJ;AAAA,MACR;AAAA,IACA;AAAA,EACA;AAAA,EACE;AAAA,IACE,KAAK;AAAA,IACL,MAAM;AAAA,IACN,SAASP,EAAQ;AAAA,IACjB,cAAc,MAAM;AAAA,IACpB,QAAQO;AAAA,MACN,MAAM;AAAA;AAAA,QAEJ;AAAA,MACR;AAAA,IACA;AAAA,EACA;AAAA,EACE;AAAA,IACE,KAAK;AAAA,IACL,MAAM;AAAA,IACN,SAASP,EAAQ;AAAA,IACjB,cAAc,MAAM;AAAA,IACpB,QAAQE;AAAAA,EACZ;AACA;AACA,IAAIM,IAAkBF;ACtHtB,MAAMG,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAanB,OAAO;AAAA,EACP,QAAQ;AAAA;AAAA,EAER,QAAQ;AAAA,EACR,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMd,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,WAAW;AACb,GCzBMC,KAAS1B,EAAM,WAAW,CAACD,GAAOoB,MAAQ;AAC9C,QAAM,EAAE,SAAAQ,GAAS,KAAAC,EAAG,IAAK7B,GACnB8B,IAAU9B,EAAM,cAChB+B,IAAYC,EAAO,IAAI,GACvBC,IAAiBD,EAAO,EAAI;AAClC,EAAAE,EAAU,MAAM;AACd,QAAIC,GAAIC;AACR,IAAKL,EAAU,YACXA,EAAU,QAAQ,UAAUH,MAAY,MAC1CG,EAAU,QAAQ,KAAI,GAEpB,CAACA,EAAU,QAAQ,UAAUH,MAAY,MAC3CG,EAAU,QAAQ,MAAK,GAEzBA,EAAU,QAAQ,gBAAgBI,IAAKnC,EAAM,iBAAiB,OAAOmC,IAAK,GAC1EJ,EAAU,QAAQ,UAAUK,IAAKpC,EAAM,WAAW,OAAOoC,IAAK;AAAA,EAChE,CAAC,GACDF,EAAU,MAAM;AACd,QAAIC,GAAIC,GAAIC,GAAIC,GAAIC;AACpB,QAAI,GAACR,EAAU,WAAW,CAAC,WAAW,WACtC;AAAA,UAAIF,KAAO,CAAC,SAAS;AACnB,YAAI;AACF,WAACO,KAAMD,IAAKJ,EAAU,SAAS,4BAA4B,QAAgBK,EAAG,KAAKD,CAAE;AAAA,QACvF,QAAc;AAAA,QACd;AAEF,UAAI,CAACN,KAAO,SAAS;AACnB,YAAI;AACF,WAACS,KAAMD,IAAKN,EAAU,SAAS,yBAAyB,QAAgBO,EAAG,KAAKD,CAAE,IACjFE,IAAK,SAAS,yBAAyB,QAAgBA,EAAG,KAAK,QAAQ;AAAA,QAC1E,QAAc;AAAA,QACd;AAAA;AAAA,EAEJ,GAAG,CAACV,CAAG,CAAC;AACR,QAAMW,IAAkB,CAACC,MAAU;AACjC,QAAIN,GAAIC;AACR,IAAAH,EAAe,UAAU,KACxBE,IAAKnC,EAAM,YAAY,QAAgBmC,EAAG,KAAKnC,CAAK,IACpDoC,IAAKpC,EAAM,gBAAgB,QAAgBoC,EAAG,KAAKpC,GAAOyC,CAAK;AAAA,EAClE,GACMC,IAAa,CAACD,MAAU;AAC5B,QAAIN,GAAIC;AACR,IAAIH,EAAe,YACjBA,EAAe,UAAU,KACxBE,IAAKnC,EAAM,YAAY,QAAgBmC,EAAG,KAAKnC,GAAOyC,CAAK,KAE7DL,IAAKpC,EAAM,WAAW,QAAgBoC,EAAG,KAAKpC,GAAOyC,CAAK;AAAA,EAC7D;AACA,MAAI,CAACX;AACH,WAAO;AAET,QAAMa,IAAa,CAAA,GACbC,IAA2B,CAAC,WAAW,SAAS;AACtD,aAAWC,KAAO7C;AAChB,IAAI6C,EAAI,WAAW,IAAI,KAAK,CAACD,EAAyB,SAASC,CAAG,MAChEF,EAAWE,CAAG,IAAI7C,EAAM6C,CAAG;AAG/B,SAAuB5C,gBAAAA,EAAM;AAAA,IAC3B6B;AAAA,IACA;AAAA,MACE,GAAGa;AAAA,MACH,OAAO3C,EAAM;AAAA,MACb,WAAWA,EAAM;AAAA,MACjB,MAAMA,EAAM;AAAA,MACZ,KAAK8C;AAAA,QACH,CAACC,MAAS;AACR,UAAAhB,EAAU,UAAUgB,GAChB,OAAO3B,KAAQ,aACjBA,EAAI2B,CAAI,IACC3B,MAAQ,SACjBA,EAAI,UAAU2B;AAAA,QAElB;AAAA,QACA,CAAC3B,CAAG;AAAA,MACZ;AAAA,MACM,KAAKpB,EAAM;AAAA,MACX,aAAaA,EAAM;AAAA,MACnB,SAASA,EAAM;AAAA,MACf,UAAUA,EAAM;AAAA,MAChB,OAAOA,EAAM;AAAA,MACb,UAAUA,EAAM;AAAA,MAChB,MAAMA,EAAM;AAAA,MACZ,aAAaA,EAAM;AAAA,MACnB,uBAAuBA,EAAM;AAAA,MAC7B,QAAQA,EAAM;AAAA,MACd,aAAawC;AAAA,MACb,QAAQE;AAAA,IACd;AAAA,IACI1C,EAAM;AAAA,EACV;AACA,CAAC;AACD2B,GAAO,cAAc;AACrB,IAAIqB,KAAiBrB;AC3FrB,MAAMsB,KAAUzB,EAAK,MAAM;AAAA;AAAA,EAEzB;AACF,CAAC,GACK0B,IAAgB,CAAA,GAChBC,KAAoB,CAACC,GAASC,MAAmB;AACrD,QAAMC,IAAkB,CAACC,MAAQ;AAC/B,eAAWC,KAAU,CAAC,GAAGN,GAAe,GAAGE,CAAO;AAChD,UAAIG,KAAOC,EAAO,QAAQD,CAAG;AAC3B,eAAOC;AAGX,WAAIH,KAGG;AAAA,EACT,GACMI,IAAcxD,EAAM,WAAW,CAACyD,GAAQtC,MAAQ;AACpD,UAAMpB,IAAQ,EAAE,GAAG0B,IAAc,GAAGgC,EAAM,GACpC,EAAE,KAAAH,GAAK,MAAAI,GAAM,WAAAC,GAAW,OAAAC,GAAO,OAAAC,GAAO,QAAAC,GAAQ,UAAAC,GAAU,SAAAC,EAAO,IAAKjE,GACpE,CAACkE,GAAaC,CAAc,IAAIC,EAAS,CAAC,CAACpE,EAAM,KAAK;AAC5D,IAAAkC,EAAU,MAAM;AACd,MAAIlC,EAAM,QACRmE,EAAe,EAAI,IAEnBA,EAAe,EAAK;AAAA,IAExB,GAAG,CAACnE,EAAM,KAAK,CAAC;AAChB,UAAMqE,IAAqB,CAACC,MAAM;AAChC,UAAInC;AACJ,MAAAgC,EAAe,EAAK,IACnBhC,IAAKnC,EAAM,mBAAmB,QAAgBmC,EAAG,KAAKnC,GAAOsE,CAAC;AAAA,IACjE,GACMC,IAAgB,CAACC,MAAS;AAC9B,UAAI,CAACA,EAAM,QAAO;AAClB,YAAM,EAAE,OAAAC,GAAO,UAAAC,GAAU,iBAAAC,GAAiB,WAAAC,GAAW,kBAAAC,EAAgB,IAAK7E;AAC1E,aAAuBC,gBAAAA,EAAM;AAAA,QAC3BgD;AAAA,QACA;AAAA,UACE,KAAKuB;AAAA,UACL,OAAAC;AAAA,UACA,UAAAC;AAAA,UACA,iBAAAC;AAAA,UACA,kBAAAE;AAAA,UACA,WAAAD;AAAA,UACA,gBAAgBP;AAAA,QAC1B;AAAA,MACA;AAAA,IACI,GACMS,IAAqB,CAACN,MAAS;AACnC,UAAIrC,GAAIC;AACR,YAAMoB,IAASF,EAAgBkB,CAAI;AACnC,UAAI,CAAChB,EAAQ,QAAO;AACpB,YAAM,EAAE,OAAOuB,GAAQ,OAAOC,GAAQ,QAAQC,GAAS,SAASC,EAAQ,IAAKlF,GACvEmF,KAAUhD,IAAKnC,EAAM,WAAW,OAAO,SAASmC,EAAGqB,EAAO,GAAG;AACnE,aAAuBvD,gBAAAA,EAAM;AAAA,QAC3B0B;AAAAA,QACA;AAAA,UACE,GAAG3B;AAAA,UACH,KAAAoB;AAAA,UACA,eAAegB,IAAKoB,EAAO,WAAW,OAAOpB,IAAKoB;AAAA,UAClD,MAAM0B,IAAW,SAASvB;AAAA,UAC1B,WAAWuB,IAAW,SAAStB;AAAA,UAC/B,OAAOsB,IAAW,EAAE,SAAS,SAAS,OAAO,QAAQ,QAAQ,OAAM,IAAK,EAAE,SAAS,SAAS,OAAOF,GAAQ,QAAQC,GAAS,GAAGF,EAAM;AAAA,UACrI,QAAAI;AAAA,QACV;AAAA,MACA;AAAA,IACI,GACMC,IAAUnB,KAAkBoB,GAC5BC,IAAoBtB,MAAa,KAAQqB,IAAkBE;AACjE,WAAuBtF,gBAAAA,EAAM,cAAcmF,GAAS,EAAE,MAAAzB,GAAM,WAAAC,GAAW,OAAO,EAAE,OAAAE,GAAO,QAAAC,GAAQ,GAAGF,EAAK,EAAE,GAAoB5D,gBAAAA,EAAM,cAAcqF,GAAmB,EAAE,UAAAtB,KAAYE,IAAcK,EAAchB,CAAG,IAAIuB,EAAmBvB,CAAG,CAAC,CAAC;AAAA,EAC/O,CAAC;AACD,SAAAE,EAAY,cAAc,eAC1BA,EAAY,kBAAkB,CAACD,MAAW;AACxC,IAAAN,EAAc,KAAKM,CAAM;AAAA,EAC3B,GACAC,EAAY,sBAAsB,MAAM;AACtC,IAAAP,EAAc,SAAS;AAAA,EACzB,GACAO,EAAY,UAAU,CAACF,MAAQ;AAC7B,QAAIA;AACF,iBAAWzB,KAAW,CAAC,GAAGoB,GAAe,GAAGE,CAAO;AACjD,YAAItB,EAAQ,QAAQyB,CAAG;AACrB,iBAAO;AAAA;AAIb,WAAO;AAAA,EACT,GACAE,EAAY,eAAe,CAACF,MAAQ;AAClC,QAAIpB;AACJ,QAAIoB;AACF,iBAAWzB,KAAW,CAAC,GAAGoB,GAAe,GAAGE,CAAO;AACjD,YAAItB,EAAQ,QAAQyB,CAAG,OAAOpB,IAAKL,EAAQ,iBAAiB,QAAgBK,EAAG,KAAKL,CAAO;AACzF,iBAAO;AAAA;AAIb,WAAO;AAAA,EACT,GACO2B;AACT,GACM4B,IAAkB,CAAC,EAAE,UAAAG,EAAQ,MAAOA,GCtGpCxB,KAAWZ,EAAQA,EAAQ,SAAS,CAAC;AAC3C,IAAIqC,KAActC,GAAkBC,GAASY,EAAQ;ACIrD,MAAM0B,KAAc,CAAC5F,GAAkC6F,MACrD7F,MAAe,WAAW,CAAC6F,IAAS,eAAe;AAErD,SAASC,GACP,GACQ;;AACR,SAAI,aAAa,MACRzD,IAAA,EAAE,QAAQ,CAAC,MAAX,gBAAAA,EAAc,cAAWC,IAAA,EAAE,eAAe,CAAC,MAAlB,gBAAAA,EAAqB,YAAW,IAE3D,EAAE;AACX;AAiBA,MAAMyD,KAA0C,CAAC;AAAA,EAC/C,QAAAC;AAAA,EACA,UAAAnH;AAAA,EACA,QAAAgH;AAAA,EACA,UAAAI,IAAW;AAAA,EACX,SAASC;AAAA,EACT,MAAAC,IAAO;AAAA,EACP,UAAAC,IAAW;AAAA,EACX,cAAAC,IAAe;AAAA,EACf,kBAAAC;AAAA,EACA,OAAAC,IAAQ;AACV,MAAM;AACJ,QAAMvG,IAAapB,GAAcC,CAAQ,GACnC,CAACiD,GAAS0E,CAAU,IAAIlC,EAAS2B,CAAQ,GAGzCQ,IAAqBvE,EAAOgE,CAAW;AAC7C,EAAA9D,EAAU,MAAM;AACd,IACE8D,MAAgB,UAChBA,MAAgBO,EAAmB,YAEnCA,EAAmB,UAAUP,GAC7BM,EAAWN,CAAW;AAAA,EAE1B,GAAG,CAACA,CAAW,CAAC;AAChB,QAAM,CAACQ,GAAQC,CAAS,IAAIrC,EAAS,CAAC,GAChC,CAACsC,GAASC,CAAU,IAAIvC,EAAS,EAAK,GACtC,CAACwC,GAAiBC,CAAkB,IAAIzC,EAAS,EAAK,GACtD,CAAC0C,GAAaC,CAAc,IAAI3C,EAAwB,IAAI,GAC5D,CAAC4C,GAAWC,CAAY,IAAI7C,EAAS,EAAK,GAE1C,CAAC8C,GAAoBC,CAAqB,IAAI/C,EAAS,EAAK,GAC5DrC,IAAYC,EAAyB,IAAI,GACzCoF,IAAWpF,EAAuB,IAAI,GACtCqF,IAASrF,EAAsB,IAAI;AAEzC,EAAAE,EAAU,MAAM;AACd,IAAAiF,EAAsB,EAAK;AAAA,EAC7B,GAAG,CAACrB,CAAM,CAAC,GAEX5D,EAAU,MAAM;AACd,QAAI,CAACN,GAAS;AACZ,MAAIyF,EAAO,YAAY,SACrB,qBAAqBA,EAAO,OAAO,GACnCA,EAAO,UAAU;AAEnB;AAAA,IACF;AACA,UAAMC,IAAO,MAAM;AACjB,YAAMC,IAAKxF,EAAU;AACrB,MAAIwF,KAAMA,EAAG,YAAY,CAACb,KAASD,EAAUc,EAAG,cAAcA,EAAG,QAAQ,GACzEF,EAAO,UAAU,sBAAsBC,CAAI;AAAA,IAC7C;AACA,WAAAD,EAAO,UAAU,sBAAsBC,CAAI,GACpC,MAAM;AACX,MAAID,EAAO,YAAY,QAAM,qBAAqBA,EAAO,OAAO;AAAA,IAClE;AAAA,EACF,GAAG,CAACzF,GAAS8E,CAAO,CAAC,GAIrBxE,EAAU,MAAM;AACd,UAAMqF,IAAKxF,EAAU;AACrB,IAAKwF,MACD3F,IACG2F,EAAG,KAAA,EAAO,MAAM,CAACC,MAAQ;AAC5B,MAAAlB,EAAW,EAAK,GAChBa,EAAsB,EAAI;AAAA,IAI5B,CAAC,IAEDI,EAAG,MAAA;AAAA,EAEP,GAAG,CAAC3F,CAAO,CAAC;AAEZ,QAAM6F,IAA2B3E,EAAY,MAAM;AACjD,IAAAqE,EAAsB,EAAK,GAC3Bb,EAAW,EAAI;AAAA,EACjB,GAAG,CAAA,CAAE,GAECoB,IAAc5E;AAAA,IAClB,CAACwB,MAAqE;AACpE,YAAMqD,IAAQP,EAAS;AACvB,UAAI,CAACO,EAAO,QAAO;AACnB,YAAMC,IAAOD,EAAM,sBAAA;AACnB,aAAO,KAAK;AAAA,QACV;AAAA,QACA,KAAK,IAAI,IAAI/B,GAAoBtB,CAAC,IAAIsD,EAAK,QAAQA,EAAK,KAAK;AAAA,MAAA;AAAA,IAEjE;AAAA,IACA,CAAA;AAAA,EAAC,GAGGC,IAAS/E,EAAY,CAACgF,MAAqB;AAC/C,UAAMP,IAAKxF,EAAU;AACrB,IAAIwF,KAAMA,EAAG,aAAUA,EAAG,cAAcO,IAAWP,EAAG;AAAA,EACxD,GAAG,CAAA,CAAE,GAECQ,IAAyB,CAC7BzD,MACG;AACH,IAAAA,EAAE,gBAAA,GACFqC,EAAW,EAAI;AACf,UAAMmB,IAAWJ,EAAYpD,CAAC;AAC9B,IAAAmC,EAAUqB,CAAQ,GAClBD,EAAOC,CAAQ;AAAA,EACjB;AAEA,EAAA5F,EAAU,MAAM;AACd,QAAI,CAACwE,EAAS;AACd,UAAMsB,IAAS,CAAC1D,MAA+BmC,EAAUiB,EAAYpD,CAAC,CAAC,GACjE2D,IAAO,CAAC3D,MAA+B;AAC3C,MAAAqC,EAAW,EAAK,GAChBkB,EAAOH,EAAYpD,CAAC,CAAC;AAAA,IACvB;AACA,kBAAO,iBAAiB,aAAa0D,CAAM,GAC3C,OAAO,iBAAiB,WAAWC,CAAI,GACvC,OAAO,iBAAiB,aAAaD,GAAQ,EAAE,SAAS,IAAM,GAC9D,OAAO,iBAAiB,YAAYC,CAAI,GACjC,MAAM;AACX,aAAO,oBAAoB,aAAaD,CAAM,GAC9C,OAAO,oBAAoB,WAAWC,CAAI,GAC1C,OAAO,oBAAoB,aAAaD,CAAM,GAC9C,OAAO,oBAAoB,YAAYC,CAAI;AAAA,IAC7C;AAAA,EACF,GAAG,CAACvB,GAASgB,GAAaG,CAAM,CAAC;AAGjC,QAAMK,KAAcpB,IAChB,EAAE,aAAa,OAAOA,CAAW,MACjC,QACEqB,KAAerB,IAAgC,KAAlB,iBAC7BsB,IAAkB,KAAK,MAAM5B,IAAS,GAAG;AAE/C,SACE,gBAAA6B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,UAAU;AAAA,MACV,WAAW,2CAA2C3C,GAAY5F,GAAY6F,CAAM,CAAC,GAAGwC,EAAW;AAAA,MACnG,OAAOD;AAAA,MACP,SAAS,MAAM;AACb,YAAI,CAAAhB,GACJ;AAAA,cAAId,GAAkB;AACpB,YAAAA,EAAA;AACA;AAAA,UACF;AACA,UAAIF,KAAUI,EAAW,CAACgC,MAAM,CAACA,CAAC;AAAA;AAAA,MACpC;AAAA,MACA,WAAW,CAAChE,MAAM;AAChB,YAAI,EAAAA,EAAE,QAAQ,WAAWA,EAAE,QAAQ,SACnCA,EAAE,eAAA,GACE,CAAA4C,IACJ;AAAA,cAAId,GAAkB;AACpB,YAAAA,EAAA;AACA;AAAA,UACF;AACA,UAAIF,KAAUI,EAAW,CAACgC,MAAM,CAACA,CAAC;AAAA;AAAA,MACpC;AAAA,MAEC,UAAA;AAAA,QAAA3C,KACC,gBAAA4C;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAK5C;AAAA,YACL,KAAI;AAAA,YACJ,WAAU;AAAA,UAAA;AAAA,QAAA;AAAA,QAGb,CAACA,KACA,gBAAA4C,EAAC,SAAI,WAAU,qDACZ,aAAe5J,GAAU;AAAA,UACxB,WAAW;AAAA,UACX,QAAQ;AAAA,QAAA,CACT,GACH;AAAA,QAEF,gBAAA4J,EAAC,OAAA,EAAI,WAAU,oBACb,UAAA,gBAAAA;AAAA,UAAC9E;AAAAA,UAAA;AAAA,YACC,KAAK1B;AAAA,YACL,KAAK+D;AAAA,YACL,QAAAH;AAAA,YACA,MAAAM;AAAA,YACA,OAAAI;AAAA,YACA,aAAW;AAAA,YACX,OAAM;AAAA,YACN,QAAO;AAAA,YACP,aAAa,MAAMY,EAAa,EAAI;AAAA,YACpC,WAAW,MAAMA,EAAa,EAAK;AAAA,YACnC,WAAW,MAAMA,EAAa,EAAI;AAAA,YAClC,QAAQ,MAAME,EAAsB,EAAK;AAAA,YACzC,kBAAkB,MAAM;AACtB,oBAAMI,IAAKxF,EAAU;AACrB,cAAIwF,KAAMA,EAAG,cAAcA,EAAG,eAC5BR,EAAeQ,EAAG,aAAaA,EAAG,WAAW;AAAA,YAEjD;AAAA,YACA,SAAS,MAAM;AACb,cAAKtB,MACHK,EAAW,EAAK,GAChBG,EAAU,CAAC;AAAA,YAEf;AAAA,UAAA;AAAA,QAAA,GAEJ;AAAA,QAECO,KAAa,CAACE,KACb,gBAAAqB,EAAC,OAAA,EAAI,WAAU,0DACb,UAAA,gBAAAA;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,QAAO;AAAA,UAAA;AAAA,QAAA,GAEX;AAAA,QAGDtB,KAAsB,CAAChB,KACtB,gBAAAqC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,UAAU;AAAA,YACV,cAAW;AAAA,YACX,SAAS,CAACjE,MAAM;AACd,cAAAA,EAAE,gBAAA,GACFmD,EAAA;AAAA,YACF;AAAA,YACA,WAAW,CAACnD,MAAM;AAChB,cAAIA,EAAE,QAAQ,WAAWA,EAAE,QAAQ,QACnCA,EAAE,eAAA,GACFA,EAAE,gBAAA,GACFmD,EAAA;AAAA,YACF;AAAA,YAEA,UAAA,gBAAAc,EAAC,QAAA,EAAK,WAAU,iGACd,UAAA,gBAAAA,EAACE,KAAS,WAAU,0BAAyB,QAAO,OAAA,CAAO,EAAA,CAC7D;AAAA,UAAA;AAAA,QAAA;AAAA,QAIHtC,KAAgB,CAACD,KAChB,gBAAAqC,EAAC,OAAA,EAAI,WAAU,8FACb,UAAA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,iBAAeH;AAAA,YACf,iBAAe;AAAA,YACf,iBAAe;AAAA,YACf,UAAU;AAAA,YACV,KAAKhB;AAAA,YACL,WAAU;AAAA,YACV,aAAaW;AAAA,YACb,cAAcA;AAAA,YACd,SAAS,CAACzD,MAAMA,EAAE,gBAAA;AAAA,YAClB,WAAW,CAACA,MAAM;AAChB,cAAIA,EAAE,QAAQ,gBAAcuD,EAAO,KAAK,IAAI,GAAGrB,IAAS,IAAI,CAAC,GACzDlC,EAAE,QAAQ,eAAauD,EAAO,KAAK,IAAI,GAAGrB,IAAS,IAAI,CAAC;AAAA,YAC9D;AAAA,YAEA,UAAA,gBAAA+B,EAAC,OAAA,EAAI,WAAU,uDACb,UAAA,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO,EAAE,OAAO,GAAGH,CAAe,IAAA;AAAA,cAAI;AAAA,YAAA,EACxC,CACF;AAAA,UAAA;AAAA,QAAA,GAEJ;AAAA,QAGDlC,KACC,gBAAAmC,EAAC,OAAA,EAAI,WAAU,kJACb,UAAA;AAAA,UAAA,gBAAAE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,CAACjE,MAAM;AACd,gBAAAA,EAAE,gBAAA,GACFgC,EAAW,CAACgC,MAAM,CAACA,CAAC;AAAA,cACtB;AAAA,cACA,WAAU;AAAA,cACV,cAAY1G,IAAU,UAAU;AAAA,cAE/B,UAAAA,IACC,gBAAA2G,EAACG,IAAA,EAAU,WAAU,UAAS,QAAO,OAAA,CAAO,IAE5C,gBAAAH,EAACE,GAAA,EAAS,WAAU,yBAAwB,QAAO,OAAA,CAAO;AAAA,YAAA;AAAA,UAAA;AAAA,UAI9D,gBAAAJ;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAW;AAAA,cACX,iBAAeD;AAAA,cACf,iBAAe;AAAA,cACf,iBAAe;AAAA,cACf,UAAU;AAAA,cACV,KAAKhB;AAAA,cACL,WAAU;AAAA,cACV,aAAaW;AAAA,cACb,cAAcA;AAAA,cACd,SAAS,CAACzD,MAAMA,EAAE,gBAAA;AAAA,cAClB,cAAc,MAAMuC,EAAmB,EAAI;AAAA,cAC3C,cAAc,MAAMA,EAAmB,EAAK;AAAA,cAC5C,WAAW,CAACvC,MAAM;AAChB,gBAAIA,EAAE,QAAQ,gBAAcuD,EAAO,KAAK,IAAI,GAAGrB,IAAS,IAAI,CAAC,GACzDlC,EAAE,QAAQ,eAAauD,EAAO,KAAK,IAAI,GAAGrB,IAAS,IAAI,CAAC;AAAA,cAC9D;AAAA,cAEA,UAAA;AAAA,gBAAA,gBAAA+B;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAW,+EAA+E3B,KAAmBF,IAAU,UAAU,KAAK;AAAA,oBAEtI,UAAA,gBAAA6B;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,WAAU;AAAA,wBACV,OAAO,EAAE,OAAO,GAAGH,CAAe,IAAA;AAAA,sBAAI;AAAA,oBAAA;AAAA,kBACxC;AAAA,gBAAA;AAAA,gBAEF,gBAAAG;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAW,6GAA6G3B,KAAmBF,IAAU,0BAA0B,mBAAmB;AAAA,oBAClM,OAAO,EAAE,MAAM,GAAG0B,CAAe,IAAA;AAAA,kBAAI;AAAA,gBAAA;AAAA,cACvC;AAAA,YAAA;AAAA,UAAA;AAAA,QACF,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;","x_google_ignoreList":[2,3,4,5,6,7,8]}
@@ -0,0 +1,199 @@
1
+ import { jsxs as c, jsx as e, Fragment as b } from "react/jsx-runtime";
2
+ import { CheckCircleIcon as T, LockOpenIcon as v, LockSimpleIcon as P, DownloadSimpleIcon as C } from "@phosphor-icons/react";
3
+ import { useState as x, useEffect as L } from "react";
4
+ import { g as D, r as g, M as U } from "./MediaPlayer-DE9MC6k6.js";
5
+ const h = (s) => s === "paid" ? v : P, z = (s) => {
6
+ const { icon: t } = s;
7
+ return /* @__PURE__ */ e("div", { className: "absolute inset-0 bg-black/30", children: /* @__PURE__ */ e("div", { className: "absolute left-3 top-3 flex size-8 items-center justify-center rounded-full bg-black/60", children: /* @__PURE__ */ e(t, { className: "size-4 text-white", weight: "fill" }) }) });
8
+ }, I = (s) => {
9
+ const { thumbnail: t, mimeType: n, LockIcon: a } = s;
10
+ return /* @__PURE__ */ c("div", { className: "relative aspect-video overflow-hidden bg-black/5", children: [
11
+ t ? /* @__PURE__ */ e(
12
+ "img",
13
+ {
14
+ src: t,
15
+ alt: "",
16
+ className: "absolute inset-0 h-full w-full object-cover"
17
+ }
18
+ ) : /* @__PURE__ */ e("div", { className: "absolute inset-0 flex items-center justify-center", children: g(n, {
19
+ className: "size-12 text-black/20",
20
+ weight: "regular"
21
+ }) }),
22
+ /* @__PURE__ */ e(z, { icon: a })
23
+ ] });
24
+ }, M = (s) => {
25
+ const { source: t, thumbnail: n, mimeType: a, title: i, paymentStatus: l, isLocked: o } = s, [r, m] = x(!1);
26
+ return L(() => {
27
+ m(!1);
28
+ }, [t]), o ? /* @__PURE__ */ e(
29
+ I,
30
+ {
31
+ thumbnail: n,
32
+ mimeType: a,
33
+ LockIcon: h(l)
34
+ }
35
+ ) : /* @__PURE__ */ e("div", { className: "relative overflow-hidden bg-black/5", children: /* @__PURE__ */ e(
36
+ "img",
37
+ {
38
+ src: t,
39
+ alt: i,
40
+ className: `block w-full transition-opacity duration-300 ${r ? "opacity-100" : "opacity-0"}`,
41
+ onLoad: () => m(!0)
42
+ }
43
+ ) });
44
+ }, O = (s) => {
45
+ const { thumbnail: t, mimeType: n, paymentStatus: a, isLocked: i } = s;
46
+ return /* @__PURE__ */ c("div", { className: "relative aspect-video overflow-hidden bg-black/5", children: [
47
+ t ? /* @__PURE__ */ e(
48
+ "img",
49
+ {
50
+ src: t,
51
+ alt: "",
52
+ className: "absolute inset-0 h-full w-full object-cover"
53
+ }
54
+ ) : /* @__PURE__ */ e("div", { className: "absolute inset-0 flex items-center justify-center", children: g(n, {
55
+ className: "size-12 text-black/20",
56
+ weight: "regular"
57
+ }) }),
58
+ i && /* @__PURE__ */ e(z, { icon: h(a) })
59
+ ] });
60
+ }, R = (s) => {
61
+ const { source: t, thumbnail: n, mimeType: a, paymentStatus: i, isLocked: l } = s;
62
+ return l ? /* @__PURE__ */ e(
63
+ I,
64
+ {
65
+ thumbnail: n,
66
+ mimeType: a,
67
+ LockIcon: h(i)
68
+ }
69
+ ) : /* @__PURE__ */ e(U, { source: t, mimeType: a, poster: n });
70
+ }, A = (s) => {
71
+ const { isLocked: t, loading: n, paymentStatus: a, source: i, onUnlock: l, onDownload: o } = s, r = h(a);
72
+ return t && l ? /* @__PURE__ */ e(
73
+ "button",
74
+ {
75
+ type: "button",
76
+ onClick: l,
77
+ disabled: n,
78
+ className: "mt-3 inline-flex h-10 w-full items-center justify-center gap-2 rounded-full bg-[#121110] px-4 text-sm font-medium leading-none text-white disabled:opacity-70",
79
+ children: n ? /* @__PURE__ */ c("span", { className: "flex items-center gap-1", children: [
80
+ /* @__PURE__ */ e("span", { className: "size-1 rounded-full bg-white animate-bounce [animation-delay:-0.3s]" }),
81
+ /* @__PURE__ */ e("span", { className: "size-1 rounded-full bg-white animate-bounce [animation-delay:-0.15s]" }),
82
+ /* @__PURE__ */ e("span", { className: "size-1 rounded-full bg-white animate-bounce" })
83
+ ] }) : /* @__PURE__ */ c(b, { children: [
84
+ a === "paid" ? /* @__PURE__ */ e(v, { className: "size-4", weight: "fill" }) : /* @__PURE__ */ e(r, { className: "size-4", weight: "fill" }),
85
+ a === "paid" ? "Open" : "Unlock"
86
+ ] })
87
+ }
88
+ ) : !t && o && i ? /* @__PURE__ */ c(
89
+ "a",
90
+ {
91
+ href: i,
92
+ target: "_blank",
93
+ rel: "noopener noreferrer",
94
+ onClick: o,
95
+ className: "mt-3 inline-flex h-10 w-full items-center justify-center gap-2 rounded-full bg-[#121110] px-4 text-sm font-medium leading-none !text-white",
96
+ children: [
97
+ /* @__PURE__ */ e(C, { className: "size-4", weight: "bold" }),
98
+ "Download"
99
+ ]
100
+ }
101
+ ) : null;
102
+ }, $ = (s) => {
103
+ const {
104
+ title: t,
105
+ amountText: n,
106
+ thumbnail: a,
107
+ source: i,
108
+ mimeType: l = "application/octet-stream",
109
+ detail: o,
110
+ onUnlock: r,
111
+ onDownload: m,
112
+ paymentStatus: d
113
+ } = s, [u, k] = x(i), [S, w] = x(!1);
114
+ L(() => {
115
+ i !== void 0 && k(i);
116
+ }, [i]);
117
+ const f = u === void 0, N = D(l), j = async () => {
118
+ if (r) {
119
+ w(!0);
120
+ try {
121
+ const y = await r();
122
+ k(y.source);
123
+ } catch {
124
+ } finally {
125
+ w(!1);
126
+ }
127
+ }
128
+ };
129
+ let p;
130
+ return N === "image" ? p = /* @__PURE__ */ e(
131
+ M,
132
+ {
133
+ source: u,
134
+ thumbnail: a,
135
+ mimeType: l,
136
+ title: t,
137
+ paymentStatus: d,
138
+ isLocked: f
139
+ }
140
+ ) : N === "document" ? p = /* @__PURE__ */ e(
141
+ O,
142
+ {
143
+ thumbnail: a,
144
+ mimeType: l,
145
+ paymentStatus: d,
146
+ isLocked: f
147
+ }
148
+ ) : p = /* @__PURE__ */ e(
149
+ R,
150
+ {
151
+ source: u,
152
+ thumbnail: a,
153
+ mimeType: l,
154
+ paymentStatus: d,
155
+ isLocked: f
156
+ }
157
+ ), /* @__PURE__ */ c("div", { className: "w-[280px] select-none overflow-hidden rounded-3xl bg-white shadow-card", children: [
158
+ p,
159
+ /* @__PURE__ */ c("div", { className: "px-4 pb-3 pt-3", children: [
160
+ /* @__PURE__ */ e("p", { className: "mb-1.5 truncate text-base font-medium text-black", children: t }),
161
+ /* @__PURE__ */ c("div", { className: "flex items-center gap-1", children: [
162
+ g(l, {
163
+ className: "size-5 shrink-0 text-black/55",
164
+ weight: "regular"
165
+ }),
166
+ o && /* @__PURE__ */ e("span", { className: "text-xs font-medium text-black/55", children: o }),
167
+ d === "paid" ? /* @__PURE__ */ c(b, { children: [
168
+ /* @__PURE__ */ e("span", { className: "text-xs font-medium text-black/55", children: "•" }),
169
+ /* @__PURE__ */ e("span", { className: "text-xs font-medium text-[#008236]", children: "Purchased" }),
170
+ /* @__PURE__ */ e(
171
+ T,
172
+ {
173
+ className: "size-4 text-[#008236]",
174
+ weight: "bold"
175
+ }
176
+ )
177
+ ] }) : n && /* @__PURE__ */ c(b, { children: [
178
+ /* @__PURE__ */ e("span", { className: "text-xs font-medium text-black/55", children: "•" }),
179
+ /* @__PURE__ */ e("span", { className: "text-xs font-medium text-black/55", children: n })
180
+ ] })
181
+ ] }),
182
+ /* @__PURE__ */ e(
183
+ A,
184
+ {
185
+ isLocked: f,
186
+ loading: S,
187
+ paymentStatus: d,
188
+ source: u,
189
+ onUnlock: r ? j : void 0,
190
+ onDownload: m
191
+ }
192
+ )
193
+ ] })
194
+ ] });
195
+ };
196
+ export {
197
+ $ as default
198
+ };
199
+ //# sourceMappingURL=Visitor-BG-9-3HU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Visitor-BG-9-3HU.js","sources":["../src/components/LockedAttachment/components/Visitor.tsx"],"sourcesContent":["import {\n CheckCircleIcon,\n DownloadSimpleIcon,\n LockOpenIcon,\n LockSimpleIcon,\n} from '@phosphor-icons/react'\nimport React, { useEffect, useState } from 'react'\n\nimport { isDevBuild } from '../../../utils/isDevBuild'\nimport type {\n LockedAttachmentBaseProps,\n LockedAttachmentSource,\n PaymentStatus,\n} from '../types'\nimport { renderTypeIcon } from '../utils/icons'\nimport { getSourceType } from '../utils/mimeType'\n\nimport MediaPlayer from './MediaPlayer'\n\nexport interface VisitorCardProps extends LockedAttachmentBaseProps {\n title?: string\n /**\n * Called when the visitor clicks Unlock. Return the resolved source URL.\n * The component manages loading state and sets source internally on resolution.\n * Omit to hide the Unlock button.\n */\n onUnlock?: () => Promise<LockedAttachmentSource>\n /** Called when the visitor clicks Download on an unlocked card. */\n onDownload?: () => void\n}\n\nconst getLockIcon = (paymentStatus?: PaymentStatus): React.ElementType =>\n paymentStatus === 'paid' ? LockOpenIcon : LockSimpleIcon\n\n// ─── Shared primitives ────────────────────────────────────────────────────────\n\ninterface LockOverlayProps {\n icon: React.ElementType\n}\n\nconst LockOverlay: React.FC<LockOverlayProps> = (props) => {\n const { icon: Icon } = props\n return (\n <div className=\"absolute inset-0 bg-black/30\">\n <div className=\"absolute left-3 top-3 flex size-8 items-center justify-center rounded-full bg-black/60\">\n <Icon className=\"size-4 text-white\" weight=\"fill\" />\n </div>\n </div>\n )\n}\n\ninterface LockedPreviewProps {\n thumbnail?: string\n mimeType: string\n LockIcon: React.ElementType\n}\n\nconst LockedPreview: React.FC<LockedPreviewProps> = (props) => {\n const { thumbnail, mimeType, LockIcon } = props\n return (\n <div className=\"relative aspect-video overflow-hidden bg-black/5\">\n {thumbnail ? (\n <img\n src={thumbnail}\n alt=\"\"\n className=\"absolute inset-0 h-full w-full object-cover\"\n />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n {renderTypeIcon(mimeType, {\n className: 'size-12 text-black/20',\n weight: 'regular',\n })}\n </div>\n )}\n <LockOverlay icon={LockIcon} />\n </div>\n )\n}\n\n// ─── Per-type preview components ─────────────────────────────────────────────\n\ninterface ImagePreviewProps {\n source?: string\n thumbnail?: string\n mimeType: string\n title?: string\n paymentStatus?: PaymentStatus\n isLocked: boolean\n}\n\nconst ImagePreview: React.FC<ImagePreviewProps> = (props) => {\n const { source, thumbnail, mimeType, title, paymentStatus, isLocked } = props\n const [sourceReady, setSourceReady] = useState(false)\n\n useEffect(() => {\n setSourceReady(false)\n }, [source])\n\n if (isLocked) {\n return (\n <LockedPreview\n thumbnail={thumbnail}\n mimeType={mimeType}\n LockIcon={getLockIcon(paymentStatus)}\n />\n )\n }\n\n return (\n <div className=\"relative overflow-hidden bg-black/5\">\n <img\n src={source}\n alt={title}\n className={`block w-full transition-opacity duration-300 ${sourceReady ? 'opacity-100' : 'opacity-0'}`}\n onLoad={() => setSourceReady(true)}\n />\n </div>\n )\n}\n\ninterface DocumentPreviewProps {\n thumbnail?: string\n mimeType: string\n paymentStatus?: PaymentStatus\n isLocked: boolean\n}\n\nconst DocumentPreview: React.FC<DocumentPreviewProps> = (props) => {\n const { thumbnail, mimeType, paymentStatus, isLocked } = props\n return (\n <div className=\"relative aspect-video overflow-hidden bg-black/5\">\n {thumbnail ? (\n <img\n src={thumbnail}\n alt=\"\"\n className=\"absolute inset-0 h-full w-full object-cover\"\n />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n {renderTypeIcon(mimeType, {\n className: 'size-12 text-black/20',\n weight: 'regular',\n })}\n </div>\n )}\n {isLocked && <LockOverlay icon={getLockIcon(paymentStatus)} />}\n </div>\n )\n}\n\ninterface MediaPreviewProps {\n source?: string\n thumbnail?: string\n mimeType: string\n paymentStatus?: PaymentStatus\n isLocked: boolean\n}\n\nconst MediaPreview: React.FC<MediaPreviewProps> = (props) => {\n const { source, thumbnail, mimeType, paymentStatus, isLocked } = props\n if (isLocked) {\n return (\n <LockedPreview\n thumbnail={thumbnail}\n mimeType={mimeType}\n LockIcon={getLockIcon(paymentStatus)}\n />\n )\n }\n return <MediaPlayer source={source!} mimeType={mimeType} poster={thumbnail} />\n}\n\n// ─── Actions ─────────────────────────────────────────────────────────────────\n\ninterface CardActionsProps {\n isLocked: boolean\n loading: boolean\n paymentStatus?: PaymentStatus\n source?: string\n onUnlock?: () => void\n onDownload?: () => void\n}\n\nconst CardActions: React.FC<CardActionsProps> = (props) => {\n const { isLocked, loading, paymentStatus, source, onUnlock, onDownload } =\n props\n const LockIcon = getLockIcon(paymentStatus)\n\n if (isLocked && onUnlock) {\n return (\n <button\n type=\"button\"\n onClick={onUnlock}\n disabled={loading}\n className=\"mt-3 inline-flex h-10 w-full items-center justify-center gap-2 rounded-full bg-[#121110] px-4 text-sm font-medium leading-none text-white disabled:opacity-70\"\n >\n {loading ? (\n <span className=\"flex items-center gap-1\">\n <span className=\"size-1 rounded-full bg-white animate-bounce [animation-delay:-0.3s]\" />\n <span className=\"size-1 rounded-full bg-white animate-bounce [animation-delay:-0.15s]\" />\n <span className=\"size-1 rounded-full bg-white animate-bounce\" />\n </span>\n ) : (\n <>\n {paymentStatus === 'paid' ? (\n <LockOpenIcon className=\"size-4\" weight=\"fill\" />\n ) : (\n <LockIcon className=\"size-4\" weight=\"fill\" />\n )}\n {paymentStatus === 'paid' ? 'Open' : 'Unlock'}\n </>\n )}\n </button>\n )\n }\n\n if (!isLocked && onDownload && source) {\n return (\n <a\n href={source}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={onDownload}\n className=\"mt-3 inline-flex h-10 w-full items-center justify-center gap-2 rounded-full bg-[#121110] px-4 text-sm font-medium leading-none !text-white\"\n >\n <DownloadSimpleIcon className=\"size-4\" weight=\"bold\" />\n Download\n </a>\n )\n }\n\n return null\n}\n\n// ─── Card shell ───────────────────────────────────────────────────────────────\n\nconst VisitorCard: React.FC<VisitorCardProps> = (props) => {\n const {\n title,\n amountText,\n thumbnail,\n source: sourceProp,\n mimeType = 'application/octet-stream',\n detail,\n onUnlock,\n onDownload,\n paymentStatus,\n } = props\n const [source, setSource] = useState(sourceProp)\n const [loading, setLoading] = useState(false)\n\n useEffect(() => {\n if (sourceProp !== undefined) setSource(sourceProp)\n }, [sourceProp])\n\n const isLocked = source === undefined\n const sourceType = getSourceType(mimeType)\n\n const handleUnlock = async () => {\n if (!onUnlock) return\n setLoading(true)\n try {\n const result = await onUnlock()\n setSource(result.source)\n } catch (err) {\n if (isDevBuild()) console.debug('[LockedAttachment] onUnlock failed', err)\n } finally {\n setLoading(false)\n }\n }\n\n let mediaPreview: React.ReactNode\n if (sourceType === 'image') {\n mediaPreview = (\n <ImagePreview\n source={source}\n thumbnail={thumbnail}\n mimeType={mimeType}\n title={title}\n paymentStatus={paymentStatus}\n isLocked={isLocked}\n />\n )\n } else if (sourceType === 'document') {\n mediaPreview = (\n <DocumentPreview\n thumbnail={thumbnail}\n mimeType={mimeType}\n paymentStatus={paymentStatus}\n isLocked={isLocked}\n />\n )\n } else {\n mediaPreview = (\n <MediaPreview\n source={source}\n thumbnail={thumbnail}\n mimeType={mimeType}\n paymentStatus={paymentStatus}\n isLocked={isLocked}\n />\n )\n }\n\n return (\n <div className=\"w-[280px] select-none overflow-hidden rounded-3xl bg-white shadow-card\">\n {mediaPreview}\n <div className=\"px-4 pb-3 pt-3\">\n <p className=\"mb-1.5 truncate text-base font-medium text-black\">\n {title}\n </p>\n <div className=\"flex items-center gap-1\">\n {renderTypeIcon(mimeType, {\n className: 'size-5 shrink-0 text-black/55',\n weight: 'regular',\n })}\n {detail && (\n <span className=\"text-xs font-medium text-black/55\">{detail}</span>\n )}\n {paymentStatus === 'paid' ? (\n <>\n <span className=\"text-xs font-medium text-black/55\">•</span>\n <span className=\"text-xs font-medium text-[#008236]\">\n Purchased\n </span>\n <CheckCircleIcon\n className=\"size-4 text-[#008236]\"\n weight=\"bold\"\n />\n </>\n ) : (\n amountText && (\n <>\n <span className=\"text-xs font-medium text-black/55\">•</span>\n <span className=\"text-xs font-medium text-black/55\">\n {amountText}\n </span>\n </>\n )\n )}\n </div>\n <CardActions\n isLocked={isLocked}\n loading={loading}\n paymentStatus={paymentStatus}\n source={source}\n onUnlock={onUnlock ? handleUnlock : undefined}\n onDownload={onDownload}\n />\n </div>\n </div>\n )\n}\n\nexport default VisitorCard\n"],"names":["getLockIcon","paymentStatus","LockOpenIcon","LockSimpleIcon","LockOverlay","props","Icon","jsx","LockedPreview","thumbnail","mimeType","LockIcon","jsxs","ImagePreview","source","title","isLocked","sourceReady","setSourceReady","useState","useEffect","DocumentPreview","MediaPreview","MediaPlayer","CardActions","loading","onUnlock","onDownload","Fragment","DownloadSimpleIcon","VisitorCard","amountText","sourceProp","detail","setSource","setLoading","sourceType","getSourceType","handleUnlock","result","mediaPreview","renderTypeIcon","CheckCircleIcon"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -231,8 +231,11 @@ export declare interface ChannelViewProps {
231
231
 
232
232
  declare interface CreatorCardProps extends LockedAttachmentBaseProps {
233
233
  title?: string;
234
+ /** When true, shows interactive media preview (composing state). When false/omitted, shows static thumbnail (sent/sold state). */
235
+ isPreview?: boolean;
234
236
  placeholderTitle?: string;
235
237
  placeholderAmountText?: string;
238
+ onDismiss?: () => void;
236
239
  }
237
240
 
238
241
  declare type DmAgentSystemType = 'SYSTEM_DM_AGENT_PAUSED' | 'SYSTEM_DM_AGENT_RESUMED';
@@ -276,11 +279,10 @@ export declare const LockedAttachment: (props: LockedAttachmentProps) => JSX_2.E
276
279
 
277
280
  /** Shared fields for creator and visitor locked-attachment cards (internal). */
278
281
  declare interface LockedAttachmentBaseProps {
282
+ title?: string;
279
283
  mimeType?: string;
280
- /** Blurred preview image shown in the locked/collapsed state. */
284
+ /** Preview image. Video/image: pass blurred version. Audio/document: pass unblurred version. */
281
285
  thumbnail?: string;
282
- /** Clean poster image passed to the media player. Falls back to thumbnail. */
283
- poster?: string;
284
286
  /** Unlocked media URL. Undefined while locked or pending unlock. */
285
287
  source?: string;
286
288
  detail?: string;
@@ -296,7 +298,6 @@ export declare type LockedAttachmentProps = ({
296
298
 
297
299
  export declare interface LockedAttachmentSource {
298
300
  source: string;
299
- poster?: string;
300
301
  }
301
302
 
302
303
  declare type MessageCustomType = 'MESSAGE_TIP' | 'MESSAGE_PAID' | 'MESSAGE_CHATBOT' | 'MESSAGE_ATTACHMENT' | AgeSafetySystemType | DmAgentSystemType;
@@ -524,8 +525,8 @@ export declare const useParticipants: (participantSource: ParticipantSource, opt
524
525
  declare interface VisitorCardProps extends LockedAttachmentBaseProps {
525
526
  title?: string;
526
527
  /**
527
- * Called when the visitor clicks Unlock. Return the resolved source and optional poster.
528
- * The component manages loading state and sets source/poster internally on resolution.
528
+ * Called when the visitor clicks Unlock. Return the resolved source URL.
529
+ * The component manages loading state and sets source internally on resolution.
529
530
  * Omit to hide the Unlock button.
530
531
  */
531
532
  onUnlock?: () => Promise<LockedAttachmentSource>;
package/dist/index.js CHANGED
@@ -821,7 +821,7 @@ function ps(t) {
821
821
  }, [s, n == null ? void 0 : n.userID, t.id, r]);
822
822
  return { selected: r, voteUp: l, voteDown: d };
823
823
  }
824
- const ys = F.lazy(() => import("./Creator-B6M8dB0U.js")), vs = F.lazy(() => import("./Visitor-CpmFZRGO.js")), Ze = () => /* @__PURE__ */ e(
824
+ const ys = F.lazy(() => import("./Creator-D38dWn2X.js")), vs = F.lazy(() => import("./Visitor-BG-9-3HU.js")), Ze = () => /* @__PURE__ */ e(
825
825
  "div",
826
826
  {
827
827
  className: "w-[280px] min-h-[200px] animate-pulse rounded-3xl bg-black/[0.06] shadow-[0px_0px_0px_1px_rgba(0,0,0,0.04),0px_1px_2px_0px_rgba(0,0,0,0.04)]",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@linktr.ee/messaging-react",
3
- "version": "1.27.0",
3
+ "version": "1.28.0-rc-1776225927",
4
4
  "description": "React messaging components built on messaging-core for web applications",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -137,7 +137,7 @@ const TemplateInner: React.FC<{
137
137
  const MessageComponent = React.useMemo(() => {
138
138
  const handleAttachmentUnlock = async () => {
139
139
  await new Promise((resolve) => setTimeout(resolve, 1000))
140
- return { source: '/video-source.mp4', poster: '/video-thumbnail.jpg' }
140
+ return { source: '/video-source.mp4' }
141
141
  }
142
142
 
143
143
  const handleAttachmentDownload = (m: LocalMessage) => {