@mieweb/ui 0.11.0-dev.43 → 0.11.0-dev.45

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 (186) hide show
  1. package/agent/skills/mieweb-ui-catalog/selection-guidance.md +1 -1
  2. package/dist/ag-grid.cjs +2 -2
  3. package/dist/ag-grid.js +1 -1
  4. package/dist/{chunk-AHYDJN4H.cjs → chunk-2XHPPOXY.cjs} +32 -32
  5. package/dist/{chunk-AHYDJN4H.cjs.map → chunk-2XHPPOXY.cjs.map} +1 -1
  6. package/dist/{chunk-3IKIRGHI.cjs → chunk-3H6BQV2D.cjs} +6 -6
  7. package/dist/{chunk-3IKIRGHI.cjs.map → chunk-3H6BQV2D.cjs.map} +1 -1
  8. package/dist/{chunk-IIV5GNSK.cjs → chunk-3PT4B4JT.cjs} +4 -4
  9. package/dist/{chunk-IIV5GNSK.cjs.map → chunk-3PT4B4JT.cjs.map} +1 -1
  10. package/dist/{chunk-GLG6UE2H.cjs → chunk-3SEQVGLH.cjs} +4 -4
  11. package/dist/{chunk-GLG6UE2H.cjs.map → chunk-3SEQVGLH.cjs.map} +1 -1
  12. package/dist/{chunk-JUY2JLFL.js → chunk-3XDU7XIC.js} +3 -3
  13. package/dist/{chunk-JUY2JLFL.js.map → chunk-3XDU7XIC.js.map} +1 -1
  14. package/dist/{chunk-LQ22CY7X.js → chunk-46ZUORUE.js} +5 -5
  15. package/dist/{chunk-LQ22CY7X.js.map → chunk-46ZUORUE.js.map} +1 -1
  16. package/dist/{chunk-CKECOCYJ.js → chunk-4IOIDS2Z.js} +3 -3
  17. package/dist/{chunk-CKECOCYJ.js.map → chunk-4IOIDS2Z.js.map} +1 -1
  18. package/dist/{chunk-F7SZSOB3.js → chunk-6PCA5H47.js} +3 -3
  19. package/dist/{chunk-F7SZSOB3.js.map → chunk-6PCA5H47.js.map} +1 -1
  20. package/dist/{chunk-ULEX7OOJ.js → chunk-6Y6W5DUY.js} +4 -4
  21. package/dist/{chunk-ULEX7OOJ.js.map → chunk-6Y6W5DUY.js.map} +1 -1
  22. package/dist/{chunk-S7AMZ4RD.cjs → chunk-7K6SW4VB.cjs} +4 -4
  23. package/dist/{chunk-S7AMZ4RD.cjs.map → chunk-7K6SW4VB.cjs.map} +1 -1
  24. package/dist/{chunk-KY67AMQ5.cjs → chunk-7MF3O3BU.cjs} +4 -4
  25. package/dist/{chunk-KY67AMQ5.cjs.map → chunk-7MF3O3BU.cjs.map} +1 -1
  26. package/dist/{chunk-Z3WMDVMR.cjs → chunk-7QNBPB7F.cjs} +9 -5
  27. package/dist/chunk-7QNBPB7F.cjs.map +1 -0
  28. package/dist/{chunk-YFWDS6MX.js → chunk-AB24H2RM.js} +3 -3
  29. package/dist/{chunk-YFWDS6MX.js.map → chunk-AB24H2RM.js.map} +1 -1
  30. package/dist/{chunk-DSGFWT4D.js → chunk-AQBZEN43.js} +5 -5
  31. package/dist/{chunk-DSGFWT4D.js.map → chunk-AQBZEN43.js.map} +1 -1
  32. package/dist/{chunk-2W73UQ3T.js → chunk-BPYI7BDC.js} +3 -3
  33. package/dist/{chunk-2W73UQ3T.js.map → chunk-BPYI7BDC.js.map} +1 -1
  34. package/dist/{chunk-7U7SONM5.js → chunk-CVCUQ2MZ.js} +3 -3
  35. package/dist/{chunk-7U7SONM5.js.map → chunk-CVCUQ2MZ.js.map} +1 -1
  36. package/dist/{chunk-PWXDRFJL.cjs → chunk-DHEOWRIE.cjs} +6 -6
  37. package/dist/{chunk-PWXDRFJL.cjs.map → chunk-DHEOWRIE.cjs.map} +1 -1
  38. package/dist/{chunk-OYUIEJPN.js → chunk-GTRYDFMT.js} +38 -10
  39. package/dist/chunk-GTRYDFMT.js.map +1 -0
  40. package/dist/{chunk-2FZYZ4HT.cjs → chunk-HDSYYQYM.cjs} +4 -4
  41. package/dist/{chunk-2FZYZ4HT.cjs.map → chunk-HDSYYQYM.cjs.map} +1 -1
  42. package/dist/{chunk-MM32RSX4.cjs → chunk-HOE2U27V.cjs} +185 -18
  43. package/dist/chunk-HOE2U27V.cjs.map +1 -0
  44. package/dist/{chunk-JCIQIR5V.js → chunk-IGUDEWIW.js} +4 -4
  45. package/dist/{chunk-JCIQIR5V.js.map → chunk-IGUDEWIW.js.map} +1 -1
  46. package/dist/{chunk-GGLISETW.cjs → chunk-IKHK4GTF.cjs} +4 -4
  47. package/dist/{chunk-GGLISETW.cjs.map → chunk-IKHK4GTF.cjs.map} +1 -1
  48. package/dist/{chunk-YVKBXNPK.js → chunk-JBNQ2L3K.js} +10 -6
  49. package/dist/chunk-JBNQ2L3K.js.map +1 -0
  50. package/dist/{chunk-GU6TPVXF.cjs → chunk-JK2IWOI7.cjs} +6 -6
  51. package/dist/{chunk-GU6TPVXF.cjs.map → chunk-JK2IWOI7.cjs.map} +1 -1
  52. package/dist/{chunk-TZKBW4GA.cjs → chunk-K76UNS22.cjs} +6 -6
  53. package/dist/{chunk-TZKBW4GA.cjs.map → chunk-K76UNS22.cjs.map} +1 -1
  54. package/dist/{chunk-DAAJ3B2T.js → chunk-KP72MDFB.js} +4 -4
  55. package/dist/{chunk-DAAJ3B2T.js.map → chunk-KP72MDFB.js.map} +1 -1
  56. package/dist/{chunk-MLCIINXT.js → chunk-LBUXS6FJ.js} +4 -4
  57. package/dist/{chunk-MLCIINXT.js.map → chunk-LBUXS6FJ.js.map} +1 -1
  58. package/dist/{chunk-GG3IK5TL.cjs → chunk-MQK2D6I6.cjs} +9 -9
  59. package/dist/{chunk-GG3IK5TL.cjs.map → chunk-MQK2D6I6.cjs.map} +1 -1
  60. package/dist/{chunk-67X7L7JX.js → chunk-MQSGJB2B.js} +173 -6
  61. package/dist/chunk-MQSGJB2B.js.map +1 -0
  62. package/dist/{chunk-2GBVJHWN.cjs → chunk-NH5JOZLG.cjs} +13 -13
  63. package/dist/{chunk-2GBVJHWN.cjs.map → chunk-NH5JOZLG.cjs.map} +1 -1
  64. package/dist/{chunk-NWU634SO.cjs → chunk-O2EAHOXM.cjs} +4 -4
  65. package/dist/{chunk-NWU634SO.cjs.map → chunk-O2EAHOXM.cjs.map} +1 -1
  66. package/dist/{chunk-JUYBJLPI.cjs → chunk-O7Y56J4R.cjs} +4 -4
  67. package/dist/{chunk-JUYBJLPI.cjs.map → chunk-O7Y56J4R.cjs.map} +1 -1
  68. package/dist/{chunk-BQSREBF2.cjs → chunk-OJ2NCQ2R.cjs} +14 -14
  69. package/dist/{chunk-BQSREBF2.cjs.map → chunk-OJ2NCQ2R.cjs.map} +1 -1
  70. package/dist/{chunk-GLRKXJCR.js → chunk-OX32ITWC.js} +3 -3
  71. package/dist/{chunk-GLRKXJCR.js.map → chunk-OX32ITWC.js.map} +1 -1
  72. package/dist/{chunk-L4APW65W.cjs → chunk-PJ4XEBMU.cjs} +4 -4
  73. package/dist/{chunk-L4APW65W.cjs.map → chunk-PJ4XEBMU.cjs.map} +1 -1
  74. package/dist/{chunk-OZKJYLN6.js → chunk-PSCSU63K.js} +3 -3
  75. package/dist/{chunk-OZKJYLN6.js.map → chunk-PSCSU63K.js.map} +1 -1
  76. package/dist/{chunk-EI4JU5JF.js → chunk-RKM4VGAN.js} +3 -3
  77. package/dist/{chunk-EI4JU5JF.js.map → chunk-RKM4VGAN.js.map} +1 -1
  78. package/dist/{chunk-ME7EVT6F.js → chunk-RYGVILUR.js} +3 -3
  79. package/dist/{chunk-ME7EVT6F.js.map → chunk-RYGVILUR.js.map} +1 -1
  80. package/dist/{chunk-EGPDT7SM.js → chunk-S7NJV335.js} +3 -3
  81. package/dist/{chunk-EGPDT7SM.js.map → chunk-S7NJV335.js.map} +1 -1
  82. package/dist/{chunk-AHT2HRHC.cjs → chunk-TNRANQVI.cjs} +16 -16
  83. package/dist/{chunk-AHT2HRHC.cjs.map → chunk-TNRANQVI.cjs.map} +1 -1
  84. package/dist/{chunk-TERHGQ73.cjs → chunk-U7XWWU5H.cjs} +5 -5
  85. package/dist/{chunk-TERHGQ73.cjs.map → chunk-U7XWWU5H.cjs.map} +1 -1
  86. package/dist/{chunk-G35LXI2A.js → chunk-UIFN2LYT.js} +3 -3
  87. package/dist/{chunk-G35LXI2A.js.map → chunk-UIFN2LYT.js.map} +1 -1
  88. package/dist/{chunk-IYDPGQJA.js → chunk-UQAWXY6R.js} +3 -3
  89. package/dist/{chunk-IYDPGQJA.js.map → chunk-UQAWXY6R.js.map} +1 -1
  90. package/dist/{chunk-YWCHUUY3.js → chunk-VOPRL4RF.js} +7 -7
  91. package/dist/{chunk-YWCHUUY3.js.map → chunk-VOPRL4RF.js.map} +1 -1
  92. package/dist/{chunk-KB2PLV5Q.js → chunk-VQGRMCVT.js} +4 -4
  93. package/dist/{chunk-KB2PLV5Q.js.map → chunk-VQGRMCVT.js.map} +1 -1
  94. package/dist/{chunk-AWJBJYLZ.cjs → chunk-X6THHGTZ.cjs} +37 -37
  95. package/dist/{chunk-AWJBJYLZ.cjs.map → chunk-X6THHGTZ.cjs.map} +1 -1
  96. package/dist/{chunk-Q6QLGCL7.cjs → chunk-XCCH5KHW.cjs} +9 -9
  97. package/dist/{chunk-Q6QLGCL7.cjs.map → chunk-XCCH5KHW.cjs.map} +1 -1
  98. package/dist/{chunk-KQXD6BFO.cjs → chunk-XM3D4KAF.cjs} +9 -9
  99. package/dist/{chunk-KQXD6BFO.cjs.map → chunk-XM3D4KAF.cjs.map} +1 -1
  100. package/dist/{chunk-PINIBEIU.cjs → chunk-XRXOGMMG.cjs} +39 -11
  101. package/dist/chunk-XRXOGMMG.cjs.map +1 -0
  102. package/dist/{chunk-XPWFIDZM.cjs → chunk-XU3X2AUL.cjs} +4 -4
  103. package/dist/{chunk-XPWFIDZM.cjs.map → chunk-XU3X2AUL.cjs.map} +1 -1
  104. package/dist/{chunk-3A4N5E6P.js → chunk-XZ65FX6T.js} +3 -3
  105. package/dist/{chunk-3A4N5E6P.js.map → chunk-XZ65FX6T.js.map} +1 -1
  106. package/dist/{chunk-CRR7AE5D.js → chunk-Z6I4XFPC.js} +3 -3
  107. package/dist/{chunk-CRR7AE5D.js.map → chunk-Z6I4XFPC.js.map} +1 -1
  108. package/dist/{chunk-LTCHD3K5.cjs → chunk-Z7ZOSENN.cjs} +5 -5
  109. package/dist/{chunk-LTCHD3K5.cjs.map → chunk-Z7ZOSENN.cjs.map} +1 -1
  110. package/dist/{chunk-NZUQL42A.cjs → chunk-ZDA6FEKA.cjs} +5 -5
  111. package/dist/{chunk-NZUQL42A.cjs.map → chunk-ZDA6FEKA.cjs.map} +1 -1
  112. package/dist/{chunk-UY2EZYIC.js → chunk-ZSBG6C3P.js} +3 -3
  113. package/dist/{chunk-UY2EZYIC.js.map → chunk-ZSBG6C3P.js.map} +1 -1
  114. package/dist/{chunk-KAQNYX7B.js → chunk-ZVRJVUFX.js} +3 -3
  115. package/dist/{chunk-KAQNYX7B.js.map → chunk-ZVRJVUFX.js.map} +1 -1
  116. package/dist/components/AudioPlayer/index.cjs +7 -7
  117. package/dist/components/AudioPlayer/index.js +2 -2
  118. package/dist/components/BoardView/index.cjs +5 -5
  119. package/dist/components/BoardView/index.js +2 -2
  120. package/dist/components/CollabStatus/index.cjs +5 -5
  121. package/dist/components/CollabStatus/index.js +2 -2
  122. package/dist/components/Dropdown/index.cjs +9 -9
  123. package/dist/components/Dropdown/index.d.cts +6 -1
  124. package/dist/components/Dropdown/index.d.ts +6 -1
  125. package/dist/components/Dropdown/index.js +2 -2
  126. package/dist/components/EmailEditor/index.cjs +16 -16
  127. package/dist/components/EmailEditor/index.js +7 -7
  128. package/dist/components/MediaEditor/index.cjs +10 -10
  129. package/dist/components/MediaEditor/index.js +5 -5
  130. package/dist/components/MediaFeed/index.cjs +6 -6
  131. package/dist/components/MediaFeed/index.js +5 -5
  132. package/dist/components/MediaPlayer/index.cjs +8 -8
  133. package/dist/components/MediaPlayer/index.js +4 -4
  134. package/dist/components/MegaMenu/index.cjs +5 -5
  135. package/dist/components/MegaMenu/index.js +2 -2
  136. package/dist/components/RecordHeader/index.cjs +5 -5
  137. package/dist/components/RecordHeader/index.js +3 -3
  138. package/dist/components/RecordLayout/index.cjs +5 -5
  139. package/dist/components/RecordLayout/index.js +3 -3
  140. package/dist/components/RichTextEditor/index.cjs +6 -6
  141. package/dist/components/RichTextEditor/index.js +3 -3
  142. package/dist/components/Slider/index.cjs +6 -6
  143. package/dist/components/Slider/index.js +2 -2
  144. package/dist/components/SliderCalculator/index.cjs +5 -5
  145. package/dist/components/SliderCalculator/index.js +3 -3
  146. package/dist/components/SuperChat/index.cjs +23 -23
  147. package/dist/components/SuperChat/index.js +8 -8
  148. package/dist/components/SuperChat/plugins/index.cjs +5 -5
  149. package/dist/components/SuperChat/plugins/index.js +4 -4
  150. package/dist/components/Tabs/index.cjs +8 -8
  151. package/dist/components/Tabs/index.js +2 -2
  152. package/dist/components/Textarea/index.cjs +8 -8
  153. package/dist/components/Textarea/index.js +5 -5
  154. package/dist/components/ThemeProvider/index.cjs +9 -9
  155. package/dist/components/ThemeProvider/index.js +3 -3
  156. package/dist/components/Tooltip/index.cjs +3 -3
  157. package/dist/components/Tooltip/index.js +2 -2
  158. package/dist/components/ViewSet/index.cjs +5 -5
  159. package/dist/components/ViewSet/index.js +4 -4
  160. package/dist/components/ViewSwitcher/index.cjs +4 -4
  161. package/dist/components/ViewSwitcher/index.js +2 -2
  162. package/dist/deck.cjs +3 -3
  163. package/dist/deck.js +1 -1
  164. package/dist/esheet.cjs +107 -107
  165. package/dist/esheet.js +10 -10
  166. package/dist/hooks/index.cjs +5 -5
  167. package/dist/hooks/index.js +1 -1
  168. package/dist/index.cjs +284 -284
  169. package/dist/index.d.cts +6 -1
  170. package/dist/index.d.ts +6 -1
  171. package/dist/index.js +40 -40
  172. package/dist/kerebron.cjs +6 -6
  173. package/dist/kerebron.js +4 -4
  174. package/dist/{model-5PB6KNYH.cjs → model-2TISYEYF.cjs} +20 -20
  175. package/dist/{model-5PB6KNYH.cjs.map → model-2TISYEYF.cjs.map} +1 -1
  176. package/dist/{model-OGWTZEXR.js → model-BCS5BUK3.js} +6 -6
  177. package/dist/{model-OGWTZEXR.js.map → model-BCS5BUK3.js.map} +1 -1
  178. package/dist/org-chart.cjs +2 -2
  179. package/dist/org-chart.js +1 -1
  180. package/package.json +1 -1
  181. package/dist/chunk-67X7L7JX.js.map +0 -1
  182. package/dist/chunk-MM32RSX4.cjs.map +0 -1
  183. package/dist/chunk-OYUIEJPN.js.map +0 -1
  184. package/dist/chunk-PINIBEIU.cjs.map +0 -1
  185. package/dist/chunk-YVKBXNPK.js.map +0 -1
  186. package/dist/chunk-Z3WMDVMR.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/MediaFeed/FeedMedia.tsx","../src/components/MediaFeed/MediaFeed.tsx"],"names":["jsx","React","isInPictureInPicture","PIP_EVENTS","jsxs","cn","MediaPlayer","Button","overlayButtonClass","playBadgeClass","Play","playBadgeIconClass","Pause","defaultMediaControlsLabels","React2","Avatar","usePrefersReducedMotion","exitPictureInPicture","Maximize2","Fragment","ChevronUp","ChevronDown","Modal","ModalHeader","ModalTitle","ModalClose"],"mappings":"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","file":"chunk-AHYDJN4H.cjs","sourcesContent":["import * as React from 'react';\nimport { Pause, Play } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\nimport { MediaPlayer, type MediaPlayerState } from '../MediaPlayer';\nimport {\n overlayButtonClass,\n playBadgeClass,\n playBadgeIconClass,\n} from '../MediaPlayer/overlayButton';\nimport {\n isInPictureInPicture,\n PIP_EVENTS,\n} from '../MediaPlayer/pictureInPicture';\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 /** The feed's `overlay` layout: the player's overlay controls, no button row. */\n overlay: boolean;\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 overlay,\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 // The pending attempt autoplay started: that start isn't the viewer asking\n // for playback. A newer attempt, or one that's called off, isn't it.\n const autoAttempt = React.useRef<number | null>(null);\n activeRef.current = active;\n\n const tryPlay = React.useCallback(async (automatic = false) => {\n const element = mediaElementRef.current;\n if (!element || !activeRef.current) return;\n const attempt = ++attemptId.current;\n setBlocked(false);\n autoAttempt.current = automatic ? attempt : null;\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 — unless the viewer floated it into picture in picture while it\n // was starting, which plays on as it does when the feed moves. A newer\n // request for the same active element can finish normally.\n if (\n (!activeRef.current || element !== mediaElementRef.current) &&\n !isInPictureInPicture(element)\n )\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 } finally {\n if (autoAttempt.current === attempt) autoAttempt.current = null;\n }\n }, []);\n\n // A clip floating in picture in picture plays on when its item stops being\n // the one on screen (the feed scrolls on, or its host hides it): the viewer\n // floated it to keep watching.\n const pauseForOwnership = React.useCallback(\n (element: HTMLMediaElement | null) => {\n if (isInPictureInPicture(element)) return;\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(!wantsPlayback.current);\n } else if (!active) {\n attemptId.current++;\n // Leave a full screen this clip's own player entered: an inactive item\n // has no controls to leave it with.\n const fullscreen = document.fullscreenElement;\n if (\n element &&\n fullscreen &&\n (fullscreen === element ||\n fullscreen === element.closest('[data-slot=\"media-player-box\"]'))\n )\n void document.exitFullscreen?.()?.catch(() => {});\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 // A clip left playing in picture in picture when its item stopped being the\n // one on screen comes back with no controls (only the active item has\n // them): pause it when its floating window closes.\n React.useEffect(() => {\n const element = mediaElementRef.current;\n if (!element) return;\n const landed = () => {\n if (!activeRef.current && !isInPictureInPicture(element)) element.pause();\n };\n for (const name of PIP_EVENTS) element.addEventListener(name, landed);\n return () => {\n for (const name of PIP_EVENTS) element.removeEventListener(name, landed);\n };\n }, [retryVersion]);\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 // In the overlay layout the clip fills the stage at its own shape, upright\n // or sideways, under the player's own controls.\n return (\n <div\n className={cn(\n 'flex h-full min-h-0 w-full flex-col items-center justify-center',\n overlay ? 'relative' : 'gap-3'\n )}\n >\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 controlsStyle={overlay ? 'overlay' : 'native'}\n aria-label={title}\n onStateChange={(next) => {\n setState(next);\n if (next === 'playing') {\n ownershipPause.current = false;\n // Started by the viewer (the player's own controls, a tap on the\n // picture, Play in the floating window), it resumes when they\n // come back to it. Autoplay's own start leaves that to autoPlay.\n // Either way the blocked-autoplay notice can go.\n setBlocked(false);\n if (\n (activeRef.current ||\n isInPictureInPicture(mediaElementRef.current)) &&\n autoAttempt.current !== attemptId.current\n ) {\n wantsPlayback.current = true;\n playbackPosition.playRequested = true;\n }\n }\n if (next === 'paused') {\n // A pause on the active item, or in the floating window, is the\n // viewer's: don't resume it later.\n if (\n (activeRef.current ||\n isInPictureInPicture(mediaElementRef.current)) &&\n !ownershipPause.current\n ) {\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={{\n error: labels.mediaError,\n retry: labels.retry,\n play: labels.play,\n pause: labels.pause,\n mute: labels.mute,\n unmute: labels.unmute,\n seek: labels.seek,\n fullscreen: labels.playerFullscreen,\n exitFullscreen: labels.exitPlayerFullscreen,\n pictureInPicture: labels.pictureInPicture,\n exitPictureInPicture: labels.exitPictureInPicture,\n time: labels.time,\n rate: labels.playerRate,\n speed: labels.playerSpeed,\n showCaptions: labels.showCaptions,\n hideCaptions: labels.hideCaptions,\n }}\n className=\"min-h-0 flex-1 [&_video]:h-full [&_video]:w-full\"\n />\n {overlay\n ? // An item that isn't the active one has no controls yet: its ▶\n // selects it and starts it.\n !active &&\n state !== 'error' &&\n state !== 'playing' && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={labels.play}\n title={labels.play}\n className={cn(\n overlayButtonClass,\n playBadgeClass,\n 'pointer-events-auto pointer-fine:h-14 pointer-fine:w-14'\n )}\n onClick={togglePlayback}\n >\n <Play className={playBadgeIconClass} aria-hidden=\"true\" />\n </Button>\n </div>\n )\n : state !== 'error' && (\n <Button\n type=\"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 && state !== 'playing' && (\n <p\n role=\"status\"\n className={cn(\n 'm-0 text-center text-sm',\n overlay\n ? // Along the top, clear of the details and actions at the foot\n // and of a host's Back button in the top corner.\n 'pointer-events-none absolute inset-x-0 top-3 flex justify-center px-14'\n : 'text-muted-foreground'\n )}\n >\n {overlay ? (\n <span className=\"rounded bg-black/60 px-2 py-1 text-white\">\n {labels.blockedAutoplay}\n </span>\n ) : (\n labels.blockedAutoplay\n )}\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 type=\"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 { defaultMediaControlsLabels } from '../MediaPlayer/MediaControls';\nimport { overlayButtonClass } from '../MediaPlayer/overlayButton';\nimport {\n exitPictureInPicture,\n isInPictureInPicture,\n} from '../MediaPlayer/pictureInPicture';\nimport { Modal, ModalClose, ModalHeader, ModalTitle } from '../Modal';\nimport { FeedMedia } from './FeedMedia';\nimport type {\n MediaFeedAuthor,\n MediaFeedClassNames,\n MediaFeedLabels,\n MediaFeedProps,\n} 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 // The player's own controls, in the overlay layout.\n mute: defaultMediaControlsLabels.mute,\n unmute: defaultMediaControlsLabels.unmute,\n seek: defaultMediaControlsLabels.seek,\n playerFullscreen: defaultMediaControlsLabels.fullscreen,\n exitPlayerFullscreen: defaultMediaControlsLabels.exitFullscreen,\n pictureInPicture: defaultMediaControlsLabels.pictureInPicture,\n exitPictureInPicture: defaultMediaControlsLabels.exitPictureInPicture,\n time: defaultMediaControlsLabels.time,\n playerRate: defaultMediaControlsLabels.rate,\n playerSpeed: defaultMediaControlsLabels.speed,\n showCaptions: defaultMediaControlsLabels.showCaptions,\n hideCaptions: defaultMediaControlsLabels.hideCaptions,\n showMore: 'Show more',\n showLess: 'Show less',\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 * The player's bar in the overlay layout: an even scrim, which the details'\n * gradient continues upward from its top edge, rather than its own gradient.\n */\nconst OVERLAY_BAR_SCRIM =\n '[&_[data-slot=media-controls-bar]]:bg-none [&_[data-slot=media-controls-bar]]:bg-black/55';\n\n/**\n * The height of the player's control bar in the item around `ref`, so the\n * details can sit just above it. The bar mounts with the active item and\n * wraps onto two rows in a narrow one, so it's watched for both.\n */\nfunction useControlsBarHeight(ref: React.RefObject<HTMLElement | null>) {\n const [height, setHeight] = React.useState(0);\n React.useLayoutEffect(() => {\n const item = ref.current?.closest('[data-slot=\"item\"]');\n if (!item) return;\n let bar: Element | null = null;\n const resize =\n typeof ResizeObserver === 'undefined'\n ? null\n : new ResizeObserver(() =>\n setHeight(bar?.getBoundingClientRect().height ?? 0)\n );\n const attach = () => {\n const next = item.querySelector('[data-slot=\"media-controls-bar\"]');\n if (next === bar) return;\n if (bar) resize?.unobserve(bar);\n bar = next;\n if (bar) resize?.observe(bar);\n setHeight(bar?.getBoundingClientRect().height ?? 0);\n };\n attach();\n const mutations =\n typeof MutationObserver === 'undefined'\n ? null\n : new MutationObserver(attach);\n mutations?.observe(item, { childList: true, subtree: true });\n return () => {\n mutations?.disconnect();\n resize?.disconnect();\n };\n }, [ref]);\n return height;\n}\n\n/**\n * The `overlay` layout's details, placed as short-video apps place them\n * (TikTok, Instagram Reels): who posted it, its title and caption at the\n * bottom start, just above the player's bar, on a gradient rising from the\n * bottom; the host's actions in a column at the bottom end, beside them. The\n * top is left to the host (a Back button). Only its own controls take a tap;\n * the rest of a tap reaches the player beneath (play/pause). An untitled item\n * shows no title: the position counter already names it on screen, and the\n * item's `aria-label` names it for assistive tech.\n */\nfunction OverlayDetails({\n author,\n title,\n caption,\n actions,\n fullscreenButton,\n labels,\n classNames,\n}: {\n author?: MediaFeedAuthor;\n title?: string;\n caption?: React.ReactNode;\n actions?: React.ReactNode;\n fullscreenButton: React.ReactNode;\n labels: MediaFeedLabels;\n classNames: MediaFeedClassNames;\n}) {\n const rootRef = React.useRef<HTMLDivElement>(null);\n const barHeight = useControlsBarHeight(rootRef);\n // Only words that add something: not empty, not the title over again.\n const showCaption =\n caption != null &&\n caption !== '' &&\n !(typeof caption === 'string' && caption.trim() === (title ?? '').trim());\n const textId = React.useId();\n const titleRef = React.useRef<HTMLHeadingElement>(null);\n const captionRef = React.useRef<HTMLDivElement>(null);\n const [expanded, setExpanded] = React.useState(false);\n const [clipped, setClipped] = React.useState(false);\n // Is the one-line title or the two-line caption cut off? Measured again\n // whenever their boxes change (a phone turned, the window resized, fonts\n // arriving), since that decides whether Show more is needed.\n React.useLayoutEffect(() => {\n if (expanded) return;\n const titleEl = titleRef.current;\n const captionEl = captionRef.current;\n const measure = () =>\n setClipped(\n (!!titleEl && titleEl.scrollWidth > titleEl.clientWidth + 1) ||\n (!!captionEl && captionEl.scrollHeight > captionEl.clientHeight + 1)\n );\n measure();\n if (typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(measure);\n for (const el of [titleEl, captionEl]) if (el) observer.observe(el);\n return () => observer.disconnect();\n }, [title, caption, expanded]);\n return (\n <div\n ref={rootRef}\n data-slot=\"details\"\n data-expanded={expanded || undefined}\n // On the bar's top edge, not over it (that would dim its controls): its\n // gradient starts at the bar's own scrim (OVERLAY_BAR_SCRIM), so the\n // two read as one. Never taller than the item above the bar, so text\n // opened in full scrolls instead of running off the top.\n style={{ bottom: barHeight, maxHeight: `calc(100% - ${barHeight}px)` }}\n className={cn(\n 'pointer-events-none absolute inset-x-0 z-10 flex items-end justify-between gap-3 bg-gradient-to-t from-black/55 via-black/30 to-transparent ps-3 pe-2 pt-16 pb-3 text-white [text-shadow:0_1px_2px_rgb(0_0_0/0.6)]',\n // A darker scrim behind the full text, which can run over a bright frame.\n expanded && 'via-black/55',\n classNames.details\n )}\n >\n {/* A readable measure on a wide screen, as short-video apps keep.\n Opened in full, the column takes the details' height and scrolls\n (a long title on a landscape phone), its text still at the foot\n when it fits. */}\n <div\n id={textId}\n className={cn(\n 'flex max-w-xl min-w-0 flex-1 flex-col leading-5',\n expanded &&\n 'pointer-events-auto min-h-0 self-stretch overflow-y-auto overscroll-contain'\n )}\n >\n <div className=\"mt-auto\">\n {author && (\n <div\n data-slot=\"author\"\n className={cn(\n 'mb-1 flex min-w-0 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 className=\"shrink-0 ring-1 ring-white/70\"\n />\n {/* Host text can be in any language: each line takes its own\n direction, so it truncates at its own end, and is only as wide\n as its text, so it still sits at the page's start edge. */}\n <p\n dir=\"auto\"\n className=\"m-0 w-fit max-w-full truncate text-sm font-semibold\"\n >\n {author.name}\n </p>\n </div>\n )}\n {title && (\n <h3\n ref={titleRef}\n data-slot=\"title\"\n dir=\"auto\"\n className={cn(\n 'm-0 w-fit max-w-full text-sm font-semibold',\n expanded ? 'break-words' : 'truncate',\n classNames.title\n )}\n >\n {title}\n </h3>\n )}\n {showCaption && (\n // A div, not a p: a host caption can hold block content, and its\n // links stay tappable through the details layer.\n <div\n ref={captionRef}\n data-slot=\"caption\"\n dir=\"auto\"\n className={cn(\n 'pointer-events-auto m-0 w-fit max-w-full text-sm break-words text-white/90',\n !expanded && 'line-clamp-2',\n classNames.caption\n )}\n >\n {caption}\n </div>\n )}\n {(clipped || expanded) && (\n <button\n type=\"button\"\n data-slot=\"details-toggle\"\n aria-expanded={expanded}\n aria-controls={textId}\n onClick={() => setExpanded((open) => !open)}\n className=\"pointer-events-auto mt-0.5 rounded-sm text-sm font-semibold text-white/80 underline-offset-2 hover:underline focus-visible:outline-2 focus-visible:outline-white/70\"\n >\n {expanded ? labels.showLess : labels.showMore}\n </button>\n )}\n </div>\n </div>\n {(actions || fullscreenButton) && (\n // The action column, at the bottom end beside the text.\n <div className=\"pointer-events-auto flex shrink-0 flex-col items-center gap-3\">\n {actions && (\n <div\n data-slot=\"actions\"\n className={cn(\n 'flex flex-col items-center gap-3',\n classNames.actions\n )}\n >\n {actions}\n </div>\n )}\n {fullscreenButton}\n </div>\n )}\n </div>\n );\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 layout = 'stacked',\n allowFullscreen: allowFullscreenProp,\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 overlay = layout === 'overlay';\n // The overlay already fills its space and the player has its own full\n // screen, so the viewer is opt-in there.\n const allowFullscreen = allowFullscreenProp ?? !overlay;\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 || !allowFullscreen) setFullscreen(false);\n }, [items.length, allowFullscreen]);\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 ownTitle = getTitle?.(item);\n const title = ownTitle || 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 const fullscreenButton = allowFullscreen && !immersive && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-label={labels.fullscreen}\n title={labels.fullscreen}\n className={\n overlay\n ? cn(overlayButtonClass, 'shrink-0 bg-transparent')\n : undefined\n }\n onClick={(event) => {\n fullscreenTriggerRef.current = event.currentTarget;\n const open = () => {\n select(id);\n setFullscreen(true);\n };\n // A clip floating in picture in picture comes back first, so it\n // stops with the inline feed instead of playing alongside the viewer.\n // If it's still floating after that (Safari can leave it there), it\n // pauses there instead.\n const video = event.currentTarget\n .closest('[data-slot=\"item\"]')\n ?.querySelector('video');\n if (isInPictureInPicture(video))\n void exitPictureInPicture(video).then(() => {\n if (isInPictureInPicture(video)) video?.pause();\n open();\n });\n else open();\n }}\n >\n <Maximize2 className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n );\n const mediaSlot = (\n <div\n data-slot=\"media\"\n className={cn(\n overlay\n ? // Black letterboxing around the clip, as on VideoCard.\n 'absolute inset-0 flex items-center justify-center bg-black'\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 overlay={overlay}\n />\n )}\n </div>\n );\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 overlay\n ? cn(\n 'relative h-full min-h-0 w-full snap-start snap-always overflow-hidden bg-black focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-white/70',\n OVERLAY_BAR_SCRIM\n )\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 overlay\n ? immersive\n ? 'flex-1'\n : 'shrink-0'\n : immersive\n ? 'h-full flex-1 border-0'\n : 'h-full shrink-0 rounded-xl',\n classNames.item\n )}\n >\n {overlay ? (\n <>\n {/* The details come first in the DOM so focus visits them before\n the player's bar, which sits under them on screen. */}\n <OverlayDetails\n author={author}\n title={ownTitle}\n caption={caption}\n actions={renderActions?.(item)}\n fullscreenButton={fullscreenButton}\n labels={labels}\n classNames={classNames}\n />\n {mediaSlot}\n </>\n ) : (\n <>\n {mediaSlot}\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(\n 'm-0 text-base font-semibold',\n classNames.title\n )}\n >\n {title}\n </h3>\n </div>\n {fullscreenButton}\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 </>\n )}\n </article>\n );\n };\n\n const controls = overlay ? (\n // Over the middle of the feed's end edge, stacked the way the feed\n // scrolls, above the actions and the player's bar at the bottom. On a\n // short screen (a phone held sideways, as SuperChat reckons it) the middle\n // runs into the actions, so they move to the top end, clear of a host's\n // Back at the top start.\n <div\n data-slot=\"controls\"\n className={cn(\n 'pointer-events-none absolute end-2 top-1/2 z-10 flex -translate-y-1/2 flex-col items-center gap-1.5 [@media(max-height:30rem)]:top-2 [@media(max-height:30rem)]:translate-y-0',\n classNames.controls\n )}\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={labels.previous}\n title={labels.previous}\n className={cn(overlayButtonClass, 'pointer-events-auto')}\n disabled={activeIndex <= 0}\n onClick={() => navigate(activeIndex - 1)}\n >\n <ChevronUp className=\"h-5 w-5\" aria-hidden=\"true\" />\n </Button>\n <span\n role=\"status\"\n aria-live=\"polite\"\n className=\"rounded-full bg-black/45 px-1.5 py-0.5 text-xs whitespace-nowrap text-white tabular-nums backdrop-blur-sm\"\n >\n {/* Its own direction: \"2 / 3\" stays in order in an RTL page, and a\n translated \"2 من 3\" still reads right to left. */}\n <bdi>{labels.position(activeIndex + 1, items.length)}</bdi>\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={labels.next}\n title={labels.next}\n className={cn(overlayButtonClass, 'pointer-events-auto')}\n disabled={activeIndex >= items.length - 1}\n onClick={() => navigate(activeIndex + 1)}\n >\n <ChevronDown className=\"h-5 w-5\" aria-hidden=\"true\" />\n </Button>\n </div>\n ) : (\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 type=\"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 {/* Its own direction: \"2 / 3\" stays in order in an RTL page, and a\n translated \"2 من 3\" still reads right to left. */}\n <bdi>{labels.position(activeIndex + 1, items.length)}</bdi>\n </span>\n <Button\n type=\"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 data-layout={layout}\n // The overlay layout is a dark surface in every theme, as video players\n // are; scoping the dark theme keeps library and host content inside it\n // (actions, errors, Retry) on their dark-theme colours.\n data-theme={overlay ? 'dark' : undefined}\n className={cn(\n 'bg-background text-foreground flex h-[min(48rem,80dvh)] min-h-0 w-full flex-col',\n overlay && 'relative',\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 type=\"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 overflow-y-auto overscroll-contain focus-visible:ring-2 focus-visible:outline-none',\n !overlay && 'gap-4',\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={\n allowFullscreen && fullscreen && !loading && !error && !!items.length\n }\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 data-layout={layout}\n // Set again here in case Modal ever portals its content out of the\n // feed's dark scope.\n data-theme={overlay ? 'dark' : undefined}\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 overlay && 'relative',\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","isInPictureInPicture","PIP_EVENTS","jsxs","cn","MediaPlayer","Button","overlayButtonClass","playBadgeClass","Play","playBadgeIconClass","Pause","defaultMediaControlsLabels","React2","Avatar","usePrefersReducedMotion","exitPictureInPicture","Maximize2","Fragment","ChevronUp","ChevronDown","Modal","ModalHeader","ModalTitle","ModalClose"],"mappings":"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","file":"chunk-2XHPPOXY.cjs","sourcesContent":["import * as React from 'react';\nimport { Pause, Play } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\nimport { MediaPlayer, type MediaPlayerState } from '../MediaPlayer';\nimport {\n overlayButtonClass,\n playBadgeClass,\n playBadgeIconClass,\n} from '../MediaPlayer/overlayButton';\nimport {\n isInPictureInPicture,\n PIP_EVENTS,\n} from '../MediaPlayer/pictureInPicture';\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 /** The feed's `overlay` layout: the player's overlay controls, no button row. */\n overlay: boolean;\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 overlay,\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 // The pending attempt autoplay started: that start isn't the viewer asking\n // for playback. A newer attempt, or one that's called off, isn't it.\n const autoAttempt = React.useRef<number | null>(null);\n activeRef.current = active;\n\n const tryPlay = React.useCallback(async (automatic = false) => {\n const element = mediaElementRef.current;\n if (!element || !activeRef.current) return;\n const attempt = ++attemptId.current;\n setBlocked(false);\n autoAttempt.current = automatic ? attempt : null;\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 — unless the viewer floated it into picture in picture while it\n // was starting, which plays on as it does when the feed moves. A newer\n // request for the same active element can finish normally.\n if (\n (!activeRef.current || element !== mediaElementRef.current) &&\n !isInPictureInPicture(element)\n )\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 } finally {\n if (autoAttempt.current === attempt) autoAttempt.current = null;\n }\n }, []);\n\n // A clip floating in picture in picture plays on when its item stops being\n // the one on screen (the feed scrolls on, or its host hides it): the viewer\n // floated it to keep watching.\n const pauseForOwnership = React.useCallback(\n (element: HTMLMediaElement | null) => {\n if (isInPictureInPicture(element)) return;\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(!wantsPlayback.current);\n } else if (!active) {\n attemptId.current++;\n // Leave a full screen this clip's own player entered: an inactive item\n // has no controls to leave it with.\n const fullscreen = document.fullscreenElement;\n if (\n element &&\n fullscreen &&\n (fullscreen === element ||\n fullscreen === element.closest('[data-slot=\"media-player-box\"]'))\n )\n void document.exitFullscreen?.()?.catch(() => {});\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 // A clip left playing in picture in picture when its item stopped being the\n // one on screen comes back with no controls (only the active item has\n // them): pause it when its floating window closes.\n React.useEffect(() => {\n const element = mediaElementRef.current;\n if (!element) return;\n const landed = () => {\n if (!activeRef.current && !isInPictureInPicture(element)) element.pause();\n };\n for (const name of PIP_EVENTS) element.addEventListener(name, landed);\n return () => {\n for (const name of PIP_EVENTS) element.removeEventListener(name, landed);\n };\n }, [retryVersion]);\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 // In the overlay layout the clip fills the stage at its own shape, upright\n // or sideways, under the player's own controls.\n return (\n <div\n className={cn(\n 'flex h-full min-h-0 w-full flex-col items-center justify-center',\n overlay ? 'relative' : 'gap-3'\n )}\n >\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 controlsStyle={overlay ? 'overlay' : 'native'}\n aria-label={title}\n onStateChange={(next) => {\n setState(next);\n if (next === 'playing') {\n ownershipPause.current = false;\n // Started by the viewer (the player's own controls, a tap on the\n // picture, Play in the floating window), it resumes when they\n // come back to it. Autoplay's own start leaves that to autoPlay.\n // Either way the blocked-autoplay notice can go.\n setBlocked(false);\n if (\n (activeRef.current ||\n isInPictureInPicture(mediaElementRef.current)) &&\n autoAttempt.current !== attemptId.current\n ) {\n wantsPlayback.current = true;\n playbackPosition.playRequested = true;\n }\n }\n if (next === 'paused') {\n // A pause on the active item, or in the floating window, is the\n // viewer's: don't resume it later.\n if (\n (activeRef.current ||\n isInPictureInPicture(mediaElementRef.current)) &&\n !ownershipPause.current\n ) {\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={{\n error: labels.mediaError,\n retry: labels.retry,\n play: labels.play,\n pause: labels.pause,\n mute: labels.mute,\n unmute: labels.unmute,\n seek: labels.seek,\n fullscreen: labels.playerFullscreen,\n exitFullscreen: labels.exitPlayerFullscreen,\n pictureInPicture: labels.pictureInPicture,\n exitPictureInPicture: labels.exitPictureInPicture,\n time: labels.time,\n rate: labels.playerRate,\n speed: labels.playerSpeed,\n showCaptions: labels.showCaptions,\n hideCaptions: labels.hideCaptions,\n }}\n className=\"min-h-0 flex-1 [&_video]:h-full [&_video]:w-full\"\n />\n {overlay\n ? // An item that isn't the active one has no controls yet: its ▶\n // selects it and starts it.\n !active &&\n state !== 'error' &&\n state !== 'playing' && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={labels.play}\n title={labels.play}\n className={cn(\n overlayButtonClass,\n playBadgeClass,\n 'pointer-events-auto pointer-fine:h-14 pointer-fine:w-14'\n )}\n onClick={togglePlayback}\n >\n <Play className={playBadgeIconClass} aria-hidden=\"true\" />\n </Button>\n </div>\n )\n : state !== 'error' && (\n <Button\n type=\"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 && state !== 'playing' && (\n <p\n role=\"status\"\n className={cn(\n 'm-0 text-center text-sm',\n overlay\n ? // Along the top, clear of the details and actions at the foot\n // and of a host's Back button in the top corner.\n 'pointer-events-none absolute inset-x-0 top-3 flex justify-center px-14'\n : 'text-muted-foreground'\n )}\n >\n {overlay ? (\n <span className=\"rounded bg-black/60 px-2 py-1 text-white\">\n {labels.blockedAutoplay}\n </span>\n ) : (\n labels.blockedAutoplay\n )}\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 type=\"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 { defaultMediaControlsLabels } from '../MediaPlayer/MediaControls';\nimport { overlayButtonClass } from '../MediaPlayer/overlayButton';\nimport {\n exitPictureInPicture,\n isInPictureInPicture,\n} from '../MediaPlayer/pictureInPicture';\nimport { Modal, ModalClose, ModalHeader, ModalTitle } from '../Modal';\nimport { FeedMedia } from './FeedMedia';\nimport type {\n MediaFeedAuthor,\n MediaFeedClassNames,\n MediaFeedLabels,\n MediaFeedProps,\n} 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 // The player's own controls, in the overlay layout.\n mute: defaultMediaControlsLabels.mute,\n unmute: defaultMediaControlsLabels.unmute,\n seek: defaultMediaControlsLabels.seek,\n playerFullscreen: defaultMediaControlsLabels.fullscreen,\n exitPlayerFullscreen: defaultMediaControlsLabels.exitFullscreen,\n pictureInPicture: defaultMediaControlsLabels.pictureInPicture,\n exitPictureInPicture: defaultMediaControlsLabels.exitPictureInPicture,\n time: defaultMediaControlsLabels.time,\n playerRate: defaultMediaControlsLabels.rate,\n playerSpeed: defaultMediaControlsLabels.speed,\n showCaptions: defaultMediaControlsLabels.showCaptions,\n hideCaptions: defaultMediaControlsLabels.hideCaptions,\n showMore: 'Show more',\n showLess: 'Show less',\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 * The player's bar in the overlay layout: an even scrim, which the details'\n * gradient continues upward from its top edge, rather than its own gradient.\n */\nconst OVERLAY_BAR_SCRIM =\n '[&_[data-slot=media-controls-bar]]:bg-none [&_[data-slot=media-controls-bar]]:bg-black/55';\n\n/**\n * The height of the player's control bar in the item around `ref`, so the\n * details can sit just above it. The bar mounts with the active item and\n * wraps onto two rows in a narrow one, so it's watched for both.\n */\nfunction useControlsBarHeight(ref: React.RefObject<HTMLElement | null>) {\n const [height, setHeight] = React.useState(0);\n React.useLayoutEffect(() => {\n const item = ref.current?.closest('[data-slot=\"item\"]');\n if (!item) return;\n let bar: Element | null = null;\n const resize =\n typeof ResizeObserver === 'undefined'\n ? null\n : new ResizeObserver(() =>\n setHeight(bar?.getBoundingClientRect().height ?? 0)\n );\n const attach = () => {\n const next = item.querySelector('[data-slot=\"media-controls-bar\"]');\n if (next === bar) return;\n if (bar) resize?.unobserve(bar);\n bar = next;\n if (bar) resize?.observe(bar);\n setHeight(bar?.getBoundingClientRect().height ?? 0);\n };\n attach();\n const mutations =\n typeof MutationObserver === 'undefined'\n ? null\n : new MutationObserver(attach);\n mutations?.observe(item, { childList: true, subtree: true });\n return () => {\n mutations?.disconnect();\n resize?.disconnect();\n };\n }, [ref]);\n return height;\n}\n\n/**\n * The `overlay` layout's details, placed as short-video apps place them\n * (TikTok, Instagram Reels): who posted it, its title and caption at the\n * bottom start, just above the player's bar, on a gradient rising from the\n * bottom; the host's actions in a column at the bottom end, beside them. The\n * top is left to the host (a Back button). Only its own controls take a tap;\n * the rest of a tap reaches the player beneath (play/pause). An untitled item\n * shows no title: the position counter already names it on screen, and the\n * item's `aria-label` names it for assistive tech.\n */\nfunction OverlayDetails({\n author,\n title,\n caption,\n actions,\n fullscreenButton,\n labels,\n classNames,\n}: {\n author?: MediaFeedAuthor;\n title?: string;\n caption?: React.ReactNode;\n actions?: React.ReactNode;\n fullscreenButton: React.ReactNode;\n labels: MediaFeedLabels;\n classNames: MediaFeedClassNames;\n}) {\n const rootRef = React.useRef<HTMLDivElement>(null);\n const barHeight = useControlsBarHeight(rootRef);\n // Only words that add something: not empty, not the title over again.\n const showCaption =\n caption != null &&\n caption !== '' &&\n !(typeof caption === 'string' && caption.trim() === (title ?? '').trim());\n const textId = React.useId();\n const titleRef = React.useRef<HTMLHeadingElement>(null);\n const captionRef = React.useRef<HTMLDivElement>(null);\n const [expanded, setExpanded] = React.useState(false);\n const [clipped, setClipped] = React.useState(false);\n // Is the one-line title or the two-line caption cut off? Measured again\n // whenever their boxes change (a phone turned, the window resized, fonts\n // arriving), since that decides whether Show more is needed.\n React.useLayoutEffect(() => {\n if (expanded) return;\n const titleEl = titleRef.current;\n const captionEl = captionRef.current;\n const measure = () =>\n setClipped(\n (!!titleEl && titleEl.scrollWidth > titleEl.clientWidth + 1) ||\n (!!captionEl && captionEl.scrollHeight > captionEl.clientHeight + 1)\n );\n measure();\n if (typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(measure);\n for (const el of [titleEl, captionEl]) if (el) observer.observe(el);\n return () => observer.disconnect();\n }, [title, caption, expanded]);\n return (\n <div\n ref={rootRef}\n data-slot=\"details\"\n data-expanded={expanded || undefined}\n // On the bar's top edge, not over it (that would dim its controls): its\n // gradient starts at the bar's own scrim (OVERLAY_BAR_SCRIM), so the\n // two read as one. Never taller than the item above the bar, so text\n // opened in full scrolls instead of running off the top.\n style={{ bottom: barHeight, maxHeight: `calc(100% - ${barHeight}px)` }}\n className={cn(\n 'pointer-events-none absolute inset-x-0 z-10 flex items-end justify-between gap-3 bg-gradient-to-t from-black/55 via-black/30 to-transparent ps-3 pe-2 pt-16 pb-3 text-white [text-shadow:0_1px_2px_rgb(0_0_0/0.6)]',\n // A darker scrim behind the full text, which can run over a bright frame.\n expanded && 'via-black/55',\n classNames.details\n )}\n >\n {/* A readable measure on a wide screen, as short-video apps keep.\n Opened in full, the column takes the details' height and scrolls\n (a long title on a landscape phone), its text still at the foot\n when it fits. */}\n <div\n id={textId}\n className={cn(\n 'flex max-w-xl min-w-0 flex-1 flex-col leading-5',\n expanded &&\n 'pointer-events-auto min-h-0 self-stretch overflow-y-auto overscroll-contain'\n )}\n >\n <div className=\"mt-auto\">\n {author && (\n <div\n data-slot=\"author\"\n className={cn(\n 'mb-1 flex min-w-0 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 className=\"shrink-0 ring-1 ring-white/70\"\n />\n {/* Host text can be in any language: each line takes its own\n direction, so it truncates at its own end, and is only as wide\n as its text, so it still sits at the page's start edge. */}\n <p\n dir=\"auto\"\n className=\"m-0 w-fit max-w-full truncate text-sm font-semibold\"\n >\n {author.name}\n </p>\n </div>\n )}\n {title && (\n <h3\n ref={titleRef}\n data-slot=\"title\"\n dir=\"auto\"\n className={cn(\n 'm-0 w-fit max-w-full text-sm font-semibold',\n expanded ? 'break-words' : 'truncate',\n classNames.title\n )}\n >\n {title}\n </h3>\n )}\n {showCaption && (\n // A div, not a p: a host caption can hold block content, and its\n // links stay tappable through the details layer.\n <div\n ref={captionRef}\n data-slot=\"caption\"\n dir=\"auto\"\n className={cn(\n 'pointer-events-auto m-0 w-fit max-w-full text-sm break-words text-white/90',\n !expanded && 'line-clamp-2',\n classNames.caption\n )}\n >\n {caption}\n </div>\n )}\n {(clipped || expanded) && (\n <button\n type=\"button\"\n data-slot=\"details-toggle\"\n aria-expanded={expanded}\n aria-controls={textId}\n onClick={() => setExpanded((open) => !open)}\n className=\"pointer-events-auto mt-0.5 rounded-sm text-sm font-semibold text-white/80 underline-offset-2 hover:underline focus-visible:outline-2 focus-visible:outline-white/70\"\n >\n {expanded ? labels.showLess : labels.showMore}\n </button>\n )}\n </div>\n </div>\n {(actions || fullscreenButton) && (\n // The action column, at the bottom end beside the text.\n <div className=\"pointer-events-auto flex shrink-0 flex-col items-center gap-3\">\n {actions && (\n <div\n data-slot=\"actions\"\n className={cn(\n 'flex flex-col items-center gap-3',\n classNames.actions\n )}\n >\n {actions}\n </div>\n )}\n {fullscreenButton}\n </div>\n )}\n </div>\n );\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 layout = 'stacked',\n allowFullscreen: allowFullscreenProp,\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 overlay = layout === 'overlay';\n // The overlay already fills its space and the player has its own full\n // screen, so the viewer is opt-in there.\n const allowFullscreen = allowFullscreenProp ?? !overlay;\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 || !allowFullscreen) setFullscreen(false);\n }, [items.length, allowFullscreen]);\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 ownTitle = getTitle?.(item);\n const title = ownTitle || 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 const fullscreenButton = allowFullscreen && !immersive && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-label={labels.fullscreen}\n title={labels.fullscreen}\n className={\n overlay\n ? cn(overlayButtonClass, 'shrink-0 bg-transparent')\n : undefined\n }\n onClick={(event) => {\n fullscreenTriggerRef.current = event.currentTarget;\n const open = () => {\n select(id);\n setFullscreen(true);\n };\n // A clip floating in picture in picture comes back first, so it\n // stops with the inline feed instead of playing alongside the viewer.\n // If it's still floating after that (Safari can leave it there), it\n // pauses there instead.\n const video = event.currentTarget\n .closest('[data-slot=\"item\"]')\n ?.querySelector('video');\n if (isInPictureInPicture(video))\n void exitPictureInPicture(video).then(() => {\n if (isInPictureInPicture(video)) video?.pause();\n open();\n });\n else open();\n }}\n >\n <Maximize2 className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n );\n const mediaSlot = (\n <div\n data-slot=\"media\"\n className={cn(\n overlay\n ? // Black letterboxing around the clip, as on VideoCard.\n 'absolute inset-0 flex items-center justify-center bg-black'\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 overlay={overlay}\n />\n )}\n </div>\n );\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 overlay\n ? cn(\n 'relative h-full min-h-0 w-full snap-start snap-always overflow-hidden bg-black focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-white/70',\n OVERLAY_BAR_SCRIM\n )\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 overlay\n ? immersive\n ? 'flex-1'\n : 'shrink-0'\n : immersive\n ? 'h-full flex-1 border-0'\n : 'h-full shrink-0 rounded-xl',\n classNames.item\n )}\n >\n {overlay ? (\n <>\n {/* The details come first in the DOM so focus visits them before\n the player's bar, which sits under them on screen. */}\n <OverlayDetails\n author={author}\n title={ownTitle}\n caption={caption}\n actions={renderActions?.(item)}\n fullscreenButton={fullscreenButton}\n labels={labels}\n classNames={classNames}\n />\n {mediaSlot}\n </>\n ) : (\n <>\n {mediaSlot}\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(\n 'm-0 text-base font-semibold',\n classNames.title\n )}\n >\n {title}\n </h3>\n </div>\n {fullscreenButton}\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 </>\n )}\n </article>\n );\n };\n\n const controls = overlay ? (\n // Over the middle of the feed's end edge, stacked the way the feed\n // scrolls, above the actions and the player's bar at the bottom. On a\n // short screen (a phone held sideways, as SuperChat reckons it) the middle\n // runs into the actions, so they move to the top end, clear of a host's\n // Back at the top start.\n <div\n data-slot=\"controls\"\n className={cn(\n 'pointer-events-none absolute end-2 top-1/2 z-10 flex -translate-y-1/2 flex-col items-center gap-1.5 [@media(max-height:30rem)]:top-2 [@media(max-height:30rem)]:translate-y-0',\n classNames.controls\n )}\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={labels.previous}\n title={labels.previous}\n className={cn(overlayButtonClass, 'pointer-events-auto')}\n disabled={activeIndex <= 0}\n onClick={() => navigate(activeIndex - 1)}\n >\n <ChevronUp className=\"h-5 w-5\" aria-hidden=\"true\" />\n </Button>\n <span\n role=\"status\"\n aria-live=\"polite\"\n className=\"rounded-full bg-black/45 px-1.5 py-0.5 text-xs whitespace-nowrap text-white tabular-nums backdrop-blur-sm\"\n >\n {/* Its own direction: \"2 / 3\" stays in order in an RTL page, and a\n translated \"2 من 3\" still reads right to left. */}\n <bdi>{labels.position(activeIndex + 1, items.length)}</bdi>\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={labels.next}\n title={labels.next}\n className={cn(overlayButtonClass, 'pointer-events-auto')}\n disabled={activeIndex >= items.length - 1}\n onClick={() => navigate(activeIndex + 1)}\n >\n <ChevronDown className=\"h-5 w-5\" aria-hidden=\"true\" />\n </Button>\n </div>\n ) : (\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 type=\"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 {/* Its own direction: \"2 / 3\" stays in order in an RTL page, and a\n translated \"2 من 3\" still reads right to left. */}\n <bdi>{labels.position(activeIndex + 1, items.length)}</bdi>\n </span>\n <Button\n type=\"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 data-layout={layout}\n // The overlay layout is a dark surface in every theme, as video players\n // are; scoping the dark theme keeps library and host content inside it\n // (actions, errors, Retry) on their dark-theme colours.\n data-theme={overlay ? 'dark' : undefined}\n className={cn(\n 'bg-background text-foreground flex h-[min(48rem,80dvh)] min-h-0 w-full flex-col',\n overlay && 'relative',\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 type=\"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 overflow-y-auto overscroll-contain focus-visible:ring-2 focus-visible:outline-none',\n !overlay && 'gap-4',\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={\n allowFullscreen && fullscreen && !loading && !error && !!items.length\n }\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 data-layout={layout}\n // Set again here in case Modal ever portals its content out of the\n // feed's dark scope.\n data-theme={overlay ? 'dark' : undefined}\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 overlay && 'relative',\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,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
