@decido/ui 0.0.0

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 (95) hide show
  1. package/.eslintrc.cjs +10 -0
  2. package/.turbo/turbo-build.log +13 -0
  3. package/.turbo/turbo-lint.log +54 -0
  4. package/dist/components/DebugPanel.d.ts +3 -0
  5. package/dist/components/DebugPanel.js +195 -0
  6. package/dist/components/DebugPanelManager.d.ts +3 -0
  7. package/dist/components/DebugPanelManager.js +20 -0
  8. package/dist/components/DecidoButton.d.ts +11 -0
  9. package/dist/components/DecidoButton.js +15 -0
  10. package/dist/components/LoginView.d.ts +6 -0
  11. package/dist/components/LoginView.js +36 -0
  12. package/dist/components/WelcomeView.d.ts +6 -0
  13. package/dist/components/WelcomeView.js +16 -0
  14. package/dist/components/base/BaseComponent.d.ts +12 -0
  15. package/dist/components/base/BaseComponent.js +43 -0
  16. package/dist/components/base/BaseComponentBacjup.d.ts +12 -0
  17. package/dist/components/base/BaseComponentBacjup.js +43 -0
  18. package/dist/components/base/BaseComponentLit.d.ts +9 -0
  19. package/dist/components/base/BaseComponentLit.js +30 -0
  20. package/dist/components/base/shared-styles.d.ts +4 -0
  21. package/dist/components/base/shared-styles.js +18 -0
  22. package/dist/components/index.d.ts +6 -0
  23. package/dist/components/index.js +7 -0
  24. package/dist/components/landing/index.d.ts +11 -0
  25. package/dist/components/landing/index.js +11 -0
  26. package/dist/components/landing/landing-button.d.ts +9 -0
  27. package/dist/components/landing/landing-button.js +5 -0
  28. package/dist/components/landing/landing-card.d.ts +6 -0
  29. package/dist/components/landing/landing-card.js +5 -0
  30. package/dist/components/landing/landing-cta.d.ts +10 -0
  31. package/dist/components/landing/landing-cta.js +5 -0
  32. package/dist/components/landing/landing-feature-card.d.ts +35 -0
  33. package/dist/components/landing/landing-feature-card.js +35 -0
  34. package/dist/components/landing/landing-footer.d.ts +18 -0
  35. package/dist/components/landing/landing-footer.js +7 -0
  36. package/dist/components/landing/landing-header.d.ts +21 -0
  37. package/dist/components/landing/landing-header.js +7 -0
  38. package/dist/components/landing/landing-hero.d.ts +22 -0
  39. package/dist/components/landing/landing-hero.js +10 -0
  40. package/dist/components/landing/landing-page.d.ts +3 -0
  41. package/dist/components/landing/landing-page.js +34 -0
  42. package/dist/components/landing/landing-section.d.ts +14 -0
  43. package/dist/components/landing/landing-section.js +8 -0
  44. package/dist/components/landing/landing-testimonial-card.d.ts +11 -0
  45. package/dist/components/landing/landing-testimonial-card.js +9 -0
  46. package/dist/components/landing/landing-waitlist.d.ts +27 -0
  47. package/dist/components/landing/landing-waitlist.js +18 -0
  48. package/dist/components/theming/ColorPicker.d.ts +8 -0
  49. package/dist/components/theming/ColorPicker.js +19 -0
  50. package/dist/components/theming/ThemePanel.d.ts +5 -0
  51. package/dist/components/theming/ThemePanel.js +12 -0
  52. package/dist/index.d.ts +13 -0
  53. package/dist/index.js +19 -0
  54. package/dist/utils/counter.d.ts +1 -0
  55. package/dist/utils/counter.js +9 -0
  56. package/eslint.config.js +11 -0
  57. package/package.json +47 -0
  58. package/src/components/DebugPanel.tsx +347 -0
  59. package/src/components/DebugPanelManager.tsx +40 -0
  60. package/src/components/DecidoButton.tsx +43 -0
  61. package/src/components/LoginView.tsx +85 -0
  62. package/src/components/WelcomeView.tsx +47 -0
  63. package/src/components/base/landing.css +477 -0
  64. package/src/components/base/shared-styles.ts +21 -0
  65. package/src/components/index.ts +7 -0
  66. package/src/components/landing/index.tsx +11 -0
  67. package/src/components/landing/landing-button.tsx +26 -0
  68. package/src/components/landing/landing-card.tsx +15 -0
  69. package/src/components/landing/landing-cta.tsx +42 -0
  70. package/src/components/landing/landing-feature-card.tsx +149 -0
  71. package/src/components/landing/landing-footer.tsx +66 -0
  72. package/src/components/landing/landing-header.tsx +55 -0
  73. package/src/components/landing/landing-hero.tsx +94 -0
  74. package/src/components/landing/landing-page.tsx +143 -0
  75. package/src/components/landing/landing-section.tsx +42 -0
  76. package/src/components/landing/landing-testimonial-card.tsx +50 -0
  77. package/src/components/landing/landing-waitlist.tsx +115 -0
  78. package/src/components/theming/ColorPicker.tsx +40 -0
  79. package/src/components/theming/ThemePanel.tsx +43 -0
  80. package/src/css/base.css +483 -0
  81. package/src/css/components.css +309 -0
  82. package/src/css/debug-panel.css +1368 -0
  83. package/src/css/layout.css +289 -0
  84. package/src/css/login-view.css +45 -0
  85. package/src/css/style.css +20 -0
  86. package/src/css/welcome-view.css +56 -0
  87. package/src/css/workbench.css +383 -0
  88. package/src/globals.d.ts +8 -0
  89. package/src/index.ts +24 -0
  90. package/src/utils/counter.d.ts.map +1 -0
  91. package/src/utils/counter.js +9 -0
  92. package/src/utils/counter.ts +9 -0
  93. package/src/vite-env.d.ts +1 -0
  94. package/tailwind.config.js +7 -0
  95. package/tsconfig.json +35 -0
