@beknurakhmed/webforge-cli 0.1.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.
- package/README.md +212 -0
- package/dist/index.js +386 -0
- package/package.json +63 -0
- package/templates/angular/angular.json +36 -0
- package/templates/angular/package.json +29 -0
- package/templates/angular/src/app/app.component.ts +27 -0
- package/templates/angular/src/index.html +11 -0
- package/templates/angular/src/main.ts +4 -0
- package/templates/angular/src/styles.css +24 -0
- package/templates/angular/tsconfig.json +27 -0
- package/templates/base/README.md +16 -0
- package/templates/base/_gitignore +11 -0
- package/templates/extras/eslint/config/eslint.config.js +18 -0
- package/templates/extras/eslint/deps.json +7 -0
- package/templates/extras/prettier/config/.prettierignore +6 -0
- package/templates/extras/prettier/config/.prettierrc +7 -0
- package/templates/extras/prettier/deps.json +5 -0
- package/templates/nextjs/next.config.ts +5 -0
- package/templates/nextjs/package.json +16 -0
- package/templates/nextjs/src/app/globals.css +36 -0
- package/templates/nextjs/src/app/layout.tsx +19 -0
- package/templates/nextjs/src/app/page.tsx +8 -0
- package/templates/nextjs/tsconfig.json +21 -0
- package/templates/nuxt/app.vue +3 -0
- package/templates/nuxt/assets/css/main.css +24 -0
- package/templates/nuxt/nuxt.config.ts +5 -0
- package/templates/nuxt/package.json +17 -0
- package/templates/nuxt/pages/index.vue +20 -0
- package/templates/nuxt/tsconfig.json +3 -0
- package/templates/overlays/blog/react/src/App.css +41 -0
- package/templates/overlays/blog/react/src/App.tsx +39 -0
- package/templates/overlays/blog/react/src/components/BlogFooter.tsx +7 -0
- package/templates/overlays/blog/react/src/components/BlogHeader.tsx +15 -0
- package/templates/overlays/blog/react/src/components/BlogSidebar.tsx +26 -0
- package/templates/overlays/blog/react/src/components/PostList.tsx +27 -0
- package/templates/overlays/crm/react/src/App.css +48 -0
- package/templates/overlays/crm/react/src/App.tsx +49 -0
- package/templates/overlays/crm/react/src/components/ContactsTable.tsx +40 -0
- package/templates/overlays/crm/react/src/components/Filters.tsx +22 -0
- package/templates/overlays/crm/react/src/components/Sidebar.tsx +25 -0
- package/templates/overlays/crm/react/src/components/StatsCards.tsx +26 -0
- package/templates/overlays/dashboard/react/src/App.css +64 -0
- package/templates/overlays/dashboard/react/src/App.tsx +30 -0
- package/templates/overlays/dashboard/react/src/components/ChartPlaceholder.tsx +18 -0
- package/templates/overlays/dashboard/react/src/components/DataTable.tsx +44 -0
- package/templates/overlays/dashboard/react/src/components/KPICards.tsx +22 -0
- package/templates/overlays/dashboard/react/src/components/Sidebar.tsx +24 -0
- package/templates/overlays/ecommerce/react/src/App.css +82 -0
- package/templates/overlays/ecommerce/react/src/App.tsx +68 -0
- package/templates/overlays/ecommerce/react/src/components/Cart.tsx +47 -0
- package/templates/overlays/ecommerce/react/src/components/Footer.tsx +29 -0
- package/templates/overlays/ecommerce/react/src/components/Header.tsx +26 -0
- package/templates/overlays/ecommerce/react/src/components/ProductGrid.tsx +32 -0
- package/templates/overlays/ecommerce/vue/src/App.vue +44 -0
- package/templates/overlays/ecommerce/vue/src/components/CartPanel.vue +46 -0
- package/templates/overlays/ecommerce/vue/src/components/ProductGrid.vue +40 -0
- package/templates/overlays/ecommerce/vue/src/components/StoreFooter.vue +17 -0
- package/templates/overlays/ecommerce/vue/src/components/StoreHeader.vue +33 -0
- package/templates/overlays/landing/angular/src/app/app.component.ts +21 -0
- package/templates/overlays/landing/angular/src/app/components/cta.component.ts +24 -0
- package/templates/overlays/landing/angular/src/app/components/features.component.ts +42 -0
- package/templates/overlays/landing/angular/src/app/components/footer.component.ts +45 -0
- package/templates/overlays/landing/angular/src/app/components/hero.component.ts +41 -0
- package/templates/overlays/landing/nextjs/src/app/components/CTA.tsx +12 -0
- package/templates/overlays/landing/nextjs/src/app/components/Features.tsx +26 -0
- package/templates/overlays/landing/nextjs/src/app/components/Footer.tsx +27 -0
- package/templates/overlays/landing/nextjs/src/app/components/Hero.tsx +22 -0
- package/templates/overlays/landing/nextjs/src/app/globals.css +49 -0
- package/templates/overlays/landing/nextjs/src/app/page.tsx +15 -0
- package/templates/overlays/landing/nuxt/components/LandingCta.vue +18 -0
- package/templates/overlays/landing/nuxt/components/LandingFeatures.vue +36 -0
- package/templates/overlays/landing/nuxt/components/LandingFooter.vue +29 -0
- package/templates/overlays/landing/nuxt/components/LandingHero.vue +35 -0
- package/templates/overlays/landing/nuxt/pages/index.vue +15 -0
- package/templates/overlays/landing/react/src/App.css +70 -0
- package/templates/overlays/landing/react/src/App.tsx +18 -0
- package/templates/overlays/landing/react/src/components/CTA.tsx +14 -0
- package/templates/overlays/landing/react/src/components/Features.tsx +50 -0
- package/templates/overlays/landing/react/src/components/Footer.tsx +34 -0
- package/templates/overlays/landing/react/src/components/Hero.tsx +22 -0
- package/templates/overlays/landing/vanilla/src/main.ts +68 -0
- package/templates/overlays/landing/vanilla/src/style.css +43 -0
- package/templates/overlays/landing/vue/src/App.vue +19 -0
- package/templates/overlays/landing/vue/src/components/AppFooter.vue +44 -0
- package/templates/overlays/landing/vue/src/components/CTA.vue +21 -0
- package/templates/overlays/landing/vue/src/components/Features.vue +36 -0
- package/templates/overlays/landing/vue/src/components/Hero.vue +35 -0
- package/templates/overlays/portfolio/react/src/App.css +81 -0
- package/templates/overlays/portfolio/react/src/App.tsx +20 -0
- package/templates/overlays/portfolio/react/src/components/ContactForm.tsx +29 -0
- package/templates/overlays/portfolio/react/src/components/HeroSection.tsx +24 -0
- package/templates/overlays/portfolio/react/src/components/PortfolioFooter.tsx +14 -0
- package/templates/overlays/portfolio/react/src/components/Projects.tsx +33 -0
- package/templates/overlays/portfolio/react/src/components/Skills.tsx +27 -0
- package/templates/react/index.html +13 -0
- package/templates/react/package.json +19 -0
- package/templates/react/public/vite.svg +1 -0
- package/templates/react/src/App.css +11 -0
- package/templates/react/src/App.tsx +12 -0
- package/templates/react/src/index.css +42 -0
- package/templates/react/src/main.tsx +10 -0
- package/templates/react/vite.config.ts +6 -0
- package/templates/state/mobx/deps.json +6 -0
- package/templates/state/mobx/react/src/store/AppStore.ts +15 -0
- package/templates/state/ngrx/angular/src/app/store/app.state.ts +22 -0
- package/templates/state/ngrx/deps.json +7 -0
- package/templates/state/pinia/deps.json +5 -0
- package/templates/state/pinia/vue/src/store/useAppStore.ts +15 -0
- package/templates/state/redux/deps.json +6 -0
- package/templates/state/redux/react/src/store/counterSlice.ts +20 -0
- package/templates/state/redux/react/src/store/index.ts +11 -0
- package/templates/state/rxjs/angular/src/app/services/app-state.service.ts +18 -0
- package/templates/state/rxjs/deps.json +3 -0
- package/templates/state/zustand/deps.json +5 -0
- package/templates/state/zustand/react/src/store/useStore.ts +15 -0
- package/templates/styling/angular-material/deps.json +6 -0
- package/templates/styling/ant-design/deps.json +5 -0
- package/templates/styling/chakra-ui/deps.json +5 -0
- package/templates/styling/css-modules/deps.json +3 -0
- package/templates/styling/material-ui/deps.json +7 -0
- package/templates/styling/scss/deps.json +5 -0
- package/templates/styling/styled-components/deps.json +5 -0
- package/templates/styling/tailwind/config/postcss.config.js +5 -0
- package/templates/styling/tailwind/config/tailwind.config.js +11 -0
- package/templates/styling/tailwind/deps.json +6 -0
- package/templates/vanilla/index.html +13 -0
- package/templates/vanilla/package.json +14 -0
- package/templates/vanilla/src/main.ts +9 -0
- package/templates/vanilla/src/style.css +36 -0
- package/templates/vanilla/vite.config.ts +3 -0
- package/templates/vue/index.html +13 -0
- package/templates/vue/package.json +18 -0
- package/templates/vue/src/App.vue +23 -0
- package/templates/vue/src/main.ts +5 -0
- package/templates/vue/src/style.css +39 -0
- package/templates/vue/vite.config.ts +6 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<header class="hero">
|
|
3
|
+
<nav class="nav">
|
|
4
|
+
<div class="logo">{{projectName}}</div>
|
|
5
|
+
<div class="nav-links">
|
|
6
|
+
<a href="#features">Features</a>
|
|
7
|
+
<a href="#cta">Pricing</a>
|
|
8
|
+
<a href="#contact">Contact</a>
|
|
9
|
+
</div>
|
|
10
|
+
</nav>
|
|
11
|
+
<div class="hero-content">
|
|
12
|
+
<h1>Build Something Amazing</h1>
|
|
13
|
+
<p>A modern landing page template to kickstart your next project.</p>
|
|
14
|
+
<div class="hero-actions">
|
|
15
|
+
<button class="btn btn-primary">Get Started</button>
|
|
16
|
+
<button class="btn btn-secondary">Learn More</button>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
</header>
|
|
20
|
+
</template>
|
|
21
|
+
|
|
22
|
+
<style scoped>
|
|
23
|
+
.hero { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding-bottom: 4rem; }
|
|
24
|
+
.nav { display: flex; justify-content: space-between; align-items: center; padding: 1rem 2rem; max-width: 1200px; margin: 0 auto; }
|
|
25
|
+
.logo { font-size: 1.5rem; font-weight: 700; }
|
|
26
|
+
.nav-links { display: flex; gap: 2rem; }
|
|
27
|
+
.nav-links a { color: rgba(255,255,255,0.9); text-decoration: none; font-weight: 500; }
|
|
28
|
+
.hero-content { text-align: center; padding: 4rem 2rem; max-width: 800px; margin: 0 auto; }
|
|
29
|
+
.hero-content h1 { font-size: 3.5rem; font-weight: 800; margin-bottom: 1.5rem; line-height: 1.1; }
|
|
30
|
+
.hero-content p { font-size: 1.25rem; opacity: 0.9; margin-bottom: 2rem; }
|
|
31
|
+
.hero-actions { display: flex; gap: 1rem; justify-content: center; }
|
|
32
|
+
.btn { padding: 0.75rem 1.5rem; border-radius: 8px; font-size: 1rem; font-weight: 600; cursor: pointer; border: 2px solid transparent; }
|
|
33
|
+
.btn-primary { background: #4f46e5; color: white; border-color: #4f46e5; }
|
|
34
|
+
.btn-secondary { background: transparent; color: white; border-color: rgba(255,255,255,0.5); }
|
|
35
|
+
</style>
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
.landing { min-height: 100vh; }
|
|
2
|
+
|
|
3
|
+
/* Nav */
|
|
4
|
+
.nav { display: flex; justify-content: space-between; align-items: center; padding: 1rem 2rem; max-width: 1200px; margin: 0 auto; }
|
|
5
|
+
.logo { font-size: 1.5rem; font-weight: 700; color: #4f46e5; }
|
|
6
|
+
.nav-links { display: flex; gap: 2rem; }
|
|
7
|
+
.nav-links a { color: #374151; text-decoration: none; font-weight: 500; transition: color 0.2s; }
|
|
8
|
+
.nav-links a:hover { color: #4f46e5; }
|
|
9
|
+
|
|
10
|
+
/* Hero */
|
|
11
|
+
.hero { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding-bottom: 4rem; }
|
|
12
|
+
.hero .logo { color: white; }
|
|
13
|
+
.hero .nav-links a { color: rgba(255,255,255,0.9); }
|
|
14
|
+
.hero-content { text-align: center; padding: 4rem 2rem; max-width: 800px; margin: 0 auto; }
|
|
15
|
+
.hero-content h1 { font-size: 3.5rem; font-weight: 800; margin-bottom: 1.5rem; line-height: 1.1; }
|
|
16
|
+
.hero-content p { font-size: 1.25rem; opacity: 0.9; margin-bottom: 2rem; line-height: 1.6; }
|
|
17
|
+
.hero-actions { display: flex; gap: 1rem; justify-content: center; flex-wrap: wrap; }
|
|
18
|
+
|
|
19
|
+
/* Buttons */
|
|
20
|
+
.btn { padding: 0.75rem 1.5rem; border-radius: 8px; font-size: 1rem; font-weight: 600; cursor: pointer; transition: all 0.2s; border: 2px solid transparent; }
|
|
21
|
+
.btn-primary { background: #4f46e5; color: white; border-color: #4f46e5; }
|
|
22
|
+
.btn-primary:hover { background: #4338ca; border-color: #4338ca; }
|
|
23
|
+
.btn-secondary { background: transparent; color: white; border-color: rgba(255,255,255,0.5); }
|
|
24
|
+
.btn-secondary:hover { background: rgba(255,255,255,0.1); border-color: white; }
|
|
25
|
+
.btn-large { padding: 1rem 2.5rem; font-size: 1.1rem; }
|
|
26
|
+
|
|
27
|
+
/* Features */
|
|
28
|
+
.features { padding: 5rem 2rem; max-width: 1200px; margin: 0 auto; text-align: center; }
|
|
29
|
+
.features h2 { font-size: 2.5rem; font-weight: 700; margin-bottom: 0.5rem; color: #111827; }
|
|
30
|
+
.features-subtitle { color: #6b7280; font-size: 1.1rem; margin-bottom: 3rem; }
|
|
31
|
+
.feature-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 2rem; text-align: left; }
|
|
32
|
+
.feature-card { padding: 2rem; border-radius: 12px; border: 1px solid #e5e7eb; transition: all 0.2s; }
|
|
33
|
+
.feature-card:hover { box-shadow: 0 10px 25px rgba(0,0,0,0.08); transform: translateY(-2px); }
|
|
34
|
+
.feature-icon { font-size: 2rem; display: block; margin-bottom: 1rem; }
|
|
35
|
+
.feature-card h3 { font-size: 1.25rem; font-weight: 600; margin-bottom: 0.5rem; color: #111827; }
|
|
36
|
+
.feature-card p { color: #6b7280; line-height: 1.6; }
|
|
37
|
+
|
|
38
|
+
/* CTA */
|
|
39
|
+
.cta { background: #f9fafb; padding: 5rem 2rem; text-align: center; }
|
|
40
|
+
.cta-content { max-width: 600px; margin: 0 auto; }
|
|
41
|
+
.cta h2 { font-size: 2.5rem; font-weight: 700; margin-bottom: 1rem; color: #111827; }
|
|
42
|
+
.cta p { color: #6b7280; font-size: 1.1rem; margin-bottom: 2rem; }
|
|
43
|
+
.cta-note { margin-top: 0.75rem; font-size: 0.875rem; color: #9ca3af; }
|
|
44
|
+
|
|
45
|
+
/* Footer */
|
|
46
|
+
.footer { background: #111827; color: #d1d5db; padding: 4rem 2rem 2rem; }
|
|
47
|
+
.footer-content { display: flex; justify-content: space-between; max-width: 1200px; margin: 0 auto; gap: 4rem; flex-wrap: wrap; }
|
|
48
|
+
.footer-brand h3 { color: white; font-size: 1.5rem; margin-bottom: 0.5rem; }
|
|
49
|
+
.footer-brand p { max-width: 300px; line-height: 1.6; }
|
|
50
|
+
.footer-links { display: flex; gap: 4rem; flex-wrap: wrap; }
|
|
51
|
+
.footer-col { display: flex; flex-direction: column; gap: 0.5rem; }
|
|
52
|
+
.footer-col h4 { color: white; font-size: 0.875rem; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.5rem; }
|
|
53
|
+
.footer-col a { color: #9ca3af; text-decoration: none; font-size: 0.9rem; transition: color 0.2s; }
|
|
54
|
+
.footer-col a:hover { color: white; }
|
|
55
|
+
.footer-bottom { border-top: 1px solid #374151; margin-top: 3rem; padding-top: 1.5rem; text-align: center; max-width: 1200px; margin-left: auto; margin-right: auto; }
|
|
56
|
+
.footer-bottom p { font-size: 0.875rem; color: #6b7280; }
|
|
57
|
+
|
|
58
|
+
@media (max-width: 768px) {
|
|
59
|
+
.hero-content h1 { font-size: 2.5rem; }
|
|
60
|
+
.nav { flex-direction: column; gap: 1rem; }
|
|
61
|
+
.footer-content { flex-direction: column; }
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
@media (prefers-color-scheme: dark) {
|
|
65
|
+
.features h2, .feature-card h3, .cta h2 { color: rgba(255,255,255,0.87); }
|
|
66
|
+
.features-subtitle, .feature-card p, .cta p { color: #9ca3af; }
|
|
67
|
+
.feature-card { border-color: #374151; }
|
|
68
|
+
.cta { background: #1f2937; }
|
|
69
|
+
.nav-links a { color: #d1d5db; }
|
|
70
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Hero } from './components/Hero';
|
|
2
|
+
import { Features } from './components/Features';
|
|
3
|
+
import { CTA } from './components/CTA';
|
|
4
|
+
import { Footer } from './components/Footer';
|
|
5
|
+
import './App.css';
|
|
6
|
+
|
|
7
|
+
function App() {
|
|
8
|
+
return (
|
|
9
|
+
<div className="landing">
|
|
10
|
+
<Hero />
|
|
11
|
+
<Features />
|
|
12
|
+
<CTA />
|
|
13
|
+
<Footer />
|
|
14
|
+
</div>
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export default App;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function CTA() {
|
|
2
|
+
return (
|
|
3
|
+
<section id="cta" className="cta">
|
|
4
|
+
<div className="cta-content">
|
|
5
|
+
<h2>Ready to Get Started?</h2>
|
|
6
|
+
<p>Join thousands of developers who are building amazing products.</p>
|
|
7
|
+
<div className="cta-actions">
|
|
8
|
+
<button className="btn btn-primary btn-large">Start Free Trial</button>
|
|
9
|
+
<p className="cta-note">No credit card required</p>
|
|
10
|
+
</div>
|
|
11
|
+
</div>
|
|
12
|
+
</section>
|
|
13
|
+
);
|
|
14
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
const features = [
|
|
2
|
+
{
|
|
3
|
+
icon: '⚡',
|
|
4
|
+
title: 'Lightning Fast',
|
|
5
|
+
description: 'Optimized for performance with lazy loading, code splitting, and modern build tools.',
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
icon: '🎨',
|
|
9
|
+
title: 'Beautiful Design',
|
|
10
|
+
description: 'Clean, modern UI with responsive layouts that look great on any device.',
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
icon: '🔒',
|
|
14
|
+
title: 'Secure by Default',
|
|
15
|
+
description: 'Built with security best practices including HTTPS, CSP headers, and input validation.',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
icon: '🧩',
|
|
19
|
+
title: 'Modular Architecture',
|
|
20
|
+
description: 'Component-based structure makes it easy to customize and extend functionality.',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
icon: '📱',
|
|
24
|
+
title: 'Mobile First',
|
|
25
|
+
description: 'Designed for mobile devices first, then scaled up for tablets and desktops.',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
icon: '🚀',
|
|
29
|
+
title: 'Easy Deployment',
|
|
30
|
+
description: 'Deploy anywhere — Vercel, Netlify, AWS, or your own server in minutes.',
|
|
31
|
+
},
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
export function Features() {
|
|
35
|
+
return (
|
|
36
|
+
<section id="features" className="features">
|
|
37
|
+
<h2>Features</h2>
|
|
38
|
+
<p className="features-subtitle">Everything you need to build a modern web application</p>
|
|
39
|
+
<div className="feature-grid">
|
|
40
|
+
{features.map((feature, index) => (
|
|
41
|
+
<div key={index} className="feature-card">
|
|
42
|
+
<span className="feature-icon">{feature.icon}</span>
|
|
43
|
+
<h3>{feature.title}</h3>
|
|
44
|
+
<p>{feature.description}</p>
|
|
45
|
+
</div>
|
|
46
|
+
))}
|
|
47
|
+
</div>
|
|
48
|
+
</section>
|
|
49
|
+
);
|
|
50
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export function Footer() {
|
|
2
|
+
return (
|
|
3
|
+
<footer className="footer">
|
|
4
|
+
<div className="footer-content">
|
|
5
|
+
<div className="footer-brand">
|
|
6
|
+
<h3>{{projectName}}</h3>
|
|
7
|
+
<p>Building the future of the web, one project at a time.</p>
|
|
8
|
+
</div>
|
|
9
|
+
<div className="footer-links">
|
|
10
|
+
<div className="footer-col">
|
|
11
|
+
<h4>Product</h4>
|
|
12
|
+
<a href="#features">Features</a>
|
|
13
|
+
<a href="#cta">Pricing</a>
|
|
14
|
+
<a href="#">Documentation</a>
|
|
15
|
+
</div>
|
|
16
|
+
<div className="footer-col">
|
|
17
|
+
<h4>Company</h4>
|
|
18
|
+
<a href="#">About</a>
|
|
19
|
+
<a href="#">Blog</a>
|
|
20
|
+
<a href="#contact">Contact</a>
|
|
21
|
+
</div>
|
|
22
|
+
<div className="footer-col">
|
|
23
|
+
<h4>Legal</h4>
|
|
24
|
+
<a href="#">Privacy Policy</a>
|
|
25
|
+
<a href="#">Terms of Service</a>
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
<div className="footer-bottom">
|
|
30
|
+
<p>© 2025 {{projectName}}. All rights reserved.</p>
|
|
31
|
+
</div>
|
|
32
|
+
</footer>
|
|
33
|
+
);
|
|
34
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export function Hero() {
|
|
2
|
+
return (
|
|
3
|
+
<header className="hero">
|
|
4
|
+
<nav className="nav">
|
|
5
|
+
<div className="logo">{{projectName}}</div>
|
|
6
|
+
<div className="nav-links">
|
|
7
|
+
<a href="#features">Features</a>
|
|
8
|
+
<a href="#cta">Pricing</a>
|
|
9
|
+
<a href="#contact">Contact</a>
|
|
10
|
+
</div>
|
|
11
|
+
</nav>
|
|
12
|
+
<div className="hero-content">
|
|
13
|
+
<h1>Build Something Amazing</h1>
|
|
14
|
+
<p>A modern landing page template to kickstart your next project. Fast, responsive, and ready for production.</p>
|
|
15
|
+
<div className="hero-actions">
|
|
16
|
+
<button className="btn btn-primary">Get Started</button>
|
|
17
|
+
<button className="btn btn-secondary">Learn More</button>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
</header>
|
|
21
|
+
);
|
|
22
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import './style.css';
|
|
2
|
+
|
|
3
|
+
const app = document.querySelector<HTMLDivElement>('#app')!;
|
|
4
|
+
|
|
5
|
+
app.innerHTML = `
|
|
6
|
+
<div class="landing">
|
|
7
|
+
<header class="hero">
|
|
8
|
+
<nav class="nav">
|
|
9
|
+
<div class="logo">{{projectName}}</div>
|
|
10
|
+
<div class="nav-links">
|
|
11
|
+
<a href="#features">Features</a>
|
|
12
|
+
<a href="#cta">Pricing</a>
|
|
13
|
+
<a href="#contact">Contact</a>
|
|
14
|
+
</div>
|
|
15
|
+
</nav>
|
|
16
|
+
<div class="hero-content">
|
|
17
|
+
<h1>Build Something Amazing</h1>
|
|
18
|
+
<p>A modern landing page template to kickstart your next project.</p>
|
|
19
|
+
<div class="hero-actions">
|
|
20
|
+
<button class="btn btn-primary">Get Started</button>
|
|
21
|
+
<button class="btn btn-secondary">Learn More</button>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
</header>
|
|
25
|
+
|
|
26
|
+
<section id="features" class="features">
|
|
27
|
+
<h2>Features</h2>
|
|
28
|
+
<p class="subtitle">Everything you need to build a modern web application</p>
|
|
29
|
+
<div class="grid" id="feature-grid"></div>
|
|
30
|
+
</section>
|
|
31
|
+
|
|
32
|
+
<section id="cta" class="cta">
|
|
33
|
+
<h2>Ready to Get Started?</h2>
|
|
34
|
+
<p>Join thousands of developers building amazing products.</p>
|
|
35
|
+
<button class="btn btn-primary btn-large">Start Free Trial</button>
|
|
36
|
+
<p class="note">No credit card required</p>
|
|
37
|
+
</section>
|
|
38
|
+
|
|
39
|
+
<footer class="footer">
|
|
40
|
+
<div class="footer-content">
|
|
41
|
+
<div class="brand">
|
|
42
|
+
<h3>{{projectName}}</h3>
|
|
43
|
+
<p>Building the future of the web.</p>
|
|
44
|
+
</div>
|
|
45
|
+
<div class="links">
|
|
46
|
+
<div class="col"><h4>Product</h4><a href="#features">Features</a><a href="#cta">Pricing</a></div>
|
|
47
|
+
<div class="col"><h4>Company</h4><a href="#">About</a><a href="#">Blog</a></div>
|
|
48
|
+
<div class="col"><h4>Legal</h4><a href="#">Privacy</a><a href="#">Terms</a></div>
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
<div class="bottom"><p>© 2025 {{projectName}}. All rights reserved.</p></div>
|
|
52
|
+
</footer>
|
|
53
|
+
</div>
|
|
54
|
+
`;
|
|
55
|
+
|
|
56
|
+
const features = [
|
|
57
|
+
{ icon: '⚡', title: 'Lightning Fast', desc: 'Optimized for performance with lazy loading and code splitting.' },
|
|
58
|
+
{ icon: '🎨', title: 'Beautiful Design', desc: 'Clean, modern UI with responsive layouts.' },
|
|
59
|
+
{ icon: '🔒', title: 'Secure by Default', desc: 'Built with security best practices.' },
|
|
60
|
+
{ icon: '🧩', title: 'Modular Architecture', desc: 'Component-based structure for easy customization.' },
|
|
61
|
+
{ icon: '📱', title: 'Mobile First', desc: 'Designed for mobile, scaled up for desktop.' },
|
|
62
|
+
{ icon: '🚀', title: 'Easy Deployment', desc: 'Deploy anywhere in minutes.' },
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
const grid = document.getElementById('feature-grid')!;
|
|
66
|
+
grid.innerHTML = features
|
|
67
|
+
.map(f => `<div class="card"><span class="icon">${f.icon}</span><h3>${f.title}</h3><p>${f.desc}</p></div>`)
|
|
68
|
+
.join('');
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
.landing { min-height: 100vh; }
|
|
2
|
+
.nav { display: flex; justify-content: space-between; align-items: center; padding: 1rem 2rem; max-width: 1200px; margin: 0 auto; }
|
|
3
|
+
.logo { font-size: 1.5rem; font-weight: 700; color: white; }
|
|
4
|
+
.nav-links { display: flex; gap: 2rem; }
|
|
5
|
+
.nav-links a { color: rgba(255,255,255,0.9); text-decoration: none; font-weight: 500; }
|
|
6
|
+
.hero { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding-bottom: 4rem; }
|
|
7
|
+
.hero-content { text-align: center; padding: 4rem 2rem; max-width: 800px; margin: 0 auto; }
|
|
8
|
+
.hero-content h1 { font-size: 3.5rem; font-weight: 800; margin-bottom: 1.5rem; line-height: 1.1; }
|
|
9
|
+
.hero-content p { font-size: 1.25rem; opacity: 0.9; margin-bottom: 2rem; }
|
|
10
|
+
.hero-actions { display: flex; gap: 1rem; justify-content: center; }
|
|
11
|
+
.btn { padding: 0.75rem 1.5rem; border-radius: 8px; font-size: 1rem; font-weight: 600; cursor: pointer; border: 2px solid transparent; }
|
|
12
|
+
.btn-primary { background: #4f46e5; color: white; border-color: #4f46e5; }
|
|
13
|
+
.btn-secondary { background: transparent; color: white; border-color: rgba(255,255,255,0.5); }
|
|
14
|
+
.btn-large { padding: 1rem 2.5rem; font-size: 1.1rem; }
|
|
15
|
+
.features { padding: 5rem 2rem; max-width: 1200px; margin: 0 auto; text-align: center; }
|
|
16
|
+
.features h2 { font-size: 2.5rem; font-weight: 700; margin-bottom: 0.5rem; }
|
|
17
|
+
.subtitle { color: #6b7280; margin-bottom: 3rem; }
|
|
18
|
+
.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 2rem; text-align: left; }
|
|
19
|
+
.card { padding: 2rem; border-radius: 12px; border: 1px solid #e5e7eb; transition: all 0.2s; }
|
|
20
|
+
.card:hover { box-shadow: 0 10px 25px rgba(0,0,0,0.08); transform: translateY(-2px); }
|
|
21
|
+
.icon { font-size: 2rem; display: block; margin-bottom: 1rem; }
|
|
22
|
+
.card h3 { font-size: 1.25rem; font-weight: 600; margin-bottom: 0.5rem; }
|
|
23
|
+
.card p { color: #6b7280; line-height: 1.6; }
|
|
24
|
+
.cta { background: #f9fafb; padding: 5rem 2rem; text-align: center; }
|
|
25
|
+
.cta h2 { font-size: 2.5rem; font-weight: 700; margin-bottom: 1rem; }
|
|
26
|
+
.cta p { color: #6b7280; margin-bottom: 2rem; }
|
|
27
|
+
.note { font-size: 0.875rem; color: #9ca3af; }
|
|
28
|
+
.footer { background: #111827; color: #d1d5db; padding: 4rem 2rem 2rem; }
|
|
29
|
+
.footer-content { display: flex; justify-content: space-between; max-width: 1200px; margin: 0 auto; gap: 4rem; flex-wrap: wrap; }
|
|
30
|
+
.brand h3 { color: white; font-size: 1.5rem; margin-bottom: 0.5rem; }
|
|
31
|
+
.links { display: flex; gap: 4rem; }
|
|
32
|
+
.col { display: flex; flex-direction: column; gap: 0.5rem; }
|
|
33
|
+
.col h4 { color: white; font-size: 0.875rem; text-transform: uppercase; margin-bottom: 0.5rem; }
|
|
34
|
+
.col a { color: #9ca3af; text-decoration: none; }
|
|
35
|
+
.col a:hover { color: white; }
|
|
36
|
+
.bottom { border-top: 1px solid #374151; margin-top: 3rem; padding-top: 1.5rem; text-align: center; }
|
|
37
|
+
.bottom p { font-size: 0.875rem; color: #6b7280; }
|
|
38
|
+
|
|
39
|
+
@media (max-width: 768px) {
|
|
40
|
+
.hero-content h1 { font-size: 2.5rem; }
|
|
41
|
+
.nav { flex-direction: column; gap: 1rem; }
|
|
42
|
+
.footer-content { flex-direction: column; }
|
|
43
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import Hero from './components/Hero.vue';
|
|
3
|
+
import Features from './components/Features.vue';
|
|
4
|
+
import CTA from './components/CTA.vue';
|
|
5
|
+
import AppFooter from './components/AppFooter.vue';
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<template>
|
|
9
|
+
<div class="landing">
|
|
10
|
+
<Hero />
|
|
11
|
+
<Features />
|
|
12
|
+
<CTA />
|
|
13
|
+
<AppFooter />
|
|
14
|
+
</div>
|
|
15
|
+
</template>
|
|
16
|
+
|
|
17
|
+
<style>
|
|
18
|
+
.landing { min-height: 100vh; }
|
|
19
|
+
</style>
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<footer class="footer">
|
|
3
|
+
<div class="footer-content">
|
|
4
|
+
<div class="brand">
|
|
5
|
+
<h3>{{projectName}}</h3>
|
|
6
|
+
<p>Building the future of the web.</p>
|
|
7
|
+
</div>
|
|
8
|
+
<div class="links">
|
|
9
|
+
<div class="col">
|
|
10
|
+
<h4>Product</h4>
|
|
11
|
+
<a href="#features">Features</a>
|
|
12
|
+
<a href="#cta">Pricing</a>
|
|
13
|
+
</div>
|
|
14
|
+
<div class="col">
|
|
15
|
+
<h4>Company</h4>
|
|
16
|
+
<a href="#">About</a>
|
|
17
|
+
<a href="#">Blog</a>
|
|
18
|
+
</div>
|
|
19
|
+
<div class="col">
|
|
20
|
+
<h4>Legal</h4>
|
|
21
|
+
<a href="#">Privacy</a>
|
|
22
|
+
<a href="#">Terms</a>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
<div class="bottom">
|
|
27
|
+
<p>© 2025 {{projectName}}. All rights reserved.</p>
|
|
28
|
+
</div>
|
|
29
|
+
</footer>
|
|
30
|
+
</template>
|
|
31
|
+
|
|
32
|
+
<style scoped>
|
|
33
|
+
.footer { background: #111827; color: #d1d5db; padding: 4rem 2rem 2rem; }
|
|
34
|
+
.footer-content { display: flex; justify-content: space-between; max-width: 1200px; margin: 0 auto; gap: 4rem; flex-wrap: wrap; }
|
|
35
|
+
.brand h3 { color: white; font-size: 1.5rem; margin-bottom: 0.5rem; }
|
|
36
|
+
.brand p { max-width: 300px; line-height: 1.6; }
|
|
37
|
+
.links { display: flex; gap: 4rem; flex-wrap: wrap; }
|
|
38
|
+
.col { display: flex; flex-direction: column; gap: 0.5rem; }
|
|
39
|
+
.col h4 { color: white; font-size: 0.875rem; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.5rem; }
|
|
40
|
+
.col a { color: #9ca3af; text-decoration: none; font-size: 0.9rem; }
|
|
41
|
+
.col a:hover { color: white; }
|
|
42
|
+
.bottom { border-top: 1px solid #374151; margin-top: 3rem; padding-top: 1.5rem; text-align: center; }
|
|
43
|
+
.bottom p { font-size: 0.875rem; color: #6b7280; }
|
|
44
|
+
</style>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<section id="cta" class="cta">
|
|
3
|
+
<div class="cta-content">
|
|
4
|
+
<h2>Ready to Get Started?</h2>
|
|
5
|
+
<p>Join thousands of developers building amazing products.</p>
|
|
6
|
+
<button class="btn btn-primary btn-large">Start Free Trial</button>
|
|
7
|
+
<p class="note">No credit card required</p>
|
|
8
|
+
</div>
|
|
9
|
+
</section>
|
|
10
|
+
</template>
|
|
11
|
+
|
|
12
|
+
<style scoped>
|
|
13
|
+
.cta { background: #f9fafb; padding: 5rem 2rem; text-align: center; }
|
|
14
|
+
.cta-content { max-width: 600px; margin: 0 auto; }
|
|
15
|
+
.cta h2 { font-size: 2.5rem; font-weight: 700; margin-bottom: 1rem; }
|
|
16
|
+
.cta p { color: #6b7280; font-size: 1.1rem; margin-bottom: 2rem; }
|
|
17
|
+
.note { font-size: 0.875rem; color: #9ca3af; margin-top: 0.75rem; }
|
|
18
|
+
.btn { padding: 0.75rem 1.5rem; border-radius: 8px; font-size: 1rem; font-weight: 600; cursor: pointer; border: 2px solid transparent; }
|
|
19
|
+
.btn-primary { background: #4f46e5; color: white; }
|
|
20
|
+
.btn-large { padding: 1rem 2.5rem; font-size: 1.1rem; }
|
|
21
|
+
</style>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
const features = [
|
|
3
|
+
{ icon: '⚡', title: 'Lightning Fast', description: 'Optimized for performance with lazy loading and code splitting.' },
|
|
4
|
+
{ icon: '🎨', title: 'Beautiful Design', description: 'Clean, modern UI with responsive layouts.' },
|
|
5
|
+
{ icon: '🔒', title: 'Secure by Default', description: 'Built with security best practices.' },
|
|
6
|
+
{ icon: '🧩', title: 'Modular Architecture', description: 'Component-based structure for easy customization.' },
|
|
7
|
+
{ icon: '📱', title: 'Mobile First', description: 'Designed for mobile, scaled up for desktop.' },
|
|
8
|
+
{ icon: '🚀', title: 'Easy Deployment', description: 'Deploy anywhere in minutes.' },
|
|
9
|
+
];
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<template>
|
|
13
|
+
<section id="features" class="features">
|
|
14
|
+
<h2>Features</h2>
|
|
15
|
+
<p class="subtitle">Everything you need to build a modern web application</p>
|
|
16
|
+
<div class="grid">
|
|
17
|
+
<div v-for="(f, i) in features" :key="i" class="card">
|
|
18
|
+
<span class="icon">{{ f.icon }}</span>
|
|
19
|
+
<h3>{{ f.title }}</h3>
|
|
20
|
+
<p>{{ f.description }}</p>
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
</section>
|
|
24
|
+
</template>
|
|
25
|
+
|
|
26
|
+
<style scoped>
|
|
27
|
+
.features { padding: 5rem 2rem; max-width: 1200px; margin: 0 auto; text-align: center; }
|
|
28
|
+
.features h2 { font-size: 2.5rem; font-weight: 700; margin-bottom: 0.5rem; }
|
|
29
|
+
.subtitle { color: #6b7280; margin-bottom: 3rem; }
|
|
30
|
+
.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 2rem; text-align: left; }
|
|
31
|
+
.card { padding: 2rem; border-radius: 12px; border: 1px solid #e5e7eb; transition: all 0.2s; }
|
|
32
|
+
.card:hover { box-shadow: 0 10px 25px rgba(0,0,0,0.08); transform: translateY(-2px); }
|
|
33
|
+
.icon { font-size: 2rem; display: block; margin-bottom: 1rem; }
|
|
34
|
+
.card h3 { font-size: 1.25rem; font-weight: 600; margin-bottom: 0.5rem; }
|
|
35
|
+
.card p { color: #6b7280; line-height: 1.6; }
|
|
36
|
+
</style>
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<header class="hero">
|
|
3
|
+
<nav class="nav">
|
|
4
|
+
<div class="logo">{{projectName}}</div>
|
|
5
|
+
<div class="nav-links">
|
|
6
|
+
<a href="#features">Features</a>
|
|
7
|
+
<a href="#cta">Pricing</a>
|
|
8
|
+
<a href="#contact">Contact</a>
|
|
9
|
+
</div>
|
|
10
|
+
</nav>
|
|
11
|
+
<div class="hero-content">
|
|
12
|
+
<h1>Build Something Amazing</h1>
|
|
13
|
+
<p>A modern landing page template to kickstart your next project.</p>
|
|
14
|
+
<div class="hero-actions">
|
|
15
|
+
<button class="btn btn-primary">Get Started</button>
|
|
16
|
+
<button class="btn btn-secondary">Learn More</button>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
</header>
|
|
20
|
+
</template>
|
|
21
|
+
|
|
22
|
+
<style scoped>
|
|
23
|
+
.hero { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding-bottom: 4rem; }
|
|
24
|
+
.nav { display: flex; justify-content: space-between; align-items: center; padding: 1rem 2rem; max-width: 1200px; margin: 0 auto; }
|
|
25
|
+
.logo { font-size: 1.5rem; font-weight: 700; color: white; }
|
|
26
|
+
.nav-links { display: flex; gap: 2rem; }
|
|
27
|
+
.nav-links a { color: rgba(255,255,255,0.9); text-decoration: none; font-weight: 500; }
|
|
28
|
+
.hero-content { text-align: center; padding: 4rem 2rem; max-width: 800px; margin: 0 auto; }
|
|
29
|
+
.hero-content h1 { font-size: 3.5rem; font-weight: 800; margin-bottom: 1.5rem; line-height: 1.1; }
|
|
30
|
+
.hero-content p { font-size: 1.25rem; opacity: 0.9; margin-bottom: 2rem; }
|
|
31
|
+
.hero-actions { display: flex; gap: 1rem; justify-content: center; }
|
|
32
|
+
.btn { padding: 0.75rem 1.5rem; border-radius: 8px; font-size: 1rem; font-weight: 600; cursor: pointer; border: 2px solid transparent; }
|
|
33
|
+
.btn-primary { background: #4f46e5; color: white; border-color: #4f46e5; }
|
|
34
|
+
.btn-secondary { background: transparent; color: white; border-color: rgba(255,255,255,0.5); }
|
|
35
|
+
</style>
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
.portfolio { min-height: 100vh; }
|
|
2
|
+
|
|
3
|
+
/* Nav */
|
|
4
|
+
.portfolio-nav { display: flex; justify-content: space-between; align-items: center; padding: 1rem 2rem; max-width: 1100px; margin: 0 auto; }
|
|
5
|
+
.logo { font-size: 1.5rem; font-weight: 700; color: white; }
|
|
6
|
+
.nav-links { display: flex; gap: 2rem; }
|
|
7
|
+
.nav-links a { color: rgba(255,255,255,0.8); text-decoration: none; font-weight: 500; }
|
|
8
|
+
|
|
9
|
+
/* Hero */
|
|
10
|
+
.portfolio-hero { background: linear-gradient(135deg, #0f172a 0%, #1e293b 50%, #334155 100%); color: white; padding-bottom: 5rem; }
|
|
11
|
+
.hero-content { text-align: center; max-width: 700px; margin: 0 auto; padding: 4rem 2rem; }
|
|
12
|
+
.hero-greeting { font-size: 1.1rem; color: #4f46e5; font-weight: 600; }
|
|
13
|
+
.hero-content h1 { font-size: 4rem; font-weight: 800; margin: 0.5rem 0; }
|
|
14
|
+
.hero-role { font-size: 1.25rem; color: #94a3b8; margin-bottom: 1rem; }
|
|
15
|
+
.hero-desc { color: #cbd5e1; line-height: 1.7; margin-bottom: 2rem; }
|
|
16
|
+
.hero-actions { display: flex; gap: 1rem; justify-content: center; }
|
|
17
|
+
.btn { padding: 0.75rem 1.5rem; border-radius: 8px; font-size: 1rem; font-weight: 600; text-decoration: none; cursor: pointer; transition: all 0.2s; border: 2px solid transparent; display: inline-block; }
|
|
18
|
+
.btn-primary { background: #4f46e5; color: white; border-color: #4f46e5; }
|
|
19
|
+
.btn-primary:hover { background: #4338ca; }
|
|
20
|
+
.btn-outline { background: transparent; color: white; border-color: #475569; }
|
|
21
|
+
.btn-outline:hover { border-color: white; }
|
|
22
|
+
|
|
23
|
+
/* Sections */
|
|
24
|
+
.section-subtitle { color: #6b7280; text-align: center; margin-bottom: 3rem; }
|
|
25
|
+
|
|
26
|
+
/* Projects */
|
|
27
|
+
.projects-section { max-width: 1100px; margin: 0 auto; padding: 5rem 2rem; }
|
|
28
|
+
.projects-section h2 { text-align: center; font-size: 2rem; margin-bottom: 0.5rem; }
|
|
29
|
+
.projects-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 1.5rem; }
|
|
30
|
+
.project-card { border: 1px solid #e5e7eb; border-radius: 12px; overflow: hidden; transition: all 0.2s; }
|
|
31
|
+
.project-card:hover { box-shadow: 0 10px 30px rgba(0,0,0,0.08); transform: translateY(-3px); }
|
|
32
|
+
.project-image { font-size: 3rem; text-align: center; padding: 2rem; background: #f9fafb; }
|
|
33
|
+
.project-info { padding: 1.25rem; }
|
|
34
|
+
.project-info h3 { font-size: 1.15rem; font-weight: 600; margin-bottom: 0.5rem; }
|
|
35
|
+
.project-info p { color: #6b7280; font-size: 0.9rem; line-height: 1.5; margin-bottom: 1rem; }
|
|
36
|
+
.project-tags { display: flex; flex-wrap: wrap; gap: 0.4rem; }
|
|
37
|
+
.tag { background: #eef2ff; color: #4f46e5; padding: 0.2rem 0.6rem; border-radius: 4px; font-size: 0.75rem; font-weight: 500; }
|
|
38
|
+
|
|
39
|
+
/* Skills */
|
|
40
|
+
.skills-section { background: #f9fafb; padding: 5rem 2rem; }
|
|
41
|
+
.skills-section h2 { text-align: center; font-size: 2rem; margin-bottom: 0.5rem; }
|
|
42
|
+
.skills-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 1.5rem; max-width: 1100px; margin: 0 auto; }
|
|
43
|
+
.skill-group { background: white; padding: 1.5rem; border-radius: 12px; border: 1px solid #e5e7eb; }
|
|
44
|
+
.skill-group h3 { font-size: 1rem; font-weight: 600; margin-bottom: 1rem; color: #4f46e5; }
|
|
45
|
+
.skill-tags { display: flex; flex-wrap: wrap; gap: 0.5rem; }
|
|
46
|
+
.skill-tag { background: #f3f4f6; padding: 0.3rem 0.8rem; border-radius: 6px; font-size: 0.85rem; color: #374151; }
|
|
47
|
+
|
|
48
|
+
/* Contact */
|
|
49
|
+
.contact-section { max-width: 600px; margin: 0 auto; padding: 5rem 2rem; }
|
|
50
|
+
.contact-section h2 { text-align: center; font-size: 2rem; margin-bottom: 0.5rem; }
|
|
51
|
+
.contact-form { display: flex; flex-direction: column; gap: 1.25rem; }
|
|
52
|
+
.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; }
|
|
53
|
+
.form-group { display: flex; flex-direction: column; gap: 0.4rem; }
|
|
54
|
+
.form-group label { font-size: 0.85rem; font-weight: 600; color: #374151; }
|
|
55
|
+
.form-group input, .form-group textarea { padding: 0.6rem 0.75rem; border: 1px solid #d1d5db; border-radius: 8px; font-size: 0.9rem; font-family: inherit; }
|
|
56
|
+
.form-group textarea { resize: vertical; }
|
|
57
|
+
|
|
58
|
+
/* Footer */
|
|
59
|
+
.portfolio-footer { background: #111827; color: #9ca3af; padding: 2rem; text-align: center; }
|
|
60
|
+
.footer-content { max-width: 1100px; margin: 0 auto; }
|
|
61
|
+
.footer-links { display: flex; gap: 2rem; justify-content: center; margin-bottom: 1rem; }
|
|
62
|
+
.footer-links a { color: #9ca3af; text-decoration: none; }
|
|
63
|
+
.footer-links a:hover { color: white; }
|
|
64
|
+
.portfolio-footer p { font-size: 0.85rem; }
|
|
65
|
+
|
|
66
|
+
@media (max-width: 768px) {
|
|
67
|
+
.hero-content h1 { font-size: 2.5rem; }
|
|
68
|
+
.form-row { grid-template-columns: 1fr; }
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@media (prefers-color-scheme: dark) {
|
|
72
|
+
.projects-section h2, .skills-section h2, .contact-section h2 { color: white; }
|
|
73
|
+
.project-card { border-color: #374151; }
|
|
74
|
+
.project-image { background: #1f2937; }
|
|
75
|
+
.project-info h3 { color: white; }
|
|
76
|
+
.skills-section { background: #1f2937; }
|
|
77
|
+
.skill-group { background: #111827; border-color: #374151; }
|
|
78
|
+
.skill-tag { background: #374151; color: #d1d5db; }
|
|
79
|
+
.form-group label { color: #d1d5db; }
|
|
80
|
+
.form-group input, .form-group textarea { background: #1f2937; border-color: #374151; color: white; }
|
|
81
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { HeroSection } from './components/HeroSection';
|
|
2
|
+
import { Projects } from './components/Projects';
|
|
3
|
+
import { Skills } from './components/Skills';
|
|
4
|
+
import { ContactForm } from './components/ContactForm';
|
|
5
|
+
import { PortfolioFooter } from './components/PortfolioFooter';
|
|
6
|
+
import './App.css';
|
|
7
|
+
|
|
8
|
+
function App() {
|
|
9
|
+
return (
|
|
10
|
+
<div className="portfolio">
|
|
11
|
+
<HeroSection />
|
|
12
|
+
<Projects />
|
|
13
|
+
<Skills />
|
|
14
|
+
<ContactForm />
|
|
15
|
+
<PortfolioFooter />
|
|
16
|
+
</div>
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export default App;
|