@flamingo-stack/openframe-frontend-core 0.0.177 → 0.0.178-snapshot.20260514174355

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 (69) hide show
  1. package/dist/{chunk-C6ZMI4UB.cjs → chunk-4TM2SBMX.cjs} +884 -1513
  2. package/dist/chunk-4TM2SBMX.cjs.map +1 -0
  3. package/dist/{chunk-WX7PT5C7.cjs → chunk-ALW3D72O.cjs} +61 -2
  4. package/dist/chunk-ALW3D72O.cjs.map +1 -0
  5. package/dist/{chunk-KB2N44BY.js → chunk-FMWHOUFE.js} +61 -2
  6. package/dist/chunk-FMWHOUFE.js.map +1 -0
  7. package/dist/{chunk-6LDN3CIY.js → chunk-ZMQP3UZJ.js} +3701 -4330
  8. package/dist/chunk-ZMQP3UZJ.js.map +1 -0
  9. package/dist/components/features/entity-video-section.d.ts +54 -0
  10. package/dist/components/features/entity-video-section.d.ts.map +1 -0
  11. package/dist/components/features/index.cjs +17 -3
  12. package/dist/components/features/index.cjs.map +1 -1
  13. package/dist/components/features/index.d.ts +4 -2
  14. package/dist/components/features/index.d.ts.map +1 -1
  15. package/dist/components/features/index.js +22 -8
  16. package/dist/components/features/video-bites-display.d.ts +38 -0
  17. package/dist/components/features/video-bites-display.d.ts.map +1 -0
  18. package/dist/components/features/video-ratio-tabs.d.ts +62 -0
  19. package/dist/components/features/video-ratio-tabs.d.ts.map +1 -0
  20. package/dist/components/features/video.d.ts +94 -0
  21. package/dist/components/features/video.d.ts.map +1 -0
  22. package/dist/components/index.cjs +17 -3
  23. package/dist/components/index.cjs.map +1 -1
  24. package/dist/components/index.js +22 -8
  25. package/dist/components/media-carousel.d.ts.map +1 -1
  26. package/dist/components/navigation/index.cjs +3 -3
  27. package/dist/components/navigation/index.js +2 -2
  28. package/dist/components/shared/product-release/release-detail-page.d.ts.map +1 -1
  29. package/dist/components/ui/index.cjs +3 -3
  30. package/dist/components/ui/index.js +2 -2
  31. package/dist/hooks/index.cjs +4 -2
  32. package/dist/hooks/index.cjs.map +1 -1
  33. package/dist/hooks/index.d.ts +1 -0
  34. package/dist/hooks/index.d.ts.map +1 -1
  35. package/dist/hooks/index.js +3 -1
  36. package/dist/hooks/use-near-viewport.d.ts +42 -0
  37. package/dist/hooks/use-near-viewport.d.ts.map +1 -0
  38. package/dist/index.cjs +19 -3
  39. package/dist/index.cjs.map +1 -1
  40. package/dist/index.js +24 -8
  41. package/package.json +2 -2
  42. package/src/components/features/entity-video-section.tsx +175 -0
  43. package/src/components/features/index.ts +9 -2
  44. package/src/components/features/video-bites-display.tsx +216 -0
  45. package/src/components/features/video-ratio-tabs.tsx +174 -0
  46. package/src/components/features/video.tsx +474 -0
  47. package/src/components/media-carousel.tsx +43 -236
  48. package/src/components/shared/product-release/release-detail-page.tsx +26 -19
  49. package/src/hooks/index.ts +3 -0
  50. package/src/hooks/use-near-viewport.ts +118 -0
  51. package/dist/chunk-6LDN3CIY.js.map +0 -1
  52. package/dist/chunk-C6ZMI4UB.cjs.map +0 -1
  53. package/dist/chunk-KB2N44BY.js.map +0 -1
  54. package/dist/chunk-WX7PT5C7.cjs.map +0 -1
  55. package/dist/components/features/video-player.d.ts +0 -47
  56. package/dist/components/features/video-player.d.ts.map +0 -1
  57. package/dist/components/features/youtube-embed.d.ts +0 -17
  58. package/dist/components/features/youtube-embed.d.ts.map +0 -1
  59. package/dist/utils/lite-youtube-embed-stub.d.ts +0 -8
  60. package/dist/utils/lite-youtube-embed-stub.d.ts.map +0 -1
  61. package/dist/utils/lite-youtube-embed.d.ts +0 -9
  62. package/dist/utils/lite-youtube-embed.d.ts.map +0 -1
  63. package/src/components/features/.video-player.md +0 -44
  64. package/src/components/features/.youtube-embed.md +0 -40
  65. package/src/components/features/__tests__/video-player.test.tsx +0 -142
  66. package/src/components/features/video-player.tsx +0 -1030
  67. package/src/components/features/youtube-embed.tsx +0 -275
  68. package/src/utils/lite-youtube-embed-stub.tsx +0 -21
  69. package/src/utils/lite-youtube-embed.tsx +0 -46
