add delete acount & change icon
This commit is contained in:
@@ -22,7 +22,6 @@
|
|||||||
<meta name="twitter:description" content="Transform your identity in 40 days with AI-powered habits, journaling, and personal growth tracking." />
|
<meta name="twitter:description" content="Transform your identity in 40 days with AI-powered habits, journaling, and personal growth tracking." />
|
||||||
|
|
||||||
<!-- App Links -->
|
<!-- App Links -->
|
||||||
<meta name="apple-itunes-app" content="app-id=YOUR_APP_ID" />
|
|
||||||
<meta name="google-play-app" content="app-id=com.nova40.app" />
|
<meta name="google-play-app" content="app-id=com.nova40.app" />
|
||||||
|
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 6.0 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 582 KiB After Width: | Height: | Size: 934 KiB |
@@ -33,23 +33,7 @@ export default function Download() {
|
|||||||
Download Nova40 for free and start your 40-day identity transformation journey today.
|
Download Nova40 for free and start your 40-day identity transformation journey today.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div className="flex flex-col sm:flex-row gap-4 justify-center items-center">
|
<div className="flex justify-center">
|
||||||
{/* App Store */}
|
|
||||||
<a
|
|
||||||
href="https://apps.apple.com/app/nova40/id0000000000"
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
className="w-full sm:w-auto inline-flex items-center justify-center gap-3 px-8 py-4 bg-white/5 hover:bg-white/10 border border-nova-border hover:border-nova-primary/50 rounded-2xl transition-all group hover:scale-105 hover:shadow-lg hover:shadow-nova-primary/10"
|
|
||||||
>
|
|
||||||
<svg className="w-9 h-9 text-white" viewBox="0 0 24 24" fill="currentColor">
|
|
||||||
<path d="M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.8-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M13 3.5c.73-.83 1.94-1.46 2.94-1.5.13 1.17-.34 2.35-1.04 3.19-.69.85-1.83 1.51-2.95 1.42-.15-1.15.41-2.35 1.05-3.11z"/>
|
|
||||||
</svg>
|
|
||||||
<div className="text-left">
|
|
||||||
<p className="text-[10px] text-nova-textSecondary leading-tight">Download on the</p>
|
|
||||||
<p className="text-white font-bold text-lg leading-tight">App Store</p>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
{/* Google Play */}
|
{/* Google Play */}
|
||||||
<a
|
<a
|
||||||
href="https://play.google.com/store/apps/details?id=com.nova40.app"
|
href="https://play.google.com/store/apps/details?id=com.nova40.app"
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ export default function Footer() {
|
|||||||
<ul className="space-y-2.5">
|
<ul className="space-y-2.5">
|
||||||
<li><Link to="/privacy-policy" className="text-nova-textSecondary hover:text-white text-sm transition-colors hover:translate-x-1 inline-block">Privacy Policy</Link></li>
|
<li><Link to="/privacy-policy" className="text-nova-textSecondary hover:text-white text-sm transition-colors hover:translate-x-1 inline-block">Privacy Policy</Link></li>
|
||||||
<li><Link to="/terms-conditions" className="text-nova-textSecondary hover:text-white text-sm transition-colors hover:translate-x-1 inline-block">Terms & Conditions</Link></li>
|
<li><Link to="/terms-conditions" className="text-nova-textSecondary hover:text-white text-sm transition-colors hover:translate-x-1 inline-block">Terms & Conditions</Link></li>
|
||||||
|
<li><Link to="/delete-account" className="text-nova-textSecondary hover:text-white text-sm transition-colors hover:translate-x-1 inline-block">Delete Account</Link></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -180,8 +180,8 @@ export default function Hero() {
|
|||||||
|
|
||||||
{/* Nova40 Icon */}
|
{/* Nova40 Icon */}
|
||||||
<div className="relative mb-4">
|
<div className="relative mb-4">
|
||||||
<Nova40Icon size={64} rounded={false} />
|
<Nova40Icon size={96} rounded />
|
||||||
<div className="absolute -inset-2 bg-nova-primary/20 rounded-full blur-xl -z-10" />
|
<div className="absolute -inset-3 bg-nova-primary/20 rounded-2xl blur-xl -z-10" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p className="text-white text-sm font-bold mb-0.5">Day 17 of 40</p>
|
<p className="text-white text-sm font-bold mb-0.5">Day 17 of 40</p>
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ export default function LegalLayout({ title, updated, children }) {
|
|||||||
<div className="flex gap-4">
|
<div className="flex gap-4">
|
||||||
<Link to="/privacy-policy" className="text-nova-textMuted hover:text-nova-textSecondary text-sm transition-colors">Privacy Policy</Link>
|
<Link to="/privacy-policy" className="text-nova-textMuted hover:text-nova-textSecondary text-sm transition-colors">Privacy Policy</Link>
|
||||||
<Link to="/terms-conditions" className="text-nova-textMuted hover:text-nova-textSecondary text-sm transition-colors">Terms & Conditions</Link>
|
<Link to="/terms-conditions" className="text-nova-textMuted hover:text-nova-textSecondary text-sm transition-colors">Terms & Conditions</Link>
|
||||||
|
<Link to="/delete-account" className="text-nova-textMuted hover:text-nova-textSecondary text-sm transition-colors">Delete Account</Link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import { Nova40IconAnimated } from './Nova40Icon'
|
|
||||||
import useReveal from '../hooks/useReveal'
|
import useReveal from '../hooks/useReveal'
|
||||||
|
|
||||||
const quotes = [
|
const quotes = [
|
||||||
@@ -53,9 +52,11 @@ export default function Testimonial() {
|
|||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Center icon */}
|
{/* Section divider */}
|
||||||
<div className="flex justify-center mt-12 reveal">
|
<div className="flex items-center justify-center gap-4 mt-16 reveal">
|
||||||
<Nova40IconAnimated size={48} />
|
<div className="w-16 h-px bg-gradient-to-r from-transparent to-nova-primary/40" />
|
||||||
|
<div className="w-2 h-2 rounded-full bg-nova-primary/50" />
|
||||||
|
<div className="w-16 h-px bg-gradient-to-l from-transparent to-nova-primary/40" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import { BrowserRouter, Routes, Route } from 'react-router-dom'
|
|||||||
import App from './App'
|
import App from './App'
|
||||||
import PrivacyPolicy from './pages/PrivacyPolicy'
|
import PrivacyPolicy from './pages/PrivacyPolicy'
|
||||||
import TermsConditions from './pages/TermsConditions'
|
import TermsConditions from './pages/TermsConditions'
|
||||||
|
import DeleteAccount from './pages/DeleteAccount'
|
||||||
import './index.css'
|
import './index.css'
|
||||||
|
|
||||||
ReactDOM.createRoot(document.getElementById('root')).render(
|
ReactDOM.createRoot(document.getElementById('root')).render(
|
||||||
@@ -13,6 +14,7 @@ ReactDOM.createRoot(document.getElementById('root')).render(
|
|||||||
<Route path="/" element={<App />} />
|
<Route path="/" element={<App />} />
|
||||||
<Route path="/privacy-policy" element={<PrivacyPolicy />} />
|
<Route path="/privacy-policy" element={<PrivacyPolicy />} />
|
||||||
<Route path="/terms-conditions" element={<TermsConditions />} />
|
<Route path="/terms-conditions" element={<TermsConditions />} />
|
||||||
|
<Route path="/delete-account" element={<DeleteAccount />} />
|
||||||
</Routes>
|
</Routes>
|
||||||
</BrowserRouter>
|
</BrowserRouter>
|
||||||
</React.StrictMode>,
|
</React.StrictMode>,
|
||||||
|
|||||||
@@ -0,0 +1,123 @@
|
|||||||
|
import React, { useState } from 'react'
|
||||||
|
import LegalLayout from '../components/LegalLayout'
|
||||||
|
|
||||||
|
export default function DeleteAccount() {
|
||||||
|
const [email, setEmail] = useState('')
|
||||||
|
const [reason, setReason] = useState('')
|
||||||
|
const [confirm, setConfirm] = useState(false)
|
||||||
|
const [submitted, setSubmitted] = useState(false)
|
||||||
|
|
||||||
|
const handleSubmit = (e) => {
|
||||||
|
e.preventDefault()
|
||||||
|
if (!email || !confirm) return
|
||||||
|
setSubmitted(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<LegalLayout title="Delete Account" updated="April 29, 2026">
|
||||||
|
<div className="max-w-lg">
|
||||||
|
<div className="glass-card p-6 sm:p-8 mb-8">
|
||||||
|
<div className="flex items-center gap-3 mb-4">
|
||||||
|
<span className="text-2xl">⚠️</span>
|
||||||
|
<h2 className="text-white font-bold text-lg">Before you proceed</h2>
|
||||||
|
</div>
|
||||||
|
<p className="text-nova-textSecondary text-sm leading-relaxed mb-4">
|
||||||
|
Deleting your account will <span className="text-nova-error font-semibold">permanently remove</span> all your data, including:
|
||||||
|
</p>
|
||||||
|
<ul className="space-y-2 mb-4">
|
||||||
|
{[
|
||||||
|
'Your account and login credentials',
|
||||||
|
'All identity journeys and habit data',
|
||||||
|
'Daily logs, mood tracking, and journal entries',
|
||||||
|
'AI-generated reflections and transformation stories',
|
||||||
|
'Progress statistics and game scores',
|
||||||
|
'Profile information (nickname, avatar)',
|
||||||
|
].map((item, i) => (
|
||||||
|
<li key={i} className="flex gap-2 text-sm">
|
||||||
|
<span className="text-nova-error mt-0.5">•</span>
|
||||||
|
<span className="text-nova-textSecondary">{item}</span>
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
<p className="text-nova-textMuted text-xs">
|
||||||
|
This action cannot be undone. If you only want to start over, consider using the "Reset Journey" option inside the app instead.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{!submitted ? (
|
||||||
|
<form onSubmit={handleSubmit} className="space-y-5">
|
||||||
|
<div>
|
||||||
|
<label htmlFor="email" className="block text-white text-sm font-semibold mb-2">
|
||||||
|
Account email address
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
id="email"
|
||||||
|
type="email"
|
||||||
|
required
|
||||||
|
value={email}
|
||||||
|
onChange={(e) => setEmail(e.target.value)}
|
||||||
|
placeholder="your@email.com"
|
||||||
|
className="w-full px-4 py-3 bg-nova-surface border border-nova-border rounded-xl text-white text-sm placeholder:text-nova-textMuted focus:outline-none focus:border-nova-primary transition-colors"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label htmlFor="reason" className="block text-white text-sm font-semibold mb-2">
|
||||||
|
Why are you leaving? <span className="text-nova-textMuted font-normal">(optional)</span>
|
||||||
|
</label>
|
||||||
|
<textarea
|
||||||
|
id="reason"
|
||||||
|
value={reason}
|
||||||
|
onChange={(e) => setReason(e.target.value)}
|
||||||
|
placeholder="Help us improve Nova40..."
|
||||||
|
rows={3}
|
||||||
|
className="w-full px-4 py-3 bg-nova-surface border border-nova-border rounded-xl text-white text-sm placeholder:text-nova-textMuted focus:outline-none focus:border-nova-primary transition-colors resize-none"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<label className="flex items-start gap-3 cursor-pointer">
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
checked={confirm}
|
||||||
|
onChange={(e) => setConfirm(e.target.checked)}
|
||||||
|
className="mt-1 w-4 h-4 rounded accent-nova-error"
|
||||||
|
/>
|
||||||
|
<span className="text-nova-textSecondary text-sm leading-relaxed">
|
||||||
|
I understand that all my data will be <span className="text-nova-error font-medium">permanently deleted</span> and this action cannot be undone.
|
||||||
|
</span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<button
|
||||||
|
type="submit"
|
||||||
|
disabled={!email || !confirm}
|
||||||
|
className="w-full py-3.5 bg-nova-error/90 hover:bg-nova-error disabled:opacity-30 disabled:cursor-not-allowed rounded-xl text-white font-semibold text-sm transition-all"
|
||||||
|
>
|
||||||
|
Delete My Account
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
) : (
|
||||||
|
<div className="glass-card p-8 text-center">
|
||||||
|
<span className="text-4xl block mb-4">✅</span>
|
||||||
|
<h3 className="text-white font-bold text-lg mb-2">Request submitted</h3>
|
||||||
|
<p className="text-nova-textSecondary text-sm leading-relaxed mb-4">
|
||||||
|
We've received your account deletion request for <span className="text-white font-medium">{email}</span>. Your account and all associated data will be deleted within 48 hours.
|
||||||
|
</p>
|
||||||
|
<p className="text-nova-textMuted text-xs">
|
||||||
|
You can also delete your account instantly from the app: Profile → Delete Account.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<div className="mt-8 p-4 border border-nova-border rounded-xl">
|
||||||
|
<p className="text-nova-textSecondary text-xs leading-relaxed">
|
||||||
|
<span className="text-white font-semibold">Prefer to do it from the app?</span> Open Nova40 → Profile → scroll down → tap "Delete Account". This will instantly delete all your data.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p className="text-nova-textMuted text-xs mt-6">
|
||||||
|
Questions? Contact us at <a href="mailto:support@nova40.app" className="text-nova-primary hover:text-nova-primaryLight transition-colors">support@nova40.app</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</LegalLayout>
|
||||||
|
)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user