kofi-stack-template-generator 2.1.54 → 2.1.55

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.
@@ -2,33 +2,27 @@
2
2
  import Logo from "./Logo.astro"
3
3
  import ThemeSelector from "./ThemeSelector.astro"
4
4
 
5
+ // Footer navigation structure - using anchor links for landing page
5
6
  const footerColumns = [
6
7
  {
7
8
  title: "Product",
8
9
  links: [
9
10
  { label: "Home", href: "/" },
10
- { label: "Pricing", href: "/pricing" },
11
- { label: "Integrations", href: "/features/integrations" },
11
+ { label: "Features", href: "#features" },
12
+ { label: "Pricing", href: "#pricing" },
12
13
  ],
13
14
  },
14
15
  {
15
16
  title: "Resources",
16
17
  links: [
17
- { label: "Blog", href: "/blog" },
18
- { label: "Documentation", href: "/docs" },
19
- ],
20
- },
21
- {
22
- title: "Company",
23
- links: [
24
- { label: "About", href: "/about" },
18
+ { label: "Testimonials", href: "#testimonials" },
25
19
  ],
26
20
  },
27
21
  {
28
22
  title: "Legal",
29
23
  links: [
30
- { label: "Privacy", href: "/privacy" },
31
- { label: "Terms", href: "/terms" },
24
+ { label: "Privacy", href: "#" },
25
+ { label: "Terms", href: "#" },
32
26
  ],
33
27
  },
34
28
  ]
@@ -39,17 +33,13 @@ const socialLinks = {
39
33
  github: "https://github.com/saasify",
40
34
  }
41
35
 
42
- const bottomLinks = [
43
- { label: "Contact Support", href: "/support" },
44
- ]
45
-
46
36
  const currentYear = new Date().getFullYear()
47
37
  ---
48
38
 
49
39
  <footer class="mt-auto border-t border-border bg-background">
50
40
  <!-- Main Footer Content -->
51
41
  <div class="container mx-auto px-4 py-12 lg:py-16">
52
- <div class="grid grid-cols-2 gap-8 md:grid-cols-3 lg:grid-cols-6">
42
+ <div class="grid grid-cols-2 gap-8 md:grid-cols-3 lg:grid-cols-5">
53
43
  <!-- Link Columns -->
54
44
  {footerColumns.map((column) => (
55
45
  <div class="col-span-1">
@@ -72,7 +62,7 @@ const currentYear = new Date().getFullYear()
72
62
  ))}
73
63
 
74
64
  <!-- Newsletter Column -->
75
- <div class="col-span-2 md:col-span-3 lg:col-span-2">
65
+ <div class="col-span-2">
76
66
  <h3 class="mb-4 text-sm font-medium text-foreground">
77
67
  Newsletter
78
68
  </h3>
@@ -150,16 +140,8 @@ const currentYear = new Date().getFullYear()
150
140
  </p>
151
141
  </div>
152
142
 
153
- <!-- Bottom Links and Theme Selector -->
143
+ <!-- Theme Selector -->
154
144
  <div class="flex items-center gap-6">
155
- {bottomLinks.map((link) => (
156
- <a
157
- href={link.href}
158
- class="text-sm text-muted-foreground transition-colors hover:text-foreground"
159
- >
160
- {link.label}
161
- </a>
162
- ))}
163
145
  <ThemeSelector />
164
146
  </div>
165
147
  </div>
@@ -1,53 +1,17 @@
1
1
  ---
2
2
  import Logo from "./Logo.astro"
3
- import { ChevronDown, Menu, X, Layout, BarChart3, Shield, Zap, Layers, Target, Rocket, Settings } from "lucide-astro"
4
-
5
- // Navigation data structure matching SaaSify
6
- const productMenu = {
7
- label: "Product",
8
- columns: [
9
- {
10
- title: "Core Features",
11
- items: [
12
- { label: "Integrations", description: "Connect with 100+ tools you already use", href: "/features/integrations", icon: "layout" },
13
- { label: "Analytics", description: "Real-time insights and reporting dashboards", href: "/features/analytics", icon: "barChart" },
14
- { label: "Security", description: "Enterprise-grade protection and compliance", href: "/features/security", icon: "shield" },
15
- ],
16
- },
17
- {
18
- title: "Productivity",
19
- items: [
20
- { label: "Dashboard", description: "Unified command center for your team", href: "/features/dashboard", icon: "layout" },
21
- { label: "Automation", description: "Streamline repetitive tasks instantly", href: "/features/automation", icon: "zap" },
22
- { label: "Workflows", description: "Build custom processes without code", href: "/features/workflows", icon: "layers" },
23
- ],
24
- },
25
- ],
26
- }
27
-
28
- const solutionsMenu = {
29
- label: "Solutions",
30
- columns: [
31
- {
32
- title: "By Team",
33
- items: [
34
- { label: "Sales Teams", description: "Close deals faster with smart tools", href: "/use-cases/sales", icon: "target" },
35
- { label: "Marketing Teams", description: "Launch campaigns that convert", href: "/use-cases/marketing", icon: "rocket" },
36
- { label: "Product Teams", description: "Ship features users love", href: "/use-cases/product", icon: "layers" },
37
- { label: "Operations", description: "Scale without the growing pains", href: "/use-cases/operations", icon: "settings" },
38
- ],
39
- },
40
- ],
41
- }
3
+ import { Menu, X } from "lucide-astro"
42
4
 