@@ -0,0 +1,54 @@
1
+ import { ComponentType } from 'react';
2
+ import type { VideoTeaser } from '../../types/video-processing';
3
+ /**
4
+ * <EntityVideoSection> — public detail-page video block.
5
+ *
6
+ * Tabbed Full Video / Highlights when both exist, plus optional
7
+ * markdown summary + video bites grid. The actual video rendering
8
+ * (YouTube facade, Mux HLS, MP4 fallback) is delegated to `<Video>` —
9
+ * the single source of truth.
10
+ *
11
+ * YouTube takes precedence over the uploaded video when both
12
+ * `youtubeUrl` and `mainVideoUrl` are present. That precedence is
13
+ * resolved here (in the section wrapper) rather than inside `<Video>`,
14
+ * so the underlying primitive stays single-source-per-render.
15
+ */
16
+ interface MarkdownRendererProps {
17
+ content: string;
18
+ }
19
+ export interface EntityVideoSectionProps {
20
+ /** Main uploaded video URL. */
21
+ mainVideoUrl?: string | null;
22
+ /** YouTube URL (takes priority over `mainVideoUrl` for display). */
23
+ youtubeUrl?: string | null;
24
+ /** AI-generated highlight video URL. */
25
+ highlightVideoUrl?: string | null;
26
+ /** Thumbnail for highlight video. */
27
+ highlightVideoThumbnail?: string | null;
28
+ /** Poster/thumbnail for main video. */
29
+ mainVideoPoster?: string | null;
30
+ /** Title for YouTube embed. */
31
+ title?: string;
32
+ /** AI-generated video summary (markdown). */
33
+ videoSummary?: string | null;
34
+ /** Video bites/teasers array. */
35
+ videoBites?: VideoTeaser[];
36
+ /** Title for the video bites section. */
37
+ bitesTitle?: string;
38
+ /** Whether to filter bites to published only. */
39
+ filterPublishedBites?: boolean;
40
+ /** Markdown renderer component injected by the host app. */
41
+ MarkdownRenderer?: ComponentType<MarkdownRendererProps>;
42
+ /**
43
+ * Raw SRT content. Deprecated — pass `captionsUrl` instead.
44
+ * Forwarded to `<Video>` for the dev-only warning.
45
+ */
46
+ srtContent?: string | null;
47
+ /** HTTPS URL to a VTT captions file (rendered as native `<track>`). */
48
+ captionsUrl?: string | null;
49
+ /** LCP hint — when true, the full-video tab's poster eager-loads. */
50
+ priority?: boolean;
51
+ }
52
+ export declare function EntityVideoSection({ mainVideoUrl, youtubeUrl, highlightVideoUrl, highlightVideoThumbnail, mainVideoPoster, title, videoSummary, videoBites, bitesTitle, filterPublishedBites, MarkdownRenderer, srtContent, captionsUrl, priority, }: EntityVideoSectionProps): import("react/jsx-runtime").JSX.Element | null;
53
+ export {};
54
+ //# sourceMappingURL=entity-video-section.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-video-section.d.ts","sourceRoot":"","sources":["../../../src/components/features/entity-video-section.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAOtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAIhE;;;;;;;;;;;;GAYG;AAEH,UAAU,qBAAqB;IAC7B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,+BAA+B;IAC/B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,wCAAwC;IACxC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,qCAAqC;IACrC,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iCAAiC;IACjC,UAAU,CAAC,EAAE,WAAW,EAAE,CAAC;IAC3B,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,aAAa,CAAC,qBAAqB,CAAC,CAAC;IACxD;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,qEAAqE;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,KAAe,EACf,YAAY,EACZ,UAAU,EACV,UAA+B,EAC/B,oBAA2B,EAC3B,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,QAAgB,GACjB,EAAE,uBAAuB,kDA8FzB"}
@@ -78,8 +78,15 @@
78
78
 
79
79
 
80
80
 
81
- var _chunkC6ZMI4UBcjs = require('../../chunk-C6ZMI4UB.cjs');
82
- require('../../chunk-WX7PT5C7.cjs');
81
+
82
+
83
+
84
+
85
+
86
+
87
+
88
+ var _chunk4TM2SBMXcjs = require('../../chunk-4TM2SBMX.cjs');
89
+ require('../../chunk-ALW3D72O.cjs');
83
90
  require('../../chunk-BJTOSUT4.cjs');
84
91
  require('../../chunk-EWIC26TW.cjs');
85
92
  require('../../chunk-OFAYLG6D.cjs');
@@ -165,5 +172,12 @@ require('../../chunk-VRHGVLSL.cjs');
165
172
 
166
173
 
167
174
 
