@flamingo-stack/openframe-frontend-core 0.0.336 → 0.0.337-snapshot.20260629165153
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-H5VFN7IP.cjs → chunk-2FDRZIX2.cjs} +340 -360
- package/dist/chunk-2FDRZIX2.cjs.map +1 -0
- package/dist/{chunk-L5TSBYSQ.js → chunk-3BWH262F.js} +4 -4
- package/dist/{chunk-RESNZ4Z3.js → chunk-A4X3DZSS.js} +2 -2
- package/dist/{chunk-LDTSPXZU.js → chunk-BG44XQB2.js} +3114 -3134
- package/dist/chunk-BG44XQB2.js.map +1 -0
- package/dist/{chunk-MDYAGMLF.cjs → chunk-DPFJPCFL.cjs} +7 -7
- package/dist/{chunk-MDYAGMLF.cjs.map → chunk-DPFJPCFL.cjs.map} +1 -1
- package/dist/{chunk-JTW23UXA.js → chunk-DPU7VTTV.js} +8 -8
- package/dist/chunk-DPU7VTTV.js.map +1 -0
- package/dist/{chunk-NW57Y4CP.cjs → chunk-FDKTAOEO.cjs} +37 -37
- package/dist/{chunk-NW57Y4CP.cjs.map → chunk-FDKTAOEO.cjs.map} +1 -1
- package/dist/{chunk-7D5UKWEA.js → chunk-FGVYJPT4.js} +2 -2
- package/dist/{chunk-US3DF2WZ.cjs → chunk-FNPF5OQS.cjs} +26 -26
- package/dist/{chunk-US3DF2WZ.cjs.map → chunk-FNPF5OQS.cjs.map} +1 -1
- package/dist/{chunk-R2TWMVBP.js → chunk-GFBCUSFN.js} +4 -4
- package/dist/{chunk-CPALUGYN.js → chunk-GOTCZBP2.js} +2 -2
- package/dist/{chunk-XVZ62VX4.js → chunk-HI367AS3.js} +2 -2
- package/dist/{chunk-KY6RWDEB.js → chunk-HKBV4OJK.js} +2 -2
- package/dist/{chunk-MVXX2JTT.cjs → chunk-IBCTHO3A.cjs} +5 -5
- package/dist/{chunk-MVXX2JTT.cjs.map → chunk-IBCTHO3A.cjs.map} +1 -1
- package/dist/{chunk-SD2J3HJ5.cjs → chunk-IJ2OYHRH.cjs} +12 -12
- package/dist/{chunk-SD2J3HJ5.cjs.map → chunk-IJ2OYHRH.cjs.map} +1 -1
- package/dist/{chunk-CIE66RSH.js → chunk-IOEGV4DP.js} +2 -2
- package/dist/{chunk-2FVULOIK.cjs → chunk-IVY5R6L2.cjs} +25 -25
- package/dist/{chunk-2FVULOIK.cjs.map → chunk-IVY5R6L2.cjs.map} +1 -1
- package/dist/{chunk-KDJJPHQE.js → chunk-JI7EPGRA.js} +4 -4
- package/dist/{chunk-TFNK6B4T.js → chunk-N7MH2OSW.js} +2 -2
- package/dist/{chunk-H2OKGWDK.cjs → chunk-QJR7QLNW.cjs} +31 -31
- package/dist/{chunk-H2OKGWDK.cjs.map → chunk-QJR7QLNW.cjs.map} +1 -1
- package/dist/{chunk-OQ4VKWYU.cjs → chunk-RLHOSQ7X.cjs} +9 -9
- package/dist/{chunk-OQ4VKWYU.cjs.map → chunk-RLHOSQ7X.cjs.map} +1 -1
- package/dist/{chunk-I5KS2YDX.cjs → chunk-RSA7DPZN.cjs} +60 -60
- package/dist/chunk-RSA7DPZN.cjs.map +1 -0
- package/dist/{chunk-HIRDBLM3.cjs → chunk-Y2VDAVIX.cjs} +62 -62
- package/dist/{chunk-HIRDBLM3.cjs.map → chunk-Y2VDAVIX.cjs.map} +1 -1
- package/dist/{chunk-45BYRANY.cjs → chunk-YHDF4WMG.cjs} +15 -15
- package/dist/{chunk-45BYRANY.cjs.map → chunk-YHDF4WMG.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-summary-editor.d.ts.map +1 -1
- package/dist/components/features/highlight-video-combined-section.d.ts.map +1 -1
- package/dist/components/features/highlight-video-preview.d.ts.map +1 -1
- package/dist/components/features/highlight-video-section.d.ts.map +1 -1
- package/dist/components/features/index.cjs +2 -2
- package/dist/components/features/index.js +1 -1
- package/dist/components/features/seo-editor-preview.d.ts.map +1 -1
- package/dist/components/features/transcript-summary-editor.d.ts.map +1 -1
- package/dist/components/features/video-source-selector.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 +123 -121
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +11 -9
- 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/related-content/index.cjs +3 -3
- package/dist/components/related-content/index.js +2 -2
- package/dist/components/tickets/index.cjs +5 -5
- package/dist/components/tickets/index.js +4 -4
- package/dist/components/ui/ai-generated-badge.d.ts +10 -0
- package/dist/components/ui/ai-generated-badge.d.ts.map +1 -0
- package/dist/components/ui/index.cjs +4 -2
- package/dist/components/ui/index.cjs.map +1 -1
- package/dist/components/ui/index.d.ts +1 -0
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js +3 -1
- package/dist/components/ui/info-card.d.ts +2 -0
- package/dist/components/ui/info-card.d.ts.map +1 -1
- package/dist/components/ui/release-changelog-section.d.ts +2 -2
- package/dist/components/ui/release-changelog-section.d.ts.map +1 -1
- package/dist/components/ui/table/table-skeleton.d.ts.map +1 -1
- package/dist/index.cjs +4 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +3 -1
- package/package.json +1 -1
- package/src/components/features/entity-summary-editor.tsx +2 -4
- package/src/components/features/highlight-video-combined-section.tsx +2 -4
- package/src/components/features/highlight-video-preview.tsx +2 -4
- package/src/components/features/highlight-video-section.tsx +2 -4
- package/src/components/features/seo-editor-preview.tsx +4 -12
- package/src/components/features/transcript-summary-editor.tsx +3 -8
- package/src/components/features/video-source-selector.tsx +2 -4
- package/src/components/shared/product-release/release-detail-page.tsx +4 -4
- package/src/components/ui/ai-generated-badge.tsx +17 -0
- package/src/components/ui/index.ts +1 -0
- package/src/components/ui/info-card.tsx +6 -1
- package/src/components/ui/release-changelog-section.tsx +19 -14
- package/src/components/ui/table/table-skeleton.tsx +6 -2
- package/src/stories/InfoCard.stories.tsx +22 -0
- package/dist/chunk-H5VFN7IP.cjs.map +0 -1
- package/dist/chunk-I5KS2YDX.cjs.map +0 -1
- package/dist/chunk-JTW23UXA.js.map +0 -1
- package/dist/chunk-LDTSPXZU.js.map +0 -1
- /package/dist/{chunk-L5TSBYSQ.js.map → chunk-3BWH262F.js.map} +0 -0
- /package/dist/{chunk-RESNZ4Z3.js.map → chunk-A4X3DZSS.js.map} +0 -0
- /package/dist/{chunk-7D5UKWEA.js.map → chunk-FGVYJPT4.js.map} +0 -0
- /package/dist/{chunk-R2TWMVBP.js.map → chunk-GFBCUSFN.js.map} +0 -0
- /package/dist/{chunk-CPALUGYN.js.map → chunk-GOTCZBP2.js.map} +0 -0
- /package/dist/{chunk-XVZ62VX4.js.map → chunk-HI367AS3.js.map} +0 -0
- /package/dist/{chunk-KY6RWDEB.js.map → chunk-HKBV4OJK.js.map} +0 -0
- /package/dist/{chunk-CIE66RSH.js.map → chunk-IOEGV4DP.js.map} +0 -0
- /package/dist/{chunk-KDJJPHQE.js.map → chunk-JI7EPGRA.js.map} +0 -0
- /package/dist/{chunk-TFNK6B4T.js.map → chunk-N7MH2OSW.js.map} +0 -0
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import React, { useState, useCallback, useEffect } from 'react';
|
|
4
4
|
import { Upload, Sparkles, X, Video, Loader2 } from 'lucide-react';
|
|
5
|
+
import { AIGeneratedBadge } from '../ui/ai-generated-badge';
|
|
5
6
|
import { Button } from '../ui/button';
|
|
6
7
|
import { Input } from '../ui/input';
|
|
7
8
|
import { Label } from '../ui/label';
|
|
@@ -201,10 +202,7 @@ export function VideoSourceSelector({
|
|
|
201
202
|
<div className="flex items-center gap-2">
|
|
202
203
|
<Label>{uploadLabel}</Label>
|
|
203
204
|
{showAIBadge && isAIGenerated && (
|
|
204
|
-
<
|
|
205
|
-
<Sparkles className="h-3 w-3" />
|
|
206
|
-
AI Generated
|
|
207
|
-
</Badge>
|
|
205
|
+
<AIGeneratedBadge />
|
|
208
206
|
)}
|
|
209
207
|
</div>
|
|
210
208
|
<Button
|
|
@@ -402,7 +402,7 @@ export function ReleaseDetailPage({
|
|
|
402
402
|
isBreaking
|
|
403
403
|
hideTitle
|
|
404
404
|
icon={<AlertTriangle className="h-6 w-6" />}
|
|
405
|
-
|
|
405
|
+
MarkdownRenderer={MarkdownRenderer}
|
|
406
406
|
/>
|
|
407
407
|
{/* Features / Bugs / Improvements use `previewFirst` — same
|
|
408
408
|
progressive-disclosure pattern as the investor-update detail
|
|
@@ -415,21 +415,21 @@ export function ReleaseDetailPage({
|
|
|
415
415
|
entries={featuresAdded || []}
|
|
416
416
|
icon={<Sparkles className="h-6 w-6" />}
|
|
417
417
|
previewFirst
|
|
418
|
-
|
|
418
|
+
MarkdownRenderer={MarkdownRenderer}
|
|
419
419
|
/>
|
|
420
420
|
<ReleaseChangelogSection
|
|
421
421
|
title="Bugs Fixed"
|
|
422
422
|
entries={bugFixed || []}
|
|
423
423
|
icon={<Wrench className="h-6 w-6" />}
|
|
424
424
|
previewFirst
|
|
425
|
-
|
|
425
|
+
MarkdownRenderer={MarkdownRenderer}
|
|
426
426
|
/>
|
|
427
427
|
<ReleaseChangelogSection
|
|
428
428
|
title="Improvements"
|
|
429
429
|
entries={improvements || []}
|
|
430
430
|
icon={<TrendingUp className="h-6 w-6" />}
|
|
431
431
|
previewFirst
|
|
432
|
-
|
|
432
|
+
MarkdownRenderer={MarkdownRenderer}
|
|
433
433
|
/>
|
|
434
434
|
|
|
435
435
|
{/* Video Bites Section - Only when VideoDisplaySection is not handling it */}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Badge } from './badge';
|
|
2
|
+
import { Sparkles } from 'lucide-react';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Canonical "AI Generated" chip (Sparkles + label). Single source of truth for
|
|
6
|
+
* every AI-generated indicator across the app — replaces the byte-identical
|
|
7
|
+
* inline `<Badge variant="secondary"><Sparkles/> AI Generated</Badge>` that was
|
|
8
|
+
* copy-pasted across the summary / video / SEO editors.
|
|
9
|
+
*/
|
|
10
|
+
export function AIGeneratedBadge({ className }: { className?: string }) {
|
|
11
|
+
return (
|
|
12
|
+
<Badge variant="secondary" className={`flex items-center gap-1${className ? ` ${className}` : ''}`}>
|
|
13
|
+
<Sparkles className="h-3 w-3" />
|
|
14
|
+
AI Generated
|
|
15
|
+
</Badge>
|
|
16
|
+
);
|
|
17
|
+
}
|
|
@@ -52,6 +52,7 @@ export * from './tab-navigation'
|
|
|
52
52
|
// Feedback components
|
|
53
53
|
export * from './alert'
|
|
54
54
|
export * from './badge'
|
|
55
|
+
export * from './ai-generated-badge'
|
|
55
56
|
export * from './progress'
|
|
56
57
|
export * from './release-changelog-section'
|
|
57
58
|
export * from './status-badge'
|
|
@@ -29,6 +29,8 @@ export interface InfoCardData {
|
|
|
29
29
|
label?: string
|
|
30
30
|
value: string | string[]
|
|
31
31
|
copyable?: boolean
|
|
32
|
+
/** Optional trailing icon/logo (e.g. an SVG) rendered next to the value */
|
|
33
|
+
icon?: React.ReactNode
|
|
32
34
|
}>
|
|
33
35
|
progress?: {
|
|
34
36
|
value: number
|
|
@@ -83,6 +85,7 @@ export function InfoCard({ data, className = '' }: InfoCardProps) {
|
|
|
83
85
|
value={val}
|
|
84
86
|
showLabel={valIndex === 0}
|
|
85
87
|
copyable={item.copyable}
|
|
88
|
+
icon={valIndex === 0 ? item.icon : undefined}
|
|
86
89
|
copyAriaLabel={`Copy ${item.label ?? 'value'} ${valIndex + 1}`}
|
|
87
90
|
/>
|
|
88
91
|
))}
|
|
@@ -136,10 +139,11 @@ interface InfoCardValueRowProps {
|
|
|
136
139
|
value: string
|
|
137
140
|
showLabel: boolean
|
|
138
141
|
copyable?: boolean
|
|
142
|
+
icon?: React.ReactNode
|
|
139
143
|
copyAriaLabel: string
|
|
140
144
|
}
|
|
141
145
|
|
|
142
|
-
function InfoCardValueRow({ label, value, showLabel, copyable, copyAriaLabel }: InfoCardValueRowProps) {
|
|
146
|
+
function InfoCardValueRow({ label, value, showLabel, copyable, icon, copyAriaLabel }: InfoCardValueRowProps) {
|
|
143
147
|
const { copy, copied } = useCopyToClipboard()
|
|
144
148
|
|
|
145
149
|
return (
|
|
@@ -155,6 +159,7 @@ function InfoCardValueRow({ label, value, showLabel, copyable, copyAriaLabel }:
|
|
|
155
159
|
>
|
|
156
160
|
{value}
|
|
157
161
|
</span>
|
|
162
|
+
{icon}
|
|
158
163
|
{copyable && (
|
|
159
164
|
<button
|
|
160
165
|
type="button"
|
|
@@ -36,7 +36,7 @@ interface ReleaseChangelogSectionProps {
|
|
|
36
36
|
* the lib's `RichMarkdownRenderer` so changelog rich-link previews
|
|
37
37
|
* (YouTube, OG cards, etc.) work out of the box. Hosts that already
|
|
38
38
|
* wrap with a Supabase-aware preset can keep passing their own. */
|
|
39
|
-
|
|
39
|
+
MarkdownRenderer?: React.ComponentType<{ content: string }>;
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
// Collapsed height for the preview-first mode. ~120px shows the first
|
|
@@ -52,7 +52,7 @@ export function ReleaseChangelogSection({
|
|
|
52
52
|
defaultCollapsed = true,
|
|
53
53
|
previewFirst = false,
|
|
54
54
|
icon,
|
|
55
|
-
|
|
55
|
+
MarkdownRenderer = RichMarkdownRenderer,
|
|
56
56
|
}: ReleaseChangelogSectionProps) {
|
|
57
57
|
const [collapsed, setCollapsed] = useState(collapsible ? defaultCollapsed : false);
|
|
58
58
|
const [previewExpanded, setPreviewExpanded] = useState(false);
|
|
@@ -126,7 +126,7 @@ export function ReleaseChangelogSection({
|
|
|
126
126
|
} : {}),
|
|
127
127
|
}}
|
|
128
128
|
>
|
|
129
|
-
<ChangelogEntryList entries={entries}
|
|
129
|
+
<ChangelogEntryList entries={entries} MarkdownRenderer={MarkdownRenderer} />
|
|
130
130
|
</div>
|
|
131
131
|
{previewNeedsFade && (
|
|
132
132
|
<button
|
|
@@ -142,7 +142,7 @@ export function ReleaseChangelogSection({
|
|
|
142
142
|
)}
|
|
143
143
|
</div>
|
|
144
144
|
) : (
|
|
145
|
-
<ChangelogEntryList entries={entries}
|
|
145
|
+
<ChangelogEntryList entries={entries} MarkdownRenderer={MarkdownRenderer} />
|
|
146
146
|
)
|
|
147
147
|
)}
|
|
148
148
|
</div>
|
|
@@ -156,31 +156,36 @@ export function ReleaseChangelogSection({
|
|
|
156
156
|
*/
|
|
157
157
|
function ChangelogEntryList({
|
|
158
158
|
entries,
|
|
159
|
-
|
|
159
|
+
MarkdownRenderer,
|
|
160
160
|
}: {
|
|
161
161
|
entries: ChangelogEntry[];
|
|
162
|
-
|
|
162
|
+
MarkdownRenderer: React.ComponentType<{ content: string }>;
|
|
163
163
|
}) {
|
|
164
164
|
return (
|
|
165
165
|
<ul className="space-y-6">
|
|
166
166
|
{entries.map((entry, index) => (
|
|
167
167
|
<li key={index} className="border-l-2 border-ods-border pl-4 ml-0">
|
|
168
|
-
{/* Entry title —
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
168
|
+
{/* Entry title — run through the SAME markdown renderer as the
|
|
169
|
+
description so inline markdown (links like `[label](url)`,
|
|
170
|
+
emphasis) renders instead of showing as raw text, then pinned
|
|
171
|
+
back to the `text-h3` body+BOLD scale (per ODS tokens:
|
|
172
|
+
`--font-h3-weight: var(--font-weight-bold)`, 14/18px responsive)
|
|
173
|
+
so plain-text titles look exactly as before. `[&_p]:!my-0`
|
|
174
|
+
strips the renderer's paragraph margins; `mb-2` keeps the gap to
|
|
175
|
+
the description. */}
|
|
176
|
+
<div className="text-h3 text-ods-text-primary mb-2 [&_p]:!text-[length:var(--font-size-h3-body)] [&_p]:!leading-[var(--font-line-space-h3-body)] [&_p]:!font-bold [&_p]:!my-0 [&_p+p]:!mt-2">
|
|
177
|
+
<MarkdownRenderer content={entry.title} />
|
|
178
|
+
</div>
|
|
174
179
|
{entry.description && (
|
|
175
180
|
/* Entry description — body text matches the main release
|
|
176
181
|
summary at the SAME 14/18px responsive `text-h4` scale.
|
|
177
|
-
The `
|
|
182
|
+
The `MarkdownRenderer` forces its own `<p>` typography
|
|
178
183
|
which would override `text-h4` on `lg+` viewports and
|
|
179
184
|
inflate the changelog body to 20px. The `[&_p]:!` overrides
|
|
180
185
|
pin every descendant `<p>` back to the h4 responsive tokens
|
|
181
186
|
so the breakpoints stay aligned with the rest of the page. */
|
|
182
187
|
<div className="text-h4 text-ods-text-primary [&_p]:!text-[length:var(--font-size-h4-body)] [&_p]:!leading-[var(--font-line-space-h4-body)] [&_p]:!font-medium">
|
|
183
|
-
<
|
|
188
|
+
<MarkdownRenderer content={entry.description} />
|
|
184
189
|
</div>
|
|
185
190
|
)}
|
|
186
191
|
</li>
|
|
@@ -16,6 +16,10 @@ export function TableCardSkeleton({
|
|
|
16
16
|
className,
|
|
17
17
|
rowClassName
|
|
18
18
|
}: TableCardSkeletonProps) {
|
|
19
|
+
// The multi-line placeholder belongs to the primary text column — the wide,
|
|
20
|
+
// GROWING one (`flex-1` / `flex-[n]`), not necessarily the first column, which
|
|
21
|
+
// may be a narrow leading action/icon column. Falls back to the first column.
|
|
22
|
+
const primaryKey = (columns.find((c) => /flex-(1|\[)/.test(c.width || '')) ?? columns[0])?.key
|
|
19
23
|
return (
|
|
20
24
|
<>
|
|
21
25
|
{Array.from({ length: rows }).map((_, index) => (
|
|
@@ -41,8 +45,8 @@ export function TableCardSkeleton({
|
|
|
41
45
|
)}
|
|
42
46
|
>
|
|
43
47
|
<div className="h-5 bg-ods-bg-surface rounded w-3/4 mb-1" />
|
|
44
|
-
{/*
|
|
45
|
-
{index % 2 === 0 && column.key ===
|
|
48
|
+
{/* second line simulates multi-line content on the primary column */}
|
|
49
|
+
{index % 2 === 0 && column.key === primaryKey && (
|
|
46
50
|
<div className="h-4 bg-ods-bg-surface rounded w-1/2 opacity-60" />
|
|
47
51
|
)}
|
|
48
52
|
</div>
|
|
@@ -103,6 +103,28 @@ export const WithCopyableValues: Story = {
|
|
|
103
103
|
),
|
|
104
104
|
}
|
|
105
105
|
|
|
106
|
+
export const WithItemIcon: Story = {
|
|
107
|
+
args: {
|
|
108
|
+
data: {
|
|
109
|
+
items: [
|
|
110
|
+
{ label: 'toolEventId', value: 'fleet_67890abcdef123456' },
|
|
111
|
+
{ label: 'ingestDay', value: '2024-01-20' },
|
|
112
|
+
{
|
|
113
|
+
label: 'toolType',
|
|
114
|
+
value: 'Fleet',
|
|
115
|
+
icon: <ShieldCheckIcon size={16} className="text-ods-text-secondary" />,
|
|
116
|
+
},
|
|
117
|
+
{ label: 'severity', value: 'ERROR' },
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
render: (args) => (
|
|
122
|
+
<div className="w-96">
|
|
123
|
+
<InfoCard {...args} />
|
|
124
|
+
</div>
|
|
125
|
+
),
|
|
126
|
+
}
|
|
127
|
+
|
|
106
128
|
export const WithFooter: Story = {
|
|
107
129
|
args: {
|
|
108
130
|
data: {
|