- var chunkXPWFIDZM_cjs = require('./chunk-XPWFIDZM.cjs');
3
+ var chunkXU3X2AUL_cjs = require('./chunk-XU3X2AUL.cjs');
4
4
  var chunkVINZZQBD_cjs = require('./chunk-VINZZQBD.cjs');
5
5
  var chunkZOSM6D7F_cjs = require('./chunk-ZOSM6D7F.cjs');
6
6
  var chunk32ZILZ2T_cjs = require('./chunk-32ZILZ2T.cjs');
7
- var chunk2FZYZ4HT_cjs = require('./chunk-2FZYZ4HT.cjs');
7
+ var chunkHDSYYQYM_cjs = require('./chunk-HDSYYQYM.cjs');
8
8
  var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
9
9
  var React = require('react');
10
10
  var jsxRuntime = require('react/jsx-runtime');
@@ -102,7 +102,7 @@ function ViewSet({
102
102
  return table ?? null;
103
103
  case "board":
104
104
  return /* @__PURE__ */ jsxRuntime.jsx(
105
- chunk2FZYZ4HT_cjs.BoardView,
105
+ chunkHDSYYQYM_cjs.BoardView,
106
106
  {
107
107
  ...shared,
108
108
  stages: stages ?? [],
@@ -143,7 +143,7 @@ function ViewSet({
143
143
  "data-slot": "view-set-switcher",
144
144
  className: chunkS5RVSXDV_cjs.cn("ms-auto", classNames?.switcher),
145
145
  children: /* @__PURE__ */ jsxRuntime.jsx(
146
- chunkXPWFIDZM_cjs.ViewSwitcher,
146
+ chunkXU3X2AUL_cjs.ViewSwitcher,
147
147
  {
148
148
  views: offered,
149
149
  value: active,
@@ -184,5 +184,5 @@ function ViewSet({
184
184
  }
185
185
 
186
186
  exports.ViewSet = ViewSet;
187
- //# sourceMappingURL=chunk-3IKIRGHI.cjs.map
188
- //# sourceMappingURL=chunk-3IKIRGHI.cjs.map
187
+ //# sourceMappingURL=chunk-3H6BQV2D.cjs.map
188
+ //# sourceMappingURL=chunk-3H6BQV2D.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ViewSet/ViewSet.tsx"],"names":["React","jsx","BoardView","CalendarView","GanttView","ListView","jsxs","cn","ViewSwitcher"],"mappings":"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","file":"chunk-3IKIRGHI.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { ViewSwitcher, type ViewOption } from '../ViewSwitcher';\nimport { ListView, type ListViewProps } from '../ListView';\nimport { BoardView, type BoardLabels, type BoardViewProps } from '../BoardView';\nimport {\n CalendarView,\n type CalendarLabels,\n type CalendarViewProps,\n} from '../CalendarView';\nimport { GanttView, type GanttLabels, type GanttViewProps } from '../GanttView';\nimport type { Stage, ViewBaseProps, ViewId } from '../../views/types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Every string any layout in the set can render.\n *\n * Each view extends `ViewLabels` with its own — the calendar's month arrows and\n * \"+n more\", the board's move announcements, the Gantt's undated footnote. They\n * are all shared props, so the per-view escape hatches below exclude `labels`;\n * without widening here a non-English host could translate the common strings\n * and nothing else, which would break the contract that every user-facing\n * string is overridable. A view ignores the keys it does not know.\n */\nexport type ViewSetLabels = Partial<CalendarLabels & BoardLabels & GanttLabels>;\n\n/**\n * Props `ViewSet` passes to every layout itself, beyond `ViewBaseProps`. Named\n * here so the per-view escape hatches below can exclude them by key rather than\n * by a hand-kept list that would drift the moment a shared prop is added.\n */\ntype ViewSetOwned = 'stages' | 'onMove' | 'timeZone' | 'locale';\n\ntype ViewOverrides<P, T> = Omit<\n Partial<P>,\n keyof ViewBaseProps<T> | ViewSetOwned\n>;\n\nexport interface ViewSetProps<T> extends ViewBaseProps<T> {\n /** Every string any offered layout can render, not just the shared ones. */\n labels?: ViewSetLabels;\n /** Views to offer, in order. The first is the default when uncontrolled. */\n views: readonly (ViewId | ViewOption)[];\n view?: ViewId;\n defaultView?: ViewId;\n onViewChange?: (view: ViewId) => void;\n /**\n * Remembers the chosen view under this key. Ignored when `view` is\n * controlled — a page with its own URL state should own it there instead.\n */\n storageKey?: string;\n /** Stages for the board and for list grouping. */\n stages?: readonly Stage[];\n onMove?: BoardViewProps<T>['onMove'];\n /**\n * IANA zone the date views read day boundaries in. Shared, because a page\n * showing one collection as a calendar and as a Gantt must place it on the\n * same days in both.\n */\n timeZone?: string;\n /** Locale for date formatting in the calendar and Gantt. */\n locale?: string;\n\n /** Rendered above the switcher row. */\n toolbar?: React.ReactNode;\n /** Rendered under the switcher row, above the view. */\n filters?: React.ReactNode;\n /** The `overview` view. Domain content — the library has no opinion on it. */\n overview?: React.ReactNode;\n /** The `table` view. A tabular collection is a grid, not a view component. */\n table?: React.ReactNode;\n /** Rendered beside the view, for a list-plus-detail layout. */\n detail?: React.ReactNode;\n\n /**\n * Per-view escape hatches for props this shell does not surface. Shared props\n * are excluded: one collection rendered several ways means switching view can\n * never change the records, the selection or the load state.\n *\n * `ViewSetOwned` covers the props the shell passes itself but that are not on\n * `ViewBaseProps`. They are spread after the shared ones, so leaving them open\n * would let one layout carry different stages, a different mutation callback\n * or a different time zone from its neighbours — the same collection quietly\n * disagreeing with itself as you switch tabs.\n */\n listProps?: ViewOverrides<ListViewProps<T>, T>;\n boardProps?: ViewOverrides<BoardViewProps<T>, T>;\n calendarProps?: ViewOverrides<CalendarViewProps<T>, T>;\n ganttProps?: ViewOverrides<GanttViewProps<T>, T>;\n\n classNames?: Partial<\n Record<'toolbar' | 'switcher' | 'body' | 'detail', string>\n >;\n}\n\nconst FIRST_ID = (views: ViewSetProps<unknown>['views']) => {\n const first = views[0];\n return (typeof first === 'string' ? first : first?.id) ?? 'list';\n};\n\n// Remembering the view is an enhancement, never a requirement. `localStorage`\n// can exist and still throw — Safari private browsing and a blocked third-party\n// storage policy both raise on access — so optional chaining is not enough; an\n// unguarded read would take the whole page down to save a preference.\nconst readStored = (key: string): ViewId | null => {\n try {\n return (globalThis.localStorage?.getItem(key) as ViewId | null) ?? null;\n } catch {\n return null;\n }\n};\n\nconst writeStored = (key: string, value: ViewId) => {\n try {\n globalThis.localStorage?.setItem(key, value);\n } catch {\n // Fall back to in-memory state for the session.\n }\n};\n\n// =============================================================================\n// Component\n// =============================================================================\n\n/**\n * The page-level composition: switcher, the enabled views, and the slots a page\n * needs around them. It owns which view is showing and nothing else — items,\n * selection and every mutation stay with the caller.\n */\nexport function ViewSet<T>({\n views,\n view,\n defaultView,\n onViewChange,\n storageKey,\n stages,\n onMove,\n toolbar,\n filters,\n overview,\n table,\n detail,\n listProps,\n boardProps,\n calendarProps,\n ganttProps,\n className,\n classNames,\n ...shared\n}: ViewSetProps<T>) {\n const [internalView, setInternalView] = React.useState<ViewId>(\n () => defaultView ?? FIRST_ID(views)\n );\n\n // `overview` and `table` are the caller's content. Offering either without\n // its slot would put a dead option in the switcher that renders a blank page.\n const offered = React.useMemo(\n () =>\n views.filter((v) => {\n const id = typeof v === 'string' ? v : v.id;\n if (id === 'overview') return overview != null;\n if (id === 'table') return table != null;\n return true;\n }),\n [views, overview, table]\n );\n\n // Read storage after mount: a server render and the first client render must\n // agree, and localStorage is not available to the former.\n React.useEffect(() => {\n if (!storageKey || view) return;\n const stored = readStored(storageKey);\n if (\n stored &&\n offered.some((v) => (typeof v === 'string' ? v : v.id) === stored)\n )\n setInternalView(stored);\n }, [storageKey, view, offered]);\n\n const requested = view ?? internalView;\n const active = offered.some(\n (v) => (typeof v === 'string' ? v : v.id) === requested\n )\n ? requested\n : FIRST_ID(offered);\n\n const changeView = (next: ViewId) => {\n if (!view) setInternalView(next);\n if (storageKey && !view) writeStored(storageKey, next);\n onViewChange?.(next);\n };\n\n const body = (() => {\n switch (active) {\n case 'overview':\n return overview ?? null;\n case 'table':\n return table ?? null;\n case 'board':\n return (\n <BoardView\n {...shared}\n stages={stages ?? []}\n onMove={onMove}\n {...boardProps}\n />\n );\n case 'calendar':\n return <CalendarView {...shared} {...calendarProps} />;\n case 'gantt':\n return <GanttView {...shared} {...ganttProps} />;\n case 'roadmap':\n // A roadmap is the Gantt at a coarse cadence; see Views.mdx. The two\n // props that make it one come last: `ganttProps` is shared with the\n // plain `gantt` case, so a `cadence: 'day'` meant for that view must\n // not quietly turn the Roadmap option into a daily chart.\n return (\n <GanttView\n {...shared}\n {...ganttProps}\n cadence=\"quarter\"\n groupByLane\n />\n );\n case 'list':\n default:\n return <ListView {...shared} stages={stages} {...listProps} />;\n }\n })();\n\n return (\n <div data-slot=\"view-set\" className={cn('flex flex-col gap-3', className)}>\n <div\n data-slot=\"view-set-toolbar\"\n className={cn('flex flex-wrap items-center gap-2', classNames?.toolbar)}\n >\n {toolbar}\n <div\n data-slot=\"view-set-switcher\"\n className={cn('ms-auto', classNames?.switcher)}\n >\n <ViewSwitcher\n views={offered}\n value={active}\n onValueChange={changeView}\n label={shared.labels?.viewSwitcher}\n />\n </div>\n </div>\n {filters}\n <div\n data-slot=\"view-set-body\"\n className={cn(\n // Plain column spans rather than an arbitrary grid template, so a\n // Tailwind 3 consumer needs no extra safelist entry.\n detail && 'gap-3 lg:grid lg:grid-cols-3',\n classNames?.body\n )}\n >\n <div className={cn('min-w-0', detail && 'lg:col-span-2')}>{body}</div>\n {detail && (\n <aside\n data-slot=\"view-set-detail\"\n className={cn('min-w-0', classNames?.detail)}\n >\n {detail}\n </aside>\n )}\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/ViewSet/ViewSet.tsx"],"names":["React","jsx","BoardView","CalendarView","GanttView","ListView","jsxs","cn","ViewSwitcher"],"mappings":"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","file":"chunk-3H6BQV2D.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { ViewSwitcher, type ViewOption } from '../ViewSwitcher';\nimport { ListView, type ListViewProps } from '../ListView';\nimport { BoardView, type BoardLabels, type BoardViewProps } from '../BoardView';\nimport {\n CalendarView,\n type CalendarLabels,\n type CalendarViewProps,\n} from '../CalendarView';\nimport { GanttView, type GanttLabels, type GanttViewProps } from '../GanttView';\nimport type { Stage, ViewBaseProps, ViewId } from '../../views/types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Every string any layout in the set can render.\n *\n * Each view extends `ViewLabels` with its own — the calendar's month arrows and\n * \"+n more\", the board's move announcements, the Gantt's undated footnote. They\n * are all shared props, so the per-view escape hatches below exclude `labels`;\n * without widening here a non-English host could translate the common strings\n * and nothing else, which would break the contract that every user-facing\n * string is overridable. A view ignores the keys it does not know.\n */\nexport type ViewSetLabels = Partial<CalendarLabels & BoardLabels & GanttLabels>;\n\n/**\n * Props `ViewSet` passes to every layout itself, beyond `ViewBaseProps`. Named\n * here so the per-view escape hatches below can exclude them by key rather than\n * by a hand-kept list that would drift the moment a shared prop is added.\n */\ntype ViewSetOwned = 'stages' | 'onMove' | 'timeZone' | 'locale';\n\ntype ViewOverrides<P, T> = Omit<\n Partial<P>,\n keyof ViewBaseProps<T> | ViewSetOwned\n>;\n\nexport interface ViewSetProps<T> extends ViewBaseProps<T> {\n /** Every string any offered layout can render, not just the shared ones. */\n labels?: ViewSetLabels;\n /** Views to offer, in order. The first is the default when uncontrolled. */\n views: readonly (ViewId | ViewOption)[];\n view?: ViewId;\n defaultView?: ViewId;\n onViewChange?: (view: ViewId) => void;\n /**\n * Remembers the chosen view under this key. Ignored when `view` is\n * controlled — a page with its own URL state should own it there instead.\n */\n storageKey?: string;\n /** Stages for the board and for list grouping. */\n stages?: readonly Stage[];\n onMove?: BoardViewProps<T>['onMove'];\n /**\n * IANA zone the date views read day boundaries in. Shared, because a page\n * showing one collection as a calendar and as a Gantt must place it on the\n * same days in both.\n */\n timeZone?: string;\n /** Locale for date formatting in the calendar and Gantt. */\n locale?: string;\n\n /** Rendered above the switcher row. */\n toolbar?: React.ReactNode;\n /** Rendered under the switcher row, above the view. */\n filters?: React.ReactNode;\n /** The `overview` view. Domain content — the library has no opinion on it. */\n overview?: React.ReactNode;\n /** The `table` view. A tabular collection is a grid, not a view component. */\n table?: React.ReactNode;\n /** Rendered beside the view, for a list-plus-detail layout. */\n detail?: React.ReactNode;\n\n /**\n * Per-view escape hatches for props this shell does not surface. Shared props\n * are excluded: one collection rendered several ways means switching view can\n * never change the records, the selection or the load state.\n *\n * `ViewSetOwned` covers the props the shell passes itself but that are not on\n * `ViewBaseProps`. They are spread after the shared ones, so leaving them open\n * would let one layout carry different stages, a different mutation callback\n * or a different time zone from its neighbours — the same collection quietly\n * disagreeing with itself as you switch tabs.\n */\n listProps?: ViewOverrides<ListViewProps<T>, T>;\n boardProps?: ViewOverrides<BoardViewProps<T>, T>;\n calendarProps?: ViewOverrides<CalendarViewProps<T>, T>;\n ganttProps?: ViewOverrides<GanttViewProps<T>, T>;\n\n classNames?: Partial<\n Record<'toolbar' | 'switcher' | 'body' | 'detail', string>\n >;\n}\n\nconst FIRST_ID = (views: ViewSetProps<unknown>['views']) => {\n const first = views[0];\n return (typeof first === 'string' ? first : first?.id) ?? 'list';\n};\n\n// Remembering the view is an enhancement, never a requirement. `localStorage`\n// can exist and still throw — Safari private browsing and a blocked third-party\n// storage policy both raise on access — so optional chaining is not enough; an\n// unguarded read would take the whole page down to save a preference.\nconst readStored = (key: string): ViewId | null => {\n try {\n return (globalThis.localStorage?.getItem(key) as ViewId | null) ?? null;\n } catch {\n return null;\n }\n};\n\nconst writeStored = (key: string, value: ViewId) => {\n try {\n globalThis.localStorage?.setItem(key, value);\n } catch {\n // Fall back to in-memory state for the session.\n }\n};\n\n// =============================================================================\n// Component\n// =============================================================================\n\n/**\n * The page-level composition: switcher, the enabled views, and the slots a page\n * needs around them. It owns which view is showing and nothing else — items,\n * selection and every mutation stay with the caller.\n */\nexport function ViewSet<T>({\n views,\n view,\n defaultView,\n onViewChange,\n storageKey,\n stages,\n onMove,\n toolbar,\n filters,\n overview,\n table,\n detail,\n listProps,\n boardProps,\n calendarProps,\n ganttProps,\n className,\n classNames,\n ...shared\n}: ViewSetProps<T>) {\n const [internalView, setInternalView] = React.useState<ViewId>(\n () => defaultView ?? FIRST_ID(views)\n );\n\n // `overview` and `table` are the caller's content. Offering either without\n // its slot would put a dead option in the switcher that renders a blank page.\n const offered = React.useMemo(\n () =>\n views.filter((v) => {\n const id = typeof v === 'string' ? v : v.id;\n if (id === 'overview') return overview != null;\n if (id === 'table') return table != null;\n return true;\n }),\n [views, overview, table]\n );\n\n // Read storage after mount: a server render and the first client render must\n // agree, and localStorage is not available to the former.\n React.useEffect(() => {\n if (!storageKey || view) return;\n const stored = readStored(storageKey);\n if (\n stored &&\n offered.some((v) => (typeof v === 'string' ? v : v.id) === stored)\n )\n setInternalView(stored);\n }, [storageKey, view, offered]);\n\n const requested = view ?? internalView;\n const active = offered.some(\n (v) => (typeof v === 'string' ? v : v.id) === requested\n )\n ? requested\n : FIRST_ID(offered);\n\n const changeView = (next: ViewId) => {\n if (!view) setInternalView(next);\n if (storageKey && !view) writeStored(storageKey, next);\n onViewChange?.(next);\n };\n\n const body = (() => {\n switch (active) {\n case 'overview':\n return overview ?? null;\n case 'table':\n return table ?? null;\n case 'board':\n return (\n <BoardView\n {...shared}\n stages={stages ?? []}\n onMove={onMove}\n {...boardProps}\n />\n );\n case 'calendar':\n return <CalendarView {...shared} {...calendarProps} />;\n case 'gantt':\n return <GanttView {...shared} {...ganttProps} />;\n case 'roadmap':\n // A roadmap is the Gantt at a coarse cadence; see Views.mdx. The two\n // props that make it one come last: `ganttProps` is shared with the\n // plain `gantt` case, so a `cadence: 'day'` meant for that view must\n // not quietly turn the Roadmap option into a daily chart.\n return (\n <GanttView\n {...shared}\n {...ganttProps}\n cadence=\"quarter\"\n groupByLane\n />\n );\n case 'list':\n default:\n return <ListView {...shared} stages={stages} {...listProps} />;\n }\n })();\n\n return (\n <div data-slot=\"view-set\" className={cn('flex flex-col gap-3', className)}>\n <div\n data-slot=\"view-set-toolbar\"\n className={cn('flex flex-wrap items-center gap-2', classNames?.toolbar)}\n >\n {toolbar}\n <div\n data-slot=\"view-set-switcher\"\n className={cn('ms-auto', classNames?.switcher)}\n >\n <ViewSwitcher\n views={offered}\n value={active}\n onValueChange={changeView}\n label={shared.labels?.viewSwitcher}\n />\n </div>\n </div>\n {filters}\n <div\n data-slot=\"view-set-body\"\n className={cn(\n // Plain column spans rather than an arbitrary grid template, so a\n // Tailwind 3 consumer needs no extra safelist entry.\n detail && 'gap-3 lg:grid lg:grid-cols-3',\n classNames?.body\n )}\n >\n <div className={cn('min-w-0', detail && 'lg:col-span-2')}>{body}</div>\n {detail && (\n <aside\n data-slot=\"view-set-detail\"\n className={cn('min-w-0', classNames?.detail)}\n >\n {detail}\n </aside>\n )}\n </div>\n </div>\n );\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkZ3WMDVMR_cjs = require('./chunk-Z3WMDVMR.cjs');
3
+ var chunk7QNBPB7F_cjs = require('./chunk-7QNBPB7F.cjs');
4
4
  var chunkHGJHWI7W_cjs = require('./chunk-HGJHWI7W.cjs');
5
5
  var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
6
6
  var React = require('react');
@@ -74,7 +74,7 @@ function MegaMenu({
74
74
  CLOSE_DELAY_MS
75
75
  );
76
76
  }, [clearTimers, onOpenChange]);
77
- const direction = chunkZ3WMDVMR_cjs.useDirection(rootRef);
77
+ const direction = chunk7QNBPB7F_cjs.useDirection(rootRef);
78
78
  const position = React__namespace.useCallback(() => {
79
79
  const root = rootRef.current;
80
80
  const panel = panelRef.current;
@@ -456,5 +456,5 @@ function MegaMenuBar({
456
456
  exports.MegaMenu = MegaMenu;
457
457
  exports.MegaMenuBar = MegaMenuBar;
458
458
  exports.normalizePath = normalizePath;
459
- //# sourceMappingURL=chunk-IIV5GNSK.cjs.map
460
- //# sourceMappingURL=chunk-IIV5GNSK.cjs.map
459
+ //# sourceMappingURL=chunk-3PT4B4JT.cjs.map
460
+ //# sourceMappingURL=chunk-3PT4B4JT.cjs.map