168
- exports.AIEnrichButton = _chunkC6ZMI4UBcjs.AIEnrichButton; exports.AIEnrichSection = _chunkC6ZMI4UBcjs.AIEnrichSection; exports.AIRequiredBadge = _chunkC6ZMI4UBcjs.AIRequiredBadge; exports.AIStatusIndicator = _chunkC6ZMI4UBcjs.AIStatusIndicator; exports.AIWarningsSection = _chunkC6ZMI4UBcjs.AIWarningsSection; exports.ArrayEntryManager = _chunkC6ZMI4UBcjs.ArrayEntryManager; exports.AuthProvidersList = _chunkC6ZMI4UBcjs.AuthProvidersList; exports.Board = _chunkC6ZMI4UBcjs.Board; exports.BoardColumn = _chunkC6ZMI4UBcjs.BoardColumn; exports.BoardColumnHeader = _chunkC6ZMI4UBcjs.BoardColumnHeader; exports.ChangelogManager = _chunkC6ZMI4UBcjs.ChangelogManager; exports.ChangelogSectionsManager = _chunkC6ZMI4UBcjs.ChangelogSectionsManager; exports.ClickUpTasksManager = _chunkC6ZMI4UBcjs.ClickUpTasksManager; exports.CommandBox = _chunkC6ZMI4UBcjs.CommandBox; exports.ConfidenceBadge = _chunkC6ZMI4UBcjs.ConfidenceBadge; exports.DynamicThemeProvider = _chunkC6ZMI4UBcjs.DynamicThemeProvider; exports.EntitySummaryEditor = _chunkC6ZMI4UBcjs.EntitySummaryEditor; exports.ErrorBoundary = _chunkC6ZMI4UBcjs.ErrorBoundary; exports.FigmaPrototypeViewer = _chunkC6ZMI4UBcjs.FigmaPrototypeViewer; exports.FiltersDropdown = _chunkC6ZMI4UBcjs.FiltersDropdown; exports.GitHubReleasesManager = _chunkC6ZMI4UBcjs.GitHubReleasesManager; exports.HighlightConfigSection = _chunkC6ZMI4UBcjs.HighlightConfigSection; exports.HighlightGenerationSection = _chunkC6ZMI4UBcjs.HighlightGenerationSection; exports.HighlightVideoCombinedSection = _chunkC6ZMI4UBcjs.HighlightVideoCombinedSection; exports.HighlightVideoPreview = _chunkC6ZMI4UBcjs.HighlightVideoPreview; exports.HighlightVideoSection = _chunkC6ZMI4UBcjs.HighlightVideoSection; exports.KnowledgeBaseLinksManager = _chunkC6ZMI4UBcjs.KnowledgeBaseLinksManager; exports.LoadingProvider = _chunkC6ZMI4UBcjs.LoadingProvider; exports.MediaGalleryManager = _chunkC6ZMI4UBcjs.MediaGalleryManager; exports.MoreAboutButton = _chunkC6ZMI4UBcjs.MoreAboutButton; exports.NotificationDrawer = _chunkC6ZMI4UBcjs.NotificationDrawer; exports.NotificationTile = _chunkC6ZMI4UBcjs.NotificationTile; exports.NotificationsProvider = _chunkC6ZMI4UBcjs.NotificationsProvider; exports.OPENFRAME_PATHS = _chunkC6ZMI4UBcjs.OPENFRAME_PATHS; exports.OSTypeBadge = _chunkC6ZMI4UBcjs.OSTypeBadge; exports.OSTypeBadgeGroup = _chunkC6ZMI4UBcjs.OSTypeBadgeGroup; exports.OSTypeIcon = _chunkC6ZMI4UBcjs.OSTypeIcon; exports.OSTypeLabel = _chunkC6ZMI4UBcjs.OSTypeLabel; exports.OrganizationIcon = _chunkC6ZMI4UBcjs.OrganizationIcon; exports.ParallaxImageShowcase = _chunkC6ZMI4UBcjs.ParallaxImageShowcase; exports.PathsDisplay = _chunkC6ZMI4UBcjs.PathsDisplay; exports.PlatformBadge = _chunkC6ZMI4UBcjs.PlatformBadge; exports.PlatformFilterComponent = _chunkC6ZMI4UBcjs.PlatformFilterComponent; exports.PolicyConfigurationPanel = _chunkC6ZMI4UBcjs.PolicyConfigurationPanel; exports.ProviderButton = _chunkC6ZMI4UBcjs.ProviderButton; exports.PushButtonSelector = _chunkC6ZMI4UBcjs.PushButtonSelector; exports.ReleaseMediaManager = _chunkC6ZMI4UBcjs.ReleaseMediaManager; exports.SEOEditorPreview = _chunkC6ZMI4UBcjs.SEOEditorPreview; exports.SectionSelector = _chunkC6ZMI4UBcjs.SectionSelector; exports.SelectButton = _chunkC6ZMI4UBcjs.SelectButton; exports.SocialLinksManager = _chunkC6ZMI4UBcjs.SocialLinksManager; exports.StartWithOpenFrameButton = _chunkC6ZMI4UBcjs.StartWithOpenFrameButton; exports.StatusFilterComponent = _chunkC6ZMI4UBcjs.StatusFilterComponent; exports.TagsSelector = _chunkC6ZMI4UBcjs.TagsSelector; exports.TicketCard = _chunkC6ZMI4UBcjs.TicketCard; exports.TicketCardSkeleton = _chunkC6ZMI4UBcjs.TicketCardSkeleton; exports.TranscribeAndSummarizeCombinedSection = _chunkC6ZMI4UBcjs.TranscribeAndSummarizeCombinedSection; exports.TranscribeSummarizeSection = _chunkC6ZMI4UBcjs.TranscribeSummarizeSection; exports.TranscriptSummaryEditor = _chunkC6ZMI4UBcjs.TranscriptSummaryEditor; exports.VideoClipsSection = _chunkC6ZMI4UBcjs.VideoClipsSection; exports.VideoPlayer = _chunkC6ZMI4UBcjs.VideoPlayer; exports.VideoSourceSelector = _chunkC6ZMI4UBcjs.VideoSourceSelector; exports.ViewToggle = _chunkC6ZMI4UBcjs.ViewToggle; exports.WaitlistForm = _chunkC6ZMI4UBcjs.WaitlistForm; exports.YouTubeEmbed = _chunkC6ZMI4UBcjs.YouTubeEmbed; exports.YouTubeLinkParser = _chunkC6ZMI4UBcjs.YouTubeLinkParser; exports.columnFromTicketStatus = _chunkC6ZMI4UBcjs.columnFromTicketStatus; exports.extractYouTubeId = _chunkC6ZMI4UBcjs.extractYouTubeId; exports.getOpenFramePaths = _chunkC6ZMI4UBcjs.getOpenFramePaths; exports.groupTicketsByStatus = _chunkC6ZMI4UBcjs.groupTicketsByStatus; exports.tintOnDark = _chunkC6ZMI4UBcjs.tintOnDark; exports.useBoardCollapse = _chunkC6ZMI4UBcjs.useBoardCollapse; exports.useDynamicTheme = _chunkC6ZMI4UBcjs.useDynamicTheme; exports.useFiltersDropdown = _chunkC6ZMI4UBcjs.useFiltersDropdown; exports.useLoading = _chunkC6ZMI4UBcjs.useLoading; exports.useNotifications = _chunkC6ZMI4UBcjs.useNotifications; exports.useOptionalNotifications = _chunkC6ZMI4UBcjs.useOptionalNotifications;
175
+
176
+
177
+
178
+
179
+
180
+
181
+
182
+ exports.AIEnrichButton = _chunk4TM2SBMXcjs.AIEnrichButton; exports.AIEnrichSection = _chunk4TM2SBMXcjs.AIEnrichSection; exports.AIRequiredBadge = _chunk4TM2SBMXcjs.AIRequiredBadge; exports.AIStatusIndicator = _chunk4TM2SBMXcjs.AIStatusIndicator; exports.AIWarningsSection = _chunk4TM2SBMXcjs.AIWarningsSection; exports.ArrayEntryManager = _chunk4TM2SBMXcjs.ArrayEntryManager; exports.AuthProvidersList = _chunk4TM2SBMXcjs.AuthProvidersList; exports.Board = _chunk4TM2SBMXcjs.Board; exports.BoardColumn = _chunk4TM2SBMXcjs.BoardColumn; exports.BoardColumnHeader = _chunk4TM2SBMXcjs.BoardColumnHeader; exports.ChangelogManager = _chunk4TM2SBMXcjs.ChangelogManager; exports.ChangelogSectionsManager = _chunk4TM2SBMXcjs.ChangelogSectionsManager; exports.ClickUpTasksManager = _chunk4TM2SBMXcjs.ClickUpTasksManager; exports.CommandBox = _chunk4TM2SBMXcjs.CommandBox; exports.ConfidenceBadge = _chunk4TM2SBMXcjs.ConfidenceBadge; exports.DynamicThemeProvider = _chunk4TM2SBMXcjs.DynamicThemeProvider; exports.EntitySummaryEditor = _chunk4TM2SBMXcjs.EntitySummaryEditor; exports.EntityVideoSection = _chunk4TM2SBMXcjs.EntityVideoSection; exports.ErrorBoundary = _chunk4TM2SBMXcjs.ErrorBoundary; exports.FigmaPrototypeViewer = _chunk4TM2SBMXcjs.FigmaPrototypeViewer; exports.FiltersDropdown = _chunk4TM2SBMXcjs.FiltersDropdown; exports.GitHubReleasesManager = _chunk4TM2SBMXcjs.GitHubReleasesManager; exports.HighlightConfigSection = _chunk4TM2SBMXcjs.HighlightConfigSection; exports.HighlightGenerationSection = _chunk4TM2SBMXcjs.HighlightGenerationSection; exports.HighlightVideoCombinedSection = _chunk4TM2SBMXcjs.HighlightVideoCombinedSection; exports.HighlightVideoPreview = _chunk4TM2SBMXcjs.HighlightVideoPreview; exports.HighlightVideoSection = _chunk4TM2SBMXcjs.HighlightVideoSection; exports.KnowledgeBaseLinksManager = _chunk4TM2SBMXcjs.KnowledgeBaseLinksManager; exports.LoadingProvider = _chunk4TM2SBMXcjs.LoadingProvider; exports.MediaGalleryManager = _chunk4TM2SBMXcjs.MediaGalleryManager; exports.MoreAboutButton = _chunk4TM2SBMXcjs.MoreAboutButton; exports.NotificationDrawer = _chunk4TM2SBMXcjs.NotificationDrawer; exports.NotificationTile = _chunk4TM2SBMXcjs.NotificationTile; exports.NotificationsProvider = _chunk4TM2SBMXcjs.NotificationsProvider; exports.OPENFRAME_PATHS = _chunk4TM2SBMXcjs.OPENFRAME_PATHS; exports.OSTypeBadge = _chunk4TM2SBMXcjs.OSTypeBadge; exports.OSTypeBadgeGroup = _chunk4TM2SBMXcjs.OSTypeBadgeGroup; exports.OSTypeIcon = _chunk4TM2SBMXcjs.OSTypeIcon; exports.OSTypeLabel = _chunk4TM2SBMXcjs.OSTypeLabel; exports.OrganizationIcon = _chunk4TM2SBMXcjs.OrganizationIcon; exports.ParallaxImageShowcase = _chunk4TM2SBMXcjs.ParallaxImageShowcase; exports.PathsDisplay = _chunk4TM2SBMXcjs.PathsDisplay; exports.PlatformBadge = _chunk4TM2SBMXcjs.PlatformBadge; exports.PlatformFilterComponent = _chunk4TM2SBMXcjs.PlatformFilterComponent; exports.PolicyConfigurationPanel = _chunk4TM2SBMXcjs.PolicyConfigurationPanel; exports.ProviderButton = _chunk4TM2SBMXcjs.ProviderButton; exports.PushButtonSelector = _chunk4TM2SBMXcjs.PushButtonSelector; exports.RATIO_DISPLAY_GRID_CLASS = _chunk4TM2SBMXcjs.RATIO_DISPLAY_GRID_CLASS; exports.RATIO_GRID_CLASS = _chunk4TM2SBMXcjs.RATIO_GRID_CLASS; exports.RatioTabs = _chunk4TM2SBMXcjs.RatioTabs; exports.ReleaseMediaManager = _chunk4TM2SBMXcjs.ReleaseMediaManager; exports.SEOEditorPreview = _chunk4TM2SBMXcjs.SEOEditorPreview; exports.SectionSelector = _chunk4TM2SBMXcjs.SectionSelector; exports.SelectButton = _chunk4TM2SBMXcjs.SelectButton; exports.SocialLinksManager = _chunk4TM2SBMXcjs.SocialLinksManager; exports.StartWithOpenFrameButton = _chunk4TM2SBMXcjs.StartWithOpenFrameButton; exports.StatusFilterComponent = _chunk4TM2SBMXcjs.StatusFilterComponent; exports.TagsSelector = _chunk4TM2SBMXcjs.TagsSelector; exports.TicketCard = _chunk4TM2SBMXcjs.TicketCard; exports.TicketCardSkeleton = _chunk4TM2SBMXcjs.TicketCardSkeleton; exports.TranscribeAndSummarizeCombinedSection = _chunk4TM2SBMXcjs.TranscribeAndSummarizeCombinedSection; exports.TranscribeSummarizeSection = _chunk4TM2SBMXcjs.TranscribeSummarizeSection; exports.TranscriptSummaryEditor = _chunk4TM2SBMXcjs.TranscriptSummaryEditor; exports.Video = _chunk4TM2SBMXcjs.Video; exports.VideoBiteCard = _chunk4TM2SBMXcjs.VideoBiteCard; exports.VideoBitesDisplay = _chunk4TM2SBMXcjs.VideoBitesDisplay; exports.VideoClipsSection = _chunk4TM2SBMXcjs.VideoClipsSection; exports.VideoSourceSelector = _chunk4TM2SBMXcjs.VideoSourceSelector; exports.ViewToggle = _chunk4TM2SBMXcjs.ViewToggle; exports.WaitlistForm = _chunk4TM2SBMXcjs.WaitlistForm; exports.columnFromTicketStatus = _chunk4TM2SBMXcjs.columnFromTicketStatus; exports.detectAspectRatio = _chunk4TM2SBMXcjs.detectAspectRatio; exports.extractYouTubeId = _chunk4TM2SBMXcjs.extractYouTubeId; exports.getOpenFramePaths = _chunk4TM2SBMXcjs.getOpenFramePaths; exports.groupByAspectRatio = _chunk4TM2SBMXcjs.groupByAspectRatio; exports.groupTicketsByStatus = _chunk4TM2SBMXcjs.groupTicketsByStatus; exports.ratioToCategory = _chunk4TM2SBMXcjs.ratioToCategory; exports.tintOnDark = _chunk4TM2SBMXcjs.tintOnDark; exports.useBoardCollapse = _chunk4TM2SBMXcjs.useBoardCollapse; exports.useDynamicTheme = _chunk4TM2SBMXcjs.useDynamicTheme; exports.useFiltersDropdown = _chunk4TM2SBMXcjs.useFiltersDropdown; exports.useLoading = _chunk4TM2SBMXcjs.useLoading; exports.useNotifications = _chunk4TM2SBMXcjs.useNotifications; exports.useOptionalNotifications = _chunk4TM2SBMXcjs.useOptionalNotifications;
169
183
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/components/features/index.cjs"],"names":[],"mappings":"AAAA,qFAAY;AACZ,YAAY;AACZ;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,4DAAiC;AACjC,oCAAiC;AACjC,oCAAiC;AACjC,oCAAiC;AACjC,oCAAiC;AACjC,oCAAiC;AACjC,oCAAiC;AACjC,oCAAiC;AACjC,oCAAiC;AACjC;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,s6JAAC","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/components/features/index.cjs"}
1
+ {"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/components/features/index.cjs"],"names":[],"mappings":"AAAA,qFAAY;AACZ,YAAY;AACZ;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,4DAAiC;AACjC,oCAAiC;AACjC,oCAAiC;AACjC,oCAAiC;AACjC,oCAAiC;AACjC,oCAAiC;AACjC,oCAAiC;AACjC,oCAAiC;AACjC,oCAAiC;AACjC;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,+1KAAC","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/components/features/index.cjs"}
@@ -30,7 +30,10 @@ export * from './social-links-manager';
30
30
  export * from './start-with-openframe-button';
