Skip to content

Commit fabf78e

Browse files
committed
content(app): synergy flow page
1 parent 35cf1cd commit fabf78e

File tree

3 files changed

+328
-1
lines changed

3 files changed

+328
-1
lines changed

public/apps/apps.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,15 @@
155155
"icon": "SparkleIcon",
156156
"order": 2,
157157
"apps": [
158+
{
159+
"slug": "synergy-flow",
160+
"to": "/apps/synergy-flow",
161+
"title": "Synergy Flow",
162+
"description": "Generate meaningless corporate buzzwords and joyful corporate art.",
163+
"icon": "BriefcaseIcon",
164+
"pinned_order": 26,
165+
"created_at": "2025-12-25T15:00:00+03:00"
166+
},
158167
{
159168
"slug": "fezynth",
160169
"to": "/apps/fezynth",

src/components/AnimatedRoutes.jsx

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ const MorseCodeTranslatorPage = lazy(
9898
() => import('../pages/apps/MorseCodeTranslatorPage'),
9999
);
100100
const MastermindPage = lazy(() => import('../pages/apps/MastermindPage'));
101+
const SynergyFlowPage = lazy(() => import('../pages/apps/SynergyFlowPage'));
101102
const WordLadderPage = lazy(() => import('../pages/apps/WordLadderPage'));
102103
const LightsOutPage = lazy(() => import('../pages/apps/LightsOutPage'));
103104
const NonogramPage = lazy(() => import('../pages/apps/NonogramPage'));
@@ -1707,6 +1708,22 @@ const AnimatedRoutes = ({
17071708
/>
17081709
<Route
17091710
path="/apps/mastermind"
1711+
element={
1712+
<motion.div
1713+
initial="initial"
1714+
animate="animate"
1715+
exit="exit"
1716+
variants={pageVariants}
1717+
transition={pageTransition}
1718+
>
1719+
<Suspense fallback={<Loading />}>
1720+
<MastermindPage />
1721+
</Suspense>
1722+
</motion.div>
1723+
}
1724+
/>
1725+
<Route
1726+
path="/apps/synergy-flow"
17101727
element={
17111728
<motion.div
17121729
initial="initial"
@@ -1716,7 +1733,7 @@ const AnimatedRoutes = ({
17161733
transition={pageTransition}
17171734
>
17181735
<Suspense fallback={<Loading />}>
1719-
<MastermindPage />
1736+
<SynergyFlowPage />
17201737
</Suspense>
17211738
</motion.div>
17221739
}

src/pages/apps/SynergyFlowPage.jsx

Lines changed: 301 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,301 @@
1+
import React, { useState, useEffect, useCallback } from 'react';
2+
import { motion, AnimatePresence } from 'framer-motion';
3+
import { Link } from 'react-router-dom';
4+
import {
5+
BriefcaseIcon,
6+
TrendUpIcon,
7+
UsersThreeIcon,
8+
LightningIcon,
9+
HandshakeIcon,
10+
LightbulbIcon,
11+
ArrowLeftIcon,
12+
ChartLineUpIcon,
13+
CurrencyDollarIcon,
14+
StarIcon,
15+
TrendDownIcon,
16+
FireIcon,
17+
ChartBarIcon
18+
} from '@phosphor-icons/react';
19+
import useSeo from '../../hooks/useSeo';
20+
21+
const BUZZWORDS = {
22+
verbs: [
23+
'Leverage', 'Synergize', 'Pivot', 'Drill down', 'Unpack', 'Disrupt',
24+
'Empower', 'Ideate', 'Onboard', 'Streamline', 'Circle back', 'Touch base',
25+
'Incentivize', 'Gamify', 'Architect', 'Orchestrate', 'Re-imagine'
26+
],
27+
adjectives: [
28+
'holistic', 'granular', 'robust', 'seamless', 'mission-critical',
29+
'next-gen', 'cutting-edge', 'value-added', 'customer-centric', 'agile',
30+
'scalable', 'disruptive', 'paradigm-shifting', 'bespoke', 'organic'
31+
],
32+
nouns: [
33+
'deliverables', 'paradigms', 'synergies', 'bandwidth', 'pain points',
34+
'ecosystems', 'verticals', 'touchpoints', 'architectures', 'mindshare',
35+
'core competencies', 'low-hanging fruit', 'best practices', 'KPIs'
36+
],
37+
suffixes: [
38+
'going forward', 'at the end of the day', 'in this space',
39+
'from a high-level perspective', 'to move the needle', 'for the win'
40+
]
41+
};
42+
43+
const CORPORATE_COLORS = [
44+
'#2F80ED', // Corporate Blue
45+
'#EB5757', // Alert Red
46+
'#F2C94C', // Optimistic Yellow
47+
'#6FCF97', // Growth Green
48+
'#9B51E0', // Innovative Purple
49+
'#F2994A', // Dynamic Orange
50+
];
51+
52+
const FLOATING_TEXTS = [
53+
"+500% ROI", "Synergy Achieved", "Stakeholder Approved", "Value Unlocked",
54+
"Paradigm Shifted", "Quarterly Goal Met", "Bonus Secured", "Market Disrupted",
55+
"Alignment Reached", "Deep Dive Complete", "Impact Driven", "Growth Hacked"
56+
];
57+
58+
const SynergyFlowPage = () => {
59+
useSeo({
60+
title: 'Synergy Flow | Fezcodex',
61+
description: 'Generate meaningless corporate buzzwords and joyful corporate art.',
62+
keywords: ['corporate', 'synergy', 'buzzword', 'generator', 'memphis', 'art'],
63+
});
64+
65+
const [phrase, setPhrase] = useState('');
66+
const [shape, setShape] = useState(0);
67+
const [color, setColor] = useState(CORPORATE_COLORS[0]);
68+
const [iconIndex, setIconIndex] = useState(0);
69+
70+
// Stats
71+
const [metrics, setMetrics] = useState({
72+
roi: 120,
73+
synergy: 850,
74+
impact: 42,
75+
burnRate: 2400,
76+
churn: 2.5,
77+
leadership: 100
78+
});
79+
80+
// Floating Particles
81+
const [particles, setParticles] = useState([]);
82+
83+
const icons = [BriefcaseIcon, TrendUpIcon, UsersThreeIcon, LightningIcon, HandshakeIcon, LightbulbIcon];
84+
const CurrentIcon = icons[iconIndex];
85+
86+
const generateSynergy = useCallback(() => {
87+
const v = BUZZWORDS.verbs[Math.floor(Math.random() * BUZZWORDS.verbs.length)];
88+
const a = BUZZWORDS.adjectives[Math.floor(Math.random() * BUZZWORDS.adjectives.length)];
89+
const n = BUZZWORDS.nouns[Math.floor(Math.random() * BUZZWORDS.nouns.length)];
90+
const s = Math.random() > 0.7 ? ` ${BUZZWORDS.suffixes[Math.floor(Math.random() * BUZZWORDS.suffixes.length)]}` : '';
91+
92+
setPhrase(`${v} ${a} ${n}${s}.`);
93+
setColor(CORPORATE_COLORS[Math.floor(Math.random() * CORPORATE_COLORS.length)]);
94+
setShape(Math.floor(Math.random() * 4));
95+
setIconIndex(Math.floor(Math.random() * icons.length));
96+
97+
// Update Metrics
98+
setMetrics(prev => ({
99+
roi: prev.roi + Math.floor(Math.random() * 50) + 10,
100+
synergy: prev.synergy + Math.floor(Math.random() * 200) + 50,
101+
impact: prev.impact + Math.floor(Math.random() * 5) + 1,
102+
burnRate: prev.burnRate + Math.floor(Math.random() * 500) + 100, // Always burning more
103+
churn: Math.max(0, (prev.churn + (Math.random() - 0.5)).toFixed(2)), // Fluctuating
104+
leadership: prev.leadership + Math.floor(Math.random() * 10) + 1 // Always up
105+
}));
106+
107+
// Add Particle
108+
const newParticle = {
109+
id: Date.now(),
110+
text: FLOATING_TEXTS[Math.floor(Math.random() * FLOATING_TEXTS.length)],
111+
x: Math.random() * 80 - 40, // Random X offset
112+
y: Math.random() * 50, // Random Y offset
113+
};
114+
setParticles(prev => [...prev, newParticle]);
115+
116+
// Cleanup particle after animation
117+
setTimeout(() => {
118+
setParticles(prev => prev.filter(p => p.id !== newParticle.id));
119+
}, 2000);
120+
}, [icons.length]); // Keep linter happy with length (stable)
121+
122+
useEffect(() => {
123+
generateSynergy();
124+
}, [generateSynergy]);
125+
126+
return (
127+
<div className="min-h-screen bg-white text-gray-800 font-sans selection:bg-blue-200 selection:text-blue-900 overflow-hidden relative">
128+
{/* Navigation Return Link (Styled to clash) */}
129+
<div className="absolute top-4 left-4 z-50">
130+
<Link to="/apps" className="px-6 py-3 bg-black text-white font-mono uppercase text-sm tracking-widest hover:bg-gray-800 transition-colors flex items-center gap-2 rounded-full shadow-lg">
131+
<ArrowLeftIcon weight="bold" />
132+
Return to Brutalism
133+
</Link>
134+
</div>
135+
136+
<div className="container mx-auto px-4 h-screen flex flex-col md:flex-row items-center justify-center relative z-10">
137+
138+
{/* Left: The "Art" */}
139+
<div className="w-full md:w-1/2 flex justify-center items-center p-8 relative">
140+
<motion.div
141+
key={color} // Re-animate on color change
142+
initial={{ scale: 0.8, opacity: 0 }}
143+
animate={{ scale: 1, opacity: 1 }}
144+
transition={{ type: "spring", bounce: 0.5 }}
145+
className="relative w-64 h-64 md:w-96 md:h-96"
146+
>
147+
{/* Abstract Blob Background */}
148+
<svg viewBox="0 0 200 200" className="w-full h-full absolute top-0 left-0 text-opacity-20" style={{ color: color, fill: 'currentColor' }}>
149+
{shape === 0 && <path d="M44.7,-76.4C58.9,-69.2,71.8,-59.1,79.6,-46.9C87.4,-34.7,90.1,-20.4,85.8,-7.1C81.5,6.2,70.2,18.5,60.2,28.8C50.2,39.1,41.5,47.4,31.9,54.6C22.3,61.8,11.8,67.9,-0.8,69.3C-13.4,70.7,-25.1,67.4,-36.3,60.8C-47.5,54.2,-58.2,44.3,-66.1,32.4C-74,20.5,-79.1,6.6,-77.3,-6.4C-75.5,-19.4,-66.8,-31.5,-56.3,-41.3C-45.8,-51.1,-33.5,-58.6,-20.9,-66.6C-8.3,-74.6,4.6,-83.1,17.2,-83.2C29.8,-83.3,42.1,-75,54.7,-66.7Z" transform="translate(100 100)" />}
150+
{shape === 1 && <path d="M38.9,-64.6C51.6,-59.1,64,-52.3,71.9,-42.2C79.8,-32.1,83.2,-18.7,81.3,-6.2C79.4,6.3,72.2,17.9,63.4,28C54.6,38.1,44.2,46.7,33.1,53.4C22,60.1,10.2,64.9,-1.4,67.3C-13,69.7,-24.3,69.7,-35.3,64.7C-46.3,59.7,-57,49.7,-64.6,37.8C-72.2,25.9,-76.7,12.1,-75.4,-1.1C-74.1,-14.3,-67,-26.9,-57.6,-36.8C-48.2,-46.7,-36.5,-53.9,-24.8,-60C-13.1,-66.1,-1.4,-71.1,10.6,-70.8C22.6,-70.5,35.2,-64.9,38.9,-64.6Z" transform="translate(100 100)" />}
151+
{shape === 2 && <circle cx="100" cy="100" r="80" />}
152+
{shape === 3 && <rect x="20" y="20" width="160" height="160" rx="40" />}
153+
</svg>
154+
155+
{/* Floating Character/Icon */}
156+
<div className="absolute inset-0 flex items-center justify-center text-white drop-shadow-lg">
157+
<CurrentIcon size={120} weight="fill" style={{ color: shape === 0 ? '#333' : 'white' }} />
158+
</div>
159+
160+
{/* Decorative Elements */}
161+
<div className="absolute top-10 right-10 w-8 h-8 rounded-full bg-white opacity-50 animate-bounce" />
162+
<div className="absolute bottom-20 left-10 w-4 h-4 rounded-full bg-black opacity-10 animate-pulse" />
163+
</motion.div>
164+
</div>
165+
166+
{/* Right: The Text */}
167+
<div className="w-full md:w-1/2 p-8 text-center md:text-left z-20 flex flex-col items-center md:items-start">
168+
<motion.div
169+
key={phrase}
170+
initial={{ y: 20, opacity: 0 }}
171+
animate={{ y: 0, opacity: 1 }}
172+
className="relative"
173+
>
174+
<h1 className="text-5xl md:text-7xl font-playfairDisplay font-bold mb-6 tracking-tight leading-tight" style={{ color: color }}>
175+
{phrase}
176+
</h1>
177+
<p className="text-gray-400 text-lg mb-8 italic font-arvo">
178+
"Driving impact through {BUZZWORDS.adjectives[Math.floor(Math.random() * 5)]} engagement."
179+
</p>
180+
181+
<div className="relative inline-block">
182+
<button
183+
onClick={generateSynergy}
184+
className="px-8 py-4 rounded-full text-white font-mono font-bold text-xl shadow-xl hover:shadow-2xl hover:-translate-y-1 transition-all duration-300 transform active:scale-95 relative z-10"
185+
style={{ backgroundColor: color }}
186+
>
187+
Generate Value 🚀
188+
</button>
189+
</div>
190+
</motion.div>
191+
192+
{/* KPI Dashboard */}
193+
<div className="mt-12 grid grid-cols-3 gap-6 w-full max-w-lg relative">
194+
{/* ROI */}
195+
<div className="bg-gray-50 p-4 rounded-2xl shadow-sm text-center transform hover:scale-105 transition-transform">
196+
<div className="flex justify-center mb-2" style={{ color: color }}>
197+
<ChartLineUpIcon size={32} weight="duotone" />
198+
</div>
199+
<div className="text-3xl font-bold font-playfairDisplay text-gray-800">
200+
{metrics.roi}%
201+
</div>
202+
<div className="text-xs text-gray-400 font-bold tracking-widest uppercase mt-1">
203+
Proj. ROI
204+
</div>
205+
</div>
206+
207+
{/* Synergy */}
208+
<div className="bg-gray-50 p-4 rounded-2xl shadow-sm text-center transform hover:scale-105 transition-transform">
209+
<div className="flex justify-center mb-2" style={{ color: color }}>
210+
<CurrencyDollarIcon size={32} weight="duotone" />
211+
</div>
212+
<div className="text-3xl font-bold font-playfairDisplay text-gray-800">
213+
{metrics.synergy}k
214+
</div>
215+
<div className="text-xs text-gray-400 font-bold tracking-widest uppercase mt-1">
216+
Net Synergy
217+
</div>
218+
</div>
219+
220+
{/* Impact */}
221+
<div className="bg-gray-50 p-4 rounded-2xl shadow-sm text-center transform hover:scale-105 transition-transform">
222+
<div className="flex justify-center mb-2" style={{ color: color }}>
223+
<StarIcon size={32} weight="duotone" />
224+
</div>
225+
<div className="text-3xl font-bold font-playfairDisplay text-gray-800">
226+
{metrics.impact}.0
227+
</div>
228+
<div className="text-xs text-gray-400 font-bold tracking-widest uppercase mt-1">
229+
Impact Factor
230+
</div>
231+
</div>
232+
233+
{/* Burn Rate */}
234+
<div className="bg-gray-50 p-4 rounded-2xl shadow-sm text-center transform hover:scale-105 transition-transform">
235+
<div className="flex justify-center mb-2" style={{ color: color }}>
236+
<FireIcon size={32} weight="duotone" />
237+
</div>
238+
<div className="text-3xl font-bold font-playfairDisplay text-gray-800">
239+
${metrics.burnRate}
240+
</div>
241+
<div className="text-xs text-gray-400 font-bold tracking-widest uppercase mt-1">
242+
Burn Rate/Hr
243+
</div>
244+
</div>
245+
246+
{/* Churn */}
247+
<div className="bg-gray-50 p-4 rounded-2xl shadow-sm text-center transform hover:scale-105 transition-transform">
248+
<div className="flex justify-center mb-2" style={{ color: color }}>
249+
<TrendDownIcon size={32} weight="duotone" />
250+
</div>
251+
<div className="text-3xl font-bold font-playfairDisplay text-gray-800">
252+
{metrics.churn}%
253+
</div>
254+
<div className="text-xs text-gray-400 font-bold tracking-widest uppercase mt-1">
255+
Churn Velocity
256+
</div>
257+
</div>
258+
259+
{/* Leadership */}
260+
<div className="bg-gray-50 p-4 rounded-2xl shadow-sm text-center transform hover:scale-105 transition-transform">
261+
<div className="flex justify-center mb-2" style={{ color: color }}>
262+
<ChartBarIcon size={32} weight="duotone" />
263+
</div>
264+
<div className="text-3xl font-bold font-playfairDisplay text-gray-800">
265+
{metrics.leadership}
266+
</div>
267+
<div className="text-xs text-gray-400 font-bold tracking-widest uppercase mt-1">
268+
Thought Leadership
269+
</div>
270+
</div>
271+
</div>
272+
273+
{/* Floating Particles Container (Moved below dashboard) */}
274+
<div className="mt-8 relative w-full h-12">
275+
<AnimatePresence>
276+
{particles.map((particle) => (
277+
<motion.div
278+
key={particle.id}
279+
initial={{ opacity: 0, y: -20, x: particle.x, scale: 0.5 }}
280+
animate={{ opacity: 1, y: 40 + particle.y, x: particle.x, scale: 1.2 }}
281+
exit={{ opacity: 0 }}
282+
transition={{ duration: 1.2, ease: "easeOut" }}
283+
className="absolute left-1/2 -translate-x-1/2 pointer-events-none whitespace-nowrap font-mono font-bold text-xl italic"
284+
style={{ color: color }}
285+
>
286+
{particle.text}
287+
</motion.div>
288+
))}
289+
</AnimatePresence>
290+
</div>
291+
</div>
292+
</div>
293+
294+
{/* Background Decor */}
295+
<div className="absolute top-0 right-0 w-1/3 h-full bg-gray-50 -z-0 transform -skew-x-12 translate-x-20" />
296+
<div className="absolute bottom-0 left-0 w-64 h-64 bg-blue-50 rounded-full blur-3xl -z-0 opacity-50" />
297+
</div>
298+
);
299+
};
300+
301+
export default SynergyFlowPage;

0 commit comments

Comments
 (0)