vibebusiness 1.2.83 → 1.2.86

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 (97) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +21 -21
  3. package/.next/standalone/.next/app-path-routes-manifest.json +1 -1
  4. package/.next/standalone/.next/build-manifest.json +2 -2
  5. package/.next/standalone/.next/prerender-manifest.json +1 -1
  6. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  7. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  8. package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
  9. package/.next/standalone/.next/server/app/api/analyze/route.js.nft.json +1 -1
  10. package/.next/standalone/.next/server/app/api/config/route.js.nft.json +1 -1
  11. package/.next/standalone/.next/server/app/api/epics/[id]/ideas/route.js.nft.json +1 -1
  12. package/.next/standalone/.next/server/app/api/epics/[id]/route.js.nft.json +1 -1
  13. package/.next/standalone/.next/server/app/api/epics/route.js.nft.json +1 -1
  14. package/.next/standalone/.next/server/app/api/goals/[id]/kpis/route.js.nft.json +1 -1
  15. package/.next/standalone/.next/server/app/api/goals/[id]/route.js.nft.json +1 -1
  16. package/.next/standalone/.next/server/app/api/goals/route.js.nft.json +1 -1
  17. package/.next/standalone/.next/server/app/api/hypotheses/[id]/route.js.nft.json +1 -1
  18. package/.next/standalone/.next/server/app/api/hypotheses/route.js.nft.json +1 -1
  19. package/.next/standalone/.next/server/app/api/ideas/[id]/card/route.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/api/ideas/[id]/comments/route.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/api/ideas/[id]/implement/route.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/api/ideas/[id]/route.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/api/ideas/[id]/transition/route.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/api/ideas/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/implementations/route.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/api/kpis/refresh/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/social/[id]/publish/route.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/api/social/[id]/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/social/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/goals/[id]/page_client-reference-manifest.js +1 -1
  31. package/.next/standalone/.next/server/app/goals/page.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/goals/page_client-reference-manifest.js +1 -1
  33. package/.next/standalone/.next/server/app/hypotheses/[id]/page_client-reference-manifest.js +1 -1
  34. package/.next/standalone/.next/server/app/hypotheses/page.js +1 -1
  35. package/.next/standalone/.next/server/app/hypotheses/page.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/hypotheses/page_client-reference-manifest.js +1 -1
  37. package/.next/standalone/.next/server/app/ideas/[id]/page.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/ideas/[id]/page_client-reference-manifest.js +1 -1
  39. package/.next/standalone/.next/server/app/page.js +1 -1
  40. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/roadmap/[id]/page_client-reference-manifest.js +1 -1
  43. package/.next/standalone/.next/server/app/roadmap/investors/page.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/roadmap/investors/page_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/roadmap/page.js.nft.json +1 -1
  46. package/.next/standalone/.next/server/app/roadmap/page_client-reference-manifest.js +1 -1
  47. package/.next/standalone/.next/server/app/roadmap/public/page.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/roadmap/public/page_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/sessions/page.js.nft.json +1 -1
  50. package/.next/standalone/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  51. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  52. package/.next/standalone/.next/server/app/settings.html +1 -1
  53. package/.next/standalone/.next/server/app/settings.rsc +1 -1
  54. package/.next/standalone/.next/server/app/social/page_client-reference-manifest.js +1 -1
  55. package/.next/standalone/.next/server/app/social.html +1 -1
  56. package/.next/standalone/.next/server/app/social.rsc +1 -1
  57. package/.next/standalone/.next/server/app/updates/[id]/page.js.nft.json +1 -1
  58. package/.next/standalone/.next/server/app/updates/[id]/page_client-reference-manifest.js +1 -1
  59. package/.next/standalone/.next/server/app/updates/new/page_client-reference-manifest.js +1 -1
  60. package/.next/standalone/.next/server/app/updates/new.html +1 -1
  61. package/.next/standalone/.next/server/app/updates/new.rsc +1 -1
  62. package/.next/standalone/.next/server/app/updates/page.js.nft.json +1 -1
  63. package/.next/standalone/.next/server/app/updates/page_client-reference-manifest.js +1 -1
  64. package/.next/standalone/.next/server/app-paths-manifest.json +18 -18
  65. package/.next/standalone/.next/server/chunks/6299.js +1 -1
  66. package/.next/standalone/.next/server/pages/404.html +1 -1
  67. package/.next/standalone/.next/server/pages/500.html +1 -1
  68. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  69. package/.next/standalone/data/goals.json +10 -2
  70. package/.next/standalone/data/social.json +19 -4
  71. package/.next/standalone/data/social.json.backup +179 -0
  72. package/.next/standalone/data/videos/ai-gets-business-feed.mp4 +0 -0
  73. package/.next/standalone/data/videos/idea-graveyard-feed.mp4 +0 -0
  74. package/.next/standalone/data/videos/lonely-founder-feed.mp4 +0 -0
  75. package/.next/standalone/data/videos/staging/ai-gets-business.json +55 -0
  76. package/.next/standalone/data/videos/staging/idea-graveyard.json +61 -0
  77. package/.next/standalone/data/videos/staging/lonely-founder.json +60 -0
  78. package/.next/standalone/data/videos/staging/while-you-slept-v2-fast.json +67 -0
  79. package/.next/standalone/data/videos/staging/while-you-slept-v3-dynamic.json +67 -0
  80. package/.next/standalone/data/videos/while-you-slept-v2-fast-feed.mp4 +0 -0
  81. package/.next/standalone/data/videos/while-you-slept-v3-dynamic-feed.mp4 +0 -0
  82. package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/c99d23d3548030c8ff8de678c71eeb15/1.pack +0 -0
  83. package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/c99d23d3548030c8ff8de678c71eeb15/3.pack +0 -0
  84. package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/c99d23d3548030c8ff8de678c71eeb15/index.pack +0 -0
  85. package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/c99d23d3548030c8ff8de678c71eeb15/index.pack.old +0 -0
  86. package/.next/standalone/package.json +1 -1
  87. package/.next/standalone/scripts/analyze.ts +7 -4
  88. package/.next/static/chunks/app/page-d325a95479e7c453.js +1 -0
  89. package/dist/bin/vibebusiness.js +8 -0
  90. package/dist/scripts/analyze.js +7 -4
  91. package/dist/scripts/heartbeat.js +10 -1
  92. package/package.json +1 -1
  93. package/scripts/lib/video/compositions/DemoVideo.tsx +134 -50
  94. package/scripts/lib/video/compositions/Root.tsx +21 -2
  95. package/.next/static/chunks/app/page-3635a292b3d471c0.js +0 -1
  96. /package/.next/static/{wJT1h-ifHTtYVlXZG2PFS → fBNMzUSuIGwJGs9aNW81h}/_buildManifest.js +0 -0
  97. /package/.next/static/{wJT1h-ifHTtYVlXZG2PFS → fBNMzUSuIGwJGs9aNW81h}/_ssgManifest.js +0 -0
