@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.
Files changed (117) hide show
  1. package/dist/{chunk-H5VFN7IP.cjs → chunk-2FDRZIX2.cjs} +340 -360
  2. package/dist/chunk-2FDRZIX2.cjs.map +1 -0
  3. package/dist/{chunk-L5TSBYSQ.js → chunk-3BWH262F.js} +4 -4
  4. package/dist/{chunk-RESNZ4Z3.js → chunk-A4X3DZSS.js} +2 -2
  5. package/dist/{chunk-LDTSPXZU.js → chunk-BG44XQB2.js} +3114 -3134
  6. package/dist/chunk-BG44XQB2.js.map +1 -0
  7. package/dist/{chunk-MDYAGMLF.cjs → chunk-DPFJPCFL.cjs} +7 -7
  8. package/dist/{chunk-MDYAGMLF.cjs.map → chunk-DPFJPCFL.cjs.map} +1 -1
  9. package/dist/{chunk-JTW23UXA.js → chunk-DPU7VTTV.js} +8 -8
  10. package/dist/chunk-DPU7VTTV.js.map +1 -0
  11. package/dist/{chunk-NW57Y4CP.cjs → chunk-FDKTAOEO.cjs} +37 -37
  12. package/dist/{chunk-NW57Y4CP.cjs.map → chunk-FDKTAOEO.cjs.map} +1 -1
  13. package/dist/{chunk-7D5UKWEA.js → chunk-FGVYJPT4.js} +2 -2
  14. package/dist/{chunk-US3DF2WZ.cjs → chunk-FNPF5OQS.cjs} +26 -26
  15. package/dist/{chunk-US3DF2WZ.cjs.map → chunk-FNPF5OQS.cjs.map} +1 -1
  16. package/dist/{chunk-R2TWMVBP.js → chunk-GFBCUSFN.js} +4 -4
  17. package/dist/{chunk-CPALUGYN.js → chunk-GOTCZBP2.js} +2 -2
  18. package/dist/{chunk-XVZ62VX4.js → chunk-HI367AS3.js} +2 -2
  19. package/dist/{chunk-KY6RWDEB.js → chunk-HKBV4OJK.js} +2 -2
  20. package/dist/{chunk-MVXX2JTT.cjs → chunk-IBCTHO3A.cjs} +5 -5
  21. package/dist/{chunk-MVXX2JTT.cjs.map → chunk-IBCTHO3A.cjs.map} +1 -1
  22. package/dist/{chunk-SD2J3HJ5.cjs → chunk-IJ2OYHRH.cjs} +12 -12
  23. package/dist/{chunk-SD2J3HJ5.cjs.map → chunk-IJ2OYHRH.cjs.map} +1 -1
  24. package/dist/{chunk-CIE66RSH.js → chunk-IOEGV4DP.js} +2 -2
  25. package/dist/{chunk-2FVULOIK.cjs → chunk-IVY5R6L2.cjs} +25 -25
  26. package/dist/{chunk-2FVULOIK.cjs.map → chunk-IVY5R6L2.cjs.map} +1 -1
  27. package/dist/{chunk-KDJJPHQE.js → chunk-JI7EPGRA.js} +4 -4
  28. package/dist/{chunk-TFNK6B4T.js → chunk-N7MH2OSW.js} +2 -2
  29. package/dist/{chunk-H2OKGWDK.cjs → chunk-QJR7QLNW.cjs} +31 -31
  30. package/dist/{chunk-H2OKGWDK.cjs.map → chunk-QJR7QLNW.cjs.map} +1 -1
  31. package/dist/{chunk-OQ4VKWYU.cjs → chunk-RLHOSQ7X.cjs} +9 -9
  32. package/dist/{chunk-OQ4VKWYU.cjs.map → chunk-RLHOSQ7X.cjs.map} +1 -1
  33. package/dist/{chunk-I5KS2YDX.cjs → chunk-RSA7DPZN.cjs} +60 -60
  34. package/dist/chunk-RSA7DPZN.cjs.map +1 -0
  35. package/dist/{chunk-HIRDBLM3.cjs → chunk-Y2VDAVIX.cjs} +62 -62
  36. package/dist/{chunk-HIRDBLM3.cjs.map → chunk-Y2VDAVIX.cjs.map} +1 -1
  37. package/dist/{chunk-45BYRANY.cjs → chunk-YHDF4WMG.cjs} +15 -15
  38. package/dist/{chunk-45BYRANY.cjs.map → chunk-YHDF4WMG.cjs.map} +1 -1
  39. package/dist/components/case-studies/index.cjs +8 -8
  40. package/dist/components/case-studies/index.js +2 -2
  41. package/dist/components/chat/index.cjs +2 -2
  42. package/dist/components/chat/index.js +1 -1
  43. package/dist/components/contact/index.cjs +3 -3
  44. package/dist/components/contact/index.js +2 -2
  45. package/dist/components/docs/index.cjs +5 -5
  46. package/dist/components/docs/index.js +4 -4
  47. package/dist/components/embeds/index.cjs +3 -3
  48. package/dist/components/embeds/index.js +2 -2
  49. package/dist/components/faq/index.cjs +3 -3
  50. package/dist/components/faq/index.js +2 -2
  51. package/dist/components/features/entity-summary-editor.d.ts.map +1 -1
  52. package/dist/components/features/highlight-video-combined-section.d.ts.map +1 -1
  53. package/dist/components/features/highlight-video-preview.d.ts.map +1 -1
  54. package/dist/components/features/highlight-video-section.d.ts.map +1 -1
  55. package/dist/components/features/index.cjs +2 -2
  56. package/dist/components/features/index.js +1 -1
  57. package/dist/components/features/seo-editor-preview.d.ts.map +1 -1
  58. package/dist/components/features/transcript-summary-editor.d.ts.map +1 -1
  59. package/dist/components/features/video-source-selector.d.ts.map +1 -1
  60. package/dist/components/help-center-pages/index.cjs +20 -20
  61. package/dist/components/help-center-pages/index.js +11 -11
  62. package/dist/components/index.cjs +123 -121
  63. package/dist/components/index.cjs.map +1 -1
  64. package/dist/components/index.js +11 -9
  65. package/dist/components/index.js.map +1 -1
  66. package/dist/components/navigation/index.cjs +2 -2
  67. package/dist/components/navigation/index.js +1 -1
  68. package/dist/components/onboarding-guides/index.cjs +5 -5
  69. package/dist/components/onboarding-guides/index.js +4 -4
  70. package/dist/components/related-content/index.cjs +3 -3
  71. package/dist/components/related-content/index.js +2 -2
  72. package/dist/components/tickets/index.cjs +5 -5
  73. package/dist/components/tickets/index.js +4 -4
  74. package/dist/components/ui/ai-generated-badge.d.ts +10 -0
  75. package/dist/components/ui/ai-generated-badge.d.ts.map +1 -0
  76. package/dist/components/ui/index.cjs +4 -2
  77. package/dist/components/ui/index.cjs.map +1 -1
  78. package/dist/components/ui/index.d.ts +1 -0
  79. package/dist/components/ui/index.d.ts.map +1 -1
  80. package/dist/components/ui/index.js +3 -1
  81. package/dist/components/ui/info-card.d.ts +2 -0
  82. package/dist/components/ui/info-card.d.ts.map +1 -1
  83. package/dist/components/ui/release-changelog-section.d.ts +2 -2
  84. package/dist/components/ui/release-changelog-section.d.ts.map +1 -1
  85. package/dist/components/ui/table/table-skeleton.d.ts.map +1 -1
  86. package/dist/index.cjs +4 -2
  87. package/dist/index.cjs.map +1 -1
  88. package/dist/index.js +3 -1
  89. package/package.json +1 -1
  90. package/src/components/features/entity-summary-editor.tsx +2 -4
  91. package/src/components/features/highlight-video-combined-section.tsx +2 -4
  92. package/src/components/features/highlight-video-preview.tsx +2 -4
  93. package/src/components/features/highlight-video-section.tsx +2 -4
  94. package/src/components/features/seo-editor-preview.tsx +4 -12
  95. package/src/components/features/transcript-summary-editor.tsx +3 -8
  96. package/src/components/features/video-source-selector.tsx +2 -4
  97. package/src/components/shared/product-release/release-detail-page.tsx +4 -4
  98. package/src/components/ui/ai-generated-badge.tsx +17 -0
  99. package/src/components/ui/index.ts +1 -0
  100. package/src/components/ui/info-card.tsx +6 -1
  101. package/src/components/ui/release-changelog-section.tsx +19 -14
  102. package/src/components/ui/table/table-skeleton.tsx +6 -2
  103. package/src/stories/InfoCard.stories.tsx +22 -0
  104. package/dist/chunk-H5VFN7IP.cjs.map +0 -1
  105. package/dist/chunk-I5KS2YDX.cjs.map +0 -1
  106. package/dist/chunk-JTW23UXA.js.map +0 -1
  107. package/dist/chunk-LDTSPXZU.js.map +0 -1
  108. /package/dist/{chunk-L5TSBYSQ.js.map → chunk-3BWH262F.js.map} +0 -0
  109. /package/dist/{chunk-RESNZ4Z3.js.map → chunk-A4X3DZSS.js.map} +0 -0
  110. /package/dist/{chunk-7D5UKWEA.js.map → chunk-FGVYJPT4.js.map} +0 -0
  111. /package/dist/{chunk-R2TWMVBP.js.map → chunk-GFBCUSFN.js.map} +0 -0
  112. /package/dist/{chunk-CPALUGYN.js.map → chunk-GOTCZBP2.js.map} +0 -0
  113. /package/dist/{chunk-XVZ62VX4.js.map → chunk-HI367AS3.js.map} +0 -0
  114. /package/dist/{chunk-KY6RWDEB.js.map → chunk-HKBV4OJK.js.map} +0 -0
  115. /package/dist/{chunk-CIE66RSH.js.map → chunk-IOEGV4DP.js.map} +0 -0
  116. /package/dist/{chunk-KDJJPHQE.js.map → chunk-JI7EPGRA.js.map} +0 -0
  117. /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
