@flamingo-stack/openframe-frontend-core 0.0.387 → 0.0.388-snapshot.20260709030118
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-SOAWTQXO.cjs → chunk-2JCSORCJ.cjs} +31 -28
- package/dist/chunk-2JCSORCJ.cjs.map +1 -0
- package/dist/{chunk-OLCNA32C.cjs → chunk-3JQUNKWY.cjs} +15 -15
- package/dist/{chunk-OLCNA32C.cjs.map → chunk-3JQUNKWY.cjs.map} +1 -1
- package/dist/{chunk-OX75ZFN6.js → chunk-44Q3IXZM.js} +2 -2
- package/dist/{chunk-MVY4ZKQR.js → chunk-4OLIDOLO.js} +2 -2
- package/dist/{chunk-ADEP6E3Z.cjs → chunk-7MKU2EB4.cjs} +26 -26
- package/dist/{chunk-ADEP6E3Z.cjs.map → chunk-7MKU2EB4.cjs.map} +1 -1
- package/dist/{chunk-EULRZYQH.js → chunk-BJPQJNSC.js} +9 -14
- package/dist/chunk-BJPQJNSC.js.map +1 -0
- package/dist/{chunk-XGLZK25V.js → chunk-CQXHHVMR.js} +2 -2
- package/dist/{chunk-POJRURML.cjs → chunk-EHTE3CTT.cjs} +37 -37
- package/dist/{chunk-POJRURML.cjs.map → chunk-EHTE3CTT.cjs.map} +1 -1
- package/dist/{chunk-DKN425XR.cjs → chunk-GNB5ERZP.cjs} +1923 -1227
- package/dist/chunk-GNB5ERZP.cjs.map +1 -0
- package/dist/{chunk-ANPV7GZT.js → chunk-IDWKP5H5.js} +5974 -5278
- package/dist/chunk-IDWKP5H5.js.map +1 -0
- package/dist/{chunk-3KA5L7LC.js → chunk-JSFHTIKA.js} +2 -2
- package/dist/{chunk-GPTS2NXW.js → chunk-KA4WXCN3.js} +12 -9
- package/dist/chunk-KA4WXCN3.js.map +1 -0
- package/dist/{chunk-DU2X2MH2.js → chunk-LFLFQ422.js} +2 -2
- package/dist/{chunk-N2LW5NHS.js → chunk-M6ODI2F5.js} +2 -2
- package/dist/{chunk-DO7LOWFE.cjs → chunk-MIEODAAV.cjs} +9 -9
- package/dist/{chunk-DO7LOWFE.cjs.map → chunk-MIEODAAV.cjs.map} +1 -1
- package/dist/{chunk-44ENRZZJ.cjs → chunk-MPOP47ME.cjs} +12 -12
- package/dist/{chunk-44ENRZZJ.cjs.map → chunk-MPOP47ME.cjs.map} +1 -1
- package/dist/{chunk-EHVRW3WB.js → chunk-NULFIYK2.js} +2 -2
- package/dist/{chunk-CIH2LZI7.cjs → chunk-OBKCQ7LA.cjs} +62 -62
- package/dist/{chunk-CIH2LZI7.cjs.map → chunk-OBKCQ7LA.cjs.map} +1 -1
- package/dist/{chunk-3L4B7MBD.cjs → chunk-Q4YGG3CL.cjs} +31 -31
- package/dist/{chunk-3L4B7MBD.cjs.map → chunk-Q4YGG3CL.cjs.map} +1 -1
- package/dist/{chunk-SECF2KWQ.cjs → chunk-TQZLC3BQ.cjs} +5 -5
- package/dist/{chunk-SECF2KWQ.cjs.map → chunk-TQZLC3BQ.cjs.map} +1 -1
- package/dist/{chunk-RUHE3RJK.cjs → chunk-VXJBE5NX.cjs} +62 -67
- package/dist/chunk-VXJBE5NX.cjs.map +1 -0
- package/dist/{chunk-OGNKGDHT.js → chunk-WIMXB5EU.js} +4 -4
- package/dist/{chunk-3BPVTHOW.js → chunk-XGOX5UQ2.js} +4 -4
- package/dist/{chunk-SGULN3RX.cjs → chunk-ZFZAHLI4.cjs} +7 -7
- package/dist/{chunk-SGULN3RX.cjs.map → chunk-ZFZAHLI4.cjs.map} +1 -1
- package/dist/components/case-studies/index.cjs +8 -8
- package/dist/components/case-studies/index.js +2 -2
- package/dist/components/chat/index.cjs +2 -2
- package/dist/components/chat/index.js +1 -1
- package/dist/components/contact/index.cjs +3 -3
- package/dist/components/contact/index.js +2 -2
- package/dist/components/docs/index.cjs +5 -5
- package/dist/components/docs/index.js +4 -4
- package/dist/components/embeds/index.cjs +3 -3
- package/dist/components/embeds/index.js +2 -2
- package/dist/components/faq/index.cjs +3 -3
- package/dist/components/faq/index.js +2 -2
- package/dist/components/features/entity-video-section.d.ts +15 -3
- package/dist/components/features/entity-video-section.d.ts.map +1 -1
- package/dist/components/features/index.cjs +10 -2
- package/dist/components/features/index.cjs.map +1 -1
- package/dist/components/features/index.d.ts +2 -0
- package/dist/components/features/index.d.ts.map +1 -1
- package/dist/components/features/index.js +11 -3
- package/dist/components/features/video-bites-display.d.ts +12 -26
- package/dist/components/features/video-bites-display.d.ts.map +1 -1
- package/dist/components/features/video-bites-shared.cjs +24 -0
- package/dist/components/features/video-bites-shared.cjs.map +1 -0
- package/dist/components/features/video-bites-shared.d.ts +47 -0
- package/dist/components/features/video-bites-shared.d.ts.map +1 -0
- package/dist/components/features/video-bites-shared.js +20 -0
- package/dist/components/features/video-bites-shared.js.map +1 -0
- package/dist/components/features/video-bites-strip.d.ts +114 -0
- package/dist/components/features/video-bites-strip.d.ts.map +1 -0
- package/dist/components/features/video-ratio-tabs.d.ts +6 -9
- package/dist/components/features/video-ratio-tabs.d.ts.map +1 -1
- package/dist/components/features/video.d.ts +25 -0
- package/dist/components/features/video.d.ts.map +1 -1
- package/dist/components/help-center-pages/index.cjs +20 -20
- package/dist/components/help-center-pages/index.js +11 -11
- package/dist/components/index.cjs +130 -165
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +333 -368
- package/dist/components/index.js.map +1 -1
- package/dist/components/navigation/index.cjs +2 -2
- package/dist/components/navigation/index.js +1 -1
- package/dist/components/onboarding-guides/index.cjs +5 -5
- package/dist/components/onboarding-guides/index.js +4 -4
- package/dist/components/onboarding-guides/onboarding-guide-detail-view.d.ts.map +1 -1
- package/dist/components/related-content/index.cjs +3 -3
- package/dist/components/related-content/index.js +2 -2
- package/dist/components/shared/product-release/release-detail-page.d.ts +6 -7
- package/dist/components/shared/product-release/release-detail-page.d.ts.map +1 -1
- package/dist/components/square-avatar.d.ts +3 -1
- package/dist/components/square-avatar.d.ts.map +1 -1
- package/dist/components/tickets/index.cjs +5 -5
- package/dist/components/tickets/index.js +4 -4
- package/dist/components/ui/index.cjs +2 -2
- package/dist/components/ui/index.js +1 -1
- package/dist/components/user-display.d.ts +5 -1
- package/dist/components/user-display.d.ts.map +1 -1
- package/dist/index.cjs +10 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +11 -3
- package/dist/types/case-study.d.ts +18 -0
- package/dist/types/case-study.d.ts.map +1 -1
- package/dist/types/video-processing.d.ts +11 -0
- package/dist/types/video-processing.d.ts.map +1 -1
- package/package.json +7 -1
- package/src/components/features/entity-video-section.tsx +26 -5
- package/src/components/features/index.ts +6 -3
- package/src/components/features/video-bites-display.tsx +17 -189
- package/src/components/features/video-bites-shared.ts +62 -0
- package/src/components/features/video-bites-strip.tsx +739 -0
- package/src/components/features/video-ratio-tabs.tsx +15 -19
- package/src/components/features/video.tsx +265 -4
- package/src/components/onboarding-guides/onboarding-guide-detail-view.tsx +10 -9
- package/src/components/shared/product-release/release-detail-page.tsx +12 -18
- package/src/components/square-avatar.tsx +5 -2
- package/src/components/user-display.tsx +14 -4
- package/src/stories/VideoBitesStrip.stories.tsx +82 -0
- package/src/types/case-study.ts +23 -0
- package/src/types/video-processing.ts +11 -0
- package/dist/chunk-ANPV7GZT.js.map +0 -1
- package/dist/chunk-DKN425XR.cjs.map +0 -1
- package/dist/chunk-EULRZYQH.js.map +0 -1
- package/dist/chunk-GPTS2NXW.js.map +0 -1
- package/dist/chunk-RUHE3RJK.cjs.map +0 -1
- package/dist/chunk-SOAWTQXO.cjs.map +0 -1
- /package/dist/{chunk-OX75ZFN6.js.map → chunk-44Q3IXZM.js.map} +0 -0
- /package/dist/{chunk-MVY4ZKQR.js.map → chunk-4OLIDOLO.js.map} +0 -0
- /package/dist/{chunk-XGLZK25V.js.map → chunk-CQXHHVMR.js.map} +0 -0
- /package/dist/{chunk-3KA5L7LC.js.map → chunk-JSFHTIKA.js.map} +0 -0
- /package/dist/{chunk-DU2X2MH2.js.map → chunk-LFLFQ422.js.map} +0 -0
- /package/dist/{chunk-N2LW5NHS.js.map → chunk-M6ODI2F5.js.map} +0 -0
- /package/dist/{chunk-EHVRW3WB.js.map → chunk-NULFIYK2.js.map} +0 -0
- /package/dist/{chunk-OGNKGDHT.js.map → chunk-WIMXB5EU.js.map} +0 -0
- /package/dist/{chunk-3BPVTHOW.js.map → chunk-XGOX5UQ2.js.map} +0 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/nextjs-vite'
|
|
2
|
+
import {
|
|
3
|
+
VideoBitesStrip,
|
|
4
|
+
type VideoBiteStripItem,
|
|
5
|
+
} from '../components/features/video-bites-strip'
|
|
6
|
+
|
|
7
|
+
// Public-domain sample clips (Google CDN test media) — small MP4s so the
|
|
8
|
+
// hover-mount preview is exercised realistically in Storybook.
|
|
9
|
+
const SAMPLE_MP4 =
|
|
10
|
+
'https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerBlazes.mp4'
|
|
11
|
+
const SAMPLE_MP4_2 =
|
|
12
|
+
'https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4'
|
|
13
|
+
|
|
14
|
+
const bite = (over: Partial<VideoBiteStripItem>): VideoBiteStripItem => ({
|
|
15
|
+
url: SAMPLE_MP4,
|
|
16
|
+
title: 'How an MSSP Director Tests Agentic AI for Regulated Law Firms',
|
|
17
|
+
published: true,
|
|
18
|
+
aspect_ratio: '9:16',
|
|
19
|
+
created_at: '2026-07-01T00:00:00Z',
|
|
20
|
+
thumbnail_url: 'https://picsum.photos/seed/bite/270/480',
|
|
21
|
+
...over,
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
const PROFILE = {
|
|
25
|
+
name: 'Michael Crisafio',
|
|
26
|
+
avatarUrl: 'https://picsum.photos/seed/avatar/68/68',
|
|
27
|
+
subtitle: 'Tier 1 Consulting',
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const MANY_MIXED: VideoBiteStripItem[] = [
|
|
31
|
+
bite({ title: 'Portrait clip A', href: '#a' }),
|
|
32
|
+
bite({ url: SAMPLE_MP4_2, title: 'Landscape clip', aspect_ratio: '16:9', thumbnail_url: 'https://picsum.photos/seed/land/480/270', href: '#b' }),
|
|
33
|
+
bite({ title: 'Square clip', aspect_ratio: '1:1', thumbnail_url: 'https://picsum.photos/seed/sq/360/360' }),
|
|
34
|
+
bite({ title: 'No-thumbnail clip (PlayIcon fallback)', thumbnail_url: undefined }),
|
|
35
|
+
bite({ title: 'Portrait clip B', thumbnail_url: 'https://picsum.photos/seed/b2/270/480' }),
|
|
36
|
+
bite({ title: 'Portrait clip C', thumbnail_url: 'https://picsum.photos/seed/b3/270/480' }),
|
|
37
|
+
bite({ title: 'Portrait clip D', thumbnail_url: 'https://picsum.photos/seed/b4/270/480' }),
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
const meta: Meta<typeof VideoBitesStrip> = {
|
|
41
|
+
title: 'Features/VideoBitesStrip',
|
|
42
|
+
component: VideoBitesStrip,
|
|
43
|
+
parameters: { layout: 'fullscreen' },
|
|
44
|
+
decorators: [
|
|
45
|
+
Story => (
|
|
46
|
+
<div className="bg-ods-bg p-8 min-h-[560px]">
|
|
47
|
+
<Story />
|
|
48
|
+
</div>
|
|
49
|
+
),
|
|
50
|
+
],
|
|
51
|
+
}
|
|
52
|
+
export default meta
|
|
53
|
+
|
|
54
|
+
type Story = StoryObj<typeof VideoBitesStrip>
|
|
55
|
+
|
|
56
|
+
/** Mixed ratios at uniform height — the marquee engages once content overflows. */
|
|
57
|
+
export const MixedRatiosMarquee: Story = {
|
|
58
|
+
args: { bites: MANY_MIXED, profile: PROFILE },
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Two bites — no overflow, so no clones, no marquee, no chevrons. */
|
|
62
|
+
export const TwoBitesNoMarquee: Story = {
|
|
63
|
+
args: { bites: MANY_MIXED.slice(0, 2), profile: PROFILE },
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Missing thumbnails fall back to bg-ods-card + PlayIcon; preview still mounts on hover. */
|
|
67
|
+
export const NoThumbnails: Story = {
|
|
68
|
+
args: {
|
|
69
|
+
bites: MANY_MIXED.map(b => ({ ...b, thumbnail_url: undefined })),
|
|
70
|
+
profile: PROFILE,
|
|
71
|
+
},
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** autoScroll off — plain scrollable row with chevrons (reduced-motion behaves the same). */
|
|
75
|
+
export const AutoScrollDisabled: Story = {
|
|
76
|
+
args: { bites: MANY_MIXED, autoScroll: false, profile: PROFILE },
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Unpublished bites are filtered by default — this renders nothing (returns null). */
|
|
80
|
+
export const AllUnpublishedRendersNull: Story = {
|
|
81
|
+
args: { bites: MANY_MIXED.map(b => ({ ...b, published: false })) },
|
|
82
|
+
}
|
package/src/types/case-study.ts
CHANGED
|
@@ -34,6 +34,19 @@ export interface CaseStudy {
|
|
|
34
34
|
video_bites: VideoTeaser[] // Array of video clips from interviews or manually added
|
|
35
35
|
customer_interview_id: number | null // Linked customer interview for bidirectional relationship
|
|
36
36
|
|
|
37
|
+
// Video processing pipeline (FULL parity with customer_interviews since
|
|
38
|
+
// 2026-07: transcribe & summarize, captions, clip config, highlight).
|
|
39
|
+
// NOTE: transcript_words_data is server-only and intentionally NOT typed here.
|
|
40
|
+
transcript?: string | null
|
|
41
|
+
srt_content?: string | null
|
|
42
|
+
video_summary?: string | null
|
|
43
|
+
custom_instructions?: string | null
|
|
44
|
+
config?: Record<string, unknown> | null // clip/highlight processing config
|
|
45
|
+
highlight_video_url?: string | null
|
|
46
|
+
highlight_video_thumbnail?: string | null
|
|
47
|
+
highlight_video_source?: 'manual' | 'ai_generated' | null
|
|
48
|
+
highlight_video_duration_ms?: number | null
|
|
49
|
+
|
|
37
50
|
// SEO
|
|
38
51
|
seo_title: string | null
|
|
39
52
|
seo_description: string | null
|
|
@@ -85,6 +98,16 @@ export interface CreateCaseStudyData {
|
|
|
85
98
|
video_source?: 'manual' | 'ai_generated'
|
|
86
99
|
video_bites?: VideoTeaser[]
|
|
87
100
|
customer_interview_id?: number | null
|
|
101
|
+
// Video processing pipeline (parity with customer_interviews)
|
|
102
|
+
transcript?: string | null
|
|
103
|
+
srt_content?: string | null
|
|
104
|
+
video_summary?: string | null
|
|
105
|
+
custom_instructions?: string | null
|
|
106
|
+
config?: Record<string, unknown> | null
|
|
107
|
+
highlight_video_url?: string | null
|
|
108
|
+
highlight_video_thumbnail?: string | null
|
|
109
|
+
highlight_video_source?: 'manual' | 'ai_generated' | null
|
|
110
|
+
highlight_video_duration_ms?: number | null
|
|
88
111
|
// SEO
|
|
89
112
|
seo_title?: string
|
|
90
113
|
seo_description?: string
|
|
@@ -4,14 +4,25 @@
|
|
|
4
4
|
/**
|
|
5
5
|
* VideoTeaser represents a short video clip extracted from a longer video.
|
|
6
6
|
* Used for teasers/bites that can be shown on preview pages.
|
|
7
|
+
*
|
|
8
|
+
* CANONICAL BITE SHAPE: this is the base persistence type — the TRUE SUPERSET
|
|
9
|
+
* of every field persisted in the `video_bites` / `teasers` jsonb columns.
|
|
10
|
+
* `VideoTeaserWithRatio` (video-ratio-tabs.tsx) adds only `aspect_ratio` and is
|
|
11
|
+
* the one type display/aggregation code extends. The AI-extraction `VideoClip`
|
|
12
|
+
* below stays a separate shape by design.
|
|
7
13
|
*/
|
|
8
14
|
export interface VideoTeaser {
|
|
9
15
|
url: string
|
|
10
16
|
title?: string
|
|
11
17
|
thumbnail_url?: string // Optional thumbnail image URL for video preview. If not provided, video player will show first frame automatically.
|
|
12
18
|
published?: boolean // Controls visibility on public preview page (default: false, admin must select)
|
|
19
|
+
featured?: boolean // Opts the bite into cross-entity featured pulls (homepage/configured surfaces). Independent of `published`.
|
|
13
20
|
source?: 'manual' | 'ai_generated' // Track origin of teaser
|
|
14
21
|
created_at?: string // ISO timestamp for sorting (newer items first)
|
|
22
|
+
start_time_ms?: number // Vizard extraction: clip start offset in the source video
|
|
23
|
+
end_time_ms?: number // Vizard extraction: clip end offset in the source video
|
|
24
|
+
confidence?: number // Vizard extraction: 0-100 virality confidence
|
|
25
|
+
viral_reason?: string // Vizard extraction: why this clip was picked
|
|
15
26
|
// Duration auto-detected from video file
|
|
16
27
|
}
|
|
17
28
|
|