@@ -553,7 +553,7 @@ Each idea must be a valid JSON object with these fields:
553
553
  "category": "product | ux_design | growth | performance | tech_debt | security | infrastructure | content | analytics | integration",
554
554
  "priority": "critical | high | medium | low",
555
555
  "effort": "xs | s | m | l | xl",
556
- "impact": "xs | s | m | l | xl",
556
+ "impact": "xs | s | m | l | xl (size of business impact \u2014 NOT a priority level; never use 'critical', 'high', 'medium', 'low' here)",
557
557
  "context": "string - What triggered this idea (observations, data)",
558
558
  "rationale": "string - Why this matters for the business",
559
559
  "implementation_plan": "string - Step-by-step implementation (markdown ok)",
@@ -1825,9 +1825,12 @@ function parseIdeas(response, sessionId) {
1825
1825
  title: idea.title || "Untitled Idea",
1826
1826
  summary: idea.summary || "",
1827
1827
  category: idea.category || "product",
1828
- priority: idea.priority || "medium",
1829
- effort: idea.effort || "m",
1830
- impact: idea.impact || "m",
1828
+ priority: ["critical", "high", "medium", "low"].includes(idea.priority) ? idea.priority : "medium",
1829
+ effort: ["xs", "s", "m", "l", "xl"].includes(idea.effort) ? idea.effort : "m",
1830
+ impact: ["xs", "s", "m", "l", "xl"].includes(idea.impact) ? idea.impact : (() => {
1831
+ if (idea.impact) logError("analyze:parseIdeas", new Error(`invalid impact "${idea.impact}" for idea "${idea.title}" \u2014 defaulting to "m"`));
1832
+ return "m";
1833
+ })(),
1831
1834
  context: idea.context || "",
1832
1835
  rationale: idea.rationale || "",
1833
1836
  implementation_plan: idea.implementation_plan || "",
@@ -33249,7 +33249,8 @@ async function renderCarousel(carousel, format, outputPath, _depsOverride, compo
33249
33249
  const inputProps = {
33250
33250
  slides: carousel.slides,
33251
33251
  format,
33252
- ...carousel.audio ? { audio: carousel.audio } : {}
33252
+ ...carousel.audio ? { audio: carousel.audio } : {},
33253
+ ...carousel.variant ? { variant: carousel.variant } : {}
33253
33254
  };
33254
33255
  const composition = await selectComposition({
33255
33256
  serveUrl: bundleCache,
@@ -34403,8 +34404,16 @@ async function writeJsonFile(filePath, data) {
34403
34404
  }
34404
34405
  async function getIdeas() {
34405
34406
  const store = await readJsonFile(getFilePath("ideas.json"), { ideas: [] });
34407
+ const VALID_PRIORITIES = ["critical", "high", "medium", "low"];
34408
+ const VALID_SIZES = ["xs", "s", "m", "l", "xl"];
34406
34409
  return store.ideas.map((idea) => ({
34407
34410
  ...idea,
34411
+ stage: idea.stage ?? idea.status ?? "inbox",
34412
+ priority: VALID_PRIORITIES.includes(idea.priority) ? idea.priority : "medium",
34413
+ impact: VALID_SIZES.includes(idea.impact) ? idea.impact : "m",
34414
+ effort: VALID_SIZES.includes(idea.effort) ? idea.effort : "s",
34415
+ comments: idea.comments ?? [],
34416
+ tags: idea.tags ?? [],
34408
34417
  epic_id: idea.epic_id ?? null,
34409
34418
  implementation: {
34410
34419
  ...idea.implementation,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibebusiness",
3
- "version": "1.2.83",
3
+ "version": "1.2.86",
4
4
  "description": "AI-powered autonomous product manager. Research. Build. Ship. Grow.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "private": false,
@@ -12,7 +12,7 @@
12
12
  */
13
13
 
14
14
  import React from 'react';
15
- import { AbsoluteFill, Sequence, useCurrentFrame, interpolate } from 'remotion';
15
+ import { AbsoluteFill, Sequence, useCurrentFrame, interpolate, spring } from 'remotion';
16
16
  import { BackgroundMusic } from './BackgroundMusic';
17
17
  import type { AudioConfig } from '../renderer';
18
18
 
@@ -33,6 +33,7 @@ export interface DemoSlideData {
33
33
  export interface DemoVideoProps {
34
34
  slides: DemoSlideData[];
35
35
  format: 'feed' | 'reels';
36
+ variant?: 'fast' | 'dynamic';
36
37
  audio?: AudioConfig;
37
38
  }
38
39
 
@@ -43,22 +44,56 @@ const TEXT = '#ffffff';
43
44
  const MUTED = 'rgba(255,255,255,0.6)';
44
45
  const FONT = '"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif';
45
46
 
46
- // Custom frame durations for different scene types
47
- const FRAME_DURATIONS: Record<string, number> = {
48
- cover: 90, // 3s
49
- terminal: 150, // 5s
50
- key_point: 90, // 3s
51
- notification: 90, // 3s
52
- steps: 150, // 5s (kanban)
53
- kanban: 150, // 5s
54
- pipeline: 135, // 4.5s
55
- quote: 135, // 4.5s
56
- cta: 105, // 3.5s
47
+ // Variant-specific frame durations
48
+ const FRAME_DURATIONS: Record<string, Record<string, number>> = {
49
+ fast: {
50
+ cover: 60, // 2s
51
+ terminal: 90, // 3s
52
+ key_point: 60, // 2s
53
+ notification: 60, // 2s
54
+ steps: 90, // 3s (kanban)
55
+ kanban: 90, // 3s
56
+ pipeline: 90, // 3s
57
+ quote: 90, // 3s
58
+ cta: 75, // 2.5s
59
+ },
60
+ dynamic: {
61
+ cover: 75, // 2.5s
62
+ terminal: 105, // 3.5s
63
+ key_point: 75, // 2.5s
64
+ notification: 75, // 2.5s
65
+ steps: 105, // 3.5s (kanban)
66
+ kanban: 105, // 3.5s
67
+ pipeline: 105, // 3.5s
68
+ quote: 105, // 3.5s
69
+ cta: 90, // 3s
70
+ },
71
+ };
72
+
73
+ // Variant-specific animation configuration
74
+ const ANIMATION_CONFIG = {
75
+ fast: {
76
+ transitionFrames: 8,
77
+ charsPerFrame: 4,
78
+ kanbanDelay: 5,
79
+ enableBounce: false,
80
+ enableSpring: false,
81
+ enableGlow: false,
82
+ },
83
+ dynamic: {
84
+ transitionFrames: 12,
85
+ charsPerFrame: 3,
86
+ kanbanDelay: 7,
87
+ enableBounce: true,
88
+ enableSpring: true,
89
+ enableGlow: true,
90
+ },
57
91
  };
58
92
 
59
93
  // ─── DemoVideo ──────────────────────────────────────────────────────────────
60
94
 
61
- export const DemoVideo: React.FC<DemoVideoProps> = ({ slides, audio }) => {
95
+ export const DemoVideo: React.FC<DemoVideoProps> = ({ slides, audio, variant = 'dynamic' }) => {
96
+ const durations = FRAME_DURATIONS[variant];
62
97
  let currentFrame = 0;
63
98
 
64
99
  return (
@@ -68,13 +103,13 @@ export const DemoVideo: React.FC<DemoVideoProps> = ({ slides, audio }) => {
68
103
  }}
69
104
  >
70
105
  {slides.map((slide, i) => {
71
- const duration = FRAME_DURATIONS[slide.type] || 90;
106
+ const duration = durations[slide.type] || 90;
72
107
  const from = currentFrame;
73
108
  currentFrame += duration;
74
109
 
75
110
  return (
76
111
  <Sequence key={i} from={from} durationInFrames={duration}>
77
- <DemoSlide slide={slide} />
112
+ <DemoSlide slide={slide} variant={variant} />
78
113
  </Sequence>
79
114
  );
80
115
  })}
@@ -85,10 +120,30 @@ export const DemoVideo: React.FC<DemoVideoProps> = ({ slides, audio }) => {
85
120
 
86
121
  // ─── DemoSlide ──────────────────────────────────────────────────────────────
87
122
 
88
- const DemoSlide: React.FC<{ slide: DemoSlideData }> = ({ slide }) => {
123
+ const DemoSlide: React.FC<{ slide: DemoSlideData; variant: string }> = ({ slide, variant }) => {
124
+ const config = ANIMATION_CONFIG[variant as keyof typeof ANIMATION_CONFIG];
89
125
  const frame = useCurrentFrame();
90
- const opacity = interpolate(frame, [0, 15], [0, 1], { extrapolateRight: 'clamp' });
91
- const y = interpolate(frame, [0, 15], [24, 0], { extrapolateRight: 'clamp' });
126
+
127
+ // Entrance animation with optional bounce
128
+ const opacity = interpolate(frame, [0, config.transitionFrames], [0, 1], { extrapolateRight: 'clamp' });
129
+
130
+ let y = interpolate(frame, [0, config.transitionFrames], [24, 0], { extrapolateRight: 'clamp' });
131
+
132
+ if (config.enableBounce && frame > config.transitionFrames) {
133
+ const overshoot = interpolate(
134
+ frame,
135
+ [config.transitionFrames, config.transitionFrames + 8],
136
+ [0, -4],
137
+ { extrapolateRight: 'clamp' }
138
+ );
139
+ const settle = interpolate(
140
+ frame,
141
+ [config.transitionFrames + 8, config.transitionFrames + 16],
142
+ [-4, 0],
143
+ { extrapolateRight: 'clamp' }
144
+ );
145
+ y = frame <= config.transitionFrames + 8 ? overshoot : settle;
146
+ }
92
147
 
93
148
  return (
94
149
  <AbsoluteFill
@@ -104,14 +159,14 @@ const DemoSlide: React.FC<{ slide: DemoSlideData }> = ({ slide }) => {
104
159
  alignItems: 'flex-start',
105
160
  }}
106
161
  >
107
- <SlideContent slide={slide} />
162
+ <SlideContent slide={slide} variant={variant} />
108
163
  </AbsoluteFill>
109
164
  );
110
165
  };
111
166
 
112
167
  // ─── Slide content by type ──────────────────────────────────────────────────
113
168
 
114
- function SlideContent({ slide }: { slide: DemoSlideData }) {
169
+ function SlideContent({ slide, variant }: { slide: DemoSlideData; variant: string }) {
115
170
  const frame = useCurrentFrame();
116
171
 
117
172
  switch (slide.type) {
@@ -139,7 +194,7 @@ function SlideContent({ slide }: { slide: DemoSlideData }) {
139
194
  );
140
195
 
141
196
  case 'terminal':
142
- return <TerminalScene title={slide.title} content={slide.content || ''} frame={frame} />;
197
+ return <TerminalScene title={slide.title} content={slide.content || ''} frame={frame} variant={variant} />;
143
198
 
144
199
  case 'notification':
145
200
  return <NotificationScene title={slide.title} content={slide.content || ''} frame={frame} />;
@@ -167,10 +222,10 @@ function SlideContent({ slide }: { slide: DemoSlideData }) {
167
222
 
168
223
  case 'steps':
169
224
  case 'kanban':
170
- return <KanbanScene title={slide.title} items={slide.items || []} frame={frame} />;
225
+ return <KanbanScene title={slide.title} items={slide.items || []} frame={frame} variant={variant} />;
171
226
 
172
227
  case 'pipeline':
173
- return <PipelineScene title={slide.title} content={slide.content || ''} label={slide.label} frame={frame} />;
228
+ return <PipelineScene title={slide.title} content={slide.content || ''} label={slide.label} frame={frame} variant={variant} />;
174
229
 
175
230
  case 'quote':
176
231
  return (
@@ -238,10 +293,11 @@ function SlideContent({ slide }: { slide: DemoSlideData }) {
238
293
 
239
294
  // ─── Custom Scene Components ────────────────────────────────────────────────
240
295
 
241
- function TerminalScene({ title, content, frame }: { title: string; content: string; frame: number }) {
296
+ function TerminalScene({ title, content, frame, variant }: { title: string; content: string; frame: number; variant: string }) {
242
297
  // Typewriter effect
298
+ const config = ANIMATION_CONFIG[variant as keyof typeof ANIMATION_CONFIG];
243
299
  const lines = content.split('\n');
244
- const charsPerFrame = 2;
300
+ const charsPerFrame = config.charsPerFrame;
245
301
  const visibleChars = Math.floor(frame * charsPerFrame);
246
302
 
247
303
  let charCount = 0;
@@ -322,7 +378,9 @@ function NotificationScene({ title, content, frame }: { title: string; content:
322
378
  );
323
379
  }
324
380
 
325
- function KanbanScene({ title, items, frame }: { title: string; items: string[]; frame: number }) {
381
+ function KanbanScene({ title, items, frame, variant }: { title: string; items: string[]; frame: number; variant: string }) {
382
+ const config = ANIMATION_CONFIG[variant as keyof typeof ANIMATION_CONFIG];
383
+
326
384
  return (
327
385
  <div style={{ width: '100%' }}>
328
386
  <div
@@ -339,9 +397,19 @@ function KanbanScene({ title, items, frame }: { title: string; items: string[];
339
397
  </div>
340
398
  <div style={{ display: 'flex', gap: 24 }}>
341
399
  {items.map((item, i) => {
342
- const delay = i * 10;
343
- const opacity = interpolate(frame, [delay, delay + 15], [0, 1], { extrapolateRight: 'clamp' });
344
- const scale = interpolate(frame, [delay, delay + 15], [0.8, 1], { extrapolateRight: 'clamp' });
400
+ const delay = i * config.kanbanDelay;
401
+
402
+ let opacity, scale;
403
+
404
+ if (config.enableSpring) {
405
+ // Use spring physics
406
+ opacity = spring({ frame: frame - delay, fps: 30, config: { damping: 15, mass: 0.5 } });
407
+ scale = spring({ frame: frame - delay, fps: 30, config: { damping: 12, mass: 0.6 } }) * 0.2 + 0.8;
408
+ } else {
409
+ // Use linear interpolation
410
+ opacity = interpolate(frame, [delay, delay + 15], [0, 1], { extrapolateRight: 'clamp' });
411
+ scale = interpolate(frame, [delay, delay + 15], [0.8, 1], { extrapolateRight: 'clamp' });
412
+ }
345
413
 
346
414
  return (
347
415
  <div
@@ -368,7 +436,8 @@ function KanbanScene({ title, items, frame }: { title: string; items: string[];
368
436
  );
369
437
  }
370
438
 
371
- function PipelineScene({ title, content, label, frame }: { title: string; content: string; label?: string; frame: number }) {
439
+ function PipelineScene({ title, content, label, frame, variant }: { title: string; content: string; label?: string; frame: number; variant: string }) {
440
+ const config = ANIMATION_CONFIG[variant as keyof typeof ANIMATION_CONFIG];
372
441
  const steps = content.split(' → ');
373
442
  const progress = interpolate(frame, [0, 100], [0, 1], { extrapolateRight: 'clamp' });
374
443
 
@@ -387,26 +456,41 @@ function PipelineScene({ title, content, label, frame }: { title: string; conten
387
456
  {title}
388
457
  </div>
389
458
  <div style={{ display: 'flex', alignItems: 'center', gap: 16, marginBottom: 32 }}>
390
- {steps.map((step, i) => (
391
- <React.Fragment key={i}>
392
- <div
393
- style={{
394
- padding: '16px 24px',
395
- background: i / (steps.length - 1) <= progress ? ACCENT : 'rgba(255,255,255,0.1)',
396
- borderRadius: 8,
397
- fontSize: 20,
398
- fontWeight: 600,
399
- color: i / (steps.length - 1) <= progress ? '#0f172a' : TEXT,
400
- transition: 'all 0.3s',
401
- }}
402
- >
403
- {step}
404
- </div>
405
- {i < steps.length - 1 && (
406
- <div style={{ fontSize: 24, color: MUTED }}>→</div>
407
- )}
408
- </React.Fragment>
409
- ))}
459
+ {steps.map((step, i) => {
460
+ const isActive = i / (steps.length - 1) <= progress;
461
+
462
+ let boxShadow = 'none';
463
+ if (config.enableGlow && isActive) {
464
+ const glowIntensity = interpolate(
465
+ frame % 30,
466
+ [0, 15, 30],
467
+ [0.3, 0.6, 0.3],
468
+ { extrapolateRight: 'clamp' }
469
+ );
470
+ boxShadow = `0 0 ${20 * glowIntensity}px rgba(16, 185, 129, ${glowIntensity})`;
471
+ }
472
+
473
+ return (
474
+ <React.Fragment key={i}>
475
+ <div
476
+ style={{
477
+ padding: '16px 24px',
478
+ background: isActive ? ACCENT : 'rgba(255,255,255,0.1)',
479
+ borderRadius: 8,
480
+ fontSize: 20,
481
+ fontWeight: 600,
482
+ color: isActive ? '#0f172a' : TEXT,
483
+ boxShadow,
484
+ }}
485
+ >
486
+ {step}
487
+ </div>
488
+ {i < steps.length - 1 && (
489
+ <div style={{ fontSize: 24, color: MUTED }}>→</div>
490
+ )}
491
+ </React.Fragment>
492
+ );
493
+ })}
410
494
  </div>
411
495
  {label && (
412
496
  <div
@@ -111,11 +111,30 @@ export const RemotionRoot: React.FC = () => {
111
111
  <Composition
112
112
  id="DemoFeed"
113
113
  component={DemoComp}
114
- durationInFrames={810} // 27 seconds at 30fps
114
+ durationInFrames={630} // Default to dynamic variant duration
115
115
  fps={30}
116
116
  width={1080}
117
117
  height={1080}
118
- defaultProps={{ slides: defaultDemoSlides, format: 'feed' } as DemoVideoProps}
118
+ defaultProps={{ slides: defaultDemoSlides, format: 'feed', variant: 'dynamic' } as DemoVideoProps}
119
+ calculateMetadata={({ props }) => {
120
+ const p = props as unknown as DemoVideoProps;
121
+ const variant = p.variant || 'dynamic';
122
+
123
+ // Calculate total duration based on variant and slides
124
+ const durations = variant === 'fast'
125
+ ? { cover: 60, terminal: 90, key_point: 60, notification: 60, steps: 90, kanban: 90, pipeline: 90, quote: 90, cta: 75 }
126
+ : { cover: 75, terminal: 105, key_point: 75, notification: 75, steps: 105, kanban: 105, pipeline: 105, quote: 105, cta: 90 };
127
+
128
+ let totalFrames = 0;
129
+ p.slides.forEach(slide => {
130
+ totalFrames += durations[slide.type as keyof typeof durations] || 90;
131
+ });
132
+
133
+ return {
134
+ durationInFrames: totalFrames,
135
+ props,
136
+ };
137
+ }}
119
138
  />
120
139
  </>
121
140
  );
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{7075:function(e,t,s){Promise.resolve().then(s.bind(s,4067)),Promise.resolve().then(s.bind(s,1259)),Promise.resolve().then(s.bind(s,8825))},4067:function(e,t,s){"use strict";s.d(t,{default:function(){return o}});var a=s(7437),r=s(9376),l=s(6221),i=s(9801),n=s(4372),c=s(6076),d=s(8623);function o(e){let{stats:t}=e,s=(0,r.useRouter)();return(0,a.jsx)("header",{className:"px-6 py-4 bg-white border-b border-slate-200",children:(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h1",{className:"text-2xl font-bold text-slate-900",children:"Idea Dashboard"}),(0,a.jsxs)("div",{className:"flex items-center gap-6 mt-2",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 text-sm text-slate-600",children:[(0,a.jsx)(l.Z,{className:"w-4 h-4"}),(0,a.jsxs)("span",{children:[t.total," total"]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2 text-sm text-amber-600",children:[(0,a.jsx)(i.Z,{className:"w-4 h-4"}),(0,a.jsxs)("span",{children:[t.inbox," in inbox"]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2 text-sm text-violet-600",children:[(0,a.jsx)(n.Z,{className:"w-4 h-4"}),(0,a.jsxs)("span",{children:[t.inProgress," in progress"]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2 text-sm text-emerald-600",children:[(0,a.jsx)(c.Z,{className:"w-4 h-4"}),(0,a.jsxs)("span",{children:[t.shipped," shipped"]})]})]})]}),(0,a.jsx)(d.Z,{onAnalysisComplete:()=>{s.refresh()}})]})})}},1259:function(e,t,s){"use strict";s.d(t,{default:function(){return f}});var a=s(7437),r=s(7648),l=s(9376),i=s(5466),n=s(2048),c=s(8896),d=s(8220),o=s(2718),x=s(5621),m=s(8728),u=s(2222),h=s(2023),b=s(1994),g=s(257);let p=[{href:"/",label:"Dashboard",icon:(0,a.jsx)(i.Z,{className:"w-5 h-5"})},{href:"/roadmap",label:"Roadmap",icon:(0,a.jsx)(n.Z,{className:"w-5 h-5"})},{href:"/goals",label:"Goals",icon:(0,a.jsx)(c.Z,{className:"w-5 h-5"})},{href:"/hypotheses",label:"Hypotheses",icon:(0,a.jsx)(d.Z,{className:"w-5 h-5"})},{href:"/social",label:"Social",icon:(0,a.jsx)(o.Z,{className:"w-5 h-5"})},{href:"/sessions",label:"Sessions",icon:(0,a.jsx)(x.Z,{className:"w-5 h-5"})},{href:"/settings",label:"Settings",icon:(0,a.jsx)(m.Z,{className:"w-5 h-5"})}];function f(e){let{children:t}=e,s=(0,l.usePathname)();return(0,a.jsxs)("div",{className:"min-h-screen flex",children:[(0,a.jsxs)("aside",{className:"w-64 bg-slate-900 text-white flex flex-col",children:[(0,a.jsx)("div",{className:"p-4 border-b border-slate-700",children:(0,a.jsxs)(r.default,{href:"/",className:"flex items-center gap-2",children:[(0,a.jsx)("div",{className:"w-10 h-10 bg-emerald-500 rounded-lg flex items-center justify-center",children:(0,a.jsx)(u.Z,{className:"w-6 h-6 text-white"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h1",{className:"font-bold text-lg leading-tight",children:"Analyst"}),(0,a.jsx)("p",{className:"text-xs text-slate-400",children:g.env.NEXT_PUBLIC_PRODUCT_NAME||"Business"})]})]})}),(0,a.jsx)("nav",{className:"flex-1 p-4",children:(0,a.jsx)("ul",{className:"space-y-1",children:p.map(e=>{let t="/"===e.href?"/"===s:s.startsWith(e.href);return(0,a.jsx)("li",{children:(0,a.jsxs)(r.default,{href:e.href,className:(0,b.Z)("flex items-center gap-3 px-3 py-2 rounded-lg transition-colors",t?"bg-slate-800 text-white":"text-slate-400 hover:text-white hover:bg-slate-800"),children:[e.icon,(0,a.jsx)("span",{children:e.label})]})},e.href)})})}),(0,a.jsx)("div",{className:"p-4 border-t border-slate-700",children:(0,a.jsxs)("div",{className:"flex items-center gap-2 text-xs text-slate-500",children:[(0,a.jsx)(h.Z,{className:"w-4 h-4"}),(0,a.jsx)("span",{children:"Powered by Claude"})]})})]}),(0,a.jsx)("main",{className:"flex-1 overflow-auto",children:t})]})}},8623:function(e,t,s){"use strict";s.d(t,{Z:function(){return o}});var a=s(7437),r=s(2265),l=s(1817),i=s(3276),n=s(1671),c=s(9322),d=s(1994);function o(e){let{onAnalysisComplete:t}=e,[s,o]=(0,r.useState)(!1),[x,m]=(0,r.useState)(!1),[u,h]=(0,r.useState)(null),b=async e=>{m(!0),h(null);try{let s=await fetch("/api/analyze",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({type:e})}),a=await s.json();a.success?(h({success:!0,message:"Generated ".concat(a.ideas_count," new ideas")}),null==t||t()):h({success:!1,message:a.error||"Analysis failed"})}catch(e){h({success:!1,message:"Failed to start analysis"})}finally{m(!1),setTimeout(()=>{h(null),o(!1)},3e3)}};return(0,a.jsxs)("div",{className:"relative",children:[(0,a.jsx)("button",{onClick:()=>o(!s),disabled:x,className:(0,d.Z)("btn btn-primary gap-2",x&&"opacity-75 cursor-wait"),children:x?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(l.Z,{className:"w-4 h-4 animate-spin"}),(0,a.jsx)("span",{children:"Analyzing..."})]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(i.Z,{className:"w-4 h-4"}),(0,a.jsx)("span",{children:"Analyze Now"})]})}),s&&!x&&(0,a.jsxs)("div",{className:"absolute right-0 mt-2 w-56 bg-white rounded-lg shadow-lg border border-slate-200 py-2 z-10 animate-slide-in",children:[(0,a.jsxs)("button",{onClick:()=>b("quick"),className:"w-full px-4 py-2 text-left hover:bg-slate-50 transition-colors",children:[(0,a.jsx)("div",{className:"font-medium text-slate-900",children:"Quick Scan"}),(0,a.jsx)("div",{className:"text-xs text-slate-500",children:"Recent changes, TODOs, errors"})]}),(0,a.jsxs)("button",{onClick:()=>b("deep"),className:"w-full px-4 py-2 text-left hover:bg-slate-50 transition-colors",children:[(0,a.jsx)("div",{className:"font-medium text-slate-900",children:"Deep Review"}),(0,a.jsx)("div",{className:"text-xs text-slate-500",children:"Architecture, tech debt, security"})]}),(0,a.jsxs)("button",{onClick:()=>b("metrics"),className:"w-full px-4 py-2 text-left hover:bg-slate-50 transition-colors",children:[(0,a.jsx)("div",{className:"font-medium text-slate-900",children:"Metrics Review"}),(0,a.jsx)("div",{className:"text-xs text-slate-500",children:"Funnels, conversions, drop-offs"})]}),(0,a.jsxs)("button",{onClick:()=>b("seo"),className:"w-full px-4 py-2 text-left hover:bg-slate-50 transition-colors",children:[(0,a.jsx)("div",{className:"font-medium text-slate-900",children:"SEO Audit"}),(0,a.jsx)("div",{className:"text-xs text-slate-500",children:"Blog performance, technical SEO"})]})]}),u&&(0,a.jsx)("div",{className:(0,d.Z)("absolute right-0 mt-2 px-4 py-3 rounded-lg shadow-lg animate-slide-in",u.success?"bg-emerald-50 border border-emerald-200":"bg-red-50 border border-red-200"),children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[u.success?(0,a.jsx)(n.Z,{className:"w-4 h-4 text-emerald-600"}):(0,a.jsx)(c.Z,{className:"w-4 h-4 text-red-600"}),(0,a.jsx)("span",{className:(0,d.Z)("text-sm font-medium",u.success?"text-emerald-800":"text-red-800"),children:u.message})]})})]})}},8825:function(e,t,s){"use strict";s.d(t,{default:function(){return C}});var a=s(7437),r=s(2265),l=s(3247),i=s(740),n=s(2489),c=s(1994),d=s(7648),o=s(9322),x=s(265),m=s(6858),u=s(5051),h=s(1239),b=s(3417),g=s(8896),p=s(4286),f=s(6646),j=s(6153);function v(e){let{priority:t}=e;switch(t){case"critical":return(0,a.jsx)(o.Z,{className:"w-3 h-3"});case"high":return(0,a.jsx)(x.Z,{className:"w-3 h-3"});case"medium":return(0,a.jsx)(m.Z,{className:"w-3 h-3"});case"low":return(0,a.jsx)(u.Z,{className:"w-3 h-3"})}}function N(e){let{size:t,label:s}=e;return(0,a.jsx)("span",{className:"size-badge",title:s,children:j.bi[t]})}function y(e){let{idea:t,compact:s=!1}=e,r=t.comments.length>0;return(0,a.jsx)(d.default,{href:"/ideas/".concat(t.id),children:(0,a.jsxs)("div",{className:"idea-card",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,a.jsxs)("span",{className:(0,c.Z)("priority-badge",j.Gs[t.priority]),children:[(0,a.jsx)(v,{priority:t.priority}),(0,a.jsx)("span",{className:"ml-1",children:j.rF[t.priority]})]}),(0,a.jsx)("span",{className:(0,c.Z)("category-badge",j.pG[t.category]),children:j.Hs[t.category]})]}),(0,a.jsx)("h3",{className:"font-medium text-slate-900 text-sm leading-snug mb-1",children:t.title}),!s&&(0,a.jsx)("p",{className:"text-xs text-slate-500 line-clamp-2 mb-2",children:t.summary}),(0,a.jsxs)("div",{className:"flex items-center justify-between mt-2 pt-2 border-t border-slate-100",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsxs)("div",{className:"flex items-center gap-1",title:"Effort",children:[(0,a.jsx)(h.Z,{className:"w-3 h-3 text-slate-400"}),(0,a.jsx)(N,{size:t.effort,label:"Effort"})]}),(0,a.jsx)("span",{className:"text-slate-300",children:"/"}),(0,a.jsxs)("div",{className:"flex items-center gap-1",title:"Impact",children:[(0,a.jsx)(x.Z,{className:"w-3 h-3 text-slate-400"}),(0,a.jsx)(N,{size:t.impact,label:"Impact"})]})]}),r&&(0,a.jsxs)("div",{className:"flex items-center gap-1 text-slate-400",children:[(0,a.jsx)(b.Z,{className:"w-3 h-3"}),(0,a.jsx)("span",{className:"text-xs",children:t.comments.length})]})]}),t.goal_id&&(0,a.jsxs)("div",{className:"flex items-center gap-1 mt-2 text-emerald-600",children:[(0,a.jsx)(g.Z,{className:"w-3 h-3"}),(0,a.jsx)("span",{className:"text-[10px]",children:"Goal aligned"})]}),"shipped"===t.stage&&t.verification&&"pending"!==t.verification.status&&(0,a.jsxs)("div",{className:"flex items-center gap-1 mt-1",children:[(0,a.jsx)(p.Z,{className:"w-3 h-3"}),(0,a.jsx)("span",{className:(0,c.Z)("text-[10px] px-1 py-0.5 rounded",j.aR[t.verification.status]),children:j.Wb[t.verification.status]})]}),t.verification_status&&(0,a.jsxs)("div",{className:"flex items-center gap-1 mt-1",children:[(0,a.jsx)(f.Z,{className:"w-3 h-3"}),(0,a.jsx)("span",{className:(0,c.Z)("text-[10px] px-1 py-0.5 rounded","proceed"===t.verification_status&&"bg-green-100 text-green-700","extend"===t.verification_status&&"bg-blue-100 text-blue-700","investigate"===t.verification_status&&"bg-yellow-100 text-yellow-700","stop"===t.verification_status&&"bg-red-100 text-red-700"),children:t.verification_status.toUpperCase()})]}),!s&&t.tags.length>0&&(0,a.jsxs)("div",{className:"flex flex-wrap gap-1 mt-2",children:[t.tags.slice(0,3).map(e=>(0,a.jsx)("span",{className:"text-[10px] px-1.5 py-0.5 bg-slate-100 text-slate-500 rounded",children:e},e)),t.tags.length>3&&(0,a.jsxs)("span",{className:"text-[10px] text-slate-400",children:["+",t.tags.length-3]})]})]})})}var w=s(8623);let Z=["product","ux_design","growth","performance","tech_debt","security","infrastructure","content","analytics","integration"],_=["critical","high","medium","low"],k=["xs","s","m","l","xl"];function C(e){let{ideas:t}=e,[s,d]=(0,r.useState)({categories:[],priorities:[],efforts:[],search:""}),[o,x]=(0,r.useState)(!1),[m,u]=(0,r.useState)(null),h=(0,r.useMemo)(()=>{let e={all:t.length};return t.forEach(t=>{e[t.category]=(e[t.category]||0)+1}),e},[t]),b=(0,r.useMemo)(()=>t.filter(e=>{if(m&&e.category!==m)return!1;if(s.search){let t=s.search.toLowerCase();if(!(e.title.toLowerCase().includes(t)||e.summary.toLowerCase().includes(t)||e.tags.some(e=>e.toLowerCase().includes(t))))return!1}return(!(s.categories.length>0)||!!s.categories.includes(e.category))&&(!(s.priorities.length>0)||!!s.priorities.includes(e.priority))&&(!(s.efforts.length>0)||!!s.efforts.includes(e.effort))}),[t,s,m]),g=(0,r.useMemo)(()=>{let e={};return j.G.forEach(t=>{e[t]=[]}),b.forEach(t=>{j.G.includes(t.stage)&&e[t.stage].push(t)}),e},[b]),p=s.categories.length+s.priorities.length+s.efforts.length,f=null!==m||""!==s.search||p>0,v=(e,t)=>{d(s=>{let a=s[e],r=a.includes(t)?a.filter(e=>e!==t):[...a,t];return{...s,[e]:r}})};return(0,a.jsxs)("div",{className:"h-full flex flex-col",children:[(0,a.jsx)("div",{className:"px-6 py-3 bg-slate-50 border-b border-slate-200 overflow-x-auto",children:(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsxs)("button",{onClick:()=>u(null),className:(0,c.Z)("px-3 py-1.5 text-sm font-medium rounded-full whitespace-nowrap transition-colors",null===m?"bg-slate-800 text-white":"bg-white text-slate-600 hover:bg-slate-100 border border-slate-200"),children:["All",(0,a.jsxs)("span",{className:"ml-1.5 text-xs opacity-70",children:["(",h.all,")"]})]}),Z.map(e=>(0,a.jsxs)("button",{onClick:()=>u(e),className:(0,c.Z)("px-3 py-1.5 text-sm font-medium rounded-full whitespace-nowrap transition-colors",m===e?j.pG[e]:"bg-white text-slate-600 hover:bg-slate-100 border border-slate-200"),children:[j.Hs[e],h[e]>0&&(0,a.jsxs)("span",{className:"ml-1.5 text-xs opacity-70",children:["(",h[e],")"]})]},e))]})}),(0,a.jsxs)("div",{className:"px-6 py-4 bg-white border-b border-slate-200",children:[(0,a.jsxs)("div",{className:"flex items-center gap-4",children:[(0,a.jsxs)("div",{className:"relative flex-1 max-w-md",children:[(0,a.jsx)(l.Z,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-slate-400"}),(0,a.jsx)("input",{type:"text",placeholder:"Search ideas...",value:s.search,onChange:e=>d(t=>({...t,search:e.target.value})),className:"input pl-10"})]}),(0,a.jsxs)("button",{onClick:()=>x(!o),className:(0,c.Z)("btn btn-secondary gap-2",o&&"bg-slate-200"),children:[(0,a.jsx)(i.Z,{className:"w-4 h-4"}),(0,a.jsx)("span",{children:"Filters"}),p>0&&(0,a.jsx)("span",{className:"px-1.5 py-0.5 bg-emerald-500 text-white text-xs rounded-full",children:p})]}),p>0&&(0,a.jsxs)("button",{onClick:()=>{d({categories:[],priorities:[],efforts:[],search:""})},className:"btn btn-ghost gap-1 text-sm",children:[(0,a.jsx)(n.Z,{className:"w-4 h-4"}),"Clear"]})]}),o&&(0,a.jsxs)("div",{className:"mt-4 flex flex-wrap gap-6 animate-slide-in",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{className:"block text-xs font-medium text-slate-500 mb-2",children:"Category"}),(0,a.jsx)("div",{className:"flex flex-wrap gap-1",children:Z.map(e=>(0,a.jsx)("button",{onClick:()=>v("categories",e),className:(0,c.Z)("px-2 py-1 text-xs rounded border transition-colors",s.categories.includes(e)?"bg-emerald-100 border-emerald-300 text-emerald-800":"bg-white border-slate-200 text-slate-600 hover:border-slate-300"),children:j.Hs[e]},e))})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{className:"block text-xs font-medium text-slate-500 mb-2",children:"Priority"}),(0,a.jsx)("div",{className:"flex flex-wrap gap-1",children:_.map(e=>(0,a.jsx)("button",{onClick:()=>v("priorities",e),className:(0,c.Z)("px-2 py-1 text-xs rounded border transition-colors",s.priorities.includes(e)?"bg-emerald-100 border-emerald-300 text-emerald-800":"bg-white border-slate-200 text-slate-600 hover:border-slate-300"),children:j.rF[e]},e))})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{className:"block text-xs font-medium text-slate-500 mb-2",children:"Effort"}),(0,a.jsx)("div",{className:"flex flex-wrap gap-1",children:k.map(e=>(0,a.jsx)("button",{onClick:()=>v("efforts",e),className:(0,c.Z)("px-2 py-1 text-xs rounded border transition-colors",s.efforts.includes(e)?"bg-emerald-100 border-emerald-300 text-emerald-800":"bg-white border-slate-200 text-slate-600 hover:border-slate-300"),children:j.bi[e]},e))})]})]})]}),0!==t.length||f?(0,a.jsx)("div",{className:"flex-1 overflow-x-auto p-6",children:(0,a.jsx)("div",{className:"flex gap-4 h-full min-w-max",children:j.G.map(e=>(0,a.jsxs)("div",{className:"w-72 flex flex-col",children:[(0,a.jsxs)("div",{className:"kanban-column-header",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("div",{className:(0,c.Z)("stage-indicator",j.lv[e])}),(0,a.jsx)("span",{className:"font-medium text-slate-700",children:j.yb[e]})]}),(0,a.jsx)("span",{className:"text-sm text-slate-400",children:g[e].length})]}),(0,a.jsx)("div",{className:"kanban-column flex-1 overflow-y-auto",children:0===g[e].length?(0,a.jsx)("div",{className:"text-center py-8 text-slate-400 text-sm",children:"No ideas"}):g[e].map(e=>(0,a.jsx)(y,{idea:e},e.id))})]},e))})}):(0,a.jsx)("div",{className:"flex-1 flex items-center justify-center p-6",children:(0,a.jsxs)("div",{className:"flex flex-col items-center justify-center h-96 text-center gap-6",children:[(0,a.jsx)("div",{className:"text-6xl",children:"\uD83E\uDD16"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-2xl font-bold text-gray-900 mb-2",children:"Your AI analyst is ready"}),(0,a.jsx)("p",{className:"text-gray-500 max-w-md",children:"Run your first vibe cycle to generate prioritized improvement ideas for your codebase."})]}),(0,a.jsxs)("div",{className:"flex flex-col items-center gap-3",children:[(0,a.jsx)(w.Z,{}),(0,a.jsxs)("p",{className:"text-sm text-gray-400",children:["Or run: ",(0,a.jsx)("code",{className:"bg-gray-100 px-2 py-0.5 rounded",children:"vibebusiness analyze --type=quick"})]})]}),(0,a.jsxs)("div",{className:"mt-4 opacity-40 pointer-events-none border border-dashed border-gray-300 rounded-lg p-4 w-72 text-left",children:[(0,a.jsx)("div",{className:"text-xs font-medium text-gray-400 uppercase mb-1",children:"Example idea"}),(0,a.jsx)("div",{className:"font-medium text-gray-700 text-sm",children:"Add empty-state onboarding UI to Kanban"}),(0,a.jsx)("div",{className:"text-xs text-gray-400 mt-1",children:"ux_design \xb7 XS effort \xb7 high impact"})]})]})})]})}},6153:function(e,t,s){"use strict";s.d(t,{G:function(){return n},GK:function(){return _},Gs:function(){return o},Hs:function(){return a},PN:function(){return h},PW:function(){return w},Q_:function(){return b},R$:function(){return N},Vr:function(){return x},Wb:function(){return u},aR:function(){return m},bi:function(){return c},en:function(){return v},i2:function(){return j},kT:function(){return g},l5:function(){return p},lE:function(){return y},lv:function(){return i},pG:function(){return r},rF:function(){return d},tV:function(){return f},tl:function(){return Z},xP:function(){return k},yb:function(){return l}});let a={product:"Product",ux_design:"UX/Design",growth:"Growth",performance:"Performance",tech_debt:"Tech Debt",security:"Security",infrastructure:"Infrastructure",content:"Content",analytics:"Analytics",integration:"Integration"},r={product:"bg-blue-100 text-blue-800",ux_design:"bg-purple-100 text-purple-800",growth:"bg-green-100 text-green-800",performance:"bg-orange-100 text-orange-800",tech_debt:"bg-yellow-100 text-yellow-800",security:"bg-red-100 text-red-800",infrastructure:"bg-gray-100 text-gray-800",content:"bg-pink-100 text-pink-800",analytics:"bg-cyan-100 text-cyan-800",integration:"bg-indigo-100 text-indigo-800"},l={inbox:"Inbox",under_review:"Under Review",approved:"Approved",in_progress:"In Progress",testing:"Testing",shipped:"Shipped",deferred:"Deferred",rejected:"Rejected",rolled_back:"Rolled Back"},i={inbox:"bg-amber-500",under_review:"bg-blue-500",approved:"bg-emerald-500",in_progress:"bg-violet-500",testing:"bg-cyan-500",shipped:"bg-green-500",deferred:"bg-gray-500",rejected:"bg-red-500",rolled_back:"bg-orange-500"},n=["inbox","under_review","approved","in_progress","testing","shipped"],c={xs:"XS",s:"S",m:"M",l:"L",xl:"XL"},d={critical:"Critical",high:"High",medium:"Medium",low:"Low"},o={critical:"bg-red-100 text-red-800 border-red-300",high:"bg-orange-100 text-orange-800 border-orange-300",medium:"bg-yellow-100 text-yellow-800 border-yellow-300",low:"bg-gray-100 text-gray-800 border-gray-300"},x={codebase_analysis:"Codebase Analysis",metrics_review:"Metrics Review",market_research:"Market Research",seo_audit:"SEO Audit",manual:"Manual"},m={pending:"bg-slate-100 text-slate-700",validated:"bg-emerald-100 text-emerald-800",needs_investigation:"bg-amber-100 text-amber-800",inconclusive:"bg-slate-100 text-slate-600",invalidated:"bg-red-100 text-red-800"},u={pending:"Pending",validated:"Validated",needs_investigation:"Needs Investigation",inconclusive:"Inconclusive",invalidated:"Invalidated"},h={ship:"Ship",update:"Update",milestone:"Milestone",digest:"Digest",manual:"Manual",thread:"Thread",insight:"Insight"},b={ship:"bg-green-100 text-green-800",update:"bg-blue-100 text-blue-800",milestone:"bg-amber-100 text-amber-800",digest:"bg-purple-100 text-purple-800",manual:"bg-slate-100 text-slate-800",thread:"bg-indigo-100 text-indigo-800",insight:"bg-cyan-100 text-cyan-800"},g={acquisition:"Acquisition",activation:"Activation",retention:"Retention",revenue:"Revenue",referral:"Referral"},p={acquisition:"bg-blue-100 text-blue-800",activation:"bg-emerald-100 text-emerald-800",retention:"bg-purple-100 text-purple-800",revenue:"bg-amber-100 text-amber-800",referral:"bg-pink-100 text-pink-800"},f={on_track:"On Track",at_risk:"At Risk",behind:"Behind",achieved:"Achieved"},j={on_track:"bg-emerald-100 text-emerald-800 border-emerald-300",at_risk:"bg-amber-100 text-amber-800 border-amber-300",behind:"bg-red-100 text-red-800 border-red-300",achieved:"bg-blue-100 text-blue-800 border-blue-300"},v={manual:"Manual",rest_api:"REST API",posthog:"PostHog",firestore:"Firestore",stripe:"Stripe",whatsapp:"WhatsApp"},N={stated:"Stated",testing:"Testing",validated:"Validated",invalidated:"Invalidated",deferred:"Deferred"},y={stated:"bg-slate-100 text-slate-800 border-slate-300",testing:"bg-amber-100 text-amber-800 border-amber-300",validated:"bg-emerald-100 text-emerald-800 border-emerald-300",invalidated:"bg-red-100 text-red-800 border-red-300",deferred:"bg-slate-100 text-slate-500 border-slate-200"},w={acquisition:"Acquisition",engagement:"Engagement",conversion:"Conversion",monetization:"Monetization"},Z={acquisition:"bg-blue-100 text-blue-800",engagement:"bg-purple-100 text-purple-800",conversion:"bg-amber-100 text-amber-800",monetization:"bg-emerald-100 text-emerald-800"},_={planned:"Planned",active:"Active",completed:"Completed",paused:"Paused"},k={planned:"bg-slate-100 text-slate-700 border-slate-300",active:"bg-blue-100 text-blue-800 border-blue-300",completed:"bg-emerald-100 text-emerald-800 border-emerald-300",paused:"bg-amber-100 text-amber-800 border-amber-300"}}},function(e){e.O(0,[972,851,971,117,744],function(){return e(e.s=7075)}),_N_E=e.O()}]);