31
31
  export * from './status-filter-component';
32
32
  export * from './tags-selector';
33
- export * from './video-player';
33
+ export * from './video';
34
+ export * from './video-ratio-tabs';
35
+ export * from './video-bites-display';
36
+ export * from './entity-video-section';
34
37
  export * from './video-source-selector';
35
38
  export * from './transcript-summary-editor';
36
39
  export * from './highlight-video-section';
@@ -43,7 +46,6 @@ export * from './highlight-video-preview';
43
46
  export * from './transcribe-and-summarize-combined-section';
44
47
  export * from './highlight-video-combined-section';
45
48
  export * from './view-toggle';
46
- export * from './youtube-embed';
47
49
  export * from './ai-enrich';
48
50
  export * from './policy-configuration-panel';
49
51
  export * from './waitlist-form';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/features/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAA;AAC3F,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,yBAAyB,CAAA;AACvC,cAAc,eAAe,CAAA;AAC7B,cAAc,kBAAkB,CAAA;AAChC,cAAc,0BAA0B,CAAA;AACxC,cAAc,oBAAoB,CAAA;AAClC,cAAc,2BAA2B,CAAA;AACzC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,oBAAoB,CAAA;AAClC,cAAc,yBAAyB,CAAA;AACvC,cAAc,qBAAqB,CAAA;AACnC,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,uBAAuB,CAAA;AACrC,cAAc,2BAA2B,CAAA;AACzC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,wBAAwB,CAAA;AACtC,cAAc,yBAAyB,CAAA;AACvC,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,2BAA2B,CAAA;AACzC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,yBAAyB,CAAA;AACvC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,uBAAuB,CAAA;AACrC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,2BAA2B,CAAA;AACzC,cAAc,6CAA6C,CAAA;AAC3D,cAAc,oCAAoC,CAAA;AAClD,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAE/B,cAAc,aAAa,CAAA;AAC3B,cAAc,8BAA8B,CAAA;AAC5C,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/features/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAA;AAC3F,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,yBAAyB,CAAA;AACvC,cAAc,eAAe,CAAA;AAC7B,cAAc,kBAAkB,CAAA;AAChC,cAAc,0BAA0B,CAAA;AACxC,cAAc,oBAAoB,CAAA;AAClC,cAAc,2BAA2B,CAAA;AACzC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,oBAAoB,CAAA;AAClC,cAAc,yBAAyB,CAAA;AACvC,cAAc,qBAAqB,CAAA;AACnC,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,uBAAuB,CAAA;AACrC,cAAc,2BAA2B,CAAA;AACzC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,wBAAwB,CAAA;AACtC,cAAc,yBAAyB,CAAA;AACvC,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,2BAA2B,CAAA;AACzC,cAAc,iBAAiB,CAAA;AAM/B,cAAc,SAAS,CAAA;AACvB,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AACtC,cAAc,yBAAyB,CAAA;AACvC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,uBAAuB,CAAA;AACrC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,2BAA2B,CAAA;AACzC,cAAc,6CAA6C,CAAA;AAC3D,cAAc,oCAAoC,CAAA;AAClD,cAAc,eAAe,CAAA;AAE7B,cAAc,aAAa,CAAA;AAC3B,cAAc,8BAA8B,CAAA;AAC5C,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,SAAS,CAAA"}
@@ -18,6 +18,7 @@ import {
18
18
  ConfidenceBadge,
19
19
  DynamicThemeProvider,
20
20
  EntitySummaryEditor,
21
+ EntityVideoSection,
21
22
  ErrorBoundary,
22
23
  FigmaPrototypeViewer,
23
24
  FiltersDropdown,
@@ -47,6 +48,9 @@ import {
47
48
  PolicyConfigurationPanel,
48
49
  ProviderButton,
49
50
  PushButtonSelector,
51
+ RATIO_DISPLAY_GRID_CLASS,
52
+ RATIO_GRID_CLASS,
53
+ RatioTabs,
50
54
  ReleaseMediaManager,
51
55
  SEOEditorPreview,
52
56
  SectionSelector,
@@ -60,17 +64,20 @@ import {
60
64
  TranscribeAndSummarizeCombinedSection,
61
65
  TranscribeSummarizeSection,
62
66
  TranscriptSummaryEditor,
67
+ Video,
68
+ VideoBiteCard,
69
+ VideoBitesDisplay,
63
70
  VideoClipsSection,
64
- VideoPlayer,
65
71
  VideoSourceSelector,
66
72
  ViewToggle,
67
73
  WaitlistForm,
68
- YouTubeEmbed,
69
- YouTubeLinkParser,
70
74
  columnFromTicketStatus,
75
+ detectAspectRatio,
71
76
  extractYouTubeId,
72
77
  getOpenFramePaths,
78
+ groupByAspectRatio,
73
79
  groupTicketsByStatus,
80
+ ratioToCategory,
74
81
  tintOnDark,
75
82
  useBoardCollapse,
76
83
  useDynamicTheme,
@@ -78,8 +85,8 @@ import {
78
85
  useLoading,
79
86
  useNotifications,
80
87
  useOptionalNotifications
81
- } from "../../chunk-6LDN3CIY.js";
82
- import "../../chunk-KB2N44BY.js";
88
+ } from "../../chunk-ZMQP3UZJ.js";
89
+ import "../../chunk-FMWHOUFE.js";
83
90
  import "../../chunk-HSTU7Y4R.js";
84
91
  import "../../chunk-F7ETWH2M.js";
85
92
  import "../../chunk-DV5GLSYR.js";
@@ -105,6 +112,7 @@ export {
105
112
  ConfidenceBadge,
106
113
  DynamicThemeProvider,
107
114
  EntitySummaryEditor,
115
+ EntityVideoSection,
108
116
  ErrorBoundary,
109
117
  FigmaPrototypeViewer,
110
118
  FiltersDropdown,
@@ -134,6 +142,9 @@ export {
134
142
  PolicyConfigurationPanel,
135
143
  ProviderButton,
136
144
  PushButtonSelector,
145
+ RATIO_DISPLAY_GRID_CLASS,
146
+ RATIO_GRID_CLASS,
147
+ RatioTabs,
137
148
  ReleaseMediaManager,
138
149
  SEOEditorPreview,
139
150
  SectionSelector,
@@ -147,17 +158,20 @@ export {
147
158
  TranscribeAndSummarizeCombinedSection,
148
159
  TranscribeSummarizeSection,
149
160
  TranscriptSummaryEditor,
161
+ Video,
162
+ VideoBiteCard,
163
+ VideoBitesDisplay,
150
164
  VideoClipsSection,
151
- VideoPlayer,
152
165
  VideoSourceSelector,
153
166
  ViewToggle,
154
167
  WaitlistForm,
155
- YouTubeEmbed,
156
- YouTubeLinkParser,
157
168
  columnFromTicketStatus,
169
+ detectAspectRatio,
158
170
  extractYouTubeId,
159
171
  getOpenFramePaths,
172
+ groupByAspectRatio,
160
173
  groupTicketsByStatus,
174
+ ratioToCategory,
161
175
  tintOnDark,
162
176
  useBoardCollapse,
163
177
  useDynamicTheme,
@@ -0,0 +1,38 @@
1
+ import type { VideoTeaser } from '../../types/video-processing';
2
+ export interface VideoBitesDisplayProps {
3
+ /** Array of video bites/teasers to display. */
4
+ bites: VideoTeaser[];
5
+ /** Title for the section. */
6
+ title?: string;
7
+ /** Whether to filter to only show published bites. Default `true`. */
8
+ filterPublished?: boolean;
9
+ /** Whether to show the title section heading. Default `true`. */
10
+ showTitle?: boolean;
11
+ }
12
+ /**
13
+ * Unified video-bites grid.
14
+ *
15
+ * Groups by aspect ratio when multiple ratios are present, otherwise
16
+ * renders a flat grid. Each bite mounts lazily via `LazyBite` so
17
+ * off-screen players don't cost the page.
18
+ */
19
+ export declare function VideoBitesDisplay({ bites, title, filterPublished, showTitle, }: VideoBitesDisplayProps): import("react/jsx-runtime").JSX.Element | null;
20
+ interface VideoBiteCardProps {
21
+ url: string;
22
+ title?: string | null;
23
+ thumbnailUrl?: string | null;
24
+ }
25
+ /**
26
+ * Individual bite card — routes through `<Video>` so the SSoT player
27
+ * is the only video primitive in the lib.
28
+ *
29
+ * Layout: `LazyBite` sets the OUTER `aspectRatio` (portrait/square/landscape),
30
+ * but `<Card>` between LazyBite and `<Video>` has no intrinsic height, so
31
+ * we wrap `<Video>` in `layout="fill"` + an explicit `relative` parent so
32
+ * the player fills the bite's aspect box from first paint. Otherwise
33
+ * MuxPlayer renders at its intrinsic default size and grows once metadata
34
+ * loads — the same CLS that hits the centered layout.
35
+ */
36
+ declare function VideoBiteCard({ url, title, thumbnailUrl }: VideoBiteCardProps): import("react/jsx-runtime").JSX.Element;
37
+ export { VideoBiteCard };
38
+ //# sourceMappingURL=video-bites-display.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-bites-display.d.ts","sourceRoot":"","sources":["../../../src/components/features/video-bites-display.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAoEhE,MAAM,WAAW,sBAAsB;IACrC,+CAA+C;IAC/C,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iEAAiE;IACjE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,KAA0B,EAC1B,eAAsB,EACtB,SAAgB,GACjB,EAAE,sBAAsB,kDAgExB;AAuBD,UAAU,kBAAkB;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;;;;;;GAUG;AACH,iBAAS,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,kBAAkB,2CAatE;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,62 @@
1
+ import type { VideoTeaser } from '../../types/video-processing';
2
+ /**
3
+ * Vizard clip extraction aspect ratios. Mirrors `lib/types/aspect-ratio.ts`
4
+ * in the hub — narrow on purpose. If the hub's `VizardAspectRatio` adds a
5
+ * value, mirror it here.
6
+ */
7
+ export type VizardAspectRatio = '9:16' | '16:9' | '1:1';
8
+ /**
9
+ * Extended VideoTeaser with aspect_ratio metadata from Vizard.
10
+ * The lib `VideoTeaser` is the canonical type but doesn't include
11
+ * `aspect_ratio` (stored in JSONB, preserved through spreads).
12
+ * Import this when you need the ratio at compile time.
13
+ */
14
+ export interface VideoTeaserWithRatio extends VideoTeaser {
15
+ aspect_ratio?: VizardAspectRatio;
16
+ confidence?: number;
17
+ viral_reason?: string;
18
+ start_time_ms?: number;
19
+ end_time_ms?: number;
20
+ }
21
+ /** Ratio category used for grid layout and tab grouping. */
22
+ export type RatioCategory = 'portrait' | 'square' | 'landscape';
23
+ /** Grid class for each aspect ratio (admin editors — narrower columns). */
24
+ export declare const RATIO_GRID_CLASS: Record<RatioCategory, string>;
25
+ /** Grid class for public display (wider grids on detail pages). */
26
+ export declare const RATIO_DISPLAY_GRID_CLASS: Record<RatioCategory, string>;
27
+ interface RatioTabsProps {
28
+ groups: Record<RatioCategory, {
29
+ count: number;
30
+ render: () => React.ReactNode;
31
+ }>;
32
+ defaultTab?: RatioCategory;
33
+ className?: string;
34
+ }
35
+ /**
36
+ * RatioTabs — shared aspect-ratio tab wrapper.
37
+ *
38
+ * Only renders tabs that have content. `forceMount` + `data-[state=inactive]:hidden`
39
+ * keeps inactive tabs in the DOM so switching back doesn't scroll-jump.
40
+ */
41
+ export declare function RatioTabs({ groups, defaultTab, className, }: RatioTabsProps): import("react/jsx-runtime").JSX.Element | null;
42
+ /**
43
+ * Detect aspect ratio from a Vizard ratio string, falling back to
44
+ * inferring from width/height if the string is missing or unknown.
45
+ * Default: portrait (`'9:16'`).
46
+ */
47
+ export declare function detectAspectRatio(ratioString?: string, width?: number, height?: number): VizardAspectRatio;
48
+ /** Map a `VizardAspectRatio` to its `RatioCategory` for grouping. */
49
+ export declare function ratioToCategory(ratio: VizardAspectRatio): RatioCategory;
50
+ /**
51
+ * Group items by aspect ratio into portrait / square / landscape buckets.
52
+ * `hasMultiple` is true when 2+ buckets are non-empty (drives tab vs. flat
53
+ * grid rendering downstream).
54
+ */
55
+ export declare function groupByAspectRatio<T>(items: T[], getAspectRatio: (item: T) => VizardAspectRatio): {
56
+ portrait: T[];
57
+ square: T[];
58
+ landscape: T[];
59
+ hasMultiple: boolean;
60
+ };
61
+ export {};
62
+ //# sourceMappingURL=video-ratio-tabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-ratio-tabs.d.ts","sourceRoot":"","sources":["../../../src/components/features/video-ratio-tabs.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEhE;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAExD;;;;;GAKG;AACH,MAAM,WAAW,oBAAqB,SAAQ,WAAW;IACvD,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,4DAA4D;AAC5D,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,CAAC;AAMhE,2EAA2E;AAC3E,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAI1D,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAIlE,CAAC;AAQF,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAC,aAAa,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,KAAK,CAAC,SAAS,CAAA;KAAE,CAAC,CAAC;IAChF,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,EACxB,MAAM,EACN,UAAU,EACV,SAAc,GACf,EAAE,cAAc,kDAiChB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,CAAC,EAAE,MAAM,EACpB,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,iBAAiB,CASnB;AAED,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,aAAa,CAIvE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,KAAK,EAAE,CAAC,EAAE,EACV,cAAc,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,iBAAiB,GAC7C;IACD,QAAQ,EAAE,CAAC,EAAE,CAAC;IACd,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,SAAS,EAAE,CAAC,EAAE,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;CACtB,CAYA"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * <Video> — single source of truth for every public video surface
3
+ * across every Flamingo platform consumer of this lib.
4
+ *
5
+ * One component, three sources, three layouts. Replaces and deletes
6
+ * the previous lib primitives:
7
+ *
8
+ * - `<VideoPlayer>` (react-player wrapper, ~900 LOC custom controls)
9
+ * - `<YouTubeEmbed>` (separate lite-youtube facade)
10
+ *
11
+ * Routing (`kind` discriminant, default `'auto'`):
12
+ *
13
+ * kind="youtube" → inline lite-youtube facade (poster + click→iframe)
14
+ * kind="file" → <MuxPlayer> (HLS + MP4 + Mux Data + CMCD all in one)
15
+ * kind="auto" → strict URL parse:
16
+ * bare 11-char id → youtube
17
+ * YouTube hostname → youtube
18
+ * anything else → file
19
+ *
20
+ * `<MuxPlayer>` handles both `.m3u8` (HLS via hls.js, native on Safari)
21
+ * AND plain `.mp4` (uses the underlying `<video>` element). One component,
22
+ * both paths — no internal "HLS vs MP4" branch needed. Captions are
23
+ * rendered as native `<track>` children when `captionsUrl` is passed.
24
+ *
25
+ * Layouts:
26
+ * layout="centered" → max-w-3xl centered wrapper. Detail-page surface.
27
+ * layout="fill" → absolute inset-0 w-full h-full. Carousel slides.
28
+ * layout="native" → intrinsic aspect ratio. Bites grid, blog cards.
29
+ */
30
+ import React from 'react';
31
+ /**
32
+ * Extract the YouTube video id from any common URL shape OR from a
33
+ * bare 11-char id (carousels and some admin shapes pass that form
34
+ * directly).
35
+ *
36
+ * Uses strict `URL` parsing + an anchored pathname regex — NOT the
37
+ * legacy `.*v=` pattern that CodeQL flagged for polynomial-time
38
+ * backtracking on adversarial input like `youtube.com/watch?`
39
+ * repeated N times. Bare-id fallback uses an anchored character-class
40
+ * regex so it can never ReDoS either.
41
+ *
42
+ * Exported so admin tooling and carousel thumbnail logic can validate
43
+ * a URL without rendering the full `<Video>` component.
44
+ */
45
+ export declare function extractYouTubeId(url: string): string | null;
46
+ export type VideoLayout = 'centered' | 'fill' | 'native';
47
+ interface VideoCommonProps {
48
+ /** Layout wrapper. Detail pages pass `"centered"`. Default `"native"`. */
49
+ layout?: VideoLayout;
50
+ /** Poster / thumbnail. */
51
+ poster?: string | null;
52
+ /** Mute by default — for autoplay carousels. */
53
+ muted?: boolean;
54
+ /** LCP hint — YouTube facade poster gets `fetchpriority="high"`. */
55
+ priority?: boolean;
56
+ /** Tailwind classes applied to the underlying player root. */
57
+ className?: string;
58
+ /** Accessible label (used as YT facade title; ignored for file branch). */
59
+ title?: string;
60
+ /**
61
+ * YouTube-only: hide YT player chrome (controls, info, fullscreen, related
62
+ * videos, keyboard shortcuts). Used for marketing/landing-page embeds that
63
+ * want a minimal look. No-op for file (MP4/HLS) branches.
64
+ */
65
+ minimalControls?: boolean;
66
+ }
67
+ interface VideoFileProps extends VideoCommonProps {
68
+ kind: 'file';
69
+ url: string;
70
+ /**
71
+ * SRT raw content. Deprecated: pass `captionsUrl` (VTT) instead.
72
+ * Native `<track>` requires a URL; raw SRT can't be rendered without
73
+ * a custom overlay. Setting this without `captionsUrl` is a no-op
74
+ * with a dev warning.
75
+ */
76
+ srtContent?: string | null;
77
+ /** HTTPS URL to a VTT captions file. Rendered as a native `<track>`. */
78
+ captionsUrl?: string | null;
79
+ }
80
+ interface VideoYouTubeProps extends VideoCommonProps {
81
+ kind: 'youtube';
82
+ /** Either a full YT URL or just the video id. */
83
+ url: string;
84
+ }
85
+ interface VideoAutoProps extends VideoCommonProps {
86
+ kind?: 'auto';
87
+ url: string;
88
+ srtContent?: string | null;
89
+ captionsUrl?: string | null;
90
+ }
91
+ export type VideoProps = VideoFileProps | VideoYouTubeProps | VideoAutoProps;
92
+ export declare function Video(props: VideoProps): React.ReactElement | null;
93
+ export {};
94
+ //# sourceMappingURL=video.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video.d.ts","sourceRoot":"","sources":["../../../src/components/features/video.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAsC,MAAM,OAAO,CAAC;AA6B3D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsB3D;AAMD,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEzD,UAAU,gBAAgB;IACxB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,gDAAgD;IAChD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,UAAU,cAAe,SAAQ,gBAAgB;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,UAAU,iBAAkB,SAAQ,gBAAgB;IAClD,IAAI,EAAE,SAAS,CAAC;IAChB,iDAAiD;IACjD,GAAG,EAAE,MAAM,CAAC;CACb;AAED,UAAU,cAAe,SAAQ,gBAAgB;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,iBAAiB,GAAG,cAAc,CAAC;AAM7E,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CA4BlE"}