@linktr.ee/messaging-react 1.35.0 → 1.36.0-rc-1777522205

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.
@@ -1,7 +1,7 @@
1
1
  import { jsx as e, jsxs as i } from "react/jsx-runtime";
2
2
  import { LockSimpleIcon as k, DownloadSimpleIcon as U, LockOpenIcon as L, CheckCircleIcon as D } from "@phosphor-icons/react";
3
3
  import v, { useState as y, useRef as g, useCallback as N, useEffect as M } from "react";
4
- import { g as O, M as P, r as j } from "./index-BsSqs61X.js";
4
+ import { g as O, M as P, r as j } from "./index-DOsC03ZN.js";
5
5
  const A = (d) => {
6
6
  const {
7
7
  isUnlocking: n = !1,
@@ -164,4 +164,4 @@ const A = (d) => {
164
164
  export {
165
165
  $ as default
166
166
  };
167
- //# sourceMappingURL=Card-DVzWMbDc.js.map
167
+ //# sourceMappingURL=Card-BHrnmHeu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Card-DVzWMbDc.js","sources":["../src/components/LockedAttachment/components/Visitor/CardActions.tsx","../src/components/LockedAttachment/components/Visitor/CardThumbnail.tsx","../src/components/LockedAttachment/components/Visitor/Card.tsx"],"sourcesContent":["import { DownloadSimpleIcon, LockSimpleIcon } from '@phosphor-icons/react'\nimport React from 'react'\n\ninterface CardActionsProps {\n sourceUrl?: string\n redeemUrl?: string\n onUnlockClicked?: () => void\n onDownloadClicked?: () => void\n isUnlocking?: boolean\n}\n\nconst CardActions: React.FC<CardActionsProps> = (props) => {\n const {\n isUnlocking = false,\n sourceUrl,\n redeemUrl,\n onUnlockClicked,\n onDownloadClicked,\n } = props\n\n const isLocked = sourceUrl === undefined\n\n if (isLocked && onUnlockClicked != null) {\n return (\n <button\n type=\"button\"\n onClick={onUnlockClicked}\n disabled={isUnlocking}\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 hover:bg-[#2a2928] disabled:opacity-70\"\n >\n {isUnlocking ? (\n <span className=\"size-4 animate-spin rounded-full border-2 border-white/30 border-t-white\" />\n ) : (\n <React.Fragment>\n <LockSimpleIcon className=\"size-4\" weight=\"fill\" />\n Unlock\n </React.Fragment>\n )}\n </button>\n )\n }\n\n if (!isLocked && onDownloadClicked != null && sourceUrl != null) {\n return (\n <a\n href={redeemUrl ?? sourceUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={onDownloadClicked}\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 hover:bg-[#2a2928]\"\n >\n <DownloadSimpleIcon className=\"size-4\" weight=\"bold\" />\n Download\n </a>\n )\n }\n\n return null\n}\n\n\nexport default CardActions\n","import { LockOpenIcon, LockSimpleIcon } from '@phosphor-icons/react'\nimport React, { useState } from 'react'\n\nimport { PaymentStatus } from '../../types'\nimport { renderTypeIcon } from '../../utils/icons'\nimport { getSourceType } from '../../utils/mimeType'\nimport MediaPlayer from '../MediaPlayer'\n\ninterface CardThumbnailProps {\n title?: string\n sourceUrl?: string\n thumbnailUrl?: string\n mimeType: string\n paymentStatus?: PaymentStatus\n}\n\nconst CardThumbnail: React.FC<CardThumbnailProps> = ({\n title,\n sourceUrl,\n thumbnailUrl,\n mimeType,\n paymentStatus,\n}) => {\n const [sourceReady, setSourceReady] = useState(false)\n\n const isLocked = sourceUrl === undefined\n const sourceType = getSourceType(mimeType)\n\n if (!isLocked) {\n if (sourceType === 'audio' || sourceType === 'video') {\n return (\n <MediaPlayer\n source={sourceUrl}\n poster={thumbnailUrl}\n mimeType={mimeType}\n />\n )\n }\n\n return (\n <div className=\"relative aspect-video overflow-hidden bg-black/5\">\n <img\n src={sourceType === 'document' ? thumbnailUrl : sourceUrl}\n alt={title}\n className={`absolute inset-0 h-full w-full object-contain transition-opacity duration-300 ${sourceReady ? 'opacity-100' : 'opacity-0'}`}\n draggable={false}\n onLoad={() => setSourceReady(true)}\n />\n </div>\n )\n }\n\n return (\n <div className=\"relative aspect-video overflow-hidden bg-black/5\">\n {thumbnailUrl != null ? (\n <img\n src={thumbnailUrl}\n alt=\"\"\n className=\"absolute inset-0 h-full w-full object-cover\"\n draggable={false}\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 && (\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 text-white\">\n {paymentStatus === 'paid' ? <LockOpenIcon /> : <LockSimpleIcon />}\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport default CardThumbnail\n","import { CheckCircleIcon } from '@phosphor-icons/react'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport type {\n LockedAttachmentBaseProps,\n LockedAttachmentSource,\n} from '../../types'\nimport { renderTypeIcon } from '../../utils/icons'\n\nimport CardActions from './CardActions'\nimport CardThumbnail from './CardThumbnail'\n\nexport interface VisitorCardProps extends LockedAttachmentBaseProps {\n /**\n * Called when the visitor clicks Unlock on an unpaid attachment.\n * Use this to open a checkout flow. Omit to hide the Unlock button.\n */\n onUnlockClick?: () => void\n /**\n * Called to fetch the attachment source — fired automatically when\n * paymentStatus transitions to 'paid', or immediately on click when\n * paymentStatus is already 'paid'. Return a LockedAttachmentSource to\n * unlock the card.\n */\n onFetchSource?: () => Promise<LockedAttachmentSource | void>\n /**\n * Called when the visitor clicks Download on an unlocked card.\n * Omit to hide the Download button.\n */\n onDownloadClick?: () => void\n /**\n * When true, shows loading dots on the Unlock button.\n * Driven by the LockedAttachmentContext (e.g. checkout in progress, payment processing).\n */\n isUnlocking?: boolean\n}\n\nconst VisitorCard: React.FC<VisitorCardProps> = ({\n title,\n amountText,\n thumbnailUrl,\n mimeType = 'application/octet-stream',\n detail,\n onUnlockClick,\n onFetchSource,\n onDownloadClick,\n paymentStatus,\n isUnlocking = false,\n}) => {\n const [source, setSource] = useState<LockedAttachmentSource | undefined>()\n\n const cardRef = useRef<HTMLDivElement>(null)\n const fetchingRef = useRef(false)\n\n const onFetchSourceRef = useRef(onFetchSource)\n onFetchSourceRef.current = onFetchSource\n\n const effectiveSourceUrl = source?.sourceUrl\n const effectiveThumbnail = source?.thumbnailUrl ?? thumbnailUrl\n const effectiveRedeemUrl = source?.redeemUrl\n\n const fetchSource = useCallback(async (): Promise<void> => {\n if (fetchingRef.current) return\n fetchingRef.current = true\n try {\n const result = await onFetchSourceRef.current?.()\n if (result) setSource(result)\n } finally {\n fetchingRef.current = false\n }\n }, [])\n\n const handleUnlockClick = useCallback(() => {\n if (paymentStatus === 'paid') {\n void fetchSource()\n } else {\n onUnlockClick?.()\n }\n }, [paymentStatus, fetchSource, onUnlockClick])\n\n // Fetch source when card is in viewport\n useEffect(() => {\n if (!cardRef.current) return\n if (paymentStatus !== 'paid' || source !== undefined) return\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n void fetchSource()\n observer.disconnect()\n }\n },\n { threshold: 1.0 }\n )\n\n observer.observe(cardRef.current)\n return () => observer.disconnect()\n }, [paymentStatus, source, fetchSource])\n\n return (\n <div\n ref={cardRef}\n data-testid=\"locked-attachment\"\n className=\"w-[280px] select-none overflow-hidden rounded-[24px] bg-white shadow-[0_0_0_1px_rgba(0,0,0,0.04),0_4px_8px_rgba(0,0,0,0.06)]\"\n >\n <CardThumbnail\n title={title}\n sourceUrl={effectiveSourceUrl}\n thumbnailUrl={effectiveThumbnail}\n mimeType={mimeType}\n paymentStatus={paymentStatus}\n />\n\n <div className=\"px-4 pb-3 pt-3\">\n <p className=\"mb-0.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\n {detail && (\n <span className=\"text-xs font-medium text-black/55\">{detail}</span>\n )}\n\n {paymentStatus === 'paid' ? (\n <React.Fragment>\n <span className=\"text-xs font-medium text-black/55\">&bull;</span>\n <span className=\"text-xs font-medium text-[#008236]\">Purchased</span>\n <CheckCircleIcon className=\"size-4 text-[#008236]\" weight=\"bold\" />\n </React.Fragment>\n ) : amountText != null ? (\n <React.Fragment>\n <span className=\"text-xs font-medium text-black/55\">&bull;</span>\n <span className=\"text-xs font-medium text-black/55\">{amountText}</span>\n </React.Fragment>\n ) : null}\n </div>\n\n <CardActions\n isUnlocking={isUnlocking}\n sourceUrl={effectiveSourceUrl}\n redeemUrl={effectiveRedeemUrl}\n onUnlockClicked={handleUnlockClick}\n onDownloadClicked={onDownloadClick}\n />\n </div>\n </div>\n )\n}\n\nexport default VisitorCard\n"],"names":["CardActions","props","isUnlocking","sourceUrl","redeemUrl","onUnlockClicked","onDownloadClicked","isLocked","jsx","jsxs","React","LockSimpleIcon","DownloadSimpleIcon","CardThumbnail","title","thumbnailUrl","mimeType","paymentStatus","sourceReady","setSourceReady","useState","sourceType","getSourceType","LockOpenIcon","MediaPlayer","VisitorCard","amountText","detail","onUnlockClick","onFetchSource","onDownloadClick","source","setSource","cardRef","useRef","fetchingRef","onFetchSourceRef","effectiveSourceUrl","effectiveThumbnail","effectiveRedeemUrl","fetchSource","useCallback","result","_a","handleUnlockClick","useEffect","observer","entry","renderTypeIcon","CheckCircleIcon"],"mappings":"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"}
1
+ {"version":3,"file":"Card-BHrnmHeu.js","sources":["../src/components/LockedAttachment/components/Visitor/CardActions.tsx","../src/components/LockedAttachment/components/Visitor/CardThumbnail.tsx","../src/components/LockedAttachment/components/Visitor/Card.tsx"],"sourcesContent":["import { DownloadSimpleIcon, LockSimpleIcon } from '@phosphor-icons/react'\nimport React from 'react'\n\ninterface CardActionsProps {\n sourceUrl?: string\n redeemUrl?: string\n onUnlockClicked?: () => void\n onDownloadClicked?: () => void\n isUnlocking?: boolean\n}\n\nconst CardActions: React.FC<CardActionsProps> = (props) => {\n const {\n isUnlocking = false,\n sourceUrl,\n redeemUrl,\n onUnlockClicked,\n onDownloadClicked,\n } = props\n\n const isLocked = sourceUrl === undefined\n\n if (isLocked && onUnlockClicked != null) {\n return (\n <button\n type=\"button\"\n onClick={onUnlockClicked}\n disabled={isUnlocking}\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 hover:bg-[#2a2928] disabled:opacity-70\"\n >\n {isUnlocking ? (\n <span className=\"size-4 animate-spin rounded-full border-2 border-white/30 border-t-white\" />\n ) : (\n <React.Fragment>\n <LockSimpleIcon className=\"size-4\" weight=\"fill\" />\n Unlock\n </React.Fragment>\n )}\n </button>\n )\n }\n\n if (!isLocked && onDownloadClicked != null && sourceUrl != null) {\n return (\n <a\n href={redeemUrl ?? sourceUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={onDownloadClicked}\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 hover:bg-[#2a2928]\"\n >\n <DownloadSimpleIcon className=\"size-4\" weight=\"bold\" />\n Download\n </a>\n )\n }\n\n return null\n}\n\n\nexport default CardActions\n","import { LockOpenIcon, LockSimpleIcon } from '@phosphor-icons/react'\nimport React, { useState } from 'react'\n\nimport { PaymentStatus } from '../../types'\nimport { renderTypeIcon } from '../../utils/icons'\nimport { getSourceType } from '../../utils/mimeType'\nimport MediaPlayer from '../MediaPlayer'\n\ninterface CardThumbnailProps {\n title?: string\n sourceUrl?: string\n thumbnailUrl?: string\n mimeType: string\n paymentStatus?: PaymentStatus\n}\n\nconst CardThumbnail: React.FC<CardThumbnailProps> = ({\n title,\n sourceUrl,\n thumbnailUrl,\n mimeType,\n paymentStatus,\n}) => {\n const [sourceReady, setSourceReady] = useState(false)\n\n const isLocked = sourceUrl === undefined\n const sourceType = getSourceType(mimeType)\n\n if (!isLocked) {\n if (sourceType === 'audio' || sourceType === 'video') {\n return (\n <MediaPlayer\n source={sourceUrl}\n poster={thumbnailUrl}\n mimeType={mimeType}\n />\n )\n }\n\n return (\n <div className=\"relative aspect-video overflow-hidden bg-black/5\">\n <img\n src={sourceType === 'document' ? thumbnailUrl : sourceUrl}\n alt={title}\n className={`absolute inset-0 h-full w-full object-contain transition-opacity duration-300 ${sourceReady ? 'opacity-100' : 'opacity-0'}`}\n draggable={false}\n onLoad={() => setSourceReady(true)}\n />\n </div>\n )\n }\n\n return (\n <div className=\"relative aspect-video overflow-hidden bg-black/5\">\n {thumbnailUrl != null ? (\n <img\n src={thumbnailUrl}\n alt=\"\"\n className=\"absolute inset-0 h-full w-full object-cover\"\n draggable={false}\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 && (\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 text-white\">\n {paymentStatus === 'paid' ? <LockOpenIcon /> : <LockSimpleIcon />}\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport default CardThumbnail\n","import { CheckCircleIcon } from '@phosphor-icons/react'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport type {\n LockedAttachmentBaseProps,\n LockedAttachmentSource,\n} from '../../types'\nimport { renderTypeIcon } from '../../utils/icons'\n\nimport CardActions from './CardActions'\nimport CardThumbnail from './CardThumbnail'\n\nexport interface VisitorCardProps extends LockedAttachmentBaseProps {\n /**\n * Called when the visitor clicks Unlock on an unpaid attachment.\n * Use this to open a checkout flow. Omit to hide the Unlock button.\n */\n onUnlockClick?: () => void\n /**\n * Called to fetch the attachment source — fired automatically when\n * paymentStatus transitions to 'paid', or immediately on click when\n * paymentStatus is already 'paid'. Return a LockedAttachmentSource to\n * unlock the card.\n */\n onFetchSource?: () => Promise<LockedAttachmentSource | void>\n /**\n * Called when the visitor clicks Download on an unlocked card.\n * Omit to hide the Download button.\n */\n onDownloadClick?: () => void\n /**\n * When true, shows loading dots on the Unlock button.\n * Driven by the LockedAttachmentContext (e.g. checkout in progress, payment processing).\n */\n isUnlocking?: boolean\n}\n\nconst VisitorCard: React.FC<VisitorCardProps> = ({\n title,\n amountText,\n thumbnailUrl,\n mimeType = 'application/octet-stream',\n detail,\n onUnlockClick,\n onFetchSource,\n onDownloadClick,\n paymentStatus,\n isUnlocking = false,\n}) => {\n const [source, setSource] = useState<LockedAttachmentSource | undefined>()\n\n const cardRef = useRef<HTMLDivElement>(null)\n const fetchingRef = useRef(false)\n\n const onFetchSourceRef = useRef(onFetchSource)\n onFetchSourceRef.current = onFetchSource\n\n const effectiveSourceUrl = source?.sourceUrl\n const effectiveThumbnail = source?.thumbnailUrl ?? thumbnailUrl\n const effectiveRedeemUrl = source?.redeemUrl\n\n const fetchSource = useCallback(async (): Promise<void> => {\n if (fetchingRef.current) return\n fetchingRef.current = true\n try {\n const result = await onFetchSourceRef.current?.()\n if (result) setSource(result)\n } finally {\n fetchingRef.current = false\n }\n }, [])\n\n const handleUnlockClick = useCallback(() => {\n if (paymentStatus === 'paid') {\n void fetchSource()\n } else {\n onUnlockClick?.()\n }\n }, [paymentStatus, fetchSource, onUnlockClick])\n\n // Fetch source when card is in viewport\n useEffect(() => {\n if (!cardRef.current) return\n if (paymentStatus !== 'paid' || source !== undefined) return\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n void fetchSource()\n observer.disconnect()\n }\n },\n { threshold: 1.0 }\n )\n\n observer.observe(cardRef.current)\n return () => observer.disconnect()\n }, [paymentStatus, source, fetchSource])\n\n return (\n <div\n ref={cardRef}\n data-testid=\"locked-attachment\"\n className=\"w-[280px] select-none overflow-hidden rounded-[24px] bg-white shadow-[0_0_0_1px_rgba(0,0,0,0.04),0_4px_8px_rgba(0,0,0,0.06)]\"\n >\n <CardThumbnail\n title={title}\n sourceUrl={effectiveSourceUrl}\n thumbnailUrl={effectiveThumbnail}\n mimeType={mimeType}\n paymentStatus={paymentStatus}\n />\n\n <div className=\"px-4 pb-3 pt-3\">\n <p className=\"mb-0.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\n {detail && (\n <span className=\"text-xs font-medium text-black/55\">{detail}</span>\n )}\n\n {paymentStatus === 'paid' ? (\n <React.Fragment>\n <span className=\"text-xs font-medium text-black/55\">&bull;</span>\n <span className=\"text-xs font-medium text-[#008236]\">Purchased</span>\n <CheckCircleIcon className=\"size-4 text-[#008236]\" weight=\"bold\" />\n </React.Fragment>\n ) : amountText != null ? (\n <React.Fragment>\n <span className=\"text-xs font-medium text-black/55\">&bull;</span>\n <span className=\"text-xs font-medium text-black/55\">{amountText}</span>\n </React.Fragment>\n ) : null}\n </div>\n\n <CardActions\n isUnlocking={isUnlocking}\n sourceUrl={effectiveSourceUrl}\n redeemUrl={effectiveRedeemUrl}\n onUnlockClicked={handleUnlockClick}\n onDownloadClicked={onDownloadClick}\n />\n </div>\n </div>\n )\n}\n\nexport default VisitorCard\n"],"names":["CardActions","props","isUnlocking","sourceUrl","redeemUrl","onUnlockClicked","onDownloadClicked","isLocked","jsx","jsxs","React","LockSimpleIcon","DownloadSimpleIcon","CardThumbnail","title","thumbnailUrl","mimeType","paymentStatus","sourceReady","setSourceReady","useState","sourceType","getSourceType","LockOpenIcon","MediaPlayer","VisitorCard","amountText","detail","onUnlockClick","onFetchSource","onDownloadClick","source","setSource","cardRef","useRef","fetchingRef","onFetchSourceRef","effectiveSourceUrl","effectiveThumbnail","effectiveRedeemUrl","fetchSource","useCallback","result","_a","handleUnlockClick","useEffect","observer","entry","renderTypeIcon","CheckCircleIcon"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsxs as n, jsx as e } from "react/jsx-runtime";
2
2
  import { CheckCircleIcon as M, XIcon as R, EyeIcon as S, EyeSlashIcon as E, LockOpenIcon as V, LockIcon as A } from "@phosphor-icons/react";
3
3
  import p from "classnames";
4
4
  import y, { useState as b, useRef as B, useCallback as O } from "react";
5
- import { r as z, g as X, M as q } from "./index-BsSqs61X.js";
5
+ import { r as z, g as X, M as q } from "./index-DOsC03ZN.js";
6
6
  const D = ({
7
7
  title: s,
8
8
  sourceUrl: i,
@@ -192,4 +192,4 @@ const D = ({
192
192
  export {
193
193
  Z as default
194
194
  };
195
- //# sourceMappingURL=Card-lN2Z0Z5p.js.map
195
+ //# sourceMappingURL=Card-D4vEgqWt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Card-lN2Z0Z5p.js","sources":["../src/components/LockedAttachment/components/Creator/CardThumbnail.tsx","../src/components/LockedAttachment/components/Creator/Card.tsx"],"sourcesContent":["import classNames from 'classnames'\nimport React from 'react'\n\nimport { renderTypeIcon } from '../../utils/icons'\nimport { getSourceType } from '../../utils/mimeType'\nimport MediaPlayer from '../MediaPlayer'\n\ninterface CardThumbnailProps {\n title?: string\n sourceUrl?: string\n thumbnailUrl?: string\n mimeType: string\n onToggle?: () => void\n}\n\nconst CardThumbnail: React.FC<CardThumbnailProps> = ({\n title,\n sourceUrl,\n thumbnailUrl,\n mimeType,\n onToggle,\n}) => {\n const isExpanded = onToggle && sourceUrl && thumbnailUrl\n\n return (\n <button\n type=\"button\"\n disabled={!onToggle}\n className={classNames(\n 'relative block w-full overflow-hidden border-0 bg-white/10 p-0 text-left appearance-none',\n { 'cursor-pointer': !!onToggle, 'cursor-default': !onToggle }\n )}\n onClick={onToggle}\n aria-label={onToggle ? 'Toggle preview' : undefined}\n >\n {isExpanded ? (\n <ThumbnailMedia\n sourceUrl={sourceUrl}\n thumbnailUrl={thumbnailUrl}\n mimeType={mimeType}\n />\n ) : thumbnailUrl ? (\n <div className=\"aspect-video overflow-hidden\">\n <img\n src={thumbnailUrl}\n alt={title}\n draggable={false}\n className=\"absolute inset-0 h-full w-full object-cover\"\n />\n </div>\n ) : (\n <div className=\"aspect-video flex items-center justify-center\">\n {renderTypeIcon(mimeType, {\n className: 'size-12 text-white/20',\n weight: 'regular',\n })}\n </div>\n )}\n\n {!isExpanded && (\n <div className=\"pointer-events-none absolute inset-0 bg-black/30\" />\n )}\n </button>\n )\n}\n\ninterface ThumbnailMediaProps {\n sourceUrl: string\n thumbnailUrl: string\n mimeType: string\n}\n\nconst ThumbnailMedia: React.FC<ThumbnailMediaProps> = ({\n sourceUrl,\n thumbnailUrl,\n mimeType,\n}) => {\n const sourceType = getSourceType(mimeType)\n\n if (sourceType === 'video' || sourceType === 'audio') {\n return (\n <MediaPlayer\n mimeType={mimeType}\n source={sourceUrl}\n poster={thumbnailUrl}\n autoPlay={true}\n loop={true}\n controls={true}\n muted={false}\n />\n )\n }\n\n if (sourceType === 'image') {\n return (\n <img src={sourceUrl} alt=\"\" className=\"block w-full\" draggable={false} />\n )\n }\n\n if (sourceType === 'document') {\n return (\n <img\n src={thumbnailUrl}\n alt=\"\"\n className=\"block w-full\"\n draggable={false}\n />\n )\n }\n\n return null\n}\n\nexport default CardThumbnail\n","import {\n CheckCircleIcon,\n EyeIcon,\n EyeSlashIcon,\n LockIcon,\n LockOpenIcon,\n XIcon,\n} from '@phosphor-icons/react'\nimport classNames from 'classnames'\nimport React, { useCallback, useRef, useState } from 'react'\n\nimport type {\n LockedAttachmentBaseProps,\n LockedAttachmentSource,\n PaymentStatus,\n} from '../../types'\nimport { renderTypeIcon } from '../../utils/icons'\n\nimport CardThumbnail from './CardThumbnail'\n\nexport interface CreatorCardProps extends LockedAttachmentBaseProps {\n placeholderTitle?: string\n placeholderAmountText?: string\n isUnlocking?: boolean\n onDismiss?: () => void\n onPreviewClick?: () => void\n onFetchSource?: () => Promise<LockedAttachmentSource | void>\n}\n\nconst CreatorCard: React.FC<CreatorCardProps> = ({\n title,\n mimeType = 'application/octet-stream',\n thumbnailUrl,\n detail,\n amountText,\n placeholderTitle = 'Attachment title',\n placeholderAmountText,\n paymentStatus,\n isUnlocking,\n onDismiss,\n onPreviewClick,\n onFetchSource,\n}) => {\n const [source, setSource] = useState<LockedAttachmentSource | undefined>()\n const [isPreviewVisible, setIsPreviewVisible] = useState(false)\n const [isLoadingPreview, setLoadingPreview] = useState(false)\n const fetchingRef = useRef(false)\n\n const effectiveSourceUrl = isPreviewVisible ? source?.sourceUrl : undefined\n const effectiveThumbnailUrl = isPreviewVisible ? (source?.thumbnailUrl ?? thumbnailUrl) : thumbnailUrl\n const isBusy = isLoadingPreview || isUnlocking\n\n const handleToggle = useCallback(async () => {\n onPreviewClick?.()\n if (isPreviewVisible) {\n setIsPreviewVisible(false)\n return\n }\n if (source) {\n setIsPreviewVisible(true)\n return\n }\n if (!onFetchSource) return\n if (fetchingRef.current) return\n fetchingRef.current = true\n setLoadingPreview(true)\n try {\n const result = await onFetchSource()\n if (result) {\n setSource(result)\n setIsPreviewVisible(true)\n }\n } finally {\n fetchingRef.current = false\n setLoadingPreview(false)\n }\n }, [isPreviewVisible, source, onPreviewClick, onFetchSource])\n\n const toggleHandler = onFetchSource || onPreviewClick ? handleToggle : undefined\n\n return (\n <div className=\"relative w-[280px] select-none overflow-hidden rounded-[24px] bg-[#121110] shadow-[0_0_0_1px_rgba(0,0,0,0.04),0_4px_8px_rgba(0,0,0,0.06)]\">\n <CardHeader\n onDismiss={onDismiss}\n onToggle={isBusy ? undefined : toggleHandler}\n isExpanded={isPreviewVisible}\n paymentStatus={paymentStatus}\n isLoading={isBusy}\n />\n\n <CardThumbnail\n title={title}\n sourceUrl={effectiveSourceUrl}\n thumbnailUrl={effectiveThumbnailUrl}\n mimeType={mimeType}\n onToggle={isBusy ? undefined : toggleHandler}\n />\n\n <div className=\"px-4 pb-3 pt-3\">\n <p\n className={classNames('mb-0.5 truncate text-base font-medium', {\n 'text-white/30': !title,\n 'text-white': !!title,\n })}\n >\n {title || placeholderTitle}\n </p>\n\n <div className=\"flex items-center gap-1\">\n {renderTypeIcon(mimeType, {\n className: 'size-5 shrink-0 text-white/55',\n weight: 'regular',\n })}\n\n {detail && (\n <span className=\"text-xs font-medium text-white/55\">{detail}</span>\n )}\n\n {paymentStatus === 'paid' ? (\n <React.Fragment>\n <span className=\"text-xs font-medium text-white/55\">&bull;</span>\n <span className=\"text-xs font-medium text-[#34c759]\">Sold</span>\n <CheckCircleIcon className=\"size-4 text-[#34c759]\" weight=\"bold\" />\n </React.Fragment>\n ) : (\n <React.Fragment>\n <span className=\"text-xs font-medium text-white/55\">&bull;</span>\n <span\n className={classNames('text-xs font-medium', {\n 'text-white/30': !amountText,\n 'text-white/55': !!amountText,\n })}\n >\n {amountText || placeholderAmountText}\n </span>\n </React.Fragment>\n )}\n </div>\n </div>\n </div>\n )\n}\n\ninterface CardHeaderProps {\n onDismiss?: () => void\n onToggle?: () => void\n isExpanded?: boolean\n paymentStatus?: PaymentStatus\n isLoading?: boolean\n}\n\nconst CardHeader: React.FC<CardHeaderProps> = ({\n onDismiss,\n onToggle,\n isExpanded,\n paymentStatus,\n isLoading,\n}) => {\n if (onDismiss) {\n return (\n <button\n type=\"button\"\n onClick={onDismiss}\n className=\"absolute top-3 z-50 flex size-8 items-center justify-center rounded-full bg-black/60 text-white right-3\"\n aria-label=\"Dismiss attachment\"\n >\n <XIcon className=\"size-4\" weight=\"bold\" />\n </button>\n )\n }\n\n if (onToggle) {\n const Icon = isExpanded ? EyeIcon : EyeSlashIcon\n return (\n <button\n type=\"button\"\n onClick={onToggle}\n className=\"absolute top-3 z-50 flex size-8 items-center justify-center rounded-full bg-black/60 text-white left-3\"\n aria-label={isExpanded ? 'Hide preview' : 'Show preview'}\n aria-pressed={isExpanded}\n >\n <Icon className=\"size-4\" weight=\"fill\" />\n </button>\n )\n }\n\n const Icon = paymentStatus === 'paid' ? LockOpenIcon : LockIcon\n\n return (\n <div className=\"absolute top-3 z-50 flex size-8 items-center justify-center rounded-full bg-black/60 text-white left-3\">\n {isLoading ? (\n <span className=\"size-4 animate-spin rounded-full border-2 border-white/30 border-t-white\" />\n ) : (\n <Icon className=\"size-4\" weight=\"fill\" />\n )}\n </div>\n )\n}\n\nexport default CreatorCard\n"],"names":["CardThumbnail","title","sourceUrl","thumbnailUrl","mimeType","onToggle","isExpanded","jsxs","classNames","jsx","ThumbnailMedia","sourceType","getSourceType","MediaPlayer","CreatorCard","detail","amountText","placeholderTitle","placeholderAmountText","paymentStatus","isUnlocking","onDismiss","onPreviewClick","onFetchSource","source","setSource","useState","isPreviewVisible","setIsPreviewVisible","isLoadingPreview","setLoadingPreview","fetchingRef","useRef","effectiveSourceUrl","effectiveThumbnailUrl","isBusy","handleToggle","useCallback","result","toggleHandler","CardHeader","renderTypeIcon","React","CheckCircleIcon","isLoading","XIcon","EyeIcon","EyeSlashIcon","LockOpenIcon","LockIcon"],"mappings":"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"}
1
+ {"version":3,"file":"Card-D4vEgqWt.js","sources":["../src/components/LockedAttachment/components/Creator/CardThumbnail.tsx","../src/components/LockedAttachment/components/Creator/Card.tsx"],"sourcesContent":["import classNames from 'classnames'\nimport React from 'react'\n\nimport { renderTypeIcon } from '../../utils/icons'\nimport { getSourceType } from '../../utils/mimeType'\nimport MediaPlayer from '../MediaPlayer'\n\ninterface CardThumbnailProps {\n title?: string\n sourceUrl?: string\n thumbnailUrl?: string\n mimeType: string\n onToggle?: () => void\n}\n\nconst CardThumbnail: React.FC<CardThumbnailProps> = ({\n title,\n sourceUrl,\n thumbnailUrl,\n mimeType,\n onToggle,\n}) => {\n const isExpanded = onToggle && sourceUrl && thumbnailUrl\n\n return (\n <button\n type=\"button\"\n disabled={!onToggle}\n className={classNames(\n 'relative block w-full overflow-hidden border-0 bg-white/10 p-0 text-left appearance-none',\n { 'cursor-pointer': !!onToggle, 'cursor-default': !onToggle }\n )}\n onClick={onToggle}\n aria-label={onToggle ? 'Toggle preview' : undefined}\n >\n {isExpanded ? (\n <ThumbnailMedia\n sourceUrl={sourceUrl}\n thumbnailUrl={thumbnailUrl}\n mimeType={mimeType}\n />\n ) : thumbnailUrl ? (\n <div className=\"aspect-video overflow-hidden\">\n <img\n src={thumbnailUrl}\n alt={title}\n draggable={false}\n className=\"absolute inset-0 h-full w-full object-cover\"\n />\n </div>\n ) : (\n <div className=\"aspect-video flex items-center justify-center\">\n {renderTypeIcon(mimeType, {\n className: 'size-12 text-white/20',\n weight: 'regular',\n })}\n </div>\n )}\n\n {!isExpanded && (\n <div className=\"pointer-events-none absolute inset-0 bg-black/30\" />\n )}\n </button>\n )\n}\n\ninterface ThumbnailMediaProps {\n sourceUrl: string\n thumbnailUrl: string\n mimeType: string\n}\n\nconst ThumbnailMedia: React.FC<ThumbnailMediaProps> = ({\n sourceUrl,\n thumbnailUrl,\n mimeType,\n}) => {\n const sourceType = getSourceType(mimeType)\n\n if (sourceType === 'video' || sourceType === 'audio') {\n return (\n <MediaPlayer\n mimeType={mimeType}\n source={sourceUrl}\n poster={thumbnailUrl}\n autoPlay={true}\n loop={true}\n controls={true}\n muted={false}\n />\n )\n }\n\n if (sourceType === 'image') {\n return (\n <img src={sourceUrl} alt=\"\" className=\"block w-full\" draggable={false} />\n )\n }\n\n if (sourceType === 'document') {\n return (\n <img\n src={thumbnailUrl}\n alt=\"\"\n className=\"block w-full\"\n draggable={false}\n />\n )\n }\n\n return null\n}\n\nexport default CardThumbnail\n","import {\n CheckCircleIcon,\n EyeIcon,\n EyeSlashIcon,\n LockIcon,\n LockOpenIcon,\n XIcon,\n} from '@phosphor-icons/react'\nimport classNames from 'classnames'\nimport React, { useCallback, useRef, useState } from 'react'\n\nimport type {\n LockedAttachmentBaseProps,\n LockedAttachmentSource,\n PaymentStatus,\n} from '../../types'\nimport { renderTypeIcon } from '../../utils/icons'\n\nimport CardThumbnail from './CardThumbnail'\n\nexport interface CreatorCardProps extends LockedAttachmentBaseProps {\n placeholderTitle?: string\n placeholderAmountText?: string\n isUnlocking?: boolean\n onDismiss?: () => void\n onPreviewClick?: () => void\n onFetchSource?: () => Promise<LockedAttachmentSource | void>\n}\n\nconst CreatorCard: React.FC<CreatorCardProps> = ({\n title,\n mimeType = 'application/octet-stream',\n thumbnailUrl,\n detail,\n amountText,\n placeholderTitle = 'Attachment title',\n placeholderAmountText,\n paymentStatus,\n isUnlocking,\n onDismiss,\n onPreviewClick,\n onFetchSource,\n}) => {\n const [source, setSource] = useState<LockedAttachmentSource | undefined>()\n const [isPreviewVisible, setIsPreviewVisible] = useState(false)\n const [isLoadingPreview, setLoadingPreview] = useState(false)\n const fetchingRef = useRef(false)\n\n const effectiveSourceUrl = isPreviewVisible ? source?.sourceUrl : undefined\n const effectiveThumbnailUrl = isPreviewVisible ? (source?.thumbnailUrl ?? thumbnailUrl) : thumbnailUrl\n const isBusy = isLoadingPreview || isUnlocking\n\n const handleToggle = useCallback(async () => {\n onPreviewClick?.()\n if (isPreviewVisible) {\n setIsPreviewVisible(false)\n return\n }\n if (source) {\n setIsPreviewVisible(true)\n return\n }\n if (!onFetchSource) return\n if (fetchingRef.current) return\n fetchingRef.current = true\n setLoadingPreview(true)\n try {\n const result = await onFetchSource()\n if (result) {\n setSource(result)\n setIsPreviewVisible(true)\n }\n } finally {\n fetchingRef.current = false\n setLoadingPreview(false)\n }\n }, [isPreviewVisible, source, onPreviewClick, onFetchSource])\n\n const toggleHandler = onFetchSource || onPreviewClick ? handleToggle : undefined\n\n return (\n <div className=\"relative w-[280px] select-none overflow-hidden rounded-[24px] bg-[#121110] shadow-[0_0_0_1px_rgba(0,0,0,0.04),0_4px_8px_rgba(0,0,0,0.06)]\">\n <CardHeader\n onDismiss={onDismiss}\n onToggle={isBusy ? undefined : toggleHandler}\n isExpanded={isPreviewVisible}\n paymentStatus={paymentStatus}\n isLoading={isBusy}\n />\n\n <CardThumbnail\n title={title}\n sourceUrl={effectiveSourceUrl}\n thumbnailUrl={effectiveThumbnailUrl}\n mimeType={mimeType}\n onToggle={isBusy ? undefined : toggleHandler}\n />\n\n <div className=\"px-4 pb-3 pt-3\">\n <p\n className={classNames('mb-0.5 truncate text-base font-medium', {\n 'text-white/30': !title,\n 'text-white': !!title,\n })}\n >\n {title || placeholderTitle}\n </p>\n\n <div className=\"flex items-center gap-1\">\n {renderTypeIcon(mimeType, {\n className: 'size-5 shrink-0 text-white/55',\n weight: 'regular',\n })}\n\n {detail && (\n <span className=\"text-xs font-medium text-white/55\">{detail}</span>\n )}\n\n {paymentStatus === 'paid' ? (\n <React.Fragment>\n <span className=\"text-xs font-medium text-white/55\">&bull;</span>\n <span className=\"text-xs font-medium text-[#34c759]\">Sold</span>\n <CheckCircleIcon className=\"size-4 text-[#34c759]\" weight=\"bold\" />\n </React.Fragment>\n ) : (\n <React.Fragment>\n <span className=\"text-xs font-medium text-white/55\">&bull;</span>\n <span\n className={classNames('text-xs font-medium', {\n 'text-white/30': !amountText,\n 'text-white/55': !!amountText,\n })}\n >\n {amountText || placeholderAmountText}\n </span>\n </React.Fragment>\n )}\n </div>\n </div>\n </div>\n )\n}\n\ninterface CardHeaderProps {\n onDismiss?: () => void\n onToggle?: () => void\n isExpanded?: boolean\n paymentStatus?: PaymentStatus\n isLoading?: boolean\n}\n\nconst CardHeader: React.FC<CardHeaderProps> = ({\n onDismiss,\n onToggle,\n isExpanded,\n paymentStatus,\n isLoading,\n}) => {\n if (onDismiss) {\n return (\n <button\n type=\"button\"\n onClick={onDismiss}\n className=\"absolute top-3 z-50 flex size-8 items-center justify-center rounded-full bg-black/60 text-white right-3\"\n aria-label=\"Dismiss attachment\"\n >\n <XIcon className=\"size-4\" weight=\"bold\" />\n </button>\n )\n }\n\n if (onToggle) {\n const Icon = isExpanded ? EyeIcon : EyeSlashIcon\n return (\n <button\n type=\"button\"\n onClick={onToggle}\n className=\"absolute top-3 z-50 flex size-8 items-center justify-center rounded-full bg-black/60 text-white left-3\"\n aria-label={isExpanded ? 'Hide preview' : 'Show preview'}\n aria-pressed={isExpanded}\n >\n <Icon className=\"size-4\" weight=\"fill\" />\n </button>\n )\n }\n\n const Icon = paymentStatus === 'paid' ? LockOpenIcon : LockIcon\n\n return (\n <div className=\"absolute top-3 z-50 flex size-8 items-center justify-center rounded-full bg-black/60 text-white left-3\">\n {isLoading ? (\n <span className=\"size-4 animate-spin rounded-full border-2 border-white/30 border-t-white\" />\n ) : (\n <Icon className=\"size-4\" weight=\"fill\" />\n )}\n </div>\n )\n}\n\nexport default CreatorCard\n"],"names":["CardThumbnail","title","sourceUrl","thumbnailUrl","mimeType","onToggle","isExpanded","jsxs","classNames","jsx","ThumbnailMedia","sourceType","getSourceType","MediaPlayer","CreatorCard","detail","amountText","placeholderTitle","placeholderAmountText","paymentStatus","isUnlocking","onDismiss","onPreviewClick","onFetchSource","source","setSource","useState","isPreviewVisible","setIsPreviewVisible","isLoadingPreview","setLoadingPreview","fetchingRef","useRef","effectiveSourceUrl","effectiveThumbnailUrl","isBusy","handleToggle","useCallback","result","toggleHandler","CardHeader","renderTypeIcon","React","CheckCircleIcon","isLoading","XIcon","EyeIcon","EyeSlashIcon","LockOpenIcon","LockIcon"],"mappings":";;;;;AAeA,MAAMA,IAA8C,CAAC;AAAA,EACnD,OAAAC;AAAA,EACA,WAAAC;AAAA,EACA,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AACF,MAAM;AACJ,QAAMC,IAAaD,KAAYH,KAAaC;AAE5C,SACE,gBAAAI;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,UAAU,CAACF;AAAA,MACX,WAAWG;AAAA,QACT;AAAA,QACA,EAAE,kBAAkB,CAAC,CAACH,GAAU,kBAAkB,CAACA,EAAA;AAAA,MAAS;AAAA,MAE9D,SAASA;AAAA,MACT,cAAYA,IAAW,mBAAmB;AAAA,MAEzC,UAAA;AAAA,QAAAC,IACC,gBAAAG;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,WAAAR;AAAA,YACA,cAAAC;AAAA,YACA,UAAAC;AAAA,UAAA;AAAA,QAAA,IAEAD,IACF,gBAAAM,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAKN;AAAA,YACL,KAAKF;AAAA,YACL,WAAW;AAAA,YACX,WAAU;AAAA,UAAA;AAAA,QAAA,GAEd,IAEA,gBAAAQ,EAAC,SAAI,WAAU,iDACZ,YAAeL,GAAU;AAAA,UACxB,WAAW;AAAA,UACX,QAAQ;AAAA,QAAA,CACT,GACH;AAAA,QAGD,CAACE,KACA,gBAAAG,EAAC,OAAA,EAAI,WAAU,mDAAA,CAAmD;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAI1E,GAQMC,IAAgD,CAAC;AAAA,EACrD,WAAAR;AAAA,EACA,cAAAC;AAAA,EACA,UAAAC;AACF,MAAM;AACJ,QAAMO,IAAaC,EAAcR,CAAQ;AAEzC,SAAIO,MAAe,WAAWA,MAAe,UAEzC,gBAAAF;AAAA,IAACI;AAAA,IAAA;AAAA,MACC,UAAAT;AAAA,MACA,QAAQF;AAAA,MACR,QAAQC;AAAA,MACR,UAAU;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,MACV,OAAO;AAAA,IAAA;AAAA,EAAA,IAKTQ,MAAe,UAEf,gBAAAF,EAAC,SAAI,KAAKP,GAAW,KAAI,IAAG,WAAU,gBAAe,WAAW,GAAA,CAAO,IAIvES,MAAe,aAEf,gBAAAF;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKN;AAAA,MACL,KAAI;AAAA,MACJ,WAAU;AAAA,MACV,WAAW;AAAA,IAAA;AAAA,EAAA,IAKV;AACT,GClFMW,IAA0C,CAAC;AAAA,EAC/C,OAAAb;AAAA,EACA,UAAAG,IAAW;AAAA,EACX,cAAAD;AAAA,EACA,QAAAY;AAAA,EACA,YAAAC;AAAA,EACA,kBAAAC,IAAmB;AAAA,EACnB,uBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,aAAAC;AAAA,EACA,WAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,eAAAC;AACF,MAAM;AACJ,QAAM,CAACC,GAAQC,CAAS,IAAIC,EAAA,GACtB,CAACC,GAAkBC,CAAmB,IAAIF,EAAS,EAAK,GACxD,CAACG,GAAkBC,CAAiB,IAAIJ,EAAS,EAAK,GACtDK,IAAcC,EAAO,EAAK,GAE1BC,IAAqBN,IAAmBH,KAAA,gBAAAA,EAAQ,YAAY,QAC5DU,IAAwBP,KAAoBH,KAAA,gBAAAA,EAAQ,iBAAgBrB,IAAgBA,GACpFgC,IAASN,KAAoBT,GAE7BgB,IAAeC,EAAY,YAAY;AAE3C,QADAf,KAAA,QAAAA,KACIK,GAAkB;AACpB,MAAAC,EAAoB,EAAK;AACzB;AAAA,IACF;AACA,QAAIJ,GAAQ;AACV,MAAAI,EAAoB,EAAI;AACxB;AAAA,IACF;AACA,QAAKL,KACD,CAAAQ,EAAY,SAChB;AAAA,MAAAA,EAAY,UAAU,IACtBD,EAAkB,EAAI;AACtB,UAAI;AACF,cAAMQ,IAAS,MAAMf,EAAA;AACrB,QAAIe,MACFb,EAAUa,CAAM,GAChBV,EAAoB,EAAI;AAAA,MAE5B,UAAA;AACE,QAAAG,EAAY,UAAU,IACtBD,EAAkB,EAAK;AAAA,MACzB;AAAA;AAAA,EACF,GAAG,CAACH,GAAkBH,GAAQF,GAAgBC,CAAa,CAAC,GAEtDgB,IAAgBhB,KAAiBD,IAAiBc,IAAe;AAEvE,SACE,gBAAA7B,EAAC,OAAA,EAAI,WAAU,6IACb,UAAA;AAAA,IAAA,gBAAAE;AAAA,MAAC+B;AAAA,MAAA;AAAA,QACC,WAAAnB;AAAA,QACA,UAAUc,IAAS,SAAYI;AAAA,QAC/B,YAAYZ;AAAA,QACZ,eAAAR;AAAA,QACA,WAAWgB;AAAA,MAAA;AAAA,IAAA;AAAA,IAGb,gBAAA1B;AAAA,MAACT;AAAA,MAAA;AAAA,QACC,OAAAC;AAAA,QACA,WAAWgC;AAAA,QACX,cAAcC;AAAA,QACd,UAAA9B;AAAA,QACA,UAAU+B,IAAS,SAAYI;AAAA,MAAA;AAAA,IAAA;AAAA,IAGjC,gBAAAhC,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,MAAA,gBAAAE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWD,EAAW,yCAAyC;AAAA,YAC7D,iBAAiB,CAACP;AAAA,YAClB,cAAc,CAAC,CAACA;AAAA,UAAA,CACjB;AAAA,UAEA,UAAAA,KAASgB;AAAA,QAAA;AAAA,MAAA;AAAA,MAGZ,gBAAAV,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,QAAAkC,EAAerC,GAAU;AAAA,UACxB,WAAW;AAAA,UACX,QAAQ;AAAA,QAAA,CACT;AAAA,QAEAW,KACC,gBAAAN,EAAC,QAAA,EAAK,WAAU,qCAAqC,UAAAM,GAAO;AAAA,QAG7DI,MAAkB,SACjB,gBAAAZ,EAACmC,EAAM,UAAN,EACC,UAAA;AAAA,UAAA,gBAAAjC,EAAC,QAAA,EAAK,WAAU,qCAAoC,UAAA,KAAM;AAAA,UAC1D,gBAAAA,EAAC,QAAA,EAAK,WAAU,sCAAqC,UAAA,QAAI;AAAA,UACzD,gBAAAA,EAACkC,GAAA,EAAgB,WAAU,yBAAwB,QAAO,OAAA,CAAO;AAAA,QAAA,EAAA,CACnE,IAEA,gBAAApC,EAACmC,EAAM,UAAN,EACC,UAAA;AAAA,UAAA,gBAAAjC,EAAC,QAAA,EAAK,WAAU,qCAAoC,UAAA,KAAM;AAAA,UAC1D,gBAAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWD,EAAW,uBAAuB;AAAA,gBAC3C,iBAAiB,CAACQ;AAAA,gBAClB,iBAAiB,CAAC,CAACA;AAAA,cAAA,CACpB;AAAA,cAEA,UAAAA,KAAcE;AAAA,YAAA;AAAA,UAAA;AAAA,QACjB,EAAA,CACF;AAAA,MAAA,EAAA,CAEJ;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ,GAUMsB,IAAwC,CAAC;AAAA,EAC7C,WAAAnB;AAAA,EACA,UAAAhB;AAAA,EACA,YAAAC;AAAA,EACA,eAAAa;AAAA,EACA,WAAAyB;AACF,MACMvB,IAEA,gBAAAZ;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,MAAK;AAAA,IACL,SAASY;AAAA,IACT,WAAU;AAAA,IACV,cAAW;AAAA,IAEX,UAAA,gBAAAZ,EAACoC,GAAA,EAAM,WAAU,UAAS,QAAO,OAAA,CAAO;AAAA,EAAA;AAAA,IAK1CxC,IAGA,gBAAAI;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,MAAK;AAAA,IACL,SAASJ;AAAA,IACT,WAAU;AAAA,IACV,cAAYC,IAAa,iBAAiB;AAAA,IAC1C,gBAAcA;AAAA,IAEd,4BATSA,IAAawC,IAAUC,GAS/B,EAAK,WAAU,UAAS,QAAO,OAAA,CAAO;AAAA,EAAA;AAAA,sBAQ1C,OAAA,EAAI,WAAU,0GACZ,UAAAH,sBACE,QAAA,EAAK,WAAU,4EAA2E,sBALpFzB,MAAkB,SAAS6B,IAAeC,GAOhD,EAAK,WAAU,UAAS,QAAO,QAAO,GAE3C;"}