- <Badge variant="secondary" className="flex items-center gap-1">
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
- SimpleMarkdownRenderer={MarkdownRenderer}
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
- SimpleMarkdownRenderer={MarkdownRenderer}
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
- SimpleMarkdownRenderer={MarkdownRenderer}
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
- SimpleMarkdownRenderer={MarkdownRenderer}
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
- SimpleMarkdownRenderer?: React.ComponentType<{ content: string }>;
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
- SimpleMarkdownRenderer = RichMarkdownRenderer,
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} SimpleMarkdownRenderer={SimpleMarkdownRenderer} />
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} SimpleMarkdownRenderer={SimpleMarkdownRenderer} />
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
- SimpleMarkdownRenderer,
159
+ MarkdownRenderer,
160
160
  }: {
161
161
  entries: ChangelogEntry[];
162
- SimpleMarkdownRenderer: React.ComponentType<{ content: string }>;
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 — `text-h3` is body family + BOLD weight (per
169
- ODS tokens: `--font-h3-weight: var(--font-weight-bold)`)
170
- at 14/18px responsive. Same body size as the description
171
- below, distinguished by weight clean visual hierarchy
172
- without inflating the body scale. */}
173
- <p className="text-h3 text-ods-text-primary mb-2">{entry.title}</p>
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 `SimpleMarkdownRenderer` forces its own `<p>` typography
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
- <SimpleMarkdownRenderer content={entry.description} />
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
- {/* Add second line for some columns to simulate multi-line content */}
45
- {index % 2 === 0 && column.key === columns[0].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: {