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.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +21 -21
- package/.next/standalone/.next/app-path-routes-manifest.json +1 -1
- package/.next/standalone/.next/build-manifest.json +2 -2
- package/.next/standalone/.next/prerender-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
- package/.next/standalone/.next/server/app/api/analyze/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/config/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/epics/[id]/ideas/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/epics/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/epics/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/goals/[id]/kpis/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/goals/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/goals/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/hypotheses/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/hypotheses/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/card/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/comments/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/implement/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/transition/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/implementations/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/kpis/refresh/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/[id]/publish/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/goals/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/goals/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/goals/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/hypotheses/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/hypotheses/page.js +1 -1
- package/.next/standalone/.next/server/app/hypotheses/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/hypotheses/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/ideas/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/ideas/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/page.js +1 -1
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/roadmap/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/roadmap/investors/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/roadmap/investors/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/roadmap/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/roadmap/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/roadmap/public/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/roadmap/public/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings.html +1 -1
- package/.next/standalone/.next/server/app/settings.rsc +1 -1
- package/.next/standalone/.next/server/app/social/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/social.html +1 -1
- package/.next/standalone/.next/server/app/social.rsc +1 -1
- package/.next/standalone/.next/server/app/updates/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/updates/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/updates/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/updates/new.html +1 -1
- package/.next/standalone/.next/server/app/updates/new.rsc +1 -1
- package/.next/standalone/.next/server/app/updates/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/updates/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +18 -18
- package/.next/standalone/.next/server/chunks/6299.js +1 -1
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/data/goals.json +10 -2
- package/.next/standalone/data/social.json +19 -4
- package/.next/standalone/data/social.json.backup +179 -0
- package/.next/standalone/data/videos/ai-gets-business-feed.mp4 +0 -0
- package/.next/standalone/data/videos/idea-graveyard-feed.mp4 +0 -0
- package/.next/standalone/data/videos/lonely-founder-feed.mp4 +0 -0
- package/.next/standalone/data/videos/staging/ai-gets-business.json +55 -0
- package/.next/standalone/data/videos/staging/idea-graveyard.json +61 -0
- package/.next/standalone/data/videos/staging/lonely-founder.json +60 -0
- package/.next/standalone/data/videos/staging/while-you-slept-v2-fast.json +67 -0
- package/.next/standalone/data/videos/staging/while-you-slept-v3-dynamic.json +67 -0
- package/.next/standalone/data/videos/while-you-slept-v2-fast-feed.mp4 +0 -0
- package/.next/standalone/data/videos/while-you-slept-v3-dynamic-feed.mp4 +0 -0
- package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/c99d23d3548030c8ff8de678c71eeb15/1.pack +0 -0
- package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/c99d23d3548030c8ff8de678c71eeb15/3.pack +0 -0
- package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/c99d23d3548030c8ff8de678c71eeb15/index.pack +0 -0
- package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/c99d23d3548030c8ff8de678c71eeb15/index.pack.old +0 -0
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/scripts/analyze.ts +7 -4
- package/.next/static/chunks/app/page-d325a95479e7c453.js +1 -0
- package/dist/bin/vibebusiness.js +8 -0
- package/dist/scripts/analyze.js +7 -4
- package/dist/scripts/heartbeat.js +10 -1
- package/package.json +1 -1
- package/scripts/lib/video/compositions/DemoVideo.tsx +134 -50
- package/scripts/lib/video/compositions/Root.tsx +21 -2
- package/.next/static/chunks/app/page-3635a292b3d471c0.js +0 -1
- /package/.next/static/{wJT1h-ifHTtYVlXZG2PFS → fBNMzUSuIGwJGs9aNW81h}/_buildManifest.js +0 -0
- /package/.next/static/{wJT1h-ifHTtYVlXZG2PFS → fBNMzUSuIGwJGs9aNW81h}/_ssgManifest.js +0 -0
package/dist/scripts/analyze.js
CHANGED
|
@@ -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
|
|
1829
|
-
effort: idea.effort
|
|
1830
|
-
impact:
|
|
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
|
@@ -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
|
-
//
|
|
47
|
-
const FRAME_DURATIONS: Record<string, number
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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 =
|
|
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
|
-
|
|
91
|
-
|
|
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 =
|
|
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 *
|
|
343
|
-
|
|
344
|
-
|
|
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
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
<div
|
|
407
|
-
|
|
408
|
-
|
|
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={
|
|
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()}]);
|
|
File without changes
|
|
File without changes
|