@@ -0,0 +1,149 @@
1
+ import React from 'react';
2
+ import LandingCard from './landing-card'; // Assuming LandingCard is now a React component
3
+
4
+ interface DemoLine {
5
+ color: string;
6
+ prefix: string;
7
+ text: string;
8
+ }
9
+
10
+ interface DemoTask {
11
+ color: string;
12
+ label: string;
13
+ time: string;
14
+ text: string;
15
+ }
16
+
17
+ interface DemoMoodInsight {
18
+ icon: string;
19
+ color: string;
20
+ text: string;
21
+ }
22
+
23
+ interface Demo {
24
+ title: string;
25
+ lines?: DemoLine[];
26
+ tasks?: DemoTask[];
27
+ moods?: any; // Define a more specific type if possible
28
+ insights?: DemoMoodInsight[];
29
+ }
30
+
31
+ interface LandingFeatureCardProps {
32
+ data: {
33
+ icon: string;
34
+ title: string;
35
+ description: string;
36
+ powered_by: string;
37
+ demo?: Demo;
38
+ };
39
+ }
40
+
41
+ const LandingFeatureCard: React.FC<LandingFeatureCardProps> = ({ data }) => {
42
+ const getIconWrapperClass = (): string => {
43
+ if (data.icon.includes('fa-brain')) return 'from-cyan-500 via-cyan-600 to-cyan-700';
44
+ if (data.icon.includes('fa-journal-whills')) return 'from-yellow-500 via-orange-500 to-red-500';
45
+ return 'from-purple-500 via-purple-600 to-purple-700';
46
+ };
47
+
48
+ const getTaglineBorderClass = (): string => {
49
+ if (data.icon.includes('fa-brain')) return 'bg-cyan-900/30 border-cyan-500/30 text-cyan-300';
50
+ if (data.icon.includes('fa-journal-whills')) return 'bg-yellow-900/30 border-yellow-500/30 text-yellow-300';
51
+ return 'bg-purple-900/30 border-purple-500/30 text-purple-300';
52
+ };
53
+
54
+ const renderDemo = () => {
55
+ const { demo } = data;
56
+ if (!demo) return null;
57
+
58
+ if (demo.lines) {
59
+ return (
60
+ <div className="glass rounded-2xl p-6 text-left mb-6 font-mono text-sm space-y-3">
61
+ <div className="text-green-400 mb-4 flex items-center">
62
+ <i className="fas fa-terminal mr-3"></i>{demo.title}
63
+ </div>
64
+ {demo.lines.map((line, index) => (
65
+ <div key={index} className="flex items-start">
66
+ <span className={`${line.color} mr-3`}>{line.prefix}</span>
67
+ <span className="text-gray-300">{line.text}</span>
68
+ </div>
69
+ ))}
70
+ </div>
71
+ );
72
+ }
73
+
74
+ if (demo.tasks) {
75
+ return (
76
+ <div className="glass rounded-2xl p-6 mb-6 space-y-3">
77
+ <div className="flex items-center justify-between mb-4">
78
+ <span className="text-sm font-semibold text-gray-300">{demo.title}</span>
79
+ <div className="flex items-center">
80
+ <div className="w-2 h-2 bg-green-400 rounded-full animate-pulse mr-2"></div>
81
+ <span className="text-xs text-green-400 font-mono">ACTIVO</span>
82
+ </div>
83
+ </div>
84
+ {demo.tasks.map((task, index) => (
85
+ <div key={index} className={`bg-${task.color}-900/40 border border-${task.color}-500/30 rounded-lg p-3 text-sm`}>
86
+ <div className="flex items-center justify-between">
87
+ <span className={`text-${task.color}-300`} dangerouslySetInnerHTML={{ __html: task.label }}></span>
88
+ <span className="text-xs text-gray-400">{task.time}</span>
89
+ </div>
90
+ <div className="text-gray-300 mt-1">{task.text}</div>
91
+ </div>
92
+ ))}
93
+ </div>
94
+ );
95
+ }
96
+
97
+ if (demo.moods) {
98
+ return (
99
+ <div className="glass rounded-2xl p-6 mb-6">
100
+ <div className="text-sm text-gray-300 mb-4 font-semibold">{demo.title}</div>
101
+ <div className="flex items-end justify-between h-20 mb-4 px-2">
102
+ <div className="w-4 bg-red-400 rounded-t" style={{ height: '30%' }}></div>
103
+ <div className="w-4 bg-yellow-400 rounded-t" style={{ height: '50%' }}></div>
104
+ <div className="w-4 bg-green-400 rounded-t" style={{ height: '70%' }}></div>
105
+ <div className="w-4 bg-green-400 rounded-t" style={{ height: '65%' }}></div>
106
+ <div className="w-4 bg-blue-400 rounded-t" style={{ height: '80%' }}></div>
107
+ <div className="w-4 bg-purple-400 rounded-t" style={{ height: '85%' }}></div>
108
+ <div className="w-4 bg-cyan-400 rounded-t" style={{ height: '75%' }}></div>
109
+ </div>
110
+ <div className="text-xs text-gray-400 text-left space-y-2">
111
+ {demo.insights?.map((insight, index) => (
112
+ <div key={index} className="flex items-center">
113
+ <i className={`${insight.icon} ${insight.color} mr-2`}></i>
114
+ <span>{insight.text}</span>
115
+ </div>
116
+ ))}
117
+ </div>
118
+ </div>
119
+ );
120
+ }
121
+
122
+ return null;
123
+ };
124
+
125
+ return (
126
+ <LandingCard>
127
+ <div className="feature-card glass-premium rounded-3xl p-10 text-center h-full flex flex-col">
128
+ <div className="flex-grow">
129
+ <div className={`w-20 h-20 bg-linear-to-br ${getIconWrapperClass()} rounded-3xl flex items-center justify-center mx-auto mb-6 shadow-2xl animate-pulse-glow`}>
130
+ <i className={`${data.icon} text-3xl text-white`}></i>
131
+ </div>
132
+ <h3 className="text-3xl font-bold mb-4 gradient-text">{data.title}</h3>
133
+ <p className="text-lg text-gray-300 leading-relaxed mb-8" dangerouslySetInnerHTML={{ __html: data.description }}></p>
134
+
135
+ {renderDemo()}
136
+ </div>
137
+
138
+ <div className="bg-purple-900/30 rounded-xl p-4 border border-purple-500/30 mt-auto">
139
+ <div className={`text-sm font-semibold ${getTaglineBorderClass()}`}>
140
+ <i className="fas fa-magic mr-2"></i>
141
+ {data.powered_by}
142
+ </div>
143
+ </div>
144
+ </div>
145
+ </LandingCard>
146
+ );
147
+ };
148
+
149
+ export default LandingFeatureCard;
@@ -0,0 +1,66 @@
1
+ import React from 'react';
2
+
3
+ interface SocialLink {
4
+ href: string;
5
+ icon: string;
6
+ }
7
+
8
+ interface FooterLink {
9
+ href: string;
10
+ text: string;
11
+ }
12
+
13
+ interface LandingFooterProps {
14
+ data: {
15
+ socials?: SocialLink[];
16
+ copyright: string;
17
+ links?: FooterLink[];
18
+ };
19
+ }
20
+
21
+ const LandingFooter: React.FC<LandingFooterProps> = ({ data }) => {
22
+ if (!data) return null;
23
+
24
+ return (
25
+ <footer className='py-20 bg-gray-900 border-t border-gray-800 relative'>
26
+ <div className='container mx-auto px-6'>
27
+ <div className='text-center mb-12'>
28
+ <div className='flex items-center justify-center space-x-4 mb-6'>
29
+ <div className='w-12 h-12 bg-linear-to-br from-purple-500 via-blue-500 to-cyan-500 rounded-xl flex items-center justify-center shadow-xl'>
30
+ <i className='fas fa-brain text-white text-xl'></i>
31
+ </div>
32
+ <div>
33
+ <div className='text-2xl font-bold gradient-text'>Decido</div>
34
+ <div className='text-sm text-gray-400 font-mono'>Tu Arquitecto de Vida IA</div>
35
+ </div>
36
+ </div>
37
+
38
+ <p className='text-gray-400 max-w-2xl mx-auto mb-8'>
39
+ Construyendo el futuro del crecimiento personal, una vida transformada a la vez.
40
+ </p>
41
+
42
+ <div className='flex items-center justify-center space-x-8 text-gray-400'>
43
+ {data.socials?.map((social, index) => (
44
+ <a key={index} href={social.href} className='hover:text-white transition-colors hover:scale-110 transform'>
45
+ <i className={`${social.icon} text-2xl`}></i>
46
+ </a>
47
+ ))}
48
+ </div>
49
+ </div>
50
+
51
+ <div className='border-t border-gray-800 pt-8 text-center'>
52
+ <div className='flex flex-col md:flex-row items-center justify-between text-gray-500 text-sm'>
53
+ <p>{data.copyright}</p>
54
+ <div className='flex items-center space-x-6 mt-4 md:mt-0'>
55
+ {data.links?.map((link, index) => (
56
+ <a key={index} href={link.href} className='hover:text-white transition-colors'>{link.text}</a>
57
+ ))}
58
+ </div>
59
+ </div>
60
+ </div>
61
+ </div>
62
+ </footer>
63
+ );
64
+ };
65
+
66
+ export default LandingFooter;
@@ -0,0 +1,55 @@
1
+ import React from 'react';
2
+
3
+ interface NavLink {
4
+ href: string;
5
+ text: string;
6
+ }
7
+
8
+ interface LandingHeaderProps {
9
+ data: {
10
+ logo?: {
11
+ icon: string;
12
+ text: string;
13
+ version: string;
14
+ };
15
+ links?: NavLink[];
16
+ cta?: {
17
+ text: string;
18
+ onClick: () => void;
19
+ };
20
+ };
21
+ }
22
+
23
+ const LandingHeader: React.FC<LandingHeaderProps> = ({ data }) => {
24
+ if (!data) return null;
25
+
26
+ return (
27
+ <nav className='fixed top-0 w-full z-40 transition-all duration-300' id='navbar'>
28
+ <div className='container mx-auto px-6 py-4'>
29
+ <div className='flex items-center justify-between'>
30
+ <div className='flex items-center space-x-3'>
31
+ <div className='w-10 h-10 bg-linear-to-br from-purple-500 via-blue-500 to-cyan-500 rounded-xl flex items-center justify-center shadow-lg animate-pulse-glow'>
32
+ <i className={`${data.logo?.icon} text-white`}></i>
33
+ </div>
34
+ <div>
35
+ <div className='text-xl font-bold gradient-text'>{data.logo?.text}</div>
36
+ <div className='text-xs text-gray-400 font-mono'>{data.logo?.version}</div>
37
+ </div>
38
+ </div>
39
+
40
+ <div className='hidden md:flex items-center space-x-8'>
41
+ {data.links?.map((link, index) => (
42
+ <a key={index} href={link.href} className='text-gray-300 hover:text-white transition-colors font-medium'>{link.text}</a>
43
+ ))}
44
+ </div>
45
+
46
+ <button onClick={data.cta?.onClick} className="btn-premium px-6 py-3 rounded-xl font-semibold text-sm">
47
+ <span className="relative z-10">{data.cta?.text}</span>
48
+ </button>
49
+ </div>
50
+ </div>
51
+ </nav>
52
+ );
53
+ };
54
+
55
+ export default LandingHeader;
@@ -0,0 +1,94 @@
1
+ import React from 'react';
2
+
3
+ interface Announcement {
4
+ badge: string;
5
+ status: string;
6
+ }
7
+
8
+ interface Stat {
9
+ id?: string;
10
+ value: string;
11
+ label: string;
12
+ sublabel: string;
13
+ }
14
+
15
+ interface LandingHeroProps {
16
+ data: {
17
+ announcement?: Announcement;
18
+ title?: string[];
19
+ subtitle?: string;
20
+ typing_text?: string;
21
+ stats?: Stat[];
22
+ };
23
+ }
24
+
25
+ const LandingHero: React.FC<LandingHeroProps> = ({ data }) => {
26
+ if (!data) return null;
27
+
28
+ const scrollToFeatures = () => {
29
+ document.getElementById('features')?.scrollIntoView({ behavior: 'smooth' });
30
+ };
31
+
32
+ return (
33
+ <section className="hero-bg min-h-screen flex items-center justify-center relative overflow-hidden">
34
+ <div className="absolute inset-0 overflow-hidden">
35
+ <div className="particle particle-1" style={{ top: '20%', left: '10%' }}></div>
36
+ <div className="particle particle-2" style={{ top: '60%', left: '80%' }}></div>
37
+ <div className="particle particle-3" style={{ top: '80%', left: '20%' }}></div>
38
+ <div className="particle particle-1" style={{ top: '30%', left: '70%', animationDelay: '1s' }}></div>
39
+ <div className="particle particle-2" style={{ top: '70%', left: '15%', animationDelay: '3s' }}></div>
40
+ <div className="particle particle-3" style={{ top: '40%', left: '85%', animationDelay: '5s' }}></div>
41
+ </div>
42
+
43
+ <div className="container mx-auto px-6 relative z-20 pt-20">
44
+ <div className="text-center max-w-7xl mx-auto">
45
+ <div className="scroll-reveal inline-flex items-center glass-premium rounded-full px-8 py-4 mb-12">
46
+ <div className="flex items-center">
47
+ <div className="w-3 h-3 bg-linear-to-r from-green-400 to-emerald-400 rounded-full mr-4 animate-pulse"></div>
48
+ <span className="text-sm font-medium mr-3">
49
+ <span className="gradient-text font-bold">{data.announcement?.badge}</span>
50
+ </span>
51
+ <div className="bg-red-500 text-white text-xs px-2 py-1 rounded-full font-bold">
52
+ {data.announcement?.status}
53
+ </div>
54
+ </div>
55
+ </div>
56
+
57
+ <div className="mb-16">
58
+ {data.title?.map((line: string, index: number) => (
59
+ <h1 key={index} className="text-6xl md:text-8xl lg:text-9xl font-black mb-8 leading-tight scroll-reveal" style={{ animationDelay: `${index * 0.2}s` }} dangerouslySetInnerHTML={{ __html: line }}></h1>
60
+ ))}
61
+ </div>
62
+
63
+ <div className="mb-16 scroll-reveal" style={{ animationDelay: '0.4s' }}>
64
+ <div className="text-2xl md:text-4xl text-gray-300 mb-6 leading-relaxed max-w-5xl mx-auto" dangerouslySetInnerHTML={{ __html: data.subtitle || '' }}>
65
+ </div>
66
+ <div className="text-lg md:text-xl text-gray-400 font-mono mb-8">
67
+ <span className="typing-text">{data.typing_text}</span>
68
+ </div>
69
+ </div>
70
+
71
+ <div className="grid grid-cols-2 md:grid-cols-4 gap-8 mb-16 scroll-reveal" style={{ animationDelay: '0.6s' }}>
72
+ {data.stats?.map((stat, index) => (
73
+ <div key={index} className="glass-premium rounded-2xl p-6 hover:scale-105 transition-transform">
74
+ <div className="text-4xl font-black gradient-text mb-2" id={stat.id || ''}>{stat.value}</div>
75
+ <div className="text-sm text-gray-400 font-mono uppercase tracking-wide">{stat.label}</div>
76
+ <div className="text-xs text-gray-500 mt-1">{stat.sublabel}</div>
77
+ </div>
78
+ ))}
79
+ </div>
80
+
81
+ <div className="scroll-reveal animate-bounce" style={{ animationDelay: '1s' }}>
82
+ <div className="inline-flex flex-col items-center text-gray-400 hover:text-white transition-colors cursor-pointer"
83
+ onClick={scrollToFeatures}>
84
+ <span className="text-sm font-mono mb-2">Descubre más</span>
85
+ <i className="fas fa-chevron-down text-2xl"></i>
86
+ </div>
87
+ </div>
88
+ </div>
89
+ </div>
90
+ </section>
91
+ );
92
+ };
93
+
94
+ export default LandingHero;
@@ -0,0 +1,143 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import LandingHeader from './landing-header';
3
+ import LandingHero from './landing-hero';
4
+ import LandingWaitlist from './landing-waitlist';
5
+ import LandingSection from './landing-section';
6
+ import LandingFeatureCard from './landing-feature-card';
7
+ import LandingTestimonialCard from './landing-testimonial-card';
8
+ import LandingCta from './landing-cta';
9
+ import LandingFooter from './landing-footer';
10
+
11
+ interface LandingData {
12
+ title: string;
13
+ description: string;
14
+ navigation: any;
15
+ hero: any;
16
+ waitlist: any;
17
+ features: any;
18
+ integral_system: any;
19
+ testimonials: any;
20
+ pricing: any;
21
+ cta: any;
22
+ footer: any;
23
+ }
24
+
25
+ const LandingPage: React.FC = () => {
26
+ const [data, setData] = useState<LandingData | null>(null);
27
+
28
+ useEffect(() => {
29
+ const fetchLandingData = async () => {
30
+ try {
31
+ const response = await fetch('/data.json');
32
+ const jsonData = await response.json();
33
+ setData(jsonData);
34
+ } catch (error) {
35
+ console.error('Error fetching landing data:', error);
36
+ }
37
+ };
38
+
39
+ fetchLandingData();
40
+ }, []);
41
+
42
+ if (!data) {
43
+ return null; // El preloader del index.html se encargará de la espera
44
+ }
45
+
46
+ const scrollToWaitlist = () => {
47
+ document.getElementById('waitlist-section')?.scrollIntoView({ behavior: 'smooth' });
48
+ };
49
+
50
+ return (
51
+ <>
52
+ <LandingHeader data={{ ...data.navigation, cta: { text: data.navigation.cta.text, onClick: scrollToWaitlist } }} />
53
+
54
+ <main>
55
+ <LandingHero data={data.hero} />
56
+
57
+ <div className="container mx-auto px-6">
58
+ <LandingWaitlist data={data.waitlist} />
59
+ </div>
60
+
61
+ <LandingSection data={data.features}>
62
+ <div className="grid lg:grid-cols-3 gap-12 max-w-8xl mx-auto">
63
+ {data.features.main_features.map((feature: any, index: number) => (
64
+ <div key={index} className="scroll-reveal" style={{ animationDelay: `${index * 0.1}s` }}>
65
+ <LandingFeatureCard data={feature} />
66
+ </div>
67
+ ))}
68
+ </div>
69
+ </LandingSection>
70
+
71
+ <LandingSection data={data.integral_system}>
72
+ <div className="grid lg:grid-cols-2 gap-12 max-w-7xl mx-auto mb-32">
73
+ {data.integral_system.features.map((feature: any, index: number) => (
74
+ <div key={index} className="feature-card glass-premium rounded-3xl p-10 scroll-reveal-left">
75
+ <div className="flex items-start mb-6">
76
+ <div className="w-20 h-20 bg-linear-to-br from-orange-500 to-yellow-500 rounded-3xl flex-shrink-0 flex items-center justify-center mr-8 shadow-2xl animate-pulse-glow">
77
+ <i className={`${feature.icon} text-4xl text-white`}></i>
78
+ </div>
79
+ <div>
80
+ <h3 className="text-3xl font-bold mb-3 gradient-text">{feature.title}</h3>
81
+ <p className="text-lg text-gray-300 leading-relaxed">{feature.description}</p>
82
+ </div>
83
+ </div>
84
+ <div className="bg-yellow-900/30 rounded-xl p-4 border border-yellow-500/30">
85
+ <div className="text-sm text-yellow-300 font-semibold text-center">
86
+ <i className="fas fa-flag-checkered mr-2"></i>
87
+ {feature.tagline}
88
+ </div>
89
+ </div>
90
+ </div>
91
+ ))}
92
+ </div>
93
+ <div className="mt-32 text-center scroll-reveal">
94
+ <h3 className="text-4xl font-bold mb-12" dangerouslySetInnerHTML={{ __html: data.integral_system.gamification.title }}></h3>
95
+ <p className="text-xl text-gray-300 max-w-3xl mx-auto mb-16">{data.integral_system.gamification.subtitle}</p>
96
+ <div className="grid md:grid-cols-3 gap-8 max-w-5xl mx-auto">
97
+ {data.integral_system.gamification.cards.map((card: any, index: number) => (
98
+ <div key={index} className="glass-strong rounded-2xl p-6">
99
+ <div className="text-yellow-400 text-5xl mb-4"><i className={card.icon}></i></div>
100
+ <h4 className="text-xl font-bold mb-2">{card.title}</h4>
101
+ <p className="text-gray-400">{card.description}</p>
102
+ <div className="mt-4 bg-gray-900/50 rounded-full p-3 font-mono text-lg" dangerouslySetInnerHTML={{ __html: card.stat }}>
103
+ </div>
104
+ </div>
105
+ ))}
106
+ </div>
107
+ </div>
108
+ </LandingSection>
109
+
110
+ <LandingSection data={data.testimonials}>
111
+ <div className="grid lg:grid-cols-3 gap-12 max-w-7xl mx-auto">
112
+ {data.testimonials.reviews.map((testimonial: any, index: number) => (
113
+ <div key={index} className="scroll-reveal" style={{ animationDelay: `${index * 0.1}s` }}>
114
+ <LandingTestimonialCard data={testimonial} />
115
+ </div>
116
+ ))}
117
+ </div>
118
+ </LandingSection>
119
+
120
+ <LandingSection data={data.pricing}>
121
+ <div className="max-w-5xl mx-auto">
122
+ <div className="glass-premium rounded-3xl p-12 mb-16 scroll-reveal">
123
+ </div>
124
+ <div className="glass-premium rounded-3xl p-12 text-center scroll-reveal">
125
+ </div>
126
+ </div>
127
+ </LandingSection>
128
+
129
+ <LandingCta
130
+ title={data.cta.title}
131
+ subtitle={data.cta.subtitle}
132
+ buttonText={data.cta.button_text}
133
+ trustText={data.cta.trust_text}
134
+ onButtonClick={scrollToWaitlist}
135
+ />
136
+ </main>
137
+
138
+ <LandingFooter data={data.footer} />
139
+ </>
140
+ );
141
+ };
142
+
143
+ export default LandingPage;
@@ -0,0 +1,42 @@
1
+ import React from 'react';
2
+
3
+ interface LandingSectionProps {
4
+ data?: {
5
+ id?: string;
6
+ header?: {
7
+ badge?: string;
8
+ title: string;
9
+ subtitle: string;
10
+ };
11
+ };
12
+ children: React.ReactNode;
13
+ }
14
+
15
+ const LandingSection: React.FC<LandingSectionProps> = ({ data, children }) => {
16
+ if (!data?.header) {
17
+ return <>{children}</>;
18
+ }
19
+
20
+ return (
21
+ <section id={data.id} className='py-40 bg-linear-to-b from-gray-900/50 to-gray-800/50 relative'>
22
+ <div className='container mx-auto px-6'>
23
+ <div className='text-center mb-32 scroll-reveal'>
24
+ {data.header.badge && (
25
+ <div className='inline-block mb-6'>
26
+ <span className='bg-linear-to-r from-purple-500/20 to-cyan-500/20 border border-purple-500/30 rounded-full px-8 py-3 text-sm font-mono font-bold uppercase tracking-wider'>
27
+ {data.header.badge}
28
+ </span>
29
+ </div>
30
+ )}
31
+ <h2 className='text-5xl md:text-7xl font-black mb-8 leading-tight' dangerouslySetInnerHTML={{ __html: data.header.title }}>
32
+ </h2>
33
+ <p className='text-xl md:text-2xl text-gray-300 max-w-4xl mx-auto leading-relaxed' dangerouslySetInnerHTML={{ __html: data.header.subtitle }}>
34
+ </p>
35
+ </div>
36
+ {children}
37
+ </div>
38
+ </section>
39
+ );
40
+ };
41
+
42
+ export default LandingSection;
@@ -0,0 +1,50 @@
1
+ import React from 'react';
2
+ import LandingCard from './landing-card'; // Assuming LandingCard is now a React component
3
+
4
+ interface LandingTestimonialCardProps {
5
+ data: {
6
+ author: string;
7
+ role: string;
8
+ quote: string;
9
+ tagline: string;
10
+ };
11
+ }
12
+
13
+ const LandingTestimonialCard: React.FC<LandingTestimonialCardProps> = ({ data }) => {
14
+ if (!data) return null;
15
+
16
+ const authorInitials = data.author?.split(' ').map(n => n[0]).join('');
17
+
18
+ return (
19
+ <LandingCard>
20
+ <div className="glass-premium rounded-3xl p-10 hover:scale-105 transition-all duration-500 h-full flex flex-col">
21
+ <div className="flex-grow">
22
+ <div className="flex items-center mb-8">
23
+ <div className="w-16 h-16 bg-linear-to-br from-purple-500 to-pink-500 rounded-full flex items-center justify-center mr-6 text-xl font-bold shadow-xl flex-shrink-0">
24
+ {authorInitials}
25
+ </div>
26
+ <div>
27
+ <h4 className="text-xl font-bold text-white">{data.author}</h4>
28
+ <p className="text-gray-400">{data.role}</p>
29
+ <div className="flex text-yellow-400 mt-2">
30
+ {[...Array(5)].map((_, i) => (
31
+ <i key={i} className="fas fa-star"></i>
32
+ ))}
33
+ </div>
34
+ </div>
35
+ </div>
36
+ <blockquote className="text-gray-300 text-lg italic leading-relaxed mb-6" dangerouslySetInnerHTML={{ __html: `"${data.quote}"` }}>
37
+ </blockquote>
38
+ </div>
39
+ <div className="bg-purple-900/30 rounded-xl p-4 border border-purple-500/30 mt-auto">
40
+ <div className="text-sm text-purple-300 font-semibold">
41
+ <i className="fas fa-trophy mr-2"></i>
42
+ {data.tagline}
43
+ </div>
44
+ </div>
45
+ </div>
46
+ </LandingCard>
47
+ );
48
+ };
49
+
50
+ export default LandingTestimonialCard;