@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.
Files changed (132) hide show
  1. package/dist/{chunk-SOAWTQXO.cjs → chunk-2JCSORCJ.cjs} +31 -28
  2. package/dist/chunk-2JCSORCJ.cjs.map +1 -0
  3. package/dist/{chunk-OLCNA32C.cjs → chunk-3JQUNKWY.cjs} +15 -15
  4. package/dist/{chunk-OLCNA32C.cjs.map → chunk-3JQUNKWY.cjs.map} +1 -1
  5. package/dist/{chunk-OX75ZFN6.js → chunk-44Q3IXZM.js} +2 -2
  6. package/dist/{chunk-MVY4ZKQR.js → chunk-4OLIDOLO.js} +2 -2
  7. package/dist/{chunk-ADEP6E3Z.cjs → chunk-7MKU2EB4.cjs} +26 -26
  8. package/dist/{chunk-ADEP6E3Z.cjs.map → chunk-7MKU2EB4.cjs.map} +1 -1
  9. package/dist/{chunk-EULRZYQH.js → chunk-BJPQJNSC.js} +9 -14
  10. package/dist/chunk-BJPQJNSC.js.map +1 -0
  11. package/dist/{chunk-XGLZK25V.js → chunk-CQXHHVMR.js} +2 -2
  12. package/dist/{chunk-POJRURML.cjs → chunk-EHTE3CTT.cjs} +37 -37
  13. package/dist/{chunk-POJRURML.cjs.map → chunk-EHTE3CTT.cjs.map} +1 -1
  14. package/dist/{chunk-DKN425XR.cjs → chunk-GNB5ERZP.cjs} +1923 -1227
  15. package/dist/chunk-GNB5ERZP.cjs.map +1 -0
  16. package/dist/{chunk-ANPV7GZT.js → chunk-IDWKP5H5.js} +5974 -5278
  17. package/dist/chunk-IDWKP5H5.js.map +1 -0
  18. package/dist/{chunk-3KA5L7LC.js → chunk-JSFHTIKA.js} +2 -2
  19. package/dist/{chunk-GPTS2NXW.js → chunk-KA4WXCN3.js} +12 -9
  20. package/dist/chunk-KA4WXCN3.js.map +1 -0
  21. package/dist/{chunk-DU2X2MH2.js → chunk-LFLFQ422.js} +2 -2
  22. package/dist/{chunk-N2LW5NHS.js → chunk-M6ODI2F5.js} +2 -2
  23. package/dist/{chunk-DO7LOWFE.cjs → chunk-MIEODAAV.cjs} +9 -9
  24. package/dist/{chunk-DO7LOWFE.cjs.map → chunk-MIEODAAV.cjs.map} +1 -1
  25. package/dist/{chunk-44ENRZZJ.cjs → chunk-MPOP47ME.cjs} +12 -12
  26. package/dist/{chunk-44ENRZZJ.cjs.map → chunk-MPOP47ME.cjs.map} +1 -1
  27. package/dist/{chunk-EHVRW3WB.js → chunk-NULFIYK2.js} +2 -2
  28. package/dist/{chunk-CIH2LZI7.cjs → chunk-OBKCQ7LA.cjs} +62 -62
  29. package/dist/{chunk-CIH2LZI7.cjs.map → chunk-OBKCQ7LA.cjs.map} +1 -1
  30. package/dist/{chunk-3L4B7MBD.cjs → chunk-Q4YGG3CL.cjs} +31 -31
  31. package/dist/{chunk-3L4B7MBD.cjs.map → chunk-Q4YGG3CL.cjs.map} +1 -1
  32. package/dist/{chunk-SECF2KWQ.cjs → chunk-TQZLC3BQ.cjs} +5 -5
  33. package/dist/{chunk-SECF2KWQ.cjs.map → chunk-TQZLC3BQ.cjs.map} +1 -1
  34. package/dist/{chunk-RUHE3RJK.cjs → chunk-VXJBE5NX.cjs} +62 -67
  35. package/dist/chunk-VXJBE5NX.cjs.map +1 -0
  36. package/dist/{chunk-OGNKGDHT.js → chunk-WIMXB5EU.js} +4 -4
  37. package/dist/{chunk-3BPVTHOW.js → chunk-XGOX5UQ2.js} +4 -4
  38. package/dist/{chunk-SGULN3RX.cjs → chunk-ZFZAHLI4.cjs} +7 -7
  39. package/dist/{chunk-SGULN3RX.cjs.map → chunk-ZFZAHLI4.cjs.map} +1 -1
  40. package/dist/components/case-studies/index.cjs +8 -8
  41. package/dist/components/case-studies/index.js +2 -2
  42. package/dist/components/chat/index.cjs +2 -2
  43. package/dist/components/chat/index.js +1 -1
  44. package/dist/components/contact/index.cjs +3 -3
  45. package/dist/components/contact/index.js +2 -2
  46. package/dist/components/docs/index.cjs +5 -5
  47. package/dist/components/docs/index.js +4 -4
  48. package/dist/components/embeds/index.cjs +3 -3
  49. package/dist/components/embeds/index.js +2 -2
  50. package/dist/components/faq/index.cjs +3 -3
  51. package/dist/components/faq/index.js +2 -2
  52. package/dist/components/features/entity-video-section.d.ts +15 -3
  53. package/dist/components/features/entity-video-section.d.ts.map +1 -1
  54. package/dist/components/features/index.cjs +10 -2
  55. package/dist/components/features/index.cjs.map +1 -1
  56. package/dist/components/features/index.d.ts +2 -0
  57. package/dist/components/features/index.d.ts.map +1 -1
  58. package/dist/components/features/index.js +11 -3
  59. package/dist/components/features/video-bites-display.d.ts +12 -26
  60. package/dist/components/features/video-bites-display.d.ts.map +1 -1
  61. package/dist/components/features/video-bites-shared.cjs +24 -0
  62. package/dist/components/features/video-bites-shared.cjs.map +1 -0
  63. package/dist/components/features/video-bites-shared.d.ts +47 -0
  64. package/dist/components/features/video-bites-shared.d.ts.map +1 -0
  65. package/dist/components/features/video-bites-shared.js +20 -0
  66. package/dist/components/features/video-bites-shared.js.map +1 -0
  67. package/dist/components/features/video-bites-strip.d.ts +114 -0
  68. package/dist/components/features/video-bites-strip.d.ts.map +1 -0
  69. package/dist/components/features/video-ratio-tabs.d.ts +6 -9
  70. package/dist/components/features/video-ratio-tabs.d.ts.map +1 -1
  71. package/dist/components/features/video.d.ts +25 -0
  72. package/dist/components/features/video.d.ts.map +1 -1
  73. package/dist/components/help-center-pages/index.cjs +20 -20
  74. package/dist/components/help-center-pages/index.js +11 -11
  75. package/dist/components/index.cjs +130 -165
  76. package/dist/components/index.cjs.map +1 -1
  77. package/dist/components/index.js +333 -368
  78. package/dist/components/index.js.map +1 -1
  79. package/dist/components/navigation/index.cjs +2 -2
  80. package/dist/components/navigation/index.js +1 -1
  81. package/dist/components/onboarding-guides/index.cjs +5 -5
  82. package/dist/components/onboarding-guides/index.js +4 -4
  83. package/dist/components/onboarding-guides/onboarding-guide-detail-view.d.ts.map +1 -1
  84. package/dist/components/related-content/index.cjs +3 -3
  85. package/dist/components/related-content/index.js +2 -2
  86. package/dist/components/shared/product-release/release-detail-page.d.ts +6 -7
  87. package/dist/components/shared/product-release/release-detail-page.d.ts.map +1 -1
  88. package/dist/components/square-avatar.d.ts +3 -1
  89. package/dist/components/square-avatar.d.ts.map +1 -1
  90. package/dist/components/tickets/index.cjs +5 -5
  91. package/dist/components/tickets/index.js +4 -4
  92. package/dist/components/ui/index.cjs +2 -2
  93. package/dist/components/ui/index.js +1 -1
  94. package/dist/components/user-display.d.ts +5 -1
  95. package/dist/components/user-display.d.ts.map +1 -1
  96. package/dist/index.cjs +10 -2
  97. package/dist/index.cjs.map +1 -1
  98. package/dist/index.js +11 -3
  99. package/dist/types/case-study.d.ts +18 -0
  100. package/dist/types/case-study.d.ts.map +1 -1
  101. package/dist/types/video-processing.d.ts +11 -0
  102. package/dist/types/video-processing.d.ts.map +1 -1
  103. package/package.json +7 -1
  104. package/src/components/features/entity-video-section.tsx +26 -5
  105. package/src/components/features/index.ts +6 -3
  106. package/src/components/features/video-bites-display.tsx +17 -189
  107. package/src/components/features/video-bites-shared.ts +62 -0
  108. package/src/components/features/video-bites-strip.tsx +739 -0
  109. package/src/components/features/video-ratio-tabs.tsx +15 -19
  110. package/src/components/features/video.tsx +265 -4
  111. package/src/components/onboarding-guides/onboarding-guide-detail-view.tsx +10 -9
  112. package/src/components/shared/product-release/release-detail-page.tsx +12 -18
  113. package/src/components/square-avatar.tsx +5 -2
  114. package/src/components/user-display.tsx +14 -4
  115. package/src/stories/VideoBitesStrip.stories.tsx +82 -0
  116. package/src/types/case-study.ts +23 -0
  117. package/src/types/video-processing.ts +11 -0
  118. package/dist/chunk-ANPV7GZT.js.map +0 -1
  119. package/dist/chunk-DKN425XR.cjs.map +0 -1
  120. package/dist/chunk-EULRZYQH.js.map +0 -1
  121. package/dist/chunk-GPTS2NXW.js.map +0 -1
  122. package/dist/chunk-RUHE3RJK.cjs.map +0 -1
  123. package/dist/chunk-SOAWTQXO.cjs.map +0 -1
  124. /package/dist/{chunk-OX75ZFN6.js.map → chunk-44Q3IXZM.js.map} +0 -0
  125. /package/dist/{chunk-MVY4ZKQR.js.map → chunk-4OLIDOLO.js.map} +0 -0
  126. /package/dist/{chunk-XGLZK25V.js.map → chunk-CQXHHVMR.js.map} +0 -0
  127. /package/dist/{chunk-3KA5L7LC.js.map → chunk-JSFHTIKA.js.map} +0 -0
  128. /package/dist/{chunk-DU2X2MH2.js.map → chunk-LFLFQ422.js.map} +0 -0
  129. /package/dist/{chunk-N2LW5NHS.js.map → chunk-M6ODI2F5.js.map} +0 -0
  130. /package/dist/{chunk-EHVRW3WB.js.map → chunk-NULFIYK2.js.map} +0 -0
  131. /package/dist/{chunk-OGNKGDHT.js.map → chunk-WIMXB5EU.js.map} +0 -0
  132. /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
+ }
@@ -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