1- import { useState } from 'react' ;
1+ import { useState , useEffect } from 'react' ;
22import { Dialog } from '@headlessui/react' ;
33import { AiFillCheckCircle , AiFillCloseCircle } from 'react-icons/ai' ;
44import { HiBars3 } from 'react-icons/hi2' ;
55import { BiLogIn } from 'react-icons/bi' ;
66import { Link } from '@wasp/router' ;
77import logo from '../static/logo.png' ;
88import daBoi from '../static/da-boi.png' ;
9- import openSaasBanner from '../static/open-saas-banner-gr.png' ;
9+ import openSaasBanner from '../static/open-saas-banner.png' ;
10+ // import openSaasBanner from '../static/open-saas-alt-banner.p ng';
1011import { features , navigation , tiers , faqs , footerNavigation } from './contentSections' ;
1112import useAuth from '@wasp/auth/useAuth' ;
1213import DropdownUser from '../components/DropdownUser' ;
@@ -18,11 +19,24 @@ import { UserMenuItems } from '../components/UserMenuItems';
1819export default function LandingPage ( ) {
1920 const [ mobileMenuOpen , setMobileMenuOpen ] = useState ( false ) ;
2021 const [ isStripePaymentLoading , setIsStripePaymentLoading ] = useState < boolean | string > ( false ) ;
22+ const [ isDemoInfoVisible , setIsDemoInfoVisible ] = useState ( false ) ;
2123
2224 const { data : user , isLoading : isUserLoading } = useAuth ( ) ;
2325
2426 const history = useHistory ( ) ;
2527
28+ useEffect ( ( ) => {
29+ try {
30+ if ( localStorage . getItem ( 'isDemoInfoVisible' ) === 'false' ) {
31+ // do nothing
32+ } else {
33+ setIsDemoInfoVisible ( true ) ;
34+ }
35+ } catch ( error ) {
36+ console . error ( error ) ;
37+ }
38+ } , [ ] ) ;
39+
2640 async function handleBuyNowClick ( tierId : string ) {
2741 if ( ! user ) {
2842 history . push ( '/login' ) ;
@@ -42,16 +56,40 @@ export default function LandingPage() {
4256 }
4357 }
4458
59+ const handleDemoInfoClose = ( ) => {
60+ try {
61+ localStorage . setItem ( 'isDemoInfoVisible' , 'false' ) ;
62+ setIsDemoInfoVisible ( false ) ;
63+ } catch ( error ) {
64+ console . error ( error ) ;
65+ }
66+ } ;
67+
4568 const NavLogo = ( ) => < img className = 'h-8 w-8' src = { logo } alt = 'Open SaaS App' /> ;
4669
4770 return (
4871 < div className = 'bg-white' >
72+ { /* Floating Demo Announcement */ }
73+ { isDemoInfoVisible && < div className = 'fixed z-999 bottom-0 mb-2 left-1/2 -translate-x-1/2 lg:mb-4 bg-gray-700 rounded-full px-3.5 py-2 text-sm text-white duration-300 ease-in-out hover:bg-gray-800 focus-visible:outline focus-visible:outline-2 focus-visible:outline-indigo-600' >
74+ < div className = 'px-4 flex flex-row gap-2 items-center my-1' >
75+ < span className = 'text-gray-100' >
76+ This demo app < span className = 'italic' > is</ span > the SaaS template. Feel free to play around!
77+ </ span >
78+ < button className = ' pl-2.5 text-gray-400 text-xl font-bold' onClick = { ( ) => handleDemoInfoClose ( ) } >
79+ X
80+ </ button >
81+ </ div >
82+ </ div > }
4983 { /* Header */ }
5084 < header className = 'absolute inset-x-0 top-0 z-50' >
5185 < nav className = 'flex items-center justify-between p-6 lg:px-8' aria-label = 'Global' >
52- < div className = 'flex lg:flex-1' >
53- < a href = '/' className = '-m-1.5 p-1.5' >
86+ < div className = 'flex items-center lg:flex-1' >
87+ < a
88+ href = '/'
89+ className = 'flex items-center -m-1.5 p-1.5 text-gray-900 duration-300 ease-in-out hover:text-yellow-500'
90+ >
5491 < NavLogo />
92+ < span className = 'ml-2 text-sm font-semibold leading-6 ' > Open Saas</ span >
5593 </ a >
5694 </ div >
5795 < div className = 'flex lg:hidden' >
@@ -163,31 +201,28 @@ export default function LandingPage() {
163201 </ div >
164202 < div className = 'py-24 sm:py-32' >
165203 < div className = 'mx-auto max-w-8xl px-6 lg:px-8' >
166- < div className = 'lg:mb-18 mx-auto max-w-2xl text-center' >
204+ < div className = 'lg:mb-18 mx-auto max-w-3xl text-center' >
167205 < h1 className = 'text-4xl font-bold tracking-tight text-gray-900 sm:text-6xl' >
168206 The < span className = 'italic' > free</ span > SaaS template with superpowers
169207 </ h1 >
170- < p className = 'mt-6 text-lg leading-8 text-gray-600' >
171- An open-source, feature-rich template, engineered with Wasp—the only full-stack React + NodeJS
172- framework that manages features for you.
208+ < p className = 'mt-6 mx-auto max-w-2xl text-lg leading-8 text-gray-600' >
209+ An open-source, feature-rich, full-stack React + NodeJS template that manages features for you.
173210 </ p >
174211 < div className = 'mt-10 flex items-center justify-center gap-x-6' >
175- < a
212+ { /* <a
176213 href='https://github.com/wasp-lang/open-saas'
177214 className='rounded-md bg-yellow-500 px-3.5 py-2.5 text-sm font-semibold text-white hover:text-white shadow-sm hover:bg-yellow-400 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600'
178- >
179- Get Started < span aria-hidden = 'true' > →</ span >
180- </ a >
215+ ></a> */ }
181216 < a
182217 href = { DOCS_URL }
183218 className = 'rounded-md px-3.5 py-2.5 text-sm font-semibold text-gray-700 ring-1 ring-inset ring-gray-200 hover:ring-2 hover:ring-purple-200 shadow-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600'
184219 >
185- Read the Docs
220+ Get Started < span aria-hidden = 'true' > → </ span >
186221 </ a >
187222 </ div >
188223 </ div >
189224 < div className = 'mt-14 flow-root sm:mt-14 ' >
190- < div className = '-m-2 rounded-xl bg-gray-900/5 p-2 ring-1 ring-inset ring-gray-900/10 lg:-m-4 lg:rounded-2xl lg:p-4' >
225+ < div className = '-m-2 rounded-xl lg:-m-4 lg:rounded-2xl lg:p-4' >
191226 < img
192227 src = { openSaasBanner }
193228 alt = 'App screenshot'
@@ -206,7 +241,7 @@ export default function LandingPage() {
206241 < div className = 'mt-12 mx-auto max-w-7xl px-6 lg:px-8 flex flex-col items-between gap-y-6' >
207242 < h2 className = 'mb-6 text-center font-semibold tracking-wide text-gray-500' > Built and Ships with</ h2 >
208243
209- < div className = 'mx-auto grid max-w-lg grid-cols-2 items-center gap-x-8 gap-y-12 sm:max-w-xl md:grid-cols-5 sm:gap-x-10 sm:gap-y-14 lg:mx-0 lg:max-w-none lg:grid-cols-5 ' >
244+ < div className = 'mx-auto grid max-w-lg grid-cols-2 items-center gap-x-8 gap-y-12 sm:max-w-xl md:grid-cols-6 sm:gap-x-10 sm:gap-y-14 lg:mx-0 lg:max-w-none' >
210245 < img
211246 className = ' col-span-1 max-h-12 w-full object-contain grayscale opacity-100'
212247 src = 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/React-icon.svg/512px-React-icon.svg.png'
@@ -220,11 +255,14 @@ export default function LandingPage() {
220255 height = { 48 }
221256 />
222257 < img
223- className = 'col-span-2 md:col-span- 1 max-h-12 w-full object-contain grayscale opacity-80 '
258+ className = 'col-span-1 max-h-12 w-full object-contain grayscale opacity-80 '
224259 src = { logo }
225260 alt = 'Wasp'
226261 height = { 48 }
227262 />
263+ < div className = 'flex justify-center col-span-1 max-h-12 w-full object-contain grayscale opacity-80' >
264+ < svg width = { 48 } height = { 48 } viewBox = "0 0 32 32" xmlns = "http://www.w3.org/2000/svg" > < title > file_type_prisma</ title > < path fill = "#545454" d = "M25.21,24.21,12.739,27.928a.525.525,0,0,1-.667-.606L16.528,5.811a.43.43,0,0,1,.809-.094l8.249,17.661A.6.6,0,0,1,25.21,24.21Zm2.139-.878L17.8,2.883h0A1.531,1.531,0,0,0,16.491,2a1.513,1.513,0,0,0-1.4.729L4.736,19.648a1.592,1.592,0,0,0,.018,1.7l5.064,7.909a1.628,1.628,0,0,0,1.83.678l14.7-4.383a1.6,1.6,0,0,0,1-2.218Z" /> </ svg >
265+ </ div >
228266 < img
229267 className = ' col-span-1 max-h-12 w-full object-contain grayscale '
230268 src = 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/d5/Tailwind_CSS_Logo.svg/512px-Tailwind_CSS_Logo.svg.png'
@@ -249,7 +287,7 @@ export default function LandingPage() {
249287 < p className = 'mt-6 text-lg leading-8 text-gray-600' >
250288 We've pre-built the important stuff.
251289 < br /> Wasp does all the boring stuff.
252- < br /> You get all the credit .
290+ < br /> You get to do the fun stuff .
253291 </ p >
254292 </ div >
255293 < div className = 'mx-auto mt-16 max-w-2xl sm:mt-20 lg:mt-24 lg:max-w-4xl' >
@@ -341,8 +379,8 @@ export default function LandingPage() {
341379 </ h2 >
342380 </ div >
343381 < p className = 'mx-auto mt-6 max-w-2xl text-center text-lg leading-8 text-gray-600' >
344- Secure Stripe webhooks, and a complete subscription management system are built-in. Just add your Stripe
345- Product IDs and you're good to go!
382+ Stripe subscriptions and secure webhooks are built-in. Just add your Stripe
383+ Product IDs! Go it a try with credit card number { ' ' } < span className = 'px-2 py-1 bg-gray-100 rounded-md text-gray-500' > 4242 4242 4242 4242 4242 </ span >
346384 </ p >
347385 < div className = 'isolate mx-auto mt-16 grid max-w-md grid-cols-1 gap-y-8 lg:gap-x-8 sm:mt-20 lg:mx-0 lg:max-w-none lg:grid-cols-3' >
348386 { tiers . map ( ( tier ) => (
0 commit comments