5
+ // Simplified navigation for landing page
43
6
  const navLinks = [
44
- { label: "Pricing", href: "/pricing" },
45
- { label: "Blog", href: "/blog" },
7
+ { label: "Features", href: "#features" },
8
+ { label: "Testimonials", href: "#testimonials" },
9
+ { label: "Pricing", href: "#pricing" },
46
10
  ]
47
11
 
48
12
  const ctaLinks = [
49
- { label: "Sign In", href: "/sign-in", variant: "ghost" },
50
- { label: "Get Started", href: "/sign-up", variant: "default" },
13
+ { label: "Sign In", href: "#", variant: "ghost" },
14
+ { label: "Get Started", href: "#pricing", variant: "default" },
51
15
  ]
52
16
  ---
53
17
 
@@ -62,97 +26,6 @@ const ctaLinks = [
62
26
 
63
27
  <!-- Desktop navigation -->
64
28
  <nav class="hidden lg:flex items-center gap-1">
65
- <!-- Product Menu -->
66
- <div class="mega-menu-trigger relative" data-menu="product">
67
- <button
68
- type="button"
69
- class="flex items-center gap-1 px-4 py-2 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors"
70
- >
71
- {productMenu.label}
72
- <ChevronDown class="h-4 w-4 transition-transform mega-chevron" />
73
- </button>
74
- <div class="mega-menu-dropdown absolute left-0 top-full pt-2 opacity-0 -translate-y-2 pointer-events-none transition-all">
75
- <div class="bg-background border border-border rounded-lg shadow-lg p-6 min-w-[480px]">
76
- <div class="grid gap-8 grid-cols-2">
77
- {productMenu.columns.map((column) => (
78
- <div>
79
- <h3 class="text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-4">
80
- {column.title}
81
- </h3>
82
- <ul class="space-y-1">
83
- {column.items.map((item) => (
84
- <li>
85
- <a
86
- href={item.href}
87
- class="flex items-start gap-3 p-3 rounded-lg hover:bg-muted transition-colors group"
88
- >
89
- <div class="flex h-10 w-10 shrink-0 items-center justify-center rounded-md bg-muted group-hover:bg-background">
90
- {item.icon === "layout" && <Layout class="h-5 w-5 text-primary" />}
91
- {item.icon === "barChart" && <BarChart3 class="h-5 w-5 text-primary" />}
92
- {item.icon === "shield" && <Shield class="h-5 w-5 text-primary" />}
93
- {item.icon === "zap" && <Zap class="h-5 w-5 text-primary" />}
94
- {item.icon === "layers" && <Layers class="h-5 w-5 text-primary" />}
95
- </div>
96
- <div>
97
- <div class="text-sm font-medium text-foreground">{item.label}</div>
98
- <div class="text-xs text-muted-foreground mt-0.5">{item.description}</div>
99
- </div>
100
- </a>
101
- </li>
102
- ))}
103
- </ul>
104
- </div>
105
- ))}
106
- </div>
107
- </div>
108
- </div>
109
- </div>
110
-
111
- <!-- Solutions Menu -->
112
- <div class="mega-menu-trigger relative" data-menu="solutions">
113
- <button
114
- type="button"
115
- class="flex items-center gap-1 px-4 py-2 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors"
116
- >
117
- {solutionsMenu.label}
118
- <ChevronDown class="h-4 w-4 transition-transform mega-chevron" />
119
- </button>
120
- <div class="mega-menu-dropdown absolute left-0 top-full pt-2 opacity-0 -translate-y-2 pointer-events-none transition-all">
121
- <div class="bg-background border border-border rounded-lg shadow-lg p-6 min-w-[320px]">
122
- <div class="grid gap-8 grid-cols-1">
123
- {solutionsMenu.columns.map((column) => (
124
- <div>
125
- <h3 class="text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-4">
126
- {column.title}
127
- </h3>
128
- <ul class="space-y-1">
129
- {column.items.map((item) => (
130
- <li>
131
- <a
132
- href={item.href}
133
- class="flex items-start gap-3 p-3 rounded-lg hover:bg-muted transition-colors group"
134
- >
135
- <div class="flex h-10 w-10 shrink-0 items-center justify-center rounded-md bg-muted group-hover:bg-background">
136
- {item.icon === "target" && <Target class="h-5 w-5 text-primary" />}
137
- {item.icon === "rocket" && <Rocket class="h-5 w-5 text-primary" />}
138
- {item.icon === "layers" && <Layers class="h-5 w-5 text-primary" />}
139
- {item.icon === "settings" && <Settings class="h-5 w-5 text-primary" />}
140
- </div>
141
- <div>
142
- <div class="text-sm font-medium text-foreground">{item.label}</div>
143
- <div class="text-xs text-muted-foreground mt-0.5">{item.description}</div>
144
- </div>
145
- </a>
146
- </li>
147
- ))}
148
- </ul>
149
- </div>
150
- ))}
151
- </div>
152
- </div>
153
- </div>
154
- </div>
155
-
156
29
  {navLinks.map((link) => (
157
30
  <a
158
31
  href={link.href}
@@ -185,7 +58,7 @@ const ctaLinks = [
185
58
 
186
59
  <!-- Mobile: Primary CTA + Hamburger -->
187
60
  <a
188
- href="/sign-up"
61
+ href="#pricing"
189
62
  class="lg:hidden px-4 py-2 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90"
190
63
  >
191
64
  Get Started
@@ -207,74 +80,7 @@ const ctaLinks = [
207
80
  <!-- Mobile Menu Overlay -->
208
81
  <div id="mobile-menu" class="fixed inset-0 top-16 z-50 bg-background hidden lg:hidden">
209
82
  <nav class="overflow-y-auto max-h-[calc(100vh-4rem)]">
210
- <!-- Product Section -->
211
- <div class="mobile-section border-b border-border" data-section="product">
212
- <button
213
- type="button"
214
- class="flex items-center justify-between w-full px-4 py-3 text-sm font-medium"
215
- >
216
- Product
217
- <ChevronDown class="h-4 w-4 transition-transform section-chevron" />
218
- </button>
219
- <div class="mobile-section-content hidden px-4 pb-4 space-y-4">
220
- {productMenu.columns.map((column) => (
221
- <div>
222
- <h4 class="text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-2">
223
- {column.title}
224
- </h4>
225
- <ul class="space-y-1">
226
- {column.items.map((item) => (
227
- <li>
228
- <a href={item.href} class="flex items-center gap-3 p-2 rounded-lg hover:bg-muted">
229
- {item.icon === "layout" && <Layout class="h-4 w-4 text-primary" />}
230
- {item.icon === "barChart" && <BarChart3 class="h-4 w-4 text-primary" />}
231
- {item.icon === "shield" && <Shield class="h-4 w-4 text-primary" />}
232
- {item.icon === "zap" && <Zap class="h-4 w-4 text-primary" />}
233
- {item.icon === "layers" && <Layers class="h-4 w-4 text-primary" />}
234
- <span class="text-sm">{item.label}</span>
235
- </a>
236
- </li>
237
- ))}
238
- </ul>
239
- </div>
240
- ))}
241
- </div>
242
- </div>
243
-
244
- <!-- Solutions Section -->
245
- <div class="mobile-section border-b border-border" data-section="solutions">
246
- <button
247
- type="button"
248
- class="flex items-center justify-between w-full px-4 py-3 text-sm font-medium"
249
- >
250
- Solutions
251
- <ChevronDown class="h-4 w-4 transition-transform section-chevron" />
252
- </button>
253
- <div class="mobile-section-content hidden px-4 pb-4 space-y-4">
254
- {solutionsMenu.columns.map((column) => (
255
- <div>
256
- <h4 class="text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-2">
257
- {column.title}
258
- </h4>
259
- <ul class="space-y-1">
260
- {column.items.map((item) => (
261
- <li>
262
- <a href={item.href} class="flex items-center gap-3 p-2 rounded-lg hover:bg-muted">
263
- {item.icon === "target" && <Target class="h-4 w-4 text-primary" />}
264
- {item.icon === "rocket" && <Rocket class="h-4 w-4 text-primary" />}
265
- {item.icon === "layers" && <Layers class="h-4 w-4 text-primary" />}
266
- {item.icon === "settings" && <Settings class="h-4 w-4 text-primary" />}
267
- <span class="text-sm">{item.label}</span>
268
- </a>
269
- </li>
270
- ))}
271
- </ul>
272
- </div>
273
- ))}
274
- </div>
275
- </div>
276
-
277
- <!-- Simple nav links -->
83
+ <!-- Navigation links -->
278
84
  {navLinks.map((link) => (
279
85
  <a
280
86
  href={link.href}
@@ -305,25 +111,6 @@ const ctaLinks = [
305
111
 
306
112
  <script>
307
113
  function initHeader() {
308
- // Desktop mega menu
309
- const megaMenuTriggers = document.querySelectorAll('.mega-menu-trigger')
310
- megaMenuTriggers.forEach((trigger) => {
311
- const dropdown = trigger.querySelector('.mega-menu-dropdown')
312
- const chevron = trigger.querySelector('.mega-chevron')
313
-
314
- trigger.addEventListener('mouseenter', () => {
315
- dropdown?.classList.remove('opacity-0', '-translate-y-2', 'pointer-events-none')
316
- dropdown?.classList.add('opacity-100', 'translate-y-0', 'pointer-events-auto')
317
- chevron?.classList.add('rotate-180')
318
- })
319
-
320
- trigger.addEventListener('mouseleave', () => {
321
- dropdown?.classList.add('opacity-0', '-translate-y-2', 'pointer-events-none')
322
- dropdown?.classList.remove('opacity-100', 'translate-y-0', 'pointer-events-auto')
323
- chevron?.classList.remove('rotate-180')
324
- })
325
- })
326
-
327
114
  // Mobile menu toggle
328
115
  const mobileToggle = document.getElementById('mobile-menu-toggle')
329
116
  const mobileMenu = document.getElementById('mobile-menu')
@@ -343,25 +130,6 @@ const ctaLinks = [
343
130
  }
344
131
  })
345
132
 
346
- // Mobile sections toggle
347
- const mobileSections = document.querySelectorAll('.mobile-section')
348
- mobileSections.forEach((section) => {
349
- const button = section.querySelector('button')
350
- const content = section.querySelector('.mobile-section-content')
351
- const chevron = section.querySelector('.section-chevron')
352
-
353
- button?.addEventListener('click', () => {
354
- const isOpen = !content?.classList.contains('hidden')
355
- if (isOpen) {
356
- content?.classList.add('hidden')
357
- chevron?.classList.remove('rotate-180')
358
- } else {
359
- content?.classList.remove('hidden')
360
- chevron?.classList.add('rotate-180')
361
- }
362
- })
363
- })
364
-
365
133
  // Close mobile menu on link click
366
134
  const mobileLinks = mobileMenu?.querySelectorAll('a')
367
135
  mobileLinks?.forEach((link) => {
@@ -46,10 +46,12 @@ import FinalCTA from "../components/blocks/FinalCTA.astro"
46
46
  />
47
47
 
48
48
  <!-- Bento Features -->
49
- <BentoFeatures
50
- heading="Discover what SaaSify can do"
51
- subheading="Everything you need to work smarter and scale faster"
52
- />
49
+ <section id="features">
50
+ <BentoFeatures
51
+ heading="Discover what SaaSify can do"
52
+ subheading="Everything you need to work smarter and scale faster"
53
+ />
54
+ </section>
53
55
 
54
56
  <!-- Feature Showcase: Integrations -->
55
57
  <FeatureShowcase
@@ -118,10 +120,12 @@ import FinalCTA from "../components/blocks/FinalCTA.astro"
118
120
  />
119
121
 
120
122
  <!-- Testimonials -->
121
- <TestimonialsGrid
122
- heading="Loved by teams at companies of all sizes"
123
- subheading="See how leading teams use SaaSify to drive growth and productivity."
124
- />
123
+ <section id="testimonials">
124
+ <TestimonialsGrid
125
+ heading="Loved by teams at companies of all sizes"
126
+ subheading="See how leading teams use SaaSify to drive growth and productivity."
127
+ />
128
+ </section>
125
129
 
126
130
  <!-- Trust Columns -->
127
131
  <TrustColumns />
@@ -141,10 +145,12 @@ import FinalCTA from "../components/blocks/FinalCTA.astro"
141
145
  />
142
146
 
143
147
  <!-- Pricing -->
144
- <PricingTable
145
- heading="Simple, transparent pricing"
146
- subheading="Start free, upgrade as your team grows. No hidden fees."
147
- />
148
+ <section id="pricing">
149
+ <PricingTable
150
+ heading="Simple, transparent pricing"
151
+ subheading="Start free, upgrade as your team grows. No hidden fees."
152
+ />
153
+ </section>
148
154
 
149
155
  <!-- Final CTA -->
150
156
  <FinalCTA