Skip to content

Commit cc20360

Browse files
author
teycir
committed
feat: replace emojis with Lucide icons in UI components
- Updated LoadingSpinner, Footer, and IdleBlur to use Hourglass, Heart, and Lock icons from lucide-react instead of emojis - Modified PageHeader to accept React.ReactNode for icon prop, enabling component-based icons - Enhanced StructuredData and download button with Download icon for consistency - Improves UI scalability, accessibility, and design uniformity across the app
1 parent ab81313 commit cc20360

13 files changed

Lines changed: 785 additions & 320 deletions

File tree

app/components/Common.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use client';
22

33
import { motion } from 'framer-motion';
4+
import { Hourglass } from 'lucide-react';
45

56
export function ErrorMessage({ message }: { message: string }) {
67
return (
@@ -18,7 +19,7 @@ export function LoadingSpinner({ text = 'Loading...' }: { text?: string }) {
1819
return (
1920
<div className="min-h-screen flex items-center justify-center">
2021
<div className="text-center">
21-
<div className="animate-spin text-4xl mb-4"></div>
22+
<Hourglass className="w-12 h-12 text-neon-green mx-auto mb-4 animate-spin" />
2223
<p className="text-neon-green/70">{text}</p>
2324
</div>
2425
</div>
@@ -44,13 +45,13 @@ export function PageHeader({
4445
title,
4546
subtitle
4647
}: {
47-
icon: string;
48+
icon: React.ReactNode;
4849
title: string;
4950
subtitle?: string;
5051
}) {
5152
return (
5253
<div className="text-center mb-8">
53-
<div className="text-6xl mb-4">{icon}</div>
54+
<div className="flex justify-center mb-4">{icon}</div>
5455
<h1 className="text-3xl font-bold glow-text mb-4">{title}</h1>
5556
{subtitle && <p className="text-neon-green/70">{subtitle}</p>}
5657
</div>

app/components/Footer.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
'use client';
22

3+
import { Heart, Lock } from 'lucide-react';
4+
35
export function Footer() {
46
return (
57
<footer className="fixed bottom-0 left-0 right-0 p-4 bg-dark-bg/90 backdrop-blur-sm border-t border-neon-green/10 z-50">
68
<div className="max-w-7xl mx-auto flex flex-col sm:flex-row items-center justify-between gap-2 text-xs text-neon-green/50 font-mono px-2">
79
<div className="flex items-center gap-2 flex-wrap justify-center">
8-
<span className="text-neon-green/70">Built with 💚 and 🔒 by <a href="https://teycirbensoltane.tn" target="_blank" rel="noopener noreferrer" className="hover:text-neon-green transition-colors underline">Teycir Ben Soltane</a></span>
10+
<span className="text-neon-green/70 flex items-center gap-1">
11+
Built with <Heart className="w-3 h-3 inline fill-current" /> and <Lock className="w-3 h-3 inline" /> by <a href="https://teycirbensoltane.tn" target="_blank" rel="noopener noreferrer" className="hover:text-neon-green transition-colors underline">Teycir Ben Soltane</a>
12+
</span>
913
<span></span>
1014
<a href="/how-it-works" className="hover:text-neon-green transition-colors">How It Works</a>
1115
<span></span>

app/components/IdleBlur.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use client';
22
import { useState, useEffect, useRef } from 'react';
33
import { motion, AnimatePresence } from 'framer-motion';
4+
import { Lock } from 'lucide-react';
45

56
export function IdleBlur() {
67
const [isIdle, setIsIdle] = useState(false);
@@ -59,9 +60,9 @@ export function IdleBlur() {
5960
initial={{ scale: 0.8, opacity: 0 }}
6061
animate={{ scale: 1, opacity: 1 }}
6162
transition={{ delay: 0.2 }}
62-
className="text-neon-green/50 text-6xl"
63+
className="flex justify-center"
6364
>
64-
🔒
65+
<Lock className="w-16 h-16 text-neon-green/50" />
6566
</motion.div>
6667
<motion.p
6768
initial={{ opacity: 0 }}

app/components/StructuredData.tsx

Lines changed: 61 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,37 +4,84 @@ export function StructuredData() {
44
const structuredData = {
55
'@context': 'https://schema.org',
66
'@type': 'SoftwareApplication',
7-
name: 'TimeSeal',
7+
name: 'TimeSeal - Cryptographic Time-Locked Vault',
88
applicationCategory: 'SecurityApplication',
99
operatingSystem: 'Web',
10+
url: 'https://timeseal.dev',
1011
offers: {
1112
'@type': 'Offer',
1213
price: '0',
1314
priceCurrency: 'USD',
1415
},
15-
description: 'Cryptographic time-locked vault with dead man\'s switch. Secure encryption for messages and files that unlock automatically at a future date or after inactivity.',
16+
description: 'Cryptographically enforced time-locked vault with dead man\'s switch. Create encrypted messages that unlock automatically at a future date or after inactivity. Zero-trust, edge-native AES-GCM encryption.',
1617
featureList: [
17-
'Time-locked encryption',
18-
'Dead man\'s switch',
19-
'AES-GCM encryption',
20-
'Zero-trust architecture',
21-
'Split-key cryptography',
22-
'Cloudflare edge deployment',
23-
'D1 database storage',
18+
'Time-locked encryption with AES-GCM-256',
19+
'Dead man\'s switch with pulse mechanism',
20+
'Zero-trust split-key architecture',
21+
'Edge-native on Cloudflare Workers',
22+
'D1 database encrypted storage',
23+
'Cryptographic receipts with HMAC',
24+
'Rate limiting and bot protection',
25+
'Audit logging for compliance',
2426
],
2527
screenshot: 'https://timeseal.dev/explainerimage.png',
28+
author: {
29+
'@type': 'Organization',
30+
name: 'TimeSeal',
31+
url: 'https://timeseal.dev'
32+
},
33+
datePublished: '2024-01-01',
34+
softwareVersion: '0.5.3',
2635
aggregateRating: {
2736
'@type': 'AggregateRating',
2837
ratingValue: '5',
2938
ratingCount: '1',
3039
},
3140
};
3241

42+
const breadcrumbData = {
43+
'@context': 'https://schema.org',
44+
'@type': 'BreadcrumbList',
45+
itemListElement: [
46+
{
47+
'@type': 'ListItem',
48+
position: 1,
49+
name: 'Home',
50+
item: 'https://timeseal.dev'
51+
},
52+
{
53+
'@type': 'ListItem',
54+
position: 2,
55+
name: 'How It Works',
56+
item: 'https://timeseal.dev/how-it-works'
57+
},
58+
{
59+
'@type': 'ListItem',
60+
position: 3,
61+
name: 'Security',
62+
item: 'https://timeseal.dev/security'
63+
},
64+
{
65+
'@type': 'ListItem',
66+
position: 4,
67+
name: 'FAQ',
68+
item: 'https://timeseal.dev/faq'
69+
}
70+
]
71+
};
72+
3373
return (
34-
<Script
35-
id="structured-data"
36-
type="application/ld+json"
37-
dangerouslySetInnerHTML={{ __html: JSON.stringify(structuredData) }}
38-
/>
74+
<>
75+
<Script
76+
id="structured-data"
77+
type="application/ld+json"
78+
dangerouslySetInnerHTML={{ __html: JSON.stringify(structuredData) }}
79+
/>
80+
<Script
81+
id="breadcrumb-data"
82+
type="application/ld+json"
83+
dangerouslySetInnerHTML={{ __html: JSON.stringify(breadcrumbData) }}
84+
/>
85+
</>
3986
);
4087
}

0 commit comments

Comments
 (0)