@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.
- package/dist/{chunk-C6ZMI4UB.cjs → chunk-4TM2SBMX.cjs} +884 -1513
- package/dist/chunk-4TM2SBMX.cjs.map +1 -0
- package/dist/{chunk-WX7PT5C7.cjs → chunk-ALW3D72O.cjs} +61 -2
- package/dist/chunk-ALW3D72O.cjs.map +1 -0
- package/dist/{chunk-KB2N44BY.js → chunk-FMWHOUFE.js} +61 -2
- package/dist/chunk-FMWHOUFE.js.map +1 -0
- package/dist/{chunk-6LDN3CIY.js → chunk-ZMQP3UZJ.js} +3701 -4330
- package/dist/chunk-ZMQP3UZJ.js.map +1 -0
- package/dist/components/features/entity-video-section.d.ts +54 -0
- package/dist/components/features/entity-video-section.d.ts.map +1 -0
- package/dist/components/features/index.cjs +17 -3
- package/dist/components/features/index.cjs.map +1 -1
- package/dist/components/features/index.d.ts +4 -2
- package/dist/components/features/index.d.ts.map +1 -1
- package/dist/components/features/index.js +22 -8
- package/dist/components/features/video-bites-display.d.ts +38 -0
- package/dist/components/features/video-bites-display.d.ts.map +1 -0
- package/dist/components/features/video-ratio-tabs.d.ts +62 -0
- package/dist/components/features/video-ratio-tabs.d.ts.map +1 -0
- package/dist/components/features/video.d.ts +94 -0
- package/dist/components/features/video.d.ts.map +1 -0
- package/dist/components/index.cjs +17 -3
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +22 -8
- package/dist/components/media-carousel.d.ts.map +1 -1
- package/dist/components/navigation/index.cjs +3 -3
- package/dist/components/navigation/index.js +2 -2
- package/dist/components/shared/product-release/release-detail-page.d.ts.map +1 -1
- package/dist/components/ui/index.cjs +3 -3
- package/dist/components/ui/index.js +2 -2
- package/dist/hooks/index.cjs +4 -2
- package/dist/hooks/index.cjs.map +1 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +3 -1
- package/dist/hooks/use-near-viewport.d.ts +42 -0
- package/dist/hooks/use-near-viewport.d.ts.map +1 -0
- package/dist/index.cjs +19 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +24 -8
- package/package.json +2 -2
- package/src/components/features/entity-video-section.tsx +175 -0
- package/src/components/features/index.ts +9 -2
- package/src/components/features/video-bites-display.tsx +216 -0
- package/src/components/features/video-ratio-tabs.tsx +174 -0
- package/src/components/features/video.tsx +474 -0
- package/src/components/media-carousel.tsx +43 -236
- package/src/components/shared/product-release/release-detail-page.tsx +26 -19
- package/src/hooks/index.ts +3 -0
- package/src/hooks/use-near-viewport.ts +118 -0
- package/dist/chunk-6LDN3CIY.js.map +0 -1
- package/dist/chunk-C6ZMI4UB.cjs.map +0 -1
- package/dist/chunk-KB2N44BY.js.map +0 -1
- package/dist/chunk-WX7PT5C7.cjs.map +0 -1
- package/dist/components/features/video-player.d.ts +0 -47
- package/dist/components/features/video-player.d.ts.map +0 -1
- package/dist/components/features/youtube-embed.d.ts +0 -17
- package/dist/components/features/youtube-embed.d.ts.map +0 -1
- package/dist/utils/lite-youtube-embed-stub.d.ts +0 -8
- package/dist/utils/lite-youtube-embed-stub.d.ts.map +0 -1
- package/dist/utils/lite-youtube-embed.d.ts +0 -9
- package/dist/utils/lite-youtube-embed.d.ts.map +0 -1
- package/src/components/features/.video-player.md +0 -44
- package/src/components/features/.youtube-embed.md +0 -40
- package/src/components/features/__tests__/video-player.test.tsx +0 -142
- package/src/components/features/video-player.tsx +0 -1030
- package/src/components/features/youtube-embed.tsx +0 -275
- package/src/utils/lite-youtube-embed-stub.tsx +0 -21
- 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
|
-
|
|
82
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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;
|
|
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-
|
|
82
|
-
import "../../chunk-
|
|
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"}
|