@mieweb/ui 0.10.0-dev.32 → 0.10.0-dev.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/dist/{chunk-VPIYTQCV.cjs → chunk-2I4IRQQG.cjs} +12 -5
  2. package/dist/chunk-2I4IRQQG.cjs.map +1 -0
  3. package/dist/{chunk-CMF7VCGP.js → chunk-2X54ZLT6.js} +3 -3
  4. package/dist/{chunk-CMF7VCGP.js.map → chunk-2X54ZLT6.js.map} +1 -1
  5. package/dist/{chunk-FKGFOBC2.js → chunk-434L5RYF.js} +4 -4
  6. package/dist/{chunk-FKGFOBC2.js.map → chunk-434L5RYF.js.map} +1 -1
  7. package/dist/{chunk-TPWKM7JH.js → chunk-43K7OQ3E.js} +3 -3
  8. package/dist/{chunk-TPWKM7JH.js.map → chunk-43K7OQ3E.js.map} +1 -1
  9. package/dist/chunk-522WJIVI.js +99 -0
  10. package/dist/chunk-522WJIVI.js.map +1 -0
  11. package/dist/{chunk-O4WGSOJI.js → chunk-56VTM4OX.js} +3 -3
  12. package/dist/{chunk-O4WGSOJI.js.map → chunk-56VTM4OX.js.map} +1 -1
  13. package/dist/{chunk-LRRSD7LR.js → chunk-5HKZR6UG.js} +3 -3
  14. package/dist/{chunk-LRRSD7LR.js.map → chunk-5HKZR6UG.js.map} +1 -1
  15. package/dist/{chunk-EMRWTCCN.cjs → chunk-6WX2OR3U.cjs} +15 -2
  16. package/dist/chunk-6WX2OR3U.cjs.map +1 -0
  17. package/dist/chunk-7E46YDOT.cjs +122 -0
  18. package/dist/chunk-7E46YDOT.cjs.map +1 -0
  19. package/dist/{chunk-57G3O552.cjs → chunk-AJPFQF3H.cjs} +7 -7
  20. package/dist/{chunk-57G3O552.cjs.map → chunk-AJPFQF3H.cjs.map} +1 -1
  21. package/dist/{chunk-I2MMUFCN.cjs → chunk-ARIJ5OHW.cjs} +9 -24
  22. package/dist/chunk-ARIJ5OHW.cjs.map +1 -0
  23. package/dist/{chunk-VOYLX32A.cjs → chunk-CLQW724U.cjs} +4 -4
  24. package/dist/{chunk-VOYLX32A.cjs.map → chunk-CLQW724U.cjs.map} +1 -1
  25. package/dist/{chunk-VNEAQCY2.js → chunk-DGHS5IVD.js} +19 -22
  26. package/dist/chunk-DGHS5IVD.js.map +1 -0
  27. package/dist/{chunk-OZ5CKVQN.js → chunk-FDA3R5E7.js} +15 -2
  28. package/dist/chunk-FDA3R5E7.js.map +1 -0
  29. package/dist/{chunk-LSMS6DY7.cjs → chunk-FSWHZY3T.cjs} +18 -21
  30. package/dist/chunk-FSWHZY3T.cjs.map +1 -0
  31. package/dist/{chunk-ISUIKUX7.cjs → chunk-H3P7POFC.cjs} +7 -7
  32. package/dist/{chunk-ISUIKUX7.cjs.map → chunk-H3P7POFC.cjs.map} +1 -1
  33. package/dist/{chunk-462XSCP3.cjs → chunk-HCIXGFWR.cjs} +4 -4
  34. package/dist/{chunk-462XSCP3.cjs.map → chunk-HCIXGFWR.cjs.map} +1 -1
  35. package/dist/{chunk-FCV7GBNQ.cjs → chunk-HNNWWLKY.cjs} +33 -33
  36. package/dist/{chunk-FCV7GBNQ.cjs.map → chunk-HNNWWLKY.cjs.map} +1 -1
  37. package/dist/{chunk-BIQ7GSO2.js → chunk-JMAZ2GKT.js} +3 -3
  38. package/dist/{chunk-BIQ7GSO2.js.map → chunk-JMAZ2GKT.js.map} +1 -1
  39. package/dist/{chunk-T4L7Q5FA.cjs → chunk-LC3JL2HB.cjs} +6 -2
  40. package/dist/chunk-LC3JL2HB.cjs.map +1 -0
  41. package/dist/{chunk-3RXZWHCU.js → chunk-LDBNUJB7.js} +3 -3
  42. package/dist/{chunk-3RXZWHCU.js.map → chunk-LDBNUJB7.js.map} +1 -1
  43. package/dist/{chunk-ADW7ZYCY.cjs → chunk-LRAAJRE7.cjs} +4 -4
  44. package/dist/{chunk-ADW7ZYCY.cjs.map → chunk-LRAAJRE7.cjs.map} +1 -1
  45. package/dist/{chunk-ILDLYRTP.js → chunk-MHR2OS5I.js} +4 -4
  46. package/dist/{chunk-ILDLYRTP.js.map → chunk-MHR2OS5I.js.map} +1 -1
  47. package/dist/{chunk-6M63CM7X.cjs → chunk-O6BJMVGT.cjs} +21 -21
  48. package/dist/{chunk-6M63CM7X.cjs.map → chunk-O6BJMVGT.cjs.map} +1 -1
  49. package/dist/{chunk-ORCCJ5VY.cjs → chunk-OIMXMPH2.cjs} +4 -4
  50. package/dist/{chunk-ORCCJ5VY.cjs.map → chunk-OIMXMPH2.cjs.map} +1 -1
  51. package/dist/{chunk-CEQJGUAS.js → chunk-P4E3K3ND.js} +12 -5
  52. package/dist/chunk-P4E3K3ND.js.map +1 -0
  53. package/dist/{chunk-6JSFT2J5.js → chunk-RLVYWUXG.js} +9 -24
  54. package/dist/chunk-RLVYWUXG.js.map +1 -0
  55. package/dist/{chunk-YRHBSSQ3.cjs → chunk-RV45J2ZT.cjs} +4 -4
  56. package/dist/{chunk-YRHBSSQ3.cjs.map → chunk-RV45J2ZT.cjs.map} +1 -1
  57. package/dist/{chunk-3DLLTITK.js → chunk-S2JZL4JC.js} +3 -3
  58. package/dist/{chunk-3DLLTITK.js.map → chunk-S2JZL4JC.js.map} +1 -1
  59. package/dist/{chunk-ENMXHZNE.js → chunk-TWQSMUE6.js} +6 -2
  60. package/dist/chunk-TWQSMUE6.js.map +1 -0
  61. package/dist/{chunk-GNOQFTLL.cjs → chunk-UTIPENPW.cjs} +6 -6
  62. package/dist/{chunk-GNOQFTLL.cjs.map → chunk-UTIPENPW.cjs.map} +1 -1
  63. package/dist/{chunk-CPPUT74P.cjs → chunk-VV2U36T6.cjs} +9 -9
  64. package/dist/{chunk-CPPUT74P.cjs.map → chunk-VV2U36T6.cjs.map} +1 -1
  65. package/dist/{chunk-EPTP3VKT.js → chunk-WFL4N5PC.js} +3 -3
  66. package/dist/{chunk-EPTP3VKT.js.map → chunk-WFL4N5PC.js.map} +1 -1
  67. package/dist/{chunk-H3QPREIJ.js → chunk-X3RSNAMX.js} +3 -3
  68. package/dist/{chunk-H3QPREIJ.js.map → chunk-X3RSNAMX.js.map} +1 -1
  69. package/dist/{chunk-T4JYUICS.js → chunk-Y7ZJZLJY.js} +3 -3
  70. package/dist/{chunk-T4JYUICS.js.map → chunk-Y7ZJZLJY.js.map} +1 -1
  71. package/dist/{chunk-P55LNEDH.cjs → chunk-ZSNFL736.cjs} +4 -4
  72. package/dist/{chunk-P55LNEDH.cjs.map → chunk-ZSNFL736.cjs.map} +1 -1
  73. package/dist/components/ActionPlan/index.cjs +5 -5
  74. package/dist/components/ActionPlan/index.js +3 -3
  75. package/dist/components/AlertDialog/index.cjs +6 -6
  76. package/dist/components/AlertDialog/index.js +2 -2
  77. package/dist/components/AssociationList/index.cjs +4 -4
  78. package/dist/components/AssociationList/index.js +2 -2
  79. package/dist/components/Badge/index.cjs +3 -3
  80. package/dist/components/Badge/index.d.cts +15 -1
  81. package/dist/components/Badge/index.d.ts +15 -1
  82. package/dist/components/Badge/index.js +1 -1
  83. package/dist/components/CompletenessMeter/index.cjs +5 -4
  84. package/dist/components/CompletenessMeter/index.js +2 -1
  85. package/dist/components/KeyboardShortcutsOverlay/index.cjs +4 -4
  86. package/dist/components/KeyboardShortcutsOverlay/index.js +2 -2
  87. package/dist/components/MediaEditor/index.cjs +7 -7
  88. package/dist/components/MediaEditor/index.js +2 -2
  89. package/dist/components/MediaFeed/index.cjs +3 -3
  90. package/dist/components/MediaFeed/index.js +2 -2
  91. package/dist/components/Modal/index.cjs +9 -9
  92. package/dist/components/Modal/index.js +1 -1
  93. package/dist/components/Progress/index.cjs +6 -6
  94. package/dist/components/Progress/index.d.cts +7 -1
  95. package/dist/components/Progress/index.d.ts +7 -1
  96. package/dist/components/Progress/index.js +1 -1
  97. package/dist/components/RadialExplorer/index.cjs +3 -3
  98. package/dist/components/RadialExplorer/index.js +2 -2
  99. package/dist/components/RecordHeader/index.cjs +4 -4
  100. package/dist/components/RecordHeader/index.d.cts +11 -1
  101. package/dist/components/RecordHeader/index.d.ts +11 -1
  102. package/dist/components/RecordHeader/index.js +2 -2
  103. package/dist/components/RecordLayout/index.cjs +4 -4
  104. package/dist/components/RecordLayout/index.js +2 -2
  105. package/dist/components/SuperChat/index.cjs +5 -5
  106. package/dist/components/SuperChat/index.js +3 -3
  107. package/dist/components/TagEditor/index.cjs +5 -3
  108. package/dist/components/TagEditor/index.js +3 -1
  109. package/dist/components/VideoCard/index.cjs +4 -4
  110. package/dist/components/VideoCard/index.js +2 -2
  111. package/dist/datavis.cjs +2 -2
  112. package/dist/datavis.js +1 -1
  113. package/dist/esheet.cjs +6 -6
  114. package/dist/esheet.js +3 -3
  115. package/dist/index.cjs +300 -314
  116. package/dist/index.cjs.map +1 -1
  117. package/dist/index.d.cts +22 -2
  118. package/dist/index.d.ts +22 -2
  119. package/dist/index.js +29 -43
  120. package/dist/index.js.map +1 -1
  121. package/dist/styles.css +1 -1
  122. package/dist/tailwind-preset.cjs +4 -4
  123. package/dist/tailwind-preset.js +1 -1
  124. package/dist/templates.cjs +31 -31
  125. package/dist/templates.js +2 -2
  126. package/package.json +1 -1
  127. package/dist/chunk-6JSFT2J5.js.map +0 -1
  128. package/dist/chunk-BMSG4NBH.js +0 -56
  129. package/dist/chunk-BMSG4NBH.js.map +0 -1
  130. package/dist/chunk-CEQJGUAS.js.map +0 -1
  131. package/dist/chunk-EMRWTCCN.cjs.map +0 -1
  132. package/dist/chunk-ENMXHZNE.js.map +0 -1
  133. package/dist/chunk-I2MMUFCN.cjs.map +0 -1
  134. package/dist/chunk-LSMS6DY7.cjs.map +0 -1
  135. package/dist/chunk-OZ5CKVQN.js.map +0 -1
  136. package/dist/chunk-T4L7Q5FA.cjs.map +0 -1
  137. package/dist/chunk-VNEAQCY2.js.map +0 -1
  138. package/dist/chunk-VPIYTQCV.cjs.map +0 -1
  139. package/dist/chunk-YVL3XATO.cjs +0 -79
  140. package/dist/chunk-YVL3XATO.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/MediaFeed/FeedMedia.tsx","../src/components/MediaFeed/MediaFeed.tsx"],"names":["jsx","React","jsxs","MediaPlayer","Button","Pause","Play","usePrefersReducedMotion","React2","cn","Avatar","Maximize2","ChevronUp","ChevronDown","Fragment","Modal","ModalHeader","ModalTitle","ModalClose"],"mappings":"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","file":"chunk-57G3O552.cjs","sourcesContent":["import * as React from 'react';\nimport { Pause, Play } from 'lucide-react';\nimport { Button } from '../Button';\nimport { MediaPlayer, type MediaPlayerState } from '../MediaPlayer';\nimport type { MediaFeedLabels, MediaFeedMedia } from './types';\n\ninterface FeedMediaProps {\n media: MediaFeedMedia;\n title: string;\n active: boolean;\n autoPlay: boolean;\n muted: boolean;\n loop: boolean;\n labels: MediaFeedLabels;\n onActivate: () => void;\n playbackPosition: { timeMs: number; playRequested?: boolean };\n playbackRequestId?: string | number;\n}\n\n/** Only ordinary web URLs become links; media resources may use other schemes. */\nfunction sourceHref(src: string): string | undefined {\n try {\n const url = new URL(src, 'https://localhost/');\n return ['http:', 'https:'].includes(url.protocol) ? src : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction SourceLink({ src, labels }: { src: string; labels: MediaFeedLabels }) {\n const href = sourceHref(src);\n return href ? (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary-700 dark:text-primary-300 focus-visible:ring-ring rounded underline underline-offset-4 focus-visible:ring-2 focus-visible:outline-none\"\n >\n {labels.openSource}\n </a>\n ) : null;\n}\n\nfunction NativeFeedMedia({\n media,\n title,\n active,\n autoPlay,\n muted,\n loop,\n labels,\n onActivate,\n playbackPosition,\n playbackRequestId,\n}: FeedMediaProps) {\n const mediaElementRef = React.useRef<\n HTMLVideoElement | HTMLAudioElement | null\n >(null);\n const [state, setState] = React.useState<MediaPlayerState>('idle');\n const [blocked, setBlocked] = React.useState(false);\n const [retryVersion, setRetryVersion] = React.useState(0);\n const wantsPlayback = React.useRef(playbackPosition.playRequested ?? false);\n const latestPlaybackRequest = React.useRef(playbackRequestId);\n latestPlaybackRequest.current = playbackRequestId;\n const handledPlaybackRequest = React.useRef<string | number | undefined>(\n undefined\n );\n const ownershipPause = React.useRef(false);\n const attemptId = React.useRef(0);\n const activeRef = React.useRef(active);\n const canSavePosition = React.useRef(false);\n activeRef.current = active;\n\n const tryPlay = React.useCallback(async () => {\n const element = mediaElementRef.current;\n if (!element || !activeRef.current) return;\n const attempt = ++attemptId.current;\n setBlocked(false);\n try {\n // The native promise can reject when browser autoplay policy requires a\n // gesture. Playback state still comes from native events, never intent.\n await element.play();\n // A delayed request must not start a card that has since left the active\n // surface. A newer request for the same active element can finish normally.\n if (!activeRef.current || element !== mediaElementRef.current)\n element.pause();\n } catch (error) {\n if (!activeRef.current || attempt !== attemptId.current) return;\n if (error instanceof Error && error.name === 'AbortError') return;\n setBlocked(true);\n }\n }, []);\n\n const pauseForOwnership = React.useCallback(\n (element: HTMLMediaElement | null) => {\n if (element && element === mediaElementRef.current && !element.paused)\n ownershipPause.current = true;\n element?.pause();\n },\n []\n );\n\n React.useEffect(() => {\n const element = mediaElementRef.current;\n const attempts = attemptId;\n const restorePosition = () => {\n if (!element || !activeRef.current) return;\n if (playbackPosition.timeMs > 0) {\n element.currentTime = playbackPosition.timeMs / 1000;\n }\n canSavePosition.current = true;\n };\n if (active && element) {\n // Another surface can clear shared manual intent while this inline copy\n // is paused (for example, the user pauses inside fullscreen).\n wantsPlayback.current = playbackPosition.playRequested ?? false;\n if (element.readyState >= 1) restorePosition();\n else element.addEventListener('loadedmetadata', restorePosition);\n }\n if (\n active &&\n (latestPlaybackRequest.current === undefined ||\n latestPlaybackRequest.current === handledPlaybackRequest.current) &&\n (autoPlay || wantsPlayback.current)\n ) {\n void tryPlay();\n } else if (!active) {\n attemptId.current++;\n pauseForOwnership(element);\n setBlocked(false);\n }\n return () => {\n attempts.current++;\n element?.removeEventListener('loadedmetadata', restorePosition);\n if (element && canSavePosition.current)\n playbackPosition.timeMs = element.currentTime * 1000;\n pauseForOwnership(element);\n };\n }, [\n active,\n autoPlay,\n pauseForOwnership,\n playbackPosition,\n retryVersion,\n tryPlay,\n ]);\n\n React.useEffect(() => {\n if (\n !active ||\n playbackRequestId === undefined ||\n playbackRequestId === handledPlaybackRequest.current\n )\n return;\n handledPlaybackRequest.current = playbackRequestId;\n wantsPlayback.current = true;\n playbackPosition.playRequested = true;\n void tryPlay();\n }, [active, playbackRequestId, playbackPosition, tryPlay]);\n\n const togglePlayback = () => {\n if (state === 'playing') {\n wantsPlayback.current = false;\n playbackPosition.playRequested = false;\n mediaElementRef.current?.pause();\n } else {\n wantsPlayback.current = true;\n playbackPosition.playRequested = true;\n onActivate();\n if (active) void tryPlay();\n }\n };\n\n return (\n <div className=\"flex h-full min-h-0 w-full flex-col items-center justify-center gap-3\">\n <MediaPlayer\n src={media.src}\n kind={media.kind === 'audio' ? 'audio' : 'video'}\n mediaElementRef={mediaElementRef}\n muted={muted}\n loop={loop}\n poster={media.poster}\n preload={active ? 'metadata' : 'none'}\n controls={active}\n aria-label={title}\n onStateChange={(next) => {\n setState(next);\n if (next === 'playing') ownershipPause.current = false;\n if (next === 'paused') {\n if (activeRef.current && !ownershipPause.current) {\n wantsPlayback.current = false;\n playbackPosition.playRequested = false;\n }\n ownershipPause.current = false;\n }\n }}\n onTimeUpdate={(timeMs) => {\n if (canSavePosition.current) playbackPosition.timeMs = timeMs;\n }}\n onRetry={() => {\n ownershipPause.current = false;\n canSavePosition.current = false;\n setState('idle');\n setBlocked(false);\n setRetryVersion((version) => version + 1);\n }}\n labels={{ error: labels.mediaError, retry: labels.retry }}\n className=\"min-h-0 flex-1 [&_video]:h-full [&_video]:w-full\"\n />\n {state !== 'error' && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n leftIcon={\n state === 'playing' ? (\n <Pause className=\"h-4 w-4\" aria-hidden=\"true\" />\n ) : (\n <Play className=\"h-4 w-4\" aria-hidden=\"true\" />\n )\n }\n onClick={togglePlayback}\n >\n {state === 'playing' ? labels.pause : labels.play}\n </Button>\n )}\n {blocked && (\n <p\n role=\"status\"\n className=\"text-muted-foreground m-0 text-center text-sm\"\n >\n {labels.blockedAutoplay}\n </p>\n )}\n {state === 'error' && <SourceLink src={media.src} labels={labels} />}\n </div>\n );\n}\n\nfunction ImageFeedMedia({ media, title, labels }: FeedMediaProps) {\n const [failed, setFailed] = React.useState(false);\n return failed ? (\n <div role=\"alert\" className=\"flex flex-col gap-3 p-6 text-center\">\n <p className=\"text-muted-foreground m-0\">{labels.mediaError}</p>\n <SourceLink src={media.src} labels={labels} />\n </div>\n ) : (\n <img\n src={media.src}\n alt={media.alt ?? title}\n loading=\"lazy\"\n className=\"h-full max-h-full w-full object-contain\"\n onError={() => setFailed(true)}\n />\n );\n}\n\nfunction youtubeId(src: string): string | null {\n const validId = /^[A-Za-z0-9_-]{11}$/;\n if (validId.test(src)) return src;\n try {\n const url = new URL(src);\n const host = url.hostname.toLowerCase();\n const parts = url.pathname.split('/').filter(Boolean);\n let id: string | null = null;\n if (host === 'youtu.be' || host === 'www.youtu.be') {\n id = parts[0] ?? null;\n } else if (\n [\n 'youtube.com',\n 'www.youtube.com',\n 'm.youtube.com',\n 'youtube-nocookie.com',\n 'www.youtube-nocookie.com',\n ].includes(host)\n ) {\n id =\n url.searchParams.get('v') ??\n (['embed', 'shorts', 'live'].includes(parts[0]) ? parts[1] : null);\n }\n return id && validId.test(id) ? id : null;\n } catch {\n return null;\n }\n}\n\nfunction YouTubeFeedMedia({\n media,\n title,\n active,\n autoPlay,\n muted,\n loop,\n labels,\n onActivate,\n playbackRequestId,\n}: FeedMediaProps) {\n const id = youtubeId(media.src);\n const [requestedPlayback, setRequestedPlayback] = React.useState(false);\n const handledPlaybackRequest = React.useRef<string | number | undefined>(\n undefined\n );\n const pendingPlayback =\n active &&\n playbackRequestId !== undefined &&\n playbackRequestId !== handledPlaybackRequest.current;\n React.useEffect(() => {\n if (!active) setRequestedPlayback(false);\n else if (\n playbackRequestId !== undefined &&\n playbackRequestId !== handledPlaybackRequest.current\n ) {\n handledPlaybackRequest.current = playbackRequestId;\n setRequestedPlayback(true);\n }\n }, [active, playbackRequestId]);\n const embedUrl = new URL(\n `https://www.youtube-nocookie.com/embed/${id ?? ''}`\n );\n for (const [key, value] of Object.entries({\n autoplay: autoPlay || requestedPlayback || pendingPlayback ? '1' : '0',\n mute: muted ? '1' : '0',\n controls: '1',\n playsinline: '1',\n rel: '0',\n loop: loop ? '1' : '0',\n ...(loop && id ? { playlist: id } : {}),\n }))\n embedUrl.searchParams.set(key, value);\n const [failed, setFailed] = React.useState(false);\n return (\n <div className=\"flex h-full min-h-0 w-full flex-col items-center gap-3\">\n {active && id && !failed ? (\n <iframe\n src={embedUrl.href}\n title={title}\n className=\"min-h-0 w-full flex-1 border-0\"\n allow=\"autoplay; encrypted-media; picture-in-picture; fullscreen\"\n referrerPolicy=\"strict-origin-when-cross-origin\"\n allowFullScreen\n onError={() => setFailed(true)}\n />\n ) : (\n <div className=\"flex min-h-0 w-full flex-1 flex-col items-center justify-center gap-4\">\n {media.poster && (\n <img\n src={media.poster}\n alt=\"\"\n loading=\"lazy\"\n className=\"min-h-0 max-w-full flex-1 object-contain\"\n />\n )}\n {id && !failed ? (\n <Button\n variant=\"secondary\"\n leftIcon={<Play className=\"h-4 w-4\" aria-hidden=\"true\" />}\n onClick={() => {\n setRequestedPlayback(true);\n onActivate();\n }}\n >\n {labels.play}\n </Button>\n ) : (\n <p role=\"alert\" className=\"text-muted-foreground m-0\">\n {labels.mediaError}\n </p>\n )}\n </div>\n )}\n <p className=\"text-muted-foreground m-0 text-center text-sm\">\n {labels.youtubeNotice}\n </p>\n <SourceLink\n src={id ? `https://www.youtube.com/watch?v=${id}` : media.src}\n labels={labels}\n />\n </div>\n );\n}\n\n/** Native resources share UI transport; external embeds retain their controls. */\nexport function FeedMedia(props: FeedMediaProps) {\n if (props.media.kind === 'image') return <ImageFeedMedia {...props} />;\n if (props.media.kind === 'youtube') return <YouTubeFeedMedia {...props} />;\n return <NativeFeedMedia {...props} />;\n}\n","import * as React from 'react';\nimport { ChevronDown, ChevronUp, Maximize2 } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { usePrefersReducedMotion } from '../../hooks/usePrefersReducedMotion';\nimport { Avatar } from '../Avatar';\nimport { Button } from '../Button';\nimport { Modal, ModalClose, ModalHeader, ModalTitle } from '../Modal';\nimport { FeedMedia } from './FeedMedia';\nimport type { MediaFeedLabels, MediaFeedProps } from './types';\n\nconst defaultLabels: MediaFeedLabels = {\n feed: 'Media feed',\n loading: 'Loading media…',\n empty: 'No media to display.',\n error: 'Unable to load the media feed.',\n retry: 'Retry',\n fullscreen: 'Open fullscreen',\n close: 'Close fullscreen',\n previous: 'Previous item',\n next: 'Next item',\n play: 'Play',\n pause: 'Pause',\n blockedAutoplay: 'Playback did not start. Press Play to try again.',\n mediaError: 'This media is unavailable.',\n openSource: 'Open source',\n youtubeNotice: 'If embedded playback is unavailable, open the source.',\n item: (position, total) => `Media item ${position} of ${total}`,\n position: (position, total) => `${position} / ${total}`,\n};\n\n/**\n * A vertical, caller-owned media collection with one active playback surface.\n * Native players share MediaPlayer; provider-specific players can use the\n * renderMedia slot. Records, engagement actions and navigation belong to the host.\n */\nfunction MediaFeedInner<T>(\n {\n items,\n getId,\n getMedia,\n getTitle,\n getCaption,\n getAuthor,\n renderActions,\n renderMedia,\n activeItemId,\n defaultActiveItemId,\n onActiveItemChange,\n playbackRequest,\n loading = false,\n error,\n onRetry,\n autoPlay = true,\n muted = true,\n loop = true,\n labels: labelOverrides,\n classNames = {},\n className,\n ...rest\n }: MediaFeedProps<T>,\n forwardedRef: React.ForwardedRef<HTMLDivElement>\n) {\n const labels = { ...defaultLabels, ...labelOverrides };\n const prefersReducedMotion = usePrefersReducedMotion();\n const allowAutoPlay = autoPlay && !prefersReducedMotion;\n const ids = items.map(getId);\n const idsKey = JSON.stringify(ids);\n const [internalActiveId, setInternalActiveId] = React.useState(\n () => defaultActiveItemId ?? ids[0]\n );\n const requestedId = activeItemId ?? internalActiveId;\n const activeId =\n requestedId !== undefined && ids.includes(requestedId)\n ? requestedId\n : ids[0];\n const activeIndex = activeId === undefined ? -1 : ids.indexOf(activeId);\n const [fullscreen, setFullscreen] = React.useState(false);\n const [retrying, setRetrying] = React.useState(false);\n const [retryFailed, setRetryFailed] = React.useState(false);\n const rootRef = React.useRef<HTMLDivElement | null>(null);\n const viewportRef = React.useRef<HTMLDivElement | null>(null);\n const cardRefs = React.useRef(new Map<string, HTMLElement>());\n const playbackPositions = React.useRef(\n new Map<string, { src: string; timeMs: number; playRequested?: boolean }>()\n );\n const consumedPlaybackRequests = React.useRef(\n new Map<string, string | number>()\n );\n const fullscreenTriggerRef = React.useRef<HTMLButtonElement | null>(null);\n const hasObserver = typeof IntersectionObserver !== 'undefined';\n // Hydration safety: the server cannot know whether the client supports\n // IntersectionObserver, so both environments start \"not visible\" and the\n // mount effects below establish real visibility (observer callbacks, or the\n // no-observer fallback). Offscreen autoplay therefore never starts early.\n const [visibleId, setVisibleId] = React.useState<string | null>(null);\n const visibleIdRef = React.useRef(visibleId);\n const [viewportVisible, setViewportVisible] = React.useState(false);\n const [pageVisible, setPageVisible] = React.useState(\n () =>\n typeof document === 'undefined' || document.visibilityState !== 'hidden'\n );\n const latest = React.useRef({\n items,\n ids,\n activeId,\n activeItemId,\n onActiveItemChange,\n fullscreen,\n });\n latest.current = {\n items,\n ids,\n activeId,\n activeItemId,\n onActiveItemChange,\n fullscreen,\n };\n\n const setRoot = React.useCallback(\n (node: HTMLDivElement | null) => {\n rootRef.current = node;\n if (typeof forwardedRef === 'function') forwardedRef(node);\n else if (forwardedRef) forwardedRef.current = node;\n },\n [forwardedRef]\n );\n\n const select = React.useCallback((id: string) => {\n const current = latest.current;\n const index = current.ids.indexOf(id);\n if (index < 0 || id === current.activeId) return;\n if (current.activeItemId === undefined) setInternalActiveId(id);\n current.onActiveItemChange?.(current.items[index]);\n }, []);\n\n // Visibility belongs to this feed, never a global keyboard/player singleton.\n // A separate viewport observer also pauses a feed scrolled off the host page.\n React.useEffect(() => {\n const root = rootRef.current;\n if (!root || typeof IntersectionObserver === 'undefined') {\n // No-observer fallback: assume the feed is on screen.\n setViewportVisible(true);\n return;\n }\n const observer = new IntersectionObserver(([entry]) => {\n setViewportVisible(entry.isIntersecting);\n });\n observer.observe(root);\n return () => observer.disconnect();\n }, []);\n\n React.useEffect(() => {\n const viewport = viewportRef.current;\n if (!viewport || typeof IntersectionObserver === 'undefined') return;\n const ratios = new Map<string, number>();\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n const id = (entry.target as HTMLElement).dataset.mediaId;\n if (id !== undefined)\n ratios.set(id, entry.isIntersecting ? entry.intersectionRatio : 0);\n }\n let bestId: string | null = null;\n let bestRatio = 0;\n for (const [id, ratio] of ratios) {\n if (ratio > bestRatio) {\n bestId = id;\n bestRatio = ratio;\n }\n }\n visibleIdRef.current = bestId;\n setVisibleId(bestId);\n if (bestId !== null && !latest.current.fullscreen) select(bestId);\n },\n { root: viewport, threshold: [0, 0.25, 0.5, 0.75, 1] }\n );\n cardRefs.current.forEach((card) => observer.observe(card));\n return () => observer.disconnect();\n }, [idsKey, loading, error, select]);\n\n React.useEffect(() => {\n const update = () => setPageVisible(document.visibilityState !== 'hidden');\n document.addEventListener('visibilitychange', update);\n return () => document.removeEventListener('visibilitychange', update);\n }, []);\n\n // Controlled selection and initial deep links scroll within the feed, without\n // moving the surrounding inbox/page. Observer selections are already visible.\n React.useEffect(() => {\n if (activeId === undefined) return;\n if (!hasObserver) {\n visibleIdRef.current = activeId;\n setVisibleId(activeId);\n }\n if (visibleIdRef.current === activeId && hasObserver) return;\n const card = cardRefs.current.get(activeId);\n if (card && viewportRef.current) {\n viewportRef.current.scrollTo?.({ top: card.offsetTop, behavior: 'auto' });\n }\n }, [activeId, idsKey, hasObserver, loading, error]);\n\n React.useEffect(() => {\n if (!items.length) setFullscreen(false);\n }, [items.length]);\n\n // The gesture targets an already selected, visible surface. Consume it once\n // per feed so a later source/fullscreen remount cannot resurrect a paused clip.\n React.useEffect(() => {\n if (\n loading ||\n error ||\n activeIndex < 0 ||\n !playbackRequest ||\n playbackRequest.itemId !== activeId\n )\n return;\n if (\n !pageVisible ||\n (!fullscreen && (!viewportVisible || visibleId !== activeId))\n )\n return;\n consumedPlaybackRequests.current.set(\n playbackRequest.itemId,\n playbackRequest.requestId\n );\n }, [\n activeId,\n activeIndex,\n fullscreen,\n pageVisible,\n viewportVisible,\n visibleId,\n playbackRequest,\n loading,\n error,\n ]);\n\n React.useEffect(() => {\n const positions = playbackPositions.current;\n for (const id of positions.keys()) {\n if (!latest.current.ids.includes(id)) positions.delete(id);\n }\n }, [idsKey]);\n\n React.useEffect(() => {\n if (fullscreen || !fullscreenTriggerRef.current) return;\n if (fullscreenTriggerRef.current.isConnected)\n fullscreenTriggerRef.current.focus();\n else viewportRef.current?.focus();\n fullscreenTriggerRef.current = null;\n }, [fullscreen]);\n\n const navigate = (index: number, focus = false) => {\n const id = ids[Math.max(0, Math.min(index, ids.length - 1))];\n if (id === undefined) return;\n select(id);\n const card = cardRefs.current.get(id);\n if (card && viewportRef.current) {\n viewportRef.current.scrollTo?.({ top: card.offsetTop, behavior: 'auto' });\n if (focus) card.focus({ preventScroll: true });\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n // Never steal arrows/Space from a player, reaction button or chat composer.\n const target = event.target as HTMLElement;\n if (event.target !== event.currentTarget && target.dataset?.slot !== 'item')\n return;\n let next: number;\n switch (event.key) {\n case 'ArrowDown':\n case 'PageDown':\n next = activeIndex + 1;\n break;\n case 'ArrowUp':\n case 'PageUp':\n next = activeIndex - 1;\n break;\n case 'Home':\n next = 0;\n break;\n case 'End':\n next = items.length - 1;\n break;\n default:\n return;\n }\n event.preventDefault();\n navigate(next, event.target !== event.currentTarget);\n };\n\n const retry = async () => {\n if (!onRetry || retrying) return;\n setRetrying(true);\n setRetryFailed(false);\n try {\n await onRetry();\n } catch {\n setRetryFailed(true);\n } finally {\n setRetrying(false);\n }\n };\n\n const renderCard = (item: T, index: number, immersive: boolean) => {\n const id = getId(item);\n const media = getMedia(item);\n let playbackPosition = playbackPositions.current.get(id);\n if (!playbackPosition || playbackPosition.src !== media.src) {\n playbackPosition = { src: media.src, timeMs: 0 };\n playbackPositions.current.set(id, playbackPosition);\n }\n const title = getTitle?.(item) || labels.item(index + 1, items.length);\n const author = getAuthor?.(item);\n const caption = getCaption?.(item);\n const active =\n !loading &&\n !error &&\n pageVisible &&\n (immersive\n ? fullscreen && id === activeId\n : !fullscreen &&\n viewportVisible &&\n id === activeId &&\n id === visibleId);\n const playbackRequestId =\n active &&\n playbackRequest?.itemId === id &&\n consumedPlaybackRequests.current.get(id) !== playbackRequest.requestId\n ? playbackRequest.requestId\n : undefined;\n return (\n <article\n key={id}\n ref={\n immersive\n ? undefined\n : (node) => {\n if (node) cardRefs.current.set(id, node);\n else cardRefs.current.delete(id);\n }\n }\n data-slot=\"item\"\n data-media-id={id}\n data-active={active}\n aria-label={title}\n aria-posinset={index + 1}\n aria-setsize={items.length}\n tabIndex={id === activeId ? 0 : -1}\n className={cn(\n 'border-border bg-card text-card-foreground focus-visible:ring-ring flex min-h-0 w-full snap-start flex-col overflow-hidden border focus-visible:ring-2 focus-visible:outline-none focus-visible:ring-inset',\n immersive ? 'h-full flex-1 border-0' : 'h-full shrink-0 rounded-xl',\n classNames.item\n )}\n >\n <div\n data-slot=\"media\"\n className={cn(\n 'bg-muted flex min-h-0 flex-1 items-center justify-center p-3',\n classNames.media\n )}\n >\n {renderMedia ? (\n renderMedia(media, {\n item,\n active,\n autoPlay: allowAutoPlay,\n muted,\n loop,\n playbackRequestId,\n })\n ) : (\n <FeedMedia\n key={`${id}:${media.kind}:${media.src}:${immersive}`}\n media={media}\n title={title}\n active={active}\n autoPlay={allowAutoPlay}\n muted={muted}\n loop={loop}\n labels={labels}\n onActivate={() => select(id)}\n playbackPosition={playbackPosition}\n playbackRequestId={playbackRequestId}\n />\n )}\n </div>\n <div\n data-slot=\"details\"\n className={cn(\n 'flex max-h-[40%] shrink-0 flex-col gap-2 overflow-y-auto p-4',\n classNames.details\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0 flex-1\">\n {author && (\n <div\n data-slot=\"author\"\n className={cn(\n 'mb-2 flex items-center gap-2',\n classNames.author\n )}\n >\n <Avatar\n name={author.name}\n src={author.avatar}\n alt=\"\"\n size=\"sm\"\n />\n <span className=\"truncate text-sm font-medium\">\n {author.name}\n </span>\n </div>\n )}\n <h3\n data-slot=\"title\"\n className={cn('m-0 text-base font-semibold', classNames.title)}\n >\n {title}\n </h3>\n </div>\n {!immersive && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={labels.fullscreen}\n title={labels.fullscreen}\n onClick={(event) => {\n fullscreenTriggerRef.current = event.currentTarget;\n select(id);\n setFullscreen(true);\n }}\n >\n <Maximize2 className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n )}\n </div>\n {caption != null && (\n <div\n data-slot=\"caption\"\n className={cn(\n 'text-muted-foreground text-sm',\n classNames.caption\n )}\n >\n {caption}\n </div>\n )}\n {renderActions && (\n <div\n data-slot=\"actions\"\n className={cn(\n 'flex flex-wrap items-center gap-2',\n classNames.actions\n )}\n >\n {renderActions(item)}\n </div>\n )}\n </div>\n </article>\n );\n };\n\n const controls = (\n <div\n data-slot=\"controls\"\n className={cn(\n 'flex shrink-0 items-center justify-between gap-3 py-2',\n classNames.controls\n )}\n >\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-auto min-h-8 flex-1 py-2 [&_[data-slot=button-label]]:whitespace-normal\"\n disabled={activeIndex <= 0}\n onClick={() => navigate(activeIndex - 1)}\n leftIcon={<ChevronUp className=\"h-4 w-4\" aria-hidden=\"true\" />}\n >\n {labels.previous}\n </Button>\n <span\n role=\"status\"\n aria-live=\"polite\"\n className=\"text-muted-foreground shrink-0 text-sm whitespace-nowrap\"\n >\n {labels.position(activeIndex + 1, items.length)}\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-auto min-h-8 flex-1 py-2 [&_[data-slot=button-label]]:whitespace-normal\"\n disabled={activeIndex >= items.length - 1}\n onClick={() => navigate(activeIndex + 1)}\n rightIcon={<ChevronDown className=\"h-4 w-4\" aria-hidden=\"true\" />}\n >\n {labels.next}\n </Button>\n </div>\n );\n\n return (\n <div\n ref={setRoot}\n data-slot=\"root\"\n data-component=\"media-feed\"\n className={cn(\n 'bg-background text-foreground flex h-[min(48rem,80dvh)] min-h-0 w-full flex-col',\n classNames.root,\n className\n )}\n {...rest}\n >\n {loading || error || !items.length ? (\n <div\n data-slot=\"status\"\n role={error ? 'alert' : 'status'}\n aria-busy={loading || retrying}\n className={cn(\n 'flex min-h-0 flex-1 flex-col items-center justify-center gap-4 p-6 text-center',\n classNames.status\n )}\n >\n <p className=\"m-0\">\n {loading ? labels.loading : error || labels.empty}\n </p>\n {error && onRetry && (\n <Button\n variant=\"outline\"\n isLoading={retrying}\n loadingText={labels.loading}\n onClick={() => {\n void retry();\n }}\n >\n {labels.retry}\n </Button>\n )}\n {retryFailed && (\n <p role=\"alert\" className=\"m-0\">\n {labels.error}\n </p>\n )}\n </div>\n ) : (\n <>\n {/* ARIA feeds are focusable composites with scoped item navigation. */}\n {/* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */}\n <div\n ref={viewportRef}\n data-slot=\"viewport\"\n role=\"feed\"\n aria-label={labels.feed}\n aria-busy={false}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n className={cn(\n 'focus-visible:ring-ring relative flex min-h-0 flex-1 snap-y snap-mandatory flex-col gap-4 overflow-y-auto overscroll-contain focus-visible:ring-2 focus-visible:outline-none',\n classNames.viewport\n )}\n >\n {items.map((item, index) => renderCard(item, index, false))}\n </div>\n {/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */}\n {controls}\n </>\n )}\n <Modal\n open={fullscreen && !loading && !error && !!items.length}\n onOpenChange={setFullscreen}\n size=\"full\"\n className=\"h-dvh min-h-0 sm:h-[calc(100dvh-2rem)]\"\n >\n <ModalHeader>\n <ModalTitle>{labels.feed}</ModalTitle>\n <ModalClose aria-label={labels.close} />\n </ModalHeader>\n {/* Fullscreen keeps the same feed navigation; controls retain their keys. */}\n {/* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */}\n <div\n data-slot=\"fullscreen\"\n data-component=\"media-feed\"\n role=\"feed\"\n aria-label={labels.feed}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n className={cn(\n 'flex min-h-0 flex-1 flex-col px-2 pb-2 sm:px-4',\n classNames.fullscreen\n )}\n >\n {activeIndex >= 0 &&\n renderCard(items[activeIndex], activeIndex, true)}\n {controls}\n </div>\n {/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */}\n </Modal>\n </div>\n );\n}\n\nexport const MediaFeed = React.forwardRef(MediaFeedInner) as <T>(\n props: MediaFeedProps<T> & React.RefAttributes<HTMLDivElement>\n) => React.ReactElement;\n\n(MediaFeed as React.NamedExoticComponent).displayName = 'MediaFeed';\n"]}
1
+ {"version":3,"sources":["../src/components/MediaFeed/FeedMedia.tsx","../src/components/MediaFeed/MediaFeed.tsx"],"names":["jsx","React","jsxs","MediaPlayer","Button","Pause","Play","usePrefersReducedMotion","React2","cn","Avatar","Maximize2","ChevronUp","ChevronDown","Fragment","Modal","ModalHeader","ModalTitle","ModalClose"],"mappings":"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","file":"chunk-AJPFQF3H.cjs","sourcesContent":["import * as React from 'react';\nimport { Pause, Play } from 'lucide-react';\nimport { Button } from '../Button';\nimport { MediaPlayer, type MediaPlayerState } from '../MediaPlayer';\nimport type { MediaFeedLabels, MediaFeedMedia } from './types';\n\ninterface FeedMediaProps {\n media: MediaFeedMedia;\n title: string;\n active: boolean;\n autoPlay: boolean;\n muted: boolean;\n loop: boolean;\n labels: MediaFeedLabels;\n onActivate: () => void;\n playbackPosition: { timeMs: number; playRequested?: boolean };\n playbackRequestId?: string | number;\n}\n\n/** Only ordinary web URLs become links; media resources may use other schemes. */\nfunction sourceHref(src: string): string | undefined {\n try {\n const url = new URL(src, 'https://localhost/');\n return ['http:', 'https:'].includes(url.protocol) ? src : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction SourceLink({ src, labels }: { src: string; labels: MediaFeedLabels }) {\n const href = sourceHref(src);\n return href ? (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary-700 dark:text-primary-300 focus-visible:ring-ring rounded underline underline-offset-4 focus-visible:ring-2 focus-visible:outline-none\"\n >\n {labels.openSource}\n </a>\n ) : null;\n}\n\nfunction NativeFeedMedia({\n media,\n title,\n active,\n autoPlay,\n muted,\n loop,\n labels,\n onActivate,\n playbackPosition,\n playbackRequestId,\n}: FeedMediaProps) {\n const mediaElementRef = React.useRef<\n HTMLVideoElement | HTMLAudioElement | null\n >(null);\n const [state, setState] = React.useState<MediaPlayerState>('idle');\n const [blocked, setBlocked] = React.useState(false);\n const [retryVersion, setRetryVersion] = React.useState(0);\n const wantsPlayback = React.useRef(playbackPosition.playRequested ?? false);\n const latestPlaybackRequest = React.useRef(playbackRequestId);\n latestPlaybackRequest.current = playbackRequestId;\n const handledPlaybackRequest = React.useRef<string | number | undefined>(\n undefined\n );\n const ownershipPause = React.useRef(false);\n const attemptId = React.useRef(0);\n const activeRef = React.useRef(active);\n const canSavePosition = React.useRef(false);\n activeRef.current = active;\n\n const tryPlay = React.useCallback(async () => {\n const element = mediaElementRef.current;\n if (!element || !activeRef.current) return;\n const attempt = ++attemptId.current;\n setBlocked(false);\n try {\n // The native promise can reject when browser autoplay policy requires a\n // gesture. Playback state still comes from native events, never intent.\n await element.play();\n // A delayed request must not start a card that has since left the active\n // surface. A newer request for the same active element can finish normally.\n if (!activeRef.current || element !== mediaElementRef.current)\n element.pause();\n } catch (error) {\n if (!activeRef.current || attempt !== attemptId.current) return;\n if (error instanceof Error && error.name === 'AbortError') return;\n setBlocked(true);\n }\n }, []);\n\n const pauseForOwnership = React.useCallback(\n (element: HTMLMediaElement | null) => {\n if (element && element === mediaElementRef.current && !element.paused)\n ownershipPause.current = true;\n element?.pause();\n },\n []\n );\n\n React.useEffect(() => {\n const element = mediaElementRef.current;\n const attempts = attemptId;\n const restorePosition = () => {\n if (!element || !activeRef.current) return;\n if (playbackPosition.timeMs > 0) {\n element.currentTime = playbackPosition.timeMs / 1000;\n }\n canSavePosition.current = true;\n };\n if (active && element) {\n // Another surface can clear shared manual intent while this inline copy\n // is paused (for example, the user pauses inside fullscreen).\n wantsPlayback.current = playbackPosition.playRequested ?? false;\n if (element.readyState >= 1) restorePosition();\n else element.addEventListener('loadedmetadata', restorePosition);\n }\n if (\n active &&\n (latestPlaybackRequest.current === undefined ||\n latestPlaybackRequest.current === handledPlaybackRequest.current) &&\n (autoPlay || wantsPlayback.current)\n ) {\n void tryPlay();\n } else if (!active) {\n attemptId.current++;\n pauseForOwnership(element);\n setBlocked(false);\n }\n return () => {\n attempts.current++;\n element?.removeEventListener('loadedmetadata', restorePosition);\n if (element && canSavePosition.current)\n playbackPosition.timeMs = element.currentTime * 1000;\n pauseForOwnership(element);\n };\n }, [\n active,\n autoPlay,\n pauseForOwnership,\n playbackPosition,\n retryVersion,\n tryPlay,\n ]);\n\n React.useEffect(() => {\n if (\n !active ||\n playbackRequestId === undefined ||\n playbackRequestId === handledPlaybackRequest.current\n )\n return;\n handledPlaybackRequest.current = playbackRequestId;\n wantsPlayback.current = true;\n playbackPosition.playRequested = true;\n void tryPlay();\n }, [active, playbackRequestId, playbackPosition, tryPlay]);\n\n const togglePlayback = () => {\n if (state === 'playing') {\n wantsPlayback.current = false;\n playbackPosition.playRequested = false;\n mediaElementRef.current?.pause();\n } else {\n wantsPlayback.current = true;\n playbackPosition.playRequested = true;\n onActivate();\n if (active) void tryPlay();\n }\n };\n\n return (\n <div className=\"flex h-full min-h-0 w-full flex-col items-center justify-center gap-3\">\n <MediaPlayer\n src={media.src}\n kind={media.kind === 'audio' ? 'audio' : 'video'}\n mediaElementRef={mediaElementRef}\n muted={muted}\n loop={loop}\n poster={media.poster}\n preload={active ? 'metadata' : 'none'}\n controls={active}\n aria-label={title}\n onStateChange={(next) => {\n setState(next);\n if (next === 'playing') ownershipPause.current = false;\n if (next === 'paused') {\n if (activeRef.current && !ownershipPause.current) {\n wantsPlayback.current = false;\n playbackPosition.playRequested = false;\n }\n ownershipPause.current = false;\n }\n }}\n onTimeUpdate={(timeMs) => {\n if (canSavePosition.current) playbackPosition.timeMs = timeMs;\n }}\n onRetry={() => {\n ownershipPause.current = false;\n canSavePosition.current = false;\n setState('idle');\n setBlocked(false);\n setRetryVersion((version) => version + 1);\n }}\n labels={{ error: labels.mediaError, retry: labels.retry }}\n className=\"min-h-0 flex-1 [&_video]:h-full [&_video]:w-full\"\n />\n {state !== 'error' && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n leftIcon={\n state === 'playing' ? (\n <Pause className=\"h-4 w-4\" aria-hidden=\"true\" />\n ) : (\n <Play className=\"h-4 w-4\" aria-hidden=\"true\" />\n )\n }\n onClick={togglePlayback}\n >\n {state === 'playing' ? labels.pause : labels.play}\n </Button>\n )}\n {blocked && (\n <p\n role=\"status\"\n className=\"text-muted-foreground m-0 text-center text-sm\"\n >\n {labels.blockedAutoplay}\n </p>\n )}\n {state === 'error' && <SourceLink src={media.src} labels={labels} />}\n </div>\n );\n}\n\nfunction ImageFeedMedia({ media, title, labels }: FeedMediaProps) {\n const [failed, setFailed] = React.useState(false);\n return failed ? (\n <div role=\"alert\" className=\"flex flex-col gap-3 p-6 text-center\">\n <p className=\"text-muted-foreground m-0\">{labels.mediaError}</p>\n <SourceLink src={media.src} labels={labels} />\n </div>\n ) : (\n <img\n src={media.src}\n alt={media.alt ?? title}\n loading=\"lazy\"\n className=\"h-full max-h-full w-full object-contain\"\n onError={() => setFailed(true)}\n />\n );\n}\n\nfunction youtubeId(src: string): string | null {\n const validId = /^[A-Za-z0-9_-]{11}$/;\n if (validId.test(src)) return src;\n try {\n const url = new URL(src);\n const host = url.hostname.toLowerCase();\n const parts = url.pathname.split('/').filter(Boolean);\n let id: string | null = null;\n if (host === 'youtu.be' || host === 'www.youtu.be') {\n id = parts[0] ?? null;\n } else if (\n [\n 'youtube.com',\n 'www.youtube.com',\n 'm.youtube.com',\n 'youtube-nocookie.com',\n 'www.youtube-nocookie.com',\n ].includes(host)\n ) {\n id =\n url.searchParams.get('v') ??\n (['embed', 'shorts', 'live'].includes(parts[0]) ? parts[1] : null);\n }\n return id && validId.test(id) ? id : null;\n } catch {\n return null;\n }\n}\n\nfunction YouTubeFeedMedia({\n media,\n title,\n active,\n autoPlay,\n muted,\n loop,\n labels,\n onActivate,\n playbackRequestId,\n}: FeedMediaProps) {\n const id = youtubeId(media.src);\n const [requestedPlayback, setRequestedPlayback] = React.useState(false);\n const handledPlaybackRequest = React.useRef<string | number | undefined>(\n undefined\n );\n const pendingPlayback =\n active &&\n playbackRequestId !== undefined &&\n playbackRequestId !== handledPlaybackRequest.current;\n React.useEffect(() => {\n if (!active) setRequestedPlayback(false);\n else if (\n playbackRequestId !== undefined &&\n playbackRequestId !== handledPlaybackRequest.current\n ) {\n handledPlaybackRequest.current = playbackRequestId;\n setRequestedPlayback(true);\n }\n }, [active, playbackRequestId]);\n const embedUrl = new URL(\n `https://www.youtube-nocookie.com/embed/${id ?? ''}`\n );\n for (const [key, value] of Object.entries({\n autoplay: autoPlay || requestedPlayback || pendingPlayback ? '1' : '0',\n mute: muted ? '1' : '0',\n controls: '1',\n playsinline: '1',\n rel: '0',\n loop: loop ? '1' : '0',\n ...(loop && id ? { playlist: id } : {}),\n }))\n embedUrl.searchParams.set(key, value);\n const [failed, setFailed] = React.useState(false);\n return (\n <div className=\"flex h-full min-h-0 w-full flex-col items-center gap-3\">\n {active && id && !failed ? (\n <iframe\n src={embedUrl.href}\n title={title}\n className=\"min-h-0 w-full flex-1 border-0\"\n allow=\"autoplay; encrypted-media; picture-in-picture; fullscreen\"\n referrerPolicy=\"strict-origin-when-cross-origin\"\n allowFullScreen\n onError={() => setFailed(true)}\n />\n ) : (\n <div className=\"flex min-h-0 w-full flex-1 flex-col items-center justify-center gap-4\">\n {media.poster && (\n <img\n src={media.poster}\n alt=\"\"\n loading=\"lazy\"\n className=\"min-h-0 max-w-full flex-1 object-contain\"\n />\n )}\n {id && !failed ? (\n <Button\n variant=\"secondary\"\n leftIcon={<Play className=\"h-4 w-4\" aria-hidden=\"true\" />}\n onClick={() => {\n setRequestedPlayback(true);\n onActivate();\n }}\n >\n {labels.play}\n </Button>\n ) : (\n <p role=\"alert\" className=\"text-muted-foreground m-0\">\n {labels.mediaError}\n </p>\n )}\n </div>\n )}\n <p className=\"text-muted-foreground m-0 text-center text-sm\">\n {labels.youtubeNotice}\n </p>\n <SourceLink\n src={id ? `https://www.youtube.com/watch?v=${id}` : media.src}\n labels={labels}\n />\n </div>\n );\n}\n\n/** Native resources share UI transport; external embeds retain their controls. */\nexport function FeedMedia(props: FeedMediaProps) {\n if (props.media.kind === 'image') return <ImageFeedMedia {...props} />;\n if (props.media.kind === 'youtube') return <YouTubeFeedMedia {...props} />;\n return <NativeFeedMedia {...props} />;\n}\n","import * as React from 'react';\nimport { ChevronDown, ChevronUp, Maximize2 } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { usePrefersReducedMotion } from '../../hooks/usePrefersReducedMotion';\nimport { Avatar } from '../Avatar';\nimport { Button } from '../Button';\nimport { Modal, ModalClose, ModalHeader, ModalTitle } from '../Modal';\nimport { FeedMedia } from './FeedMedia';\nimport type { MediaFeedLabels, MediaFeedProps } from './types';\n\nconst defaultLabels: MediaFeedLabels = {\n feed: 'Media feed',\n loading: 'Loading media…',\n empty: 'No media to display.',\n error: 'Unable to load the media feed.',\n retry: 'Retry',\n fullscreen: 'Open fullscreen',\n close: 'Close fullscreen',\n previous: 'Previous item',\n next: 'Next item',\n play: 'Play',\n pause: 'Pause',\n blockedAutoplay: 'Playback did not start. Press Play to try again.',\n mediaError: 'This media is unavailable.',\n openSource: 'Open source',\n youtubeNotice: 'If embedded playback is unavailable, open the source.',\n item: (position, total) => `Media item ${position} of ${total}`,\n position: (position, total) => `${position} / ${total}`,\n};\n\n/**\n * A vertical, caller-owned media collection with one active playback surface.\n * Native players share MediaPlayer; provider-specific players can use the\n * renderMedia slot. Records, engagement actions and navigation belong to the host.\n */\nfunction MediaFeedInner<T>(\n {\n items,\n getId,\n getMedia,\n getTitle,\n getCaption,\n getAuthor,\n renderActions,\n renderMedia,\n activeItemId,\n defaultActiveItemId,\n onActiveItemChange,\n playbackRequest,\n loading = false,\n error,\n onRetry,\n autoPlay = true,\n muted = true,\n loop = true,\n labels: labelOverrides,\n classNames = {},\n className,\n ...rest\n }: MediaFeedProps<T>,\n forwardedRef: React.ForwardedRef<HTMLDivElement>\n) {\n const labels = { ...defaultLabels, ...labelOverrides };\n const prefersReducedMotion = usePrefersReducedMotion();\n const allowAutoPlay = autoPlay && !prefersReducedMotion;\n const ids = items.map(getId);\n const idsKey = JSON.stringify(ids);\n const [internalActiveId, setInternalActiveId] = React.useState(\n () => defaultActiveItemId ?? ids[0]\n );\n const requestedId = activeItemId ?? internalActiveId;\n const activeId =\n requestedId !== undefined && ids.includes(requestedId)\n ? requestedId\n : ids[0];\n const activeIndex = activeId === undefined ? -1 : ids.indexOf(activeId);\n const [fullscreen, setFullscreen] = React.useState(false);\n const [retrying, setRetrying] = React.useState(false);\n const [retryFailed, setRetryFailed] = React.useState(false);\n const rootRef = React.useRef<HTMLDivElement | null>(null);\n const viewportRef = React.useRef<HTMLDivElement | null>(null);\n const cardRefs = React.useRef(new Map<string, HTMLElement>());\n const playbackPositions = React.useRef(\n new Map<string, { src: string; timeMs: number; playRequested?: boolean }>()\n );\n const consumedPlaybackRequests = React.useRef(\n new Map<string, string | number>()\n );\n const fullscreenTriggerRef = React.useRef<HTMLButtonElement | null>(null);\n const hasObserver = typeof IntersectionObserver !== 'undefined';\n // Hydration safety: the server cannot know whether the client supports\n // IntersectionObserver, so both environments start \"not visible\" and the\n // mount effects below establish real visibility (observer callbacks, or the\n // no-observer fallback). Offscreen autoplay therefore never starts early.\n const [visibleId, setVisibleId] = React.useState<string | null>(null);\n const visibleIdRef = React.useRef(visibleId);\n const [viewportVisible, setViewportVisible] = React.useState(false);\n const [pageVisible, setPageVisible] = React.useState(\n () =>\n typeof document === 'undefined' || document.visibilityState !== 'hidden'\n );\n const latest = React.useRef({\n items,\n ids,\n activeId,\n activeItemId,\n onActiveItemChange,\n fullscreen,\n });\n latest.current = {\n items,\n ids,\n activeId,\n activeItemId,\n onActiveItemChange,\n fullscreen,\n };\n\n const setRoot = React.useCallback(\n (node: HTMLDivElement | null) => {\n rootRef.current = node;\n if (typeof forwardedRef === 'function') forwardedRef(node);\n else if (forwardedRef) forwardedRef.current = node;\n },\n [forwardedRef]\n );\n\n const select = React.useCallback((id: string) => {\n const current = latest.current;\n const index = current.ids.indexOf(id);\n if (index < 0 || id === current.activeId) return;\n if (current.activeItemId === undefined) setInternalActiveId(id);\n current.onActiveItemChange?.(current.items[index]);\n }, []);\n\n // Visibility belongs to this feed, never a global keyboard/player singleton.\n // A separate viewport observer also pauses a feed scrolled off the host page.\n React.useEffect(() => {\n const root = rootRef.current;\n if (!root || typeof IntersectionObserver === 'undefined') {\n // No-observer fallback: assume the feed is on screen.\n setViewportVisible(true);\n return;\n }\n const observer = new IntersectionObserver(([entry]) => {\n setViewportVisible(entry.isIntersecting);\n });\n observer.observe(root);\n return () => observer.disconnect();\n }, []);\n\n React.useEffect(() => {\n const viewport = viewportRef.current;\n if (!viewport || typeof IntersectionObserver === 'undefined') return;\n const ratios = new Map<string, number>();\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n const id = (entry.target as HTMLElement).dataset.mediaId;\n if (id !== undefined)\n ratios.set(id, entry.isIntersecting ? entry.intersectionRatio : 0);\n }\n let bestId: string | null = null;\n let bestRatio = 0;\n for (const [id, ratio] of ratios) {\n if (ratio > bestRatio) {\n bestId = id;\n bestRatio = ratio;\n }\n }\n visibleIdRef.current = bestId;\n setVisibleId(bestId);\n if (bestId !== null && !latest.current.fullscreen) select(bestId);\n },\n { root: viewport, threshold: [0, 0.25, 0.5, 0.75, 1] }\n );\n cardRefs.current.forEach((card) => observer.observe(card));\n return () => observer.disconnect();\n }, [idsKey, loading, error, select]);\n\n React.useEffect(() => {\n const update = () => setPageVisible(document.visibilityState !== 'hidden');\n document.addEventListener('visibilitychange', update);\n return () => document.removeEventListener('visibilitychange', update);\n }, []);\n\n // Controlled selection and initial deep links scroll within the feed, without\n // moving the surrounding inbox/page. Observer selections are already visible.\n React.useEffect(() => {\n if (activeId === undefined) return;\n if (!hasObserver) {\n visibleIdRef.current = activeId;\n setVisibleId(activeId);\n }\n if (visibleIdRef.current === activeId && hasObserver) return;\n const card = cardRefs.current.get(activeId);\n if (card && viewportRef.current) {\n viewportRef.current.scrollTo?.({ top: card.offsetTop, behavior: 'auto' });\n }\n }, [activeId, idsKey, hasObserver, loading, error]);\n\n React.useEffect(() => {\n if (!items.length) setFullscreen(false);\n }, [items.length]);\n\n // The gesture targets an already selected, visible surface. Consume it once\n // per feed so a later source/fullscreen remount cannot resurrect a paused clip.\n React.useEffect(() => {\n if (\n loading ||\n error ||\n activeIndex < 0 ||\n !playbackRequest ||\n playbackRequest.itemId !== activeId\n )\n return;\n if (\n !pageVisible ||\n (!fullscreen && (!viewportVisible || visibleId !== activeId))\n )\n return;\n consumedPlaybackRequests.current.set(\n playbackRequest.itemId,\n playbackRequest.requestId\n );\n }, [\n activeId,\n activeIndex,\n fullscreen,\n pageVisible,\n viewportVisible,\n visibleId,\n playbackRequest,\n loading,\n error,\n ]);\n\n React.useEffect(() => {\n const positions = playbackPositions.current;\n for (const id of positions.keys()) {\n if (!latest.current.ids.includes(id)) positions.delete(id);\n }\n }, [idsKey]);\n\n React.useEffect(() => {\n if (fullscreen || !fullscreenTriggerRef.current) return;\n if (fullscreenTriggerRef.current.isConnected)\n fullscreenTriggerRef.current.focus();\n else viewportRef.current?.focus();\n fullscreenTriggerRef.current = null;\n }, [fullscreen]);\n\n const navigate = (index: number, focus = false) => {\n const id = ids[Math.max(0, Math.min(index, ids.length - 1))];\n if (id === undefined) return;\n select(id);\n const card = cardRefs.current.get(id);\n if (card && viewportRef.current) {\n viewportRef.current.scrollTo?.({ top: card.offsetTop, behavior: 'auto' });\n if (focus) card.focus({ preventScroll: true });\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n // Never steal arrows/Space from a player, reaction button or chat composer.\n const target = event.target as HTMLElement;\n if (event.target !== event.currentTarget && target.dataset?.slot !== 'item')\n return;\n let next: number;\n switch (event.key) {\n case 'ArrowDown':\n case 'PageDown':\n next = activeIndex + 1;\n break;\n case 'ArrowUp':\n case 'PageUp':\n next = activeIndex - 1;\n break;\n case 'Home':\n next = 0;\n break;\n case 'End':\n next = items.length - 1;\n break;\n default:\n return;\n }\n event.preventDefault();\n navigate(next, event.target !== event.currentTarget);\n };\n\n const retry = async () => {\n if (!onRetry || retrying) return;\n setRetrying(true);\n setRetryFailed(false);\n try {\n await onRetry();\n } catch {\n setRetryFailed(true);\n } finally {\n setRetrying(false);\n }\n };\n\n const renderCard = (item: T, index: number, immersive: boolean) => {\n const id = getId(item);\n const media = getMedia(item);\n let playbackPosition = playbackPositions.current.get(id);\n if (!playbackPosition || playbackPosition.src !== media.src) {\n playbackPosition = { src: media.src, timeMs: 0 };\n playbackPositions.current.set(id, playbackPosition);\n }\n const title = getTitle?.(item) || labels.item(index + 1, items.length);\n const author = getAuthor?.(item);\n const caption = getCaption?.(item);\n const active =\n !loading &&\n !error &&\n pageVisible &&\n (immersive\n ? fullscreen && id === activeId\n : !fullscreen &&\n viewportVisible &&\n id === activeId &&\n id === visibleId);\n const playbackRequestId =\n active &&\n playbackRequest?.itemId === id &&\n consumedPlaybackRequests.current.get(id) !== playbackRequest.requestId\n ? playbackRequest.requestId\n : undefined;\n return (\n <article\n key={id}\n ref={\n immersive\n ? undefined\n : (node) => {\n if (node) cardRefs.current.set(id, node);\n else cardRefs.current.delete(id);\n }\n }\n data-slot=\"item\"\n data-media-id={id}\n data-active={active}\n aria-label={title}\n aria-posinset={index + 1}\n aria-setsize={items.length}\n tabIndex={id === activeId ? 0 : -1}\n className={cn(\n 'border-border bg-card text-card-foreground focus-visible:ring-ring flex min-h-0 w-full snap-start flex-col overflow-hidden border focus-visible:ring-2 focus-visible:outline-none focus-visible:ring-inset',\n immersive ? 'h-full flex-1 border-0' : 'h-full shrink-0 rounded-xl',\n classNames.item\n )}\n >\n <div\n data-slot=\"media\"\n className={cn(\n 'bg-muted flex min-h-0 flex-1 items-center justify-center p-3',\n classNames.media\n )}\n >\n {renderMedia ? (\n renderMedia(media, {\n item,\n active,\n autoPlay: allowAutoPlay,\n muted,\n loop,\n playbackRequestId,\n })\n ) : (\n <FeedMedia\n key={`${id}:${media.kind}:${media.src}:${immersive}`}\n media={media}\n title={title}\n active={active}\n autoPlay={allowAutoPlay}\n muted={muted}\n loop={loop}\n labels={labels}\n onActivate={() => select(id)}\n playbackPosition={playbackPosition}\n playbackRequestId={playbackRequestId}\n />\n )}\n </div>\n <div\n data-slot=\"details\"\n className={cn(\n 'flex max-h-[40%] shrink-0 flex-col gap-2 overflow-y-auto p-4',\n classNames.details\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0 flex-1\">\n {author && (\n <div\n data-slot=\"author\"\n className={cn(\n 'mb-2 flex items-center gap-2',\n classNames.author\n )}\n >\n <Avatar\n name={author.name}\n src={author.avatar}\n alt=\"\"\n size=\"sm\"\n />\n <span className=\"truncate text-sm font-medium\">\n {author.name}\n </span>\n </div>\n )}\n <h3\n data-slot=\"title\"\n className={cn('m-0 text-base font-semibold', classNames.title)}\n >\n {title}\n </h3>\n </div>\n {!immersive && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={labels.fullscreen}\n title={labels.fullscreen}\n onClick={(event) => {\n fullscreenTriggerRef.current = event.currentTarget;\n select(id);\n setFullscreen(true);\n }}\n >\n <Maximize2 className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n )}\n </div>\n {caption != null && (\n <div\n data-slot=\"caption\"\n className={cn(\n 'text-muted-foreground text-sm',\n classNames.caption\n )}\n >\n {caption}\n </div>\n )}\n {renderActions && (\n <div\n data-slot=\"actions\"\n className={cn(\n 'flex flex-wrap items-center gap-2',\n classNames.actions\n )}\n >\n {renderActions(item)}\n </div>\n )}\n </div>\n </article>\n );\n };\n\n const controls = (\n <div\n data-slot=\"controls\"\n className={cn(\n 'flex shrink-0 items-center justify-between gap-3 py-2',\n classNames.controls\n )}\n >\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-auto min-h-8 flex-1 py-2 [&_[data-slot=button-label]]:whitespace-normal\"\n disabled={activeIndex <= 0}\n onClick={() => navigate(activeIndex - 1)}\n leftIcon={<ChevronUp className=\"h-4 w-4\" aria-hidden=\"true\" />}\n >\n {labels.previous}\n </Button>\n <span\n role=\"status\"\n aria-live=\"polite\"\n className=\"text-muted-foreground shrink-0 text-sm whitespace-nowrap\"\n >\n {labels.position(activeIndex + 1, items.length)}\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-auto min-h-8 flex-1 py-2 [&_[data-slot=button-label]]:whitespace-normal\"\n disabled={activeIndex >= items.length - 1}\n onClick={() => navigate(activeIndex + 1)}\n rightIcon={<ChevronDown className=\"h-4 w-4\" aria-hidden=\"true\" />}\n >\n {labels.next}\n </Button>\n </div>\n );\n\n return (\n <div\n ref={setRoot}\n data-slot=\"root\"\n data-component=\"media-feed\"\n className={cn(\n 'bg-background text-foreground flex h-[min(48rem,80dvh)] min-h-0 w-full flex-col',\n classNames.root,\n className\n )}\n {...rest}\n >\n {loading || error || !items.length ? (\n <div\n data-slot=\"status\"\n role={error ? 'alert' : 'status'}\n aria-busy={loading || retrying}\n className={cn(\n 'flex min-h-0 flex-1 flex-col items-center justify-center gap-4 p-6 text-center',\n classNames.status\n )}\n >\n <p className=\"m-0\">\n {loading ? labels.loading : error || labels.empty}\n </p>\n {error && onRetry && (\n <Button\n variant=\"outline\"\n isLoading={retrying}\n loadingText={labels.loading}\n onClick={() => {\n void retry();\n }}\n >\n {labels.retry}\n </Button>\n )}\n {retryFailed && (\n <p role=\"alert\" className=\"m-0\">\n {labels.error}\n </p>\n )}\n </div>\n ) : (\n <>\n {/* ARIA feeds are focusable composites with scoped item navigation. */}\n {/* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */}\n <div\n ref={viewportRef}\n data-slot=\"viewport\"\n role=\"feed\"\n aria-label={labels.feed}\n aria-busy={false}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n className={cn(\n 'focus-visible:ring-ring relative flex min-h-0 flex-1 snap-y snap-mandatory flex-col gap-4 overflow-y-auto overscroll-contain focus-visible:ring-2 focus-visible:outline-none',\n classNames.viewport\n )}\n >\n {items.map((item, index) => renderCard(item, index, false))}\n </div>\n {/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */}\n {controls}\n </>\n )}\n <Modal\n open={fullscreen && !loading && !error && !!items.length}\n onOpenChange={setFullscreen}\n size=\"full\"\n className=\"h-dvh min-h-0 sm:h-[calc(100dvh-2rem)]\"\n >\n <ModalHeader>\n <ModalTitle>{labels.feed}</ModalTitle>\n <ModalClose aria-label={labels.close} />\n </ModalHeader>\n {/* Fullscreen keeps the same feed navigation; controls retain their keys. */}\n {/* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */}\n <div\n data-slot=\"fullscreen\"\n data-component=\"media-feed\"\n role=\"feed\"\n aria-label={labels.feed}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n className={cn(\n 'flex min-h-0 flex-1 flex-col px-2 pb-2 sm:px-4',\n classNames.fullscreen\n )}\n >\n {activeIndex >= 0 &&\n renderCard(items[activeIndex], activeIndex, true)}\n {controls}\n </div>\n {/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */}\n </Modal>\n </div>\n );\n}\n\nexport const MediaFeed = React.forwardRef(MediaFeedInner) as <T>(\n props: MediaFeedProps<T> & React.RefAttributes<HTMLDivElement>\n) => React.ReactElement;\n\n(MediaFeed as React.NamedExoticComponent).displayName = 'MediaFeed';\n"]}
@@ -1,5 +1,6 @@
1
1
  'use strict';
2
2
 
3
+ var chunk2I4IRQQG_cjs = require('./chunk-2I4IRQQG.cjs');
3
4
  var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
4
5
  var React = require('react');
5
6
  var jsxRuntime = require('react/jsx-runtime');
@@ -63,29 +64,13 @@ var CompletenessMeter = React__namespace.forwardRef(function CompletenessMeter2(
63
64
  const compact = variant === "compact";
64
65
  const bar = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
65
66
  /* @__PURE__ */ jsxRuntime.jsx(
66
- "div",
67
+ chunk2I4IRQQG_cjs.Progress,
67
68
  {
68
- role: "progressbar",
69
- "aria-valuenow": percent,
70
- "aria-valuemin": 0,
71
- "aria-valuemax": 100,
72
- "aria-valuetext": labels.percent(percent),
73
- "aria-label": labels.progress,
74
- "data-slot": "completeness-meter-bar",
75
- className: chunkS5RVSXDV_cjs.cn(
76
- "bg-muted h-2 overflow-hidden rounded-full",
77
- compact ? "w-24" : "flex-1"
78
- ),
79
- children: /* @__PURE__ */ jsxRuntime.jsx(
80
- "div",
81
- {
82
- className: chunkS5RVSXDV_cjs.cn(
83
- "h-full rounded-full motion-safe:transition-[width] motion-safe:duration-300",
84
- tone(percent)
85
- ),
86
- style: { width: `${percent}%` }
87
- }
88
- )
69
+ value: percent,
70
+ srLabel: labels.progress,
71
+ valueText: labels.percent(percent),
72
+ fillClassName: tone(percent),
73
+ className: compact ? "w-24" : "flex-1"
89
74
  }
90
75
  ),
91
76
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground text-xs font-medium tabular-nums", children: labels.percent(percent) })
@@ -150,5 +135,5 @@ var CompletenessMeter = React__namespace.forwardRef(function CompletenessMeter2(
150
135
  exports.CompletenessMeter = CompletenessMeter;
151
136
  exports.defaultCompletenessMeterLabels = defaultCompletenessMeterLabels;
152
137
  exports.getCompleteness = getCompleteness;
153
- //# sourceMappingURL=chunk-I2MMUFCN.cjs.map
154
- //# sourceMappingURL=chunk-I2MMUFCN.cjs.map
138
+ //# sourceMappingURL=chunk-ARIJ5OHW.cjs.map
139
+ //# sourceMappingURL=chunk-ARIJ5OHW.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/CompletenessMeter/CompletenessMeter.tsx"],"names":["React","CompletenessMeter","jsxs","jsx","Progress","cn"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BO,IAAM,8BAAA,GAA0D;AAAA,EACrE,KAAA,EAAO,mBAAA;AAAA,EACP,QAAA,EAAU,mBAAA;AAAA,EACV,OAAA,EAAS,CAAC,OAAA,KAAY,CAAA,EAAG,OAAO,CAAA,CAAA,CAAA;AAAA,EAChC,OAAA,EAAS,CAAC,KAAA,KAAU,CAAA,SAAA,EAAY,KAAK,CAAA,CAAA,CAAA;AAAA,EACrC,WAAA,EAAa;AACf;AAGO,SAAS,gBAAgB,MAAA,EAA6B;AAC3D,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,MAAM,CAAA,GACJ,CAAA,CAAE,MAAA,KAAW,MAAA,GACT,IACA,MAAA,CAAO,QAAA,CAAS,CAAA,CAAE,MAAM,IACtB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,GACpB,CAAA;AACR,IAAA,KAAA,IAAS,CAAA;AACT,IAAA,IAAI,CAAA,CAAE,UAAU,IAAA,IAAQ,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,QAAQ,CAAA,GAAI,IAAA,CAAK,MAAO,IAAA,GAAO,KAAA,GAAS,GAAG,CAAA,GAAI,GAAA;AAAA,IACxD,SAAS,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,QAAQ;AAAA,GAC3C;AACF;AAEA,SAAS,KAAK,OAAA,EAAiB;AAC7B,EAAA,IAAI,OAAA,IAAW,IAAI,OAAO,gBAAA;AAC1B,EAAA,IAAI,OAAA,IAAW,IAAI,OAAO,gBAAA;AAC1B,EAAA,OAAO,oBAAA;AACT;AAsBO,IAAM,iBAAA,GAA0BA,gBAAA,CAAA,UAAA,CAGrC,SAASC,kBAAAA,CACT;AAAA,EACE,MAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,YAAA;AAAA,EACA,MAAA,EAAQ,cAAA;AAAA,EACR,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,8BAAA,EAAgC,GAAG,cAAA,EAAe;AACtE,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,gBAAgB,MAAM,CAAA;AACnD,EAAA,MAAM,UAAgBD,gBAAA,CAAA,KAAA,EAAM;AAC5B,EAAA,MAAM,UAAU,OAAA,KAAY,SAAA;AAE5B,EAAA,MAAM,GAAA,mBACJE,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,cAAA;AAAA,MAACC,0BAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,OAAA;AAAA,QACP,SAAS,MAAA,CAAO,QAAA;AAAA,QAChB,SAAA,EAAW,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AAAA,QACjC,aAAA,EAAe,KAAK,OAAO,CAAA;AAAA,QAC3B,SAAA,EAAW,UAAU,MAAA,GAAS;AAAA;AAAA,KAChC;AAAA,mCACC,MAAA,EAAA,EAAK,SAAA,EAAU,0DACb,QAAA,EAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EACzB;AAAA,GAAA,EACF,CAAA;AAGF,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACED,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,oBAAA;AAAA,QACV,SAAA,EAAWE,oBAAA,CAAG,aAAA,EAAe,SAAS,CAAA;AAAA,QACrC,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,uBACEH,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA,EAAK,OAAA;AAAA,MACL,iBAAA,EAAiB,OAAA;AAAA,MACjB,WAAA,EAAU,oBAAA;AAAA,MACV,SAAA,EAAWG,oBAAA,CAAG,6BAAA,EAA+B,SAAS,CAAA;AAAA,MACrD,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAF,cAAA,CAAC,QAAG,EAAA,EAAI,OAAA,EAAS,SAAA,EAAU,uCAAA,EACxB,iBAAO,KAAA,EACV,CAAA;AAAA,QACC,GAAA;AAAA,QACA,OAAA,CAAQ,MAAA,KAAW,CAAA,mBAClBA,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gDAAA,EACV,QAAA,EAAA,MAAA,CAAO,WAAA,EACV,CAAA,mBAEAD,eAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAC,cAAA,CAAC,OAAE,SAAA,EAAU,oCAAA,EACV,iBAAO,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,EAChC,CAAA;AAAA,0BACAA,cAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,qBAAA;AAAA,cACV,WAAA,EAAU,4BAAA;AAAA,cAET,kBAAQ,GAAA,CAAI,CAAC,sBACZD,eAAA,CAAC,IAAA,EAAA,EAAe,WAAU,mCAAA,EACxB,QAAA,EAAA;AAAA,gCAAAC,cAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,aAAA,EAAY,MAAA;AAAA,oBACZ,SAAA,EAAU;AAAA;AAAA,iBACZ;AAAA,gBACC,YAAA,mBACCA,cAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAS,MAAM,YAAA,CAAa,CAAA,CAAE,GAAG,CAAA;AAAA,oBACjC,SAAA,EAAU,sLAAA;AAAA,oBAET,QAAA,EAAA,CAAA,CAAE;AAAA;AAAA,oCAGLA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAmB,YAAE,KAAA,EAAM;AAAA,eAAA,EAAA,EAdtC,CAAA,CAAE,GAgBX,CACD;AAAA;AAAA;AACH,SAAA,EACF;AAAA;AAAA;AAAA,GAEJ;AAEJ,CAAC","file":"chunk-ARIJ5OHW.cjs","sourcesContent":["import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Progress } from '../Progress';\n\nexport interface CompletenessField {\n /** Stable key, passed back to `onFieldClick`. */\n key: string;\n /** Display name of the field. */\n label: string;\n /** Whether the field has a value. */\n complete: boolean;\n /** Relative importance; defaults to 1. */\n weight?: number;\n}\n\nexport interface CompletenessMeterLabels {\n /** Heading of the full variant. */\n title: string;\n /** Accessible name of the progress bar. */\n progress: string;\n /** Visible percentage and `aria-valuetext`. */\n percent: (percent: number) => string;\n /** Heading of the missing-fields list. */\n missing: (count: number) => string;\n /** Shown when nothing is missing. */\n allComplete: string;\n}\n\nexport const defaultCompletenessMeterLabels: CompletenessMeterLabels = {\n title: 'Data completeness',\n progress: 'Data completeness',\n percent: (percent) => `${percent}%`,\n missing: (count) => `Missing (${count})`,\n allComplete: 'All fields complete',\n};\n\n/** Weighted completion percentage (0–100) and the incomplete fields. */\nexport function getCompleteness(fields: CompletenessField[]) {\n let total = 0;\n let done = 0;\n for (const f of fields) {\n const w =\n f.weight === undefined\n ? 1\n : Number.isFinite(f.weight)\n ? Math.max(0, f.weight)\n : 0;\n total += w;\n if (f.complete) done += w;\n }\n return {\n percent: total > 0 ? Math.round((done / total) * 100) : 100,\n missing: fields.filter((f) => !f.complete),\n };\n}\n\nfunction tone(percent: number) {\n if (percent >= 80) return 'bg-success-500';\n if (percent >= 50) return 'bg-warning-500';\n return 'bg-destructive-500';\n}\n\nexport interface CompletenessMeterProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Fields that make up the record. */\n fields: CompletenessField[];\n /** `compact` shows the bar and percentage only. */\n variant?: 'default' | 'compact';\n /** Makes each missing field a button, e.g. to focus its input. */\n onFieldClick?: (key: string) => void;\n /** Overrides for any user-facing string. */\n labels?: Partial<CompletenessMeterLabels>;\n}\n\n/**\n * How complete a record is: a weighted percentage, a progress bar and the\n * list of missing fields.\n *\n * @example\n * ```tsx\n * <CompletenessMeter fields={fields} onFieldClick={(key) => focusField(key)} />\n * ```\n */\nexport const CompletenessMeter = React.forwardRef<\n HTMLDivElement,\n CompletenessMeterProps\n>(function CompletenessMeter(\n {\n fields,\n variant = 'default',\n onFieldClick,\n labels: labelOverrides,\n className,\n ...props\n },\n ref\n) {\n const labels = { ...defaultCompletenessMeterLabels, ...labelOverrides };\n const { percent, missing } = getCompleteness(fields);\n const titleId = React.useId();\n const compact = variant === 'compact';\n\n const bar = (\n <div className=\"flex items-center gap-2\">\n <Progress\n value={percent}\n srLabel={labels.progress}\n valueText={labels.percent(percent)}\n fillClassName={tone(percent)}\n className={compact ? 'w-24' : 'flex-1'}\n />\n <span className=\"text-muted-foreground text-xs font-medium tabular-nums\">\n {labels.percent(percent)}\n </span>\n </div>\n );\n\n if (compact) {\n return (\n <div\n ref={ref}\n data-slot=\"completeness-meter\"\n className={cn('inline-flex', className)}\n {...props}\n >\n {bar}\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-labelledby={titleId}\n data-slot=\"completeness-meter\"\n className={cn('flex flex-col gap-2 text-sm', className)}\n {...props}\n >\n <h3 id={titleId} className=\"text-foreground text-sm font-semibold\">\n {labels.title}\n </h3>\n {bar}\n {missing.length === 0 ? (\n <p className=\"text-success-700 dark:text-success-400 text-xs\">\n {labels.allComplete}\n </p>\n ) : (\n <div>\n <p className=\"text-muted-foreground mb-1 text-xs\">\n {labels.missing(missing.length)}\n </p>\n <ul\n className=\"flex flex-col gap-1\"\n data-slot=\"completeness-meter-missing\"\n >\n {missing.map((f) => (\n <li key={f.key} className=\"flex items-center gap-1.5 text-xs\">\n <span\n aria-hidden=\"true\"\n className=\"bg-destructive-500 h-1.5 w-1.5 shrink-0 rounded-full\"\n />\n {onFieldClick ? (\n <button\n type=\"button\"\n onClick={() => onFieldClick(f.key)}\n className=\"text-foreground decoration-primary-500 focus-visible:ring-ring rounded-sm text-start underline underline-offset-2 hover:decoration-2 focus-visible:ring-2 focus-visible:outline-none\"\n >\n {f.label}\n </button>\n ) : (\n <span className=\"text-foreground\">{f.label}</span>\n )}\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n );\n});\n"]}
@@ -3,7 +3,7 @@
3
3
  var chunkIWRBJHO3_cjs = require('./chunk-IWRBJHO3.cjs');
4
4
  var chunk7IRTD4JT_cjs = require('./chunk-7IRTD4JT.cjs');
5
5
  var chunkGKDHMNUA_cjs = require('./chunk-GKDHMNUA.cjs');
6
- var chunkYVL3XATO_cjs = require('./chunk-YVL3XATO.cjs');
6
+ var chunk7E46YDOT_cjs = require('./chunk-7E46YDOT.cjs');
7
7
  var chunkANMX7YDL_cjs = require('./chunk-ANMX7YDL.cjs');
8
8
  var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
9
9
  var React = require('react');
@@ -243,7 +243,7 @@ var AssociationList = React__namespace.forwardRef(
243
243
  children: title
244
244
  }
245
245
  ),
246
- !loading && !error && /* @__PURE__ */ jsxRuntime.jsx(chunkYVL3XATO_cjs.Badge, { size: "sm", variant: "secondary", children: items.length }),
246
+ !loading && !error && /* @__PURE__ */ jsxRuntime.jsx(chunk7E46YDOT_cjs.Badge, { size: "sm", variant: "secondary", children: items.length }),
247
247
  onAdd && /* @__PURE__ */ jsxRuntime.jsx(
248
248
  chunkANMX7YDL_cjs.Button,
249
249
  {
@@ -267,5 +267,5 @@ AssociationList.displayName = "AssociationList";
267
267
 
268
268
  exports.AssociationList = AssociationList;
269
269
  exports.defaultAssociationListLabels = defaultAssociationListLabels;
270
- //# sourceMappingURL=chunk-VOYLX32A.cjs.map
271
- //# sourceMappingURL=chunk-VOYLX32A.cjs.map
270
+ //# sourceMappingURL=chunk-CLQW724U.cjs.map
271
+ //# sourceMappingURL=chunk-CLQW724U.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/AssociationList/AssociationList.tsx"],"names":["React","usePendingOverrides","jsx","RecordState","cn","jsxs","Fragment","Avatar","LoaderCircle","X","Button","Badge","Plus"],"mappings":"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","file":"chunk-VOYLX32A.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { LoaderCircle, Plus, X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Avatar } from '../Avatar';\nimport { Badge } from '../Badge';\nimport { Button } from '../Button';\nimport { RecordState } from '../ActivityFeed/RecordState';\nimport { usePendingOverrides } from '../ActivityFeed/usePendingOverrides';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface AssociationListItem {\n id: string;\n name: string;\n subtitle?: string;\n avatarUrl?: string;\n}\n\nexport interface AssociationListLabels {\n loading: string;\n empty: string;\n error: string;\n retry: string;\n add: string;\n /** Accessible name of an item's remove button. */\n remove: (name: string) => string;\n showAll: (count: number) => string;\n showLess: string;\n}\n\nexport const defaultAssociationListLabels: AssociationListLabels = {\n loading: 'Loading',\n empty: 'None yet',\n error: 'Could not load these records',\n retry: 'Try again',\n add: 'Add',\n remove: (name) => `Remove ${name}`,\n showAll: (count) => `Show all (${count})`,\n showLess: 'Show less',\n};\n\nexport type AssociationListSlot =\n | 'header'\n | 'list'\n | 'item'\n | 'toggle'\n | 'state';\n\nexport interface AssociationListProps extends Omit<\n React.HTMLAttributes<HTMLElement>,\n 'children' | 'title'\n> {\n /** Card heading, e.g. \"Contacts\". */\n title: string;\n items: AssociationListItem[];\n loading?: boolean;\n error?: Error | null;\n onRetry?: () => void;\n /** Items shown before \"Show all\". Defaults to 5. */\n maxVisible?: number;\n onOpen?: (id: string, item: AssociationListItem) => void;\n getHref?: (id: string, item: AssociationListItem) => string;\n /** Renders the header's add button. */\n onAdd?: () => void;\n /** Confirmation is the caller's; the row shows pending until the promise settles. */\n onRemove?: (id: string, item: AssociationListItem) => void | Promise<void>;\n /** Trailing content per row, e.g. a role badge. */\n renderItemMeta?: (item: AssociationListItem) => React.ReactNode;\n emptyState?: React.ReactNode;\n labels?: Partial<AssociationListLabels>;\n classNames?: Partial<Record<AssociationListSlot, string>>;\n headingLevel?: 'h2' | 'h3' | 'h4';\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\n/**\n * A card of records related to the current one. Declared\n * `parameters.catalog.collection` — its load states are part of the API.\n */\nexport const AssociationList = React.forwardRef<\n HTMLElement,\n AssociationListProps\n>(\n (\n {\n title,\n items,\n loading = false,\n error = null,\n onRetry,\n maxVisible = 5,\n onOpen,\n getHref,\n onAdd,\n onRemove,\n renderItemMeta,\n emptyState,\n labels,\n classNames,\n headingLevel: Heading = 'h3',\n className,\n ...rest\n },\n ref\n ) => {\n const text = { ...defaultAssociationListLabels, ...labels };\n const headingId = React.useId();\n const listId = React.useId();\n const [expanded, setExpanded] = React.useState(false);\n const [pending, runRemove] = usePendingOverrides<true>();\n\n const shown = expanded ? items : items.slice(0, maxVisible);\n const linkClasses =\n 'text-foreground block truncate rounded-sm text-sm font-medium hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring';\n\n let body: React.ReactNode;\n if (error) {\n body = (\n <RecordState\n kind=\"error\"\n slot=\"association-list-state\"\n message={text.error}\n retryLabel={text.retry}\n onRetry={onRetry}\n className={cn('py-6', classNames?.state)}\n />\n );\n } else if (loading) {\n body = (\n <RecordState\n kind=\"loading\"\n slot=\"association-list-state\"\n message={text.loading}\n rows={2}\n className={classNames?.state}\n />\n );\n } else if (items.length === 0) {\n body = emptyState ?? (\n <RecordState\n kind=\"empty\"\n slot=\"association-list-state\"\n message={text.empty}\n className={cn('py-6', classNames?.state)}\n />\n );\n } else {\n body = (\n <>\n <ul\n id={listId}\n data-slot=\"association-list-list\"\n className={cn('divide-border divide-y', classNames?.list)}\n >\n {shown.map((item) => {\n const isPending = pending.has(item.id);\n const href = getHref?.(item.id, item);\n let name: React.ReactNode = (\n <span className=\"text-foreground block truncate text-sm font-medium\">\n {item.name}\n </span>\n );\n if (href) {\n name = (\n <a\n href={href}\n className={linkClasses}\n onClick={(event) => {\n if (\n !onOpen ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.button !== 0\n )\n return;\n event.preventDefault();\n onOpen(item.id, item);\n }}\n >\n {item.name}\n </a>\n );\n } else if (onOpen) {\n name = (\n <button\n type=\"button\"\n className={cn(linkClasses, 'max-w-full text-start')}\n onClick={() => onOpen(item.id, item)}\n >\n {item.name}\n </button>\n );\n }\n return (\n <li\n key={item.id}\n data-slot=\"association-list-item\"\n aria-busy={isPending || undefined}\n className={cn(\n 'flex items-center gap-3 px-4 py-2.5',\n isPending && 'opacity-60',\n classNames?.item\n )}\n >\n <Avatar\n size=\"sm\"\n name={item.name}\n src={item.avatarUrl}\n alt=\"\"\n aria-hidden\n className=\"shrink-0\"\n />\n <div className=\"min-w-0 flex-1\">\n {name}\n {item.subtitle && (\n <span className=\"text-muted-foreground block truncate text-xs\">\n {item.subtitle}\n </span>\n )}\n </div>\n {renderItemMeta?.(item)}\n {onRemove && (\n <button\n type=\"button\"\n aria-label={text.remove(item.name)}\n title={text.remove(item.name)}\n disabled={isPending}\n onClick={() =>\n void runRemove(item.id, true, () =>\n onRemove(item.id, item)\n )\n }\n className={cn(\n 'text-muted-foreground hover:bg-muted hover:text-foreground shrink-0 rounded-md p-1.5',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none'\n )}\n >\n {isPending ? (\n <LoaderCircle\n className=\"size-4 animate-spin motion-reduce:animate-none\"\n aria-hidden\n />\n ) : (\n <X className=\"size-4\" aria-hidden />\n )}\n </button>\n )}\n </li>\n );\n })}\n </ul>\n {items.length > maxVisible && (\n <div className=\"border-border border-t px-2 py-1.5\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n fullWidth\n aria-expanded={expanded}\n aria-controls={listId}\n data-slot=\"association-list-toggle\"\n className={classNames?.toggle}\n onClick={() => setExpanded((e) => !e)}\n >\n {expanded ? text.showLess : text.showAll(items.length)}\n </Button>\n </div>\n )}\n </>\n );\n }\n\n return (\n <section\n ref={ref}\n aria-labelledby={headingId}\n data-slot=\"association-list\"\n className={cn(\n 'border-border bg-card overflow-hidden rounded-lg border',\n className\n )}\n {...rest}\n >\n <div\n data-slot=\"association-list-header\"\n className={cn(\n 'border-border flex items-center gap-2 border-b px-4 py-2.5',\n classNames?.header\n )}\n >\n <Heading\n id={headingId}\n className=\"text-foreground min-w-0 flex-1 truncate text-sm font-semibold\"\n >\n {title}\n </Heading>\n {!loading && !error && (\n <Badge size=\"sm\" variant=\"secondary\">\n {items.length}\n </Badge>\n )}\n {onAdd && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onAdd}\n leftIcon={<Plus className=\"size-4\" aria-hidden />}\n >\n {text.add}\n </Button>\n )}\n </div>\n {body}\n </section>\n );\n }\n);\n\nAssociationList.displayName = 'AssociationList';\n"]}
1
+ {"version":3,"sources":["../src/components/AssociationList/AssociationList.tsx"],"names":["React","usePendingOverrides","jsx","RecordState","cn","jsxs","Fragment","Avatar","LoaderCircle","X","Button","Badge","Plus"],"mappings":"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","file":"chunk-CLQW724U.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { LoaderCircle, Plus, X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Avatar } from '../Avatar';\nimport { Badge } from '../Badge';\nimport { Button } from '../Button';\nimport { RecordState } from '../ActivityFeed/RecordState';\nimport { usePendingOverrides } from '../ActivityFeed/usePendingOverrides';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface AssociationListItem {\n id: string;\n name: string;\n subtitle?: string;\n avatarUrl?: string;\n}\n\nexport interface AssociationListLabels {\n loading: string;\n empty: string;\n error: string;\n retry: string;\n add: string;\n /** Accessible name of an item's remove button. */\n remove: (name: string) => string;\n showAll: (count: number) => string;\n showLess: string;\n}\n\nexport const defaultAssociationListLabels: AssociationListLabels = {\n loading: 'Loading',\n empty: 'None yet',\n error: 'Could not load these records',\n retry: 'Try again',\n add: 'Add',\n remove: (name) => `Remove ${name}`,\n showAll: (count) => `Show all (${count})`,\n showLess: 'Show less',\n};\n\nexport type AssociationListSlot =\n | 'header'\n | 'list'\n | 'item'\n | 'toggle'\n | 'state';\n\nexport interface AssociationListProps extends Omit<\n React.HTMLAttributes<HTMLElement>,\n 'children' | 'title'\n> {\n /** Card heading, e.g. \"Contacts\". */\n title: string;\n items: AssociationListItem[];\n loading?: boolean;\n error?: Error | null;\n onRetry?: () => void;\n /** Items shown before \"Show all\". Defaults to 5. */\n maxVisible?: number;\n onOpen?: (id: string, item: AssociationListItem) => void;\n getHref?: (id: string, item: AssociationListItem) => string;\n /** Renders the header's add button. */\n onAdd?: () => void;\n /** Confirmation is the caller's; the row shows pending until the promise settles. */\n onRemove?: (id: string, item: AssociationListItem) => void | Promise<void>;\n /** Trailing content per row, e.g. a role badge. */\n renderItemMeta?: (item: AssociationListItem) => React.ReactNode;\n emptyState?: React.ReactNode;\n labels?: Partial<AssociationListLabels>;\n classNames?: Partial<Record<AssociationListSlot, string>>;\n headingLevel?: 'h2' | 'h3' | 'h4';\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\n/**\n * A card of records related to the current one. Declared\n * `parameters.catalog.collection` — its load states are part of the API.\n */\nexport const AssociationList = React.forwardRef<\n HTMLElement,\n AssociationListProps\n>(\n (\n {\n title,\n items,\n loading = false,\n error = null,\n onRetry,\n maxVisible = 5,\n onOpen,\n getHref,\n onAdd,\n onRemove,\n renderItemMeta,\n emptyState,\n labels,\n classNames,\n headingLevel: Heading = 'h3',\n className,\n ...rest\n },\n ref\n ) => {\n const text = { ...defaultAssociationListLabels, ...labels };\n const headingId = React.useId();\n const listId = React.useId();\n const [expanded, setExpanded] = React.useState(false);\n const [pending, runRemove] = usePendingOverrides<true>();\n\n const shown = expanded ? items : items.slice(0, maxVisible);\n const linkClasses =\n 'text-foreground block truncate rounded-sm text-sm font-medium hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring';\n\n let body: React.ReactNode;\n if (error) {\n body = (\n <RecordState\n kind=\"error\"\n slot=\"association-list-state\"\n message={text.error}\n retryLabel={text.retry}\n onRetry={onRetry}\n className={cn('py-6', classNames?.state)}\n />\n );\n } else if (loading) {\n body = (\n <RecordState\n kind=\"loading\"\n slot=\"association-list-state\"\n message={text.loading}\n rows={2}\n className={classNames?.state}\n />\n );\n } else if (items.length === 0) {\n body = emptyState ?? (\n <RecordState\n kind=\"empty\"\n slot=\"association-list-state\"\n message={text.empty}\n className={cn('py-6', classNames?.state)}\n />\n );\n } else {\n body = (\n <>\n <ul\n id={listId}\n data-slot=\"association-list-list\"\n className={cn('divide-border divide-y', classNames?.list)}\n >\n {shown.map((item) => {\n const isPending = pending.has(item.id);\n const href = getHref?.(item.id, item);\n let name: React.ReactNode = (\n <span className=\"text-foreground block truncate text-sm font-medium\">\n {item.name}\n </span>\n );\n if (href) {\n name = (\n <a\n href={href}\n className={linkClasses}\n onClick={(event) => {\n if (\n !onOpen ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.button !== 0\n )\n return;\n event.preventDefault();\n onOpen(item.id, item);\n }}\n >\n {item.name}\n </a>\n );\n } else if (onOpen) {\n name = (\n <button\n type=\"button\"\n className={cn(linkClasses, 'max-w-full text-start')}\n onClick={() => onOpen(item.id, item)}\n >\n {item.name}\n </button>\n );\n }\n return (\n <li\n key={item.id}\n data-slot=\"association-list-item\"\n aria-busy={isPending || undefined}\n className={cn(\n 'flex items-center gap-3 px-4 py-2.5',\n isPending && 'opacity-60',\n classNames?.item\n )}\n >\n <Avatar\n size=\"sm\"\n name={item.name}\n src={item.avatarUrl}\n alt=\"\"\n aria-hidden\n className=\"shrink-0\"\n />\n <div className=\"min-w-0 flex-1\">\n {name}\n {item.subtitle && (\n <span className=\"text-muted-foreground block truncate text-xs\">\n {item.subtitle}\n </span>\n )}\n </div>\n {renderItemMeta?.(item)}\n {onRemove && (\n <button\n type=\"button\"\n aria-label={text.remove(item.name)}\n title={text.remove(item.name)}\n disabled={isPending}\n onClick={() =>\n void runRemove(item.id, true, () =>\n onRemove(item.id, item)\n )\n }\n className={cn(\n 'text-muted-foreground hover:bg-muted hover:text-foreground shrink-0 rounded-md p-1.5',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none'\n )}\n >\n {isPending ? (\n <LoaderCircle\n className=\"size-4 animate-spin motion-reduce:animate-none\"\n aria-hidden\n />\n ) : (\n <X className=\"size-4\" aria-hidden />\n )}\n </button>\n )}\n </li>\n );\n })}\n </ul>\n {items.length > maxVisible && (\n <div className=\"border-border border-t px-2 py-1.5\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n fullWidth\n aria-expanded={expanded}\n aria-controls={listId}\n data-slot=\"association-list-toggle\"\n className={classNames?.toggle}\n onClick={() => setExpanded((e) => !e)}\n >\n {expanded ? text.showLess : text.showAll(items.length)}\n </Button>\n </div>\n )}\n </>\n );\n }\n\n return (\n <section\n ref={ref}\n aria-labelledby={headingId}\n data-slot=\"association-list\"\n className={cn(\n 'border-border bg-card overflow-hidden rounded-lg border',\n className\n )}\n {...rest}\n >\n <div\n data-slot=\"association-list-header\"\n className={cn(\n 'border-border flex items-center gap-2 border-b px-4 py-2.5',\n classNames?.header\n )}\n >\n <Heading\n id={headingId}\n className=\"text-foreground min-w-0 flex-1 truncate text-sm font-semibold\"\n >\n {title}\n </Heading>\n {!loading && !error && (\n <Badge size=\"sm\" variant=\"secondary\">\n {items.length}\n </Badge>\n )}\n {onAdd && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onAdd}\n leftIcon={<Plus className=\"size-4\" aria-hidden />}\n >\n {text.add}\n </Button>\n )}\n </div>\n {body}\n </section>\n );\n }\n);\n\nAssociationList.displayName = 'AssociationList';\n"]}
@@ -1,10 +1,11 @@
1
1
  import { useClickOutside } from './chunk-62ZOA6PX.js';
2
2
  import { useAnchoredPosition } from './chunk-WSNMQQ4P.js';
3
+ import { Badge } from './chunk-522WJIVI.js';
3
4
  import { cn } from './chunk-TQONQSJO.js';
4
5
  import * as React from 'react';
5
6
  import { createPortal } from 'react-dom';
6
7
  import { cva } from 'class-variance-authority';
7
- import { X, Loader2 } from 'lucide-react';
8
+ import { Loader2 } from 'lucide-react';
8
9
  import { jsxs, jsx } from 'react/jsx-runtime';
9
10
 
10
11
  var defaultTagEditorLabels = {
@@ -183,28 +184,24 @@ var TagEditor = React.forwardRef(
183
184
  {
184
185
  "aria-label": label ?? labels.input,
185
186
  className: "flex max-w-full flex-wrap items-center gap-1.5",
186
- children: value.map((tag, index) => /* @__PURE__ */ jsxs(
187
+ children: value.map((tag, index) => /* @__PURE__ */ jsx(
187
188
  "li",
188
189
  {
189
190
  "data-slot": "tag-editor-tag",
190
- className: "bg-primary-100 text-primary-900 dark:bg-primary-900 dark:text-primary-100 inline-flex max-w-full items-center gap-1 rounded-full py-0.5 ps-2.5 pe-1 text-sm",
191
- children: [
192
- /* @__PURE__ */ jsx("span", { className: "truncate", children: tag }),
193
- !readOnly && /* @__PURE__ */ jsx(
194
- "button",
195
- {
196
- type: "button",
197
- "aria-label": labels.remove(tag),
198
- disabled: !interactive,
199
- onClick: (e) => {
200
- e.stopPropagation();
201
- remove(index);
202
- },
203
- className: "hover:bg-primary-200 dark:hover:bg-primary-800 focus-visible:ring-ring rounded-full p-0.5 focus-visible:ring-2 focus-visible:outline-none disabled:opacity-50",
204
- children: /* @__PURE__ */ jsx(X, { "aria-hidden": "true", className: "h-3 w-3" })
205
- }
206
- )
207
- ]
191
+ className: "inline-flex max-w-full",
192
+ children: /* @__PURE__ */ jsx(
193
+ Badge,
194
+ {
195
+ className: "max-w-full",
196
+ onRemove: readOnly ? void 0 : (e) => {
197
+ e.stopPropagation();
198
+ remove(index);
199
+ },
200
+ removeLabel: labels.remove(tag),
201
+ removeDisabled: !interactive,
202
+ children: /* @__PURE__ */ jsx("span", { className: "truncate", children: tag })
203
+ }
204
+ )
208
205
  },
209
206
  tag
210
207
  ))
@@ -304,5 +301,5 @@ var TagEditor = React.forwardRef(
304
301
  TagEditor.displayName = "TagEditor";
305
302
 
306
303
  export { TagEditor, defaultTagEditorLabels };
307
- //# sourceMappingURL=chunk-VNEAQCY2.js.map
308
- //# sourceMappingURL=chunk-VNEAQCY2.js.map
304
+ //# sourceMappingURL=chunk-DGHS5IVD.js.map
305
+ //# sourceMappingURL=chunk-DGHS5IVD.js.map