@beknurakhmed/webforge-cli 0.1.0 → 0.1.2
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 +226 -212
- package/package.json +63 -63
- package/templates/extras/typescript/deps.json +6 -0
- package/templates/extras/typescript/react/tsconfig.json +21 -0
- package/templates/extras/typescript/vanilla/tsconfig.json +19 -0
- package/templates/extras/typescript/vue/tsconfig.json +20 -0
- package/templates/overlays/blog/angular/src/app/app.component.ts +100 -0
- package/templates/overlays/blog/angular/src/app/app.routes.ts +12 -0
- package/templates/overlays/blog/angular/src/app/components/blog-sidebar.component.ts +115 -0
- package/templates/overlays/blog/angular/src/app/components/post-card.component.ts +94 -0
- package/templates/overlays/blog/angular/src/app/pages/about.component.ts +114 -0
- package/templates/overlays/blog/angular/src/app/pages/category.component.ts +141 -0
- package/templates/overlays/blog/angular/src/app/pages/home.component.ts +143 -0
- package/templates/overlays/blog/angular/src/app/pages/post-detail.component.ts +196 -0
- package/templates/overlays/blog/angular/src/main.ts +10 -0
- package/templates/overlays/blog/nextjs/src/app/about/page.tsx +55 -0
- package/templates/overlays/blog/nextjs/src/app/category/[slug]/page.tsx +52 -0
- package/templates/overlays/blog/nextjs/src/app/components/BlogFooter.tsx +46 -0
- package/templates/overlays/blog/nextjs/src/app/components/BlogHeader.tsx +37 -0
- package/templates/overlays/blog/nextjs/src/app/components/BlogSidebar.tsx +56 -0
- package/templates/overlays/blog/nextjs/src/app/components/PostCard.tsx +42 -0
- package/templates/overlays/blog/nextjs/src/app/globals.css +158 -0
- package/templates/overlays/blog/nextjs/src/app/layout.tsx +20 -0
- package/templates/overlays/blog/nextjs/src/app/page.tsx +36 -0
- package/templates/overlays/blog/nextjs/src/app/post/[id]/page.tsx +78 -0
- package/templates/overlays/blog/nuxt/app.vue +27 -0
- package/templates/overlays/blog/nuxt/components/BlogFooter.vue +48 -0
- package/templates/overlays/blog/nuxt/components/BlogHeader.vue +55 -0
- package/templates/overlays/blog/nuxt/components/BlogSidebar.vue +144 -0
- package/templates/overlays/blog/nuxt/components/PostCard.vue +125 -0
- package/templates/overlays/blog/nuxt/layouts/default.vue +25 -0
- package/templates/overlays/blog/nuxt/pages/about.vue +161 -0
- package/templates/overlays/blog/nuxt/pages/category/[slug].vue +80 -0
- package/templates/overlays/blog/nuxt/pages/index.vue +54 -0
- package/templates/overlays/blog/nuxt/pages/post/[id].vue +158 -0
- package/templates/overlays/blog/react/src/App.css +58 -18
- package/templates/overlays/blog/react/src/App.tsx +16 -31
- package/templates/overlays/blog/react/src/components/BlogFooter.tsx +4 -2
- package/templates/overlays/blog/react/src/components/BlogHeader.tsx +12 -6
- package/templates/overlays/blog/react/src/components/BlogSidebar.tsx +9 -8
- package/templates/overlays/blog/react/src/components/Layout.tsx +17 -0
- package/templates/overlays/blog/react/src/components/PostCard.tsx +30 -0
- package/templates/overlays/blog/react/src/data/posts.ts +22 -0
- package/templates/overlays/blog/react/src/pages/About.tsx +33 -0
- package/templates/overlays/blog/react/src/pages/Category.tsx +29 -0
- package/templates/overlays/blog/react/src/pages/Home.tsx +18 -0
- package/templates/overlays/blog/react/src/pages/PostDetail.tsx +38 -0
- package/templates/overlays/blog/vanilla/src/main.ts +112 -0
- package/templates/overlays/blog/vanilla/src/pages/about.ts +106 -0
- package/templates/overlays/blog/vanilla/src/pages/category.ts +86 -0
- package/templates/overlays/blog/vanilla/src/pages/home.ts +103 -0
- package/templates/overlays/blog/vanilla/src/pages/post-detail.ts +108 -0
- package/templates/overlays/blog/vanilla/src/router.ts +33 -0
- package/templates/overlays/blog/vanilla/src/style.css +677 -0
- package/templates/overlays/blog/vue/src/App.vue +29 -0
- package/templates/overlays/blog/vue/src/components/BlogFooter.vue +8 -0
- package/templates/overlays/blog/vue/src/components/BlogHeader.vue +14 -0
- package/templates/overlays/blog/vue/src/components/BlogSidebar.vue +31 -0
- package/templates/overlays/blog/vue/src/components/PostCard.vue +17 -0
- package/templates/overlays/blog/vue/src/data.ts +82 -0
- package/templates/overlays/blog/vue/src/main.ts +6 -0
- package/templates/overlays/blog/vue/src/pages/About.vue +17 -0
- package/templates/overlays/blog/vue/src/pages/Category.vue +32 -0
- package/templates/overlays/blog/vue/src/pages/Home.vue +14 -0
- package/templates/overlays/blog/vue/src/pages/PostDetail.vue +22 -0
- package/templates/overlays/blog/vue/src/router.ts +19 -0
- package/templates/overlays/blog/vue/src/style.css +288 -0
- package/templates/overlays/crm/angular/src/app/app.component.ts +110 -0
- package/templates/overlays/crm/angular/src/app/app.routes.ts +12 -0
- package/templates/overlays/crm/angular/src/app/components/contacts-table.component.ts +98 -0
- package/templates/overlays/crm/angular/src/app/components/stats-cards.component.ts +63 -0
- package/templates/overlays/crm/angular/src/app/pages/contacts.component.ts +70 -0
- package/templates/overlays/crm/angular/src/app/pages/dashboard-home.component.ts +38 -0
- package/templates/overlays/crm/angular/src/app/pages/deals.component.ts +145 -0
- package/templates/overlays/crm/angular/src/app/pages/settings.component.ts +103 -0
- package/templates/overlays/crm/angular/src/main.ts +8 -0
- package/templates/overlays/crm/nextjs/src/app/components/ContactsTable.tsx +69 -0
- package/templates/overlays/crm/nextjs/src/app/components/Sidebar.tsx +45 -0
- package/templates/overlays/crm/nextjs/src/app/components/StatsCards.tsx +31 -0
- package/templates/overlays/crm/nextjs/src/app/contacts/page.tsx +111 -0
- package/templates/overlays/crm/nextjs/src/app/deals/page.tsx +111 -0
- package/templates/overlays/crm/nextjs/src/app/globals.css +165 -0
- package/templates/overlays/crm/nextjs/src/app/layout.tsx +20 -0
- package/templates/overlays/crm/nextjs/src/app/page.tsx +43 -0
- package/templates/overlays/crm/nextjs/src/app/settings/page.tsx +91 -0
- package/templates/overlays/crm/nuxt/app.vue +27 -0
- package/templates/overlays/crm/nuxt/components/ContactsTable.vue +140 -0
- package/templates/overlays/crm/nuxt/components/CrmSidebar.vue +97 -0
- package/templates/overlays/crm/nuxt/components/StatsCards.vue +63 -0
- package/templates/overlays/crm/nuxt/layouts/default.vue +21 -0
- package/templates/overlays/crm/nuxt/pages/contacts.vue +79 -0
- package/templates/overlays/crm/nuxt/pages/deals.vue +229 -0
- package/templates/overlays/crm/nuxt/pages/index.vue +186 -0
- package/templates/overlays/crm/nuxt/pages/settings.vue +233 -0
- package/templates/overlays/crm/react/src/App.css +49 -20
- package/templates/overlays/crm/react/src/App.tsx +16 -41
- package/templates/overlays/crm/react/src/components/ContactsTable.tsx +8 -8
- package/templates/overlays/crm/react/src/components/Layout.tsx +15 -0
- package/templates/overlays/crm/react/src/components/Sidebar.tsx +20 -14
- package/templates/overlays/crm/react/src/components/StatsCards.tsx +10 -12
- package/templates/overlays/crm/react/src/data/contacts.ts +19 -0
- package/templates/overlays/crm/react/src/pages/Contacts.tsx +32 -0
- package/templates/overlays/crm/react/src/pages/DashboardHome.tsx +44 -0
- package/templates/overlays/crm/react/src/pages/Deals.tsx +48 -0
- package/templates/overlays/crm/react/src/pages/Settings.tsx +35 -0
- package/templates/overlays/crm/vanilla/src/main.ts +95 -0
- package/templates/overlays/crm/vanilla/src/pages/contacts.ts +87 -0
- package/templates/overlays/crm/vanilla/src/pages/dashboard-home.ts +121 -0
- package/templates/overlays/crm/vanilla/src/pages/deals.ts +116 -0
- package/templates/overlays/crm/vanilla/src/pages/settings.ts +129 -0
- package/templates/overlays/crm/vanilla/src/router.ts +33 -0
- package/templates/overlays/crm/vanilla/src/style.css +766 -0
- package/templates/overlays/crm/vue/src/App.vue +25 -0
- package/templates/overlays/crm/vue/src/components/ContactsTable.vue +30 -0
- package/templates/overlays/crm/vue/src/components/CrmSidebar.vue +14 -0
- package/templates/overlays/crm/vue/src/components/StatsCards.vue +23 -0
- package/templates/overlays/crm/vue/src/data.ts +38 -0
- package/templates/overlays/crm/vue/src/main.ts +6 -0
- package/templates/overlays/crm/vue/src/pages/Contacts.vue +25 -0
- package/templates/overlays/crm/vue/src/pages/DashboardHome.vue +19 -0
- package/templates/overlays/crm/vue/src/pages/Deals.vue +34 -0
- package/templates/overlays/crm/vue/src/pages/Settings.vue +33 -0
- package/templates/overlays/crm/vue/src/router.ts +19 -0
- package/templates/overlays/crm/vue/src/style.css +272 -0
- package/templates/overlays/dashboard/angular/src/app/app.component.ts +135 -0
- package/templates/overlays/dashboard/angular/src/app/app.routes.ts +24 -0
- package/templates/overlays/dashboard/angular/src/app/components/chart-placeholder.component.ts +86 -0
- package/templates/overlays/dashboard/angular/src/app/components/data-table.component.ts +140 -0
- package/templates/overlays/dashboard/angular/src/app/components/kpi-cards.component.ts +120 -0
- package/templates/overlays/dashboard/angular/src/app/pages/analytics.component.ts +138 -0
- package/templates/overlays/dashboard/angular/src/app/pages/overview.component.ts +58 -0
- package/templates/overlays/dashboard/angular/src/app/pages/settings.component.ts +128 -0
- package/templates/overlays/dashboard/angular/src/app/pages/users.component.ts +153 -0
- package/templates/overlays/dashboard/angular/src/main.ts +10 -0
- package/templates/overlays/dashboard/nextjs/src/app/analytics/page.tsx +76 -0
- package/templates/overlays/dashboard/nextjs/src/app/components/ChartPlaceholder.tsx +58 -0
- package/templates/overlays/dashboard/nextjs/src/app/components/DataTable.tsx +60 -0
- package/templates/overlays/dashboard/nextjs/src/app/components/KPICards.tsx +31 -0
- package/templates/overlays/dashboard/nextjs/src/app/components/Sidebar.tsx +45 -0
- package/templates/overlays/dashboard/nextjs/src/app/globals.css +150 -0
- package/templates/overlays/dashboard/nextjs/src/app/layout.tsx +20 -0
- package/templates/overlays/dashboard/nextjs/src/app/page.tsx +20 -0
- package/templates/overlays/dashboard/nextjs/src/app/settings/page.tsx +118 -0
- package/templates/overlays/dashboard/nextjs/src/app/users/page.tsx +99 -0
- package/templates/overlays/dashboard/nuxt/app.vue +27 -0
- package/templates/overlays/dashboard/nuxt/components/ChartPlaceholder.vue +73 -0
- package/templates/overlays/dashboard/nuxt/components/DashSidebar.vue +97 -0
- package/templates/overlays/dashboard/nuxt/components/DataTable.vue +126 -0
- package/templates/overlays/dashboard/nuxt/components/KPICards.vue +76 -0
- package/templates/overlays/dashboard/nuxt/layouts/default.vue +21 -0
- package/templates/overlays/dashboard/nuxt/pages/analytics.vue +94 -0
- package/templates/overlays/dashboard/nuxt/pages/index.vue +49 -0
- package/templates/overlays/dashboard/nuxt/pages/settings.vue +239 -0
- package/templates/overlays/dashboard/nuxt/pages/users.vue +227 -0
- package/templates/overlays/dashboard/react/src/App.css +50 -24
- package/templates/overlays/dashboard/react/src/App.tsx +16 -22
- package/templates/overlays/dashboard/react/src/components/ChartPlaceholder.tsx +5 -2
- package/templates/overlays/dashboard/react/src/components/DataTable.tsx +9 -1
- package/templates/overlays/dashboard/react/src/components/KPICards.tsx +4 -4
- package/templates/overlays/dashboard/react/src/components/Layout.tsx +13 -0
- package/templates/overlays/dashboard/react/src/components/Sidebar.tsx +15 -10
- package/templates/overlays/dashboard/react/src/pages/Analytics.tsx +33 -0
- package/templates/overlays/dashboard/react/src/pages/Overview.tsx +23 -0
- package/templates/overlays/dashboard/react/src/pages/Settings.tsx +41 -0
- package/templates/overlays/dashboard/react/src/pages/Users.tsx +57 -0
- package/templates/overlays/dashboard/vanilla/src/main.ts +101 -0
- package/templates/overlays/dashboard/vanilla/src/pages/analytics.ts +99 -0
- package/templates/overlays/dashboard/vanilla/src/pages/overview.ts +60 -0
- package/templates/overlays/dashboard/vanilla/src/pages/settings.ts +118 -0
- package/templates/overlays/dashboard/vanilla/src/pages/users.ts +80 -0
- package/templates/overlays/dashboard/vanilla/src/router.ts +33 -0
- package/templates/overlays/dashboard/vanilla/src/style.css +654 -0
- package/templates/overlays/dashboard/vue/src/App.vue +12 -0
- package/templates/overlays/dashboard/vue/src/components/ChartPlaceholder.vue +34 -0
- package/templates/overlays/dashboard/vue/src/components/DashSidebar.vue +19 -0
- package/templates/overlays/dashboard/vue/src/components/DataTable.vue +34 -0
- package/templates/overlays/dashboard/vue/src/components/KPICards.vue +18 -0
- package/templates/overlays/dashboard/vue/src/main.ts +6 -0
- package/templates/overlays/dashboard/vue/src/pages/Analytics.vue +32 -0
- package/templates/overlays/dashboard/vue/src/pages/Overview.vue +17 -0
- package/templates/overlays/dashboard/vue/src/pages/Settings.vue +65 -0
- package/templates/overlays/dashboard/vue/src/pages/Users.vue +44 -0
- package/templates/overlays/dashboard/vue/src/router.ts +15 -0
- package/templates/overlays/dashboard/vue/src/style.css +447 -0
- package/templates/overlays/ecommerce/angular/src/app/app.component.ts +147 -0
- package/templates/overlays/ecommerce/angular/src/app/app.routes.ts +10 -0
- package/templates/overlays/ecommerce/angular/src/app/components/product-card.component.ts +94 -0
- package/templates/overlays/ecommerce/angular/src/app/data/products.ts +75 -0
- package/templates/overlays/ecommerce/angular/src/app/pages/cart.component.ts +169 -0
- package/templates/overlays/ecommerce/angular/src/app/pages/home.component.ts +96 -0
- package/templates/overlays/ecommerce/angular/src/app/pages/product-detail.component.ts +124 -0
- package/templates/overlays/ecommerce/angular/src/main.ts +10 -0
- package/templates/overlays/ecommerce/nextjs/src/app/cart/page.tsx +74 -0
- package/templates/overlays/ecommerce/nextjs/src/app/components/CartProvider.tsx +80 -0
- package/templates/overlays/ecommerce/nextjs/src/app/components/Footer.tsx +44 -0
- package/templates/overlays/ecommerce/nextjs/src/app/components/Header.tsx +27 -0
- package/templates/overlays/ecommerce/nextjs/src/app/components/ProductCard.tsx +23 -0
- package/templates/overlays/ecommerce/nextjs/src/app/globals.css +144 -0
- package/templates/overlays/ecommerce/nextjs/src/app/layout.tsx +23 -0
- package/templates/overlays/ecommerce/nextjs/src/app/page.tsx +73 -0
- package/templates/overlays/ecommerce/nextjs/src/app/product/[id]/page.tsx +63 -0
- package/templates/overlays/ecommerce/nuxt/app.vue +27 -0
- package/templates/overlays/ecommerce/nuxt/components/ProductCard.vue +77 -0
- package/templates/overlays/ecommerce/nuxt/components/StoreFooter.vue +47 -0
- package/templates/overlays/ecommerce/nuxt/components/StoreHeader.vue +91 -0
- package/templates/overlays/ecommerce/nuxt/layouts/default.vue +43 -0
- package/templates/overlays/ecommerce/nuxt/pages/cart.vue +268 -0
- package/templates/overlays/ecommerce/nuxt/pages/index.vue +154 -0
- package/templates/overlays/ecommerce/nuxt/pages/product/[id].vue +211 -0
- package/templates/overlays/ecommerce/react/src/App.css +71 -59
- package/templates/overlays/ecommerce/react/src/App.tsx +18 -44
- package/templates/overlays/ecommerce/react/src/components/Footer.tsx +2 -2
- package/templates/overlays/ecommerce/react/src/components/Header.tsx +15 -14
- package/templates/overlays/ecommerce/react/src/components/Layout.tsx +20 -0
- package/templates/overlays/ecommerce/react/src/components/ProductCard.tsx +28 -0
- package/templates/overlays/ecommerce/react/src/data/products.ts +23 -0
- package/templates/overlays/ecommerce/react/src/pages/Cart.tsx +51 -0
- package/templates/overlays/ecommerce/react/src/pages/Home.tsx +37 -0
- package/templates/overlays/ecommerce/react/src/pages/ProductDetail.tsx +38 -0
- package/templates/overlays/ecommerce/vanilla/src/main.ts +73 -0
- package/templates/overlays/ecommerce/vanilla/src/pages/cart.ts +73 -0
- package/templates/overlays/ecommerce/vanilla/src/pages/home.ts +71 -0
- package/templates/overlays/ecommerce/vanilla/src/pages/product-detail.ts +81 -0
- package/templates/overlays/ecommerce/vanilla/src/router.ts +33 -0
- package/templates/overlays/ecommerce/vanilla/src/style.css +522 -0
- package/templates/overlays/ecommerce/vue/src/App.vue +17 -32
- package/templates/overlays/ecommerce/vue/src/components/ProductCard.vue +25 -0
- package/templates/overlays/ecommerce/vue/src/components/StoreFooter.vue +6 -12
- package/templates/overlays/ecommerce/vue/src/components/StoreHeader.vue +5 -23
- package/templates/overlays/ecommerce/vue/src/data.ts +23 -0
- package/templates/overlays/ecommerce/vue/src/main.ts +6 -0
- package/templates/overlays/ecommerce/vue/src/pages/Cart.vue +34 -0
- package/templates/overlays/ecommerce/vue/src/pages/Home.vue +27 -0
- package/templates/overlays/ecommerce/vue/src/pages/ProductDetail.vue +27 -0
- package/templates/overlays/ecommerce/vue/src/router.ts +13 -0
- package/templates/overlays/ecommerce/vue/src/style.css +359 -0
- package/templates/overlays/portfolio/angular/src/app/app.component.ts +102 -0
- package/templates/overlays/portfolio/angular/src/app/app.routes.ts +12 -0
- package/templates/overlays/portfolio/angular/src/app/components/project-card.component.ts +86 -0
- package/templates/overlays/portfolio/angular/src/app/components/skills-grid.component.ts +88 -0
- package/templates/overlays/portfolio/angular/src/app/pages/about.component.ts +122 -0
- package/templates/overlays/portfolio/angular/src/app/pages/contact.component.ts +131 -0
- package/templates/overlays/portfolio/angular/src/app/pages/home.component.ts +207 -0
- package/templates/overlays/portfolio/angular/src/app/pages/projects.component.ts +150 -0
- package/templates/overlays/portfolio/angular/src/main.ts +10 -0
- package/templates/overlays/portfolio/nextjs/src/app/about/page.tsx +70 -0
- package/templates/overlays/portfolio/nextjs/src/app/components/Footer.tsx +37 -0
- package/templates/overlays/portfolio/nextjs/src/app/components/Navbar.tsx +37 -0
- package/templates/overlays/portfolio/nextjs/src/app/components/ProjectCard.tsx +35 -0
- package/templates/overlays/portfolio/nextjs/src/app/components/SkillsGrid.tsx +45 -0
- package/templates/overlays/portfolio/nextjs/src/app/contact/page.tsx +138 -0
- package/templates/overlays/portfolio/nextjs/src/app/globals.css +197 -0
- package/templates/overlays/portfolio/nextjs/src/app/layout.tsx +20 -0
- package/templates/overlays/portfolio/nextjs/src/app/page.tsx +60 -0
- package/templates/overlays/portfolio/nextjs/src/app/projects/page.tsx +56 -0
- package/templates/overlays/portfolio/nuxt/app.vue +27 -0
- package/templates/overlays/portfolio/nuxt/components/PortfolioFooter.vue +49 -0
- package/templates/overlays/portfolio/nuxt/components/PortfolioNav.vue +77 -0
- package/templates/overlays/portfolio/nuxt/components/ProjectCard.vue +102 -0
- package/templates/overlays/portfolio/nuxt/components/SkillsGrid.vue +89 -0
- package/templates/overlays/portfolio/nuxt/layouts/default.vue +21 -0
- package/templates/overlays/portfolio/nuxt/pages/about.vue +179 -0
- package/templates/overlays/portfolio/nuxt/pages/contact.vue +278 -0
- package/templates/overlays/portfolio/nuxt/pages/index.vue +160 -0
- package/templates/overlays/portfolio/nuxt/pages/projects.vue +116 -0
- package/templates/overlays/portfolio/react/src/App.css +54 -27
- package/templates/overlays/portfolio/react/src/App.tsx +16 -12
- package/templates/overlays/portfolio/react/src/components/Layout.tsx +17 -0
- package/templates/overlays/portfolio/react/src/components/Navbar.tsx +30 -0
- package/templates/overlays/portfolio/react/src/components/PortfolioFooter.tsx +5 -3
- package/templates/overlays/portfolio/react/src/components/ProjectCard.tsx +24 -0
- package/templates/overlays/portfolio/react/src/components/SkillsGrid.tsx +20 -0
- package/templates/overlays/portfolio/react/src/data/projects.ts +25 -0
- package/templates/overlays/portfolio/react/src/pages/About.tsx +43 -0
- package/templates/overlays/portfolio/react/src/pages/Contact.tsx +48 -0
- package/templates/overlays/portfolio/react/src/pages/Home.tsx +44 -0
- package/templates/overlays/portfolio/react/src/pages/Projects.tsx +36 -0
- package/templates/overlays/portfolio/vanilla/src/main.ts +58 -0
- package/templates/overlays/portfolio/vanilla/src/pages/about.ts +146 -0
- package/templates/overlays/portfolio/vanilla/src/pages/contact.ts +159 -0
- package/templates/overlays/portfolio/vanilla/src/pages/home.ts +123 -0
- package/templates/overlays/portfolio/vanilla/src/pages/projects.ts +89 -0
- package/templates/overlays/portfolio/vanilla/src/router.ts +33 -0
- package/templates/overlays/portfolio/vanilla/src/style.css +909 -0
- package/templates/overlays/portfolio/vue/src/App.vue +25 -0
- package/templates/overlays/portfolio/vue/src/components/PortfolioFooter.vue +14 -0
- package/templates/overlays/portfolio/vue/src/components/PortfolioNav.vue +16 -0
- package/templates/overlays/portfolio/vue/src/components/ProjectCard.vue +18 -0
- package/templates/overlays/portfolio/vue/src/components/SkillsGrid.vue +14 -0
- package/templates/overlays/portfolio/vue/src/data.ts +78 -0
- package/templates/overlays/portfolio/vue/src/main.ts +6 -0
- package/templates/overlays/portfolio/vue/src/pages/About.vue +30 -0
- package/templates/overlays/portfolio/vue/src/pages/Contact.vue +47 -0
- package/templates/overlays/portfolio/vue/src/pages/Home.vue +27 -0
- package/templates/overlays/portfolio/vue/src/pages/Projects.vue +33 -0
- package/templates/overlays/portfolio/vue/src/router.ts +19 -0
- package/templates/overlays/portfolio/vue/src/style.css +404 -0
- package/templates/react/package.json +23 -19
- package/templates/react/tsconfig.json +20 -0
- package/templates/styling/tailwind/deps.json +7 -6
- package/templates/styling/tailwind/nextjs/postcss.config.mjs +7 -0
- package/templates/styling/tailwind/nextjs/src/app/globals.css +1 -0
- package/templates/styling/tailwind/react/src/index.css +1 -0
- package/templates/styling/tailwind/react/vite.config.ts +7 -0
- package/templates/styling/tailwind/vanilla/src/style.css +1 -0
- package/templates/styling/tailwind/vanilla/vite.config.ts +6 -0
- package/templates/styling/tailwind/vue/src/style.css +1 -0
- package/templates/styling/tailwind/vue/vite.config.ts +7 -0
- package/templates/vanilla/package.json +15 -14
- package/templates/vanilla/tsconfig.json +19 -0
- package/templates/vue/package.json +21 -18
- package/templates/vue/tsconfig.json +20 -0
- package/templates/overlays/blog/react/src/components/PostList.tsx +0 -27
- package/templates/overlays/crm/react/src/components/Filters.tsx +0 -22
- package/templates/overlays/ecommerce/react/src/components/Cart.tsx +0 -47
- package/templates/overlays/ecommerce/react/src/components/ProductGrid.tsx +0 -32
- package/templates/overlays/ecommerce/vue/src/components/CartPanel.vue +0 -46
- package/templates/overlays/ecommerce/vue/src/components/ProductGrid.vue +0 -40
- package/templates/overlays/portfolio/react/src/components/ContactForm.tsx +0 -29
- package/templates/overlays/portfolio/react/src/components/HeroSection.tsx +0 -24
- package/templates/overlays/portfolio/react/src/components/Projects.tsx +0 -33
- package/templates/overlays/portfolio/react/src/components/Skills.tsx +0 -27
- package/templates/styling/tailwind/config/postcss.config.js +0 -5
- package/templates/styling/tailwind/config/tailwind.config.js +0 -11
|
@@ -1,19 +1,23 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
1
|
+
import { BrowserRouter, Routes, Route } from 'react-router-dom';
|
|
2
|
+
import Layout from './components/Layout';
|
|
3
|
+
import Home from './pages/Home';
|
|
4
|
+
import Projects from './pages/Projects';
|
|
5
|
+
import About from './pages/About';
|
|
6
|
+
import Contact from './pages/Contact';
|
|
6
7
|
import './App.css';
|
|
7
8
|
|
|
8
9
|
function App() {
|
|
9
10
|
return (
|
|
10
|
-
<
|
|
11
|
-
<
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
<BrowserRouter>
|
|
12
|
+
<Routes>
|
|
13
|
+
<Route path="/" element={<Layout />}>
|
|
14
|
+
<Route index element={<Home />} />
|
|
15
|
+
<Route path="projects" element={<Projects />} />
|
|
16
|
+
<Route path="about" element={<About />} />
|
|
17
|
+
<Route path="contact" element={<Contact />} />
|
|
18
|
+
</Route>
|
|
19
|
+
</Routes>
|
|
20
|
+
</BrowserRouter>
|
|
17
21
|
);
|
|
18
22
|
}
|
|
19
23
|
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Outlet } from 'react-router-dom';
|
|
2
|
+
import Navbar from './Navbar';
|
|
3
|
+
import PortfolioFooter from './PortfolioFooter';
|
|
4
|
+
|
|
5
|
+
function Layout() {
|
|
6
|
+
return (
|
|
7
|
+
<div className="portfolio">
|
|
8
|
+
<Navbar />
|
|
9
|
+
<main>
|
|
10
|
+
<Outlet />
|
|
11
|
+
</main>
|
|
12
|
+
<PortfolioFooter />
|
|
13
|
+
</div>
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export default Layout;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { NavLink } from 'react-router-dom';
|
|
2
|
+
|
|
3
|
+
const navItems = [
|
|
4
|
+
{ to: '/', label: 'Home' },
|
|
5
|
+
{ to: '/projects', label: 'Projects' },
|
|
6
|
+
{ to: '/about', label: 'About' },
|
|
7
|
+
{ to: '/contact', label: 'Contact' },
|
|
8
|
+
];
|
|
9
|
+
|
|
10
|
+
function Navbar() {
|
|
11
|
+
return (
|
|
12
|
+
<nav className="portfolio-nav">
|
|
13
|
+
<NavLink to="/" className="logo">{'{{projectName}}'}</NavLink>
|
|
14
|
+
<div className="nav-links">
|
|
15
|
+
{navItems.map((item) => (
|
|
16
|
+
<NavLink
|
|
17
|
+
key={item.to}
|
|
18
|
+
to={item.to}
|
|
19
|
+
end={item.to === '/'}
|
|
20
|
+
className={({ isActive }) => isActive ? 'active' : ''}
|
|
21
|
+
>
|
|
22
|
+
{item.label}
|
|
23
|
+
</NavLink>
|
|
24
|
+
))}
|
|
25
|
+
</div>
|
|
26
|
+
</nav>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export default Navbar;
|
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
function PortfolioFooter() {
|
|
2
2
|
return (
|
|
3
3
|
<footer className="portfolio-footer">
|
|
4
4
|
<div className="footer-content">
|
|
5
5
|
<div className="footer-links">
|
|
6
|
-
<a href="
|
|
6
|
+
<a href="#" target="_blank" rel="noopener noreferrer">GitHub</a>
|
|
7
7
|
<a href="#">LinkedIn</a>
|
|
8
8
|
<a href="#">Twitter</a>
|
|
9
9
|
</div>
|
|
10
|
-
<p>© 2025 {{projectName}}. All rights reserved.</p>
|
|
10
|
+
<p>© 2025 {'{{projectName}}'}. All rights reserved.</p>
|
|
11
11
|
</div>
|
|
12
12
|
</footer>
|
|
13
13
|
);
|
|
14
14
|
}
|
|
15
|
+
|
|
16
|
+
export default PortfolioFooter;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Project } from '../data/projects';
|
|
2
|
+
|
|
3
|
+
interface ProjectCardProps {
|
|
4
|
+
project: Project;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
function ProjectCard({ project }: ProjectCardProps) {
|
|
8
|
+
return (
|
|
9
|
+
<div className="project-card">
|
|
10
|
+
<div className="project-image">{project.image}</div>
|
|
11
|
+
<div className="project-info">
|
|
12
|
+
<h3>{project.title}</h3>
|
|
13
|
+
<p>{project.description}</p>
|
|
14
|
+
<div className="project-tags">
|
|
15
|
+
{project.tags.map((tag, j) => (
|
|
16
|
+
<span key={j} className="tag">{tag}</span>
|
|
17
|
+
))}
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export default ProjectCard;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { skills } from '../data/projects';
|
|
2
|
+
|
|
3
|
+
function SkillsGrid() {
|
|
4
|
+
return (
|
|
5
|
+
<div className="skills-grid">
|
|
6
|
+
{skills.map((group, i) => (
|
|
7
|
+
<div key={i} className="skill-group">
|
|
8
|
+
<h3>{group.category}</h3>
|
|
9
|
+
<div className="skill-tags">
|
|
10
|
+
{group.items.map((skill, j) => (
|
|
11
|
+
<span key={j} className="skill-tag">{skill}</span>
|
|
12
|
+
))}
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
))}
|
|
16
|
+
</div>
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export default SkillsGrid;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface Project {
|
|
2
|
+
id: number;
|
|
3
|
+
title: string;
|
|
4
|
+
description: string;
|
|
5
|
+
image: string;
|
|
6
|
+
tags: string[];
|
|
7
|
+
category: string;
|
|
8
|
+
link: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const projects: Project[] = [
|
|
12
|
+
{ id: 1, title: 'E-Commerce Platform', description: 'Full-stack online store with cart, checkout, and payment integration.', image: '🛒', tags: ['React', 'Node.js', 'MongoDB'], category: 'Web App', link: '#' },
|
|
13
|
+
{ id: 2, title: 'Task Management App', description: 'Collaborative task manager with real-time updates and team features.', image: '📋', tags: ['Vue.js', 'Firebase', 'Tailwind'], category: 'Web App', link: '#' },
|
|
14
|
+
{ id: 3, title: 'Weather Dashboard', description: 'Beautiful weather visualization with forecasts and location search.', image: '🌤️', tags: ['TypeScript', 'API', 'Chart.js'], category: 'Dashboard', link: '#' },
|
|
15
|
+
{ id: 4, title: 'Social Media App', description: 'Social networking platform with posts, comments, and messaging.', image: '💬', tags: ['Next.js', 'PostgreSQL', 'WebSocket'], category: 'Mobile', link: '#' },
|
|
16
|
+
{ id: 5, title: 'Portfolio Website', description: 'Responsive portfolio with animations and dark mode support.', image: '🎨', tags: ['React', 'Framer Motion', 'SCSS'], category: 'Website', link: '#' },
|
|
17
|
+
{ id: 6, title: 'Blog CMS', description: 'Content management system with markdown editor and SEO tools.', image: '📝', tags: ['Nuxt', 'MongoDB', 'Markdown'], category: 'Website', link: '#' },
|
|
18
|
+
];
|
|
19
|
+
|
|
20
|
+
export const skills = [
|
|
21
|
+
{ category: 'Frontend', items: ['React', 'Vue', 'TypeScript', 'Tailwind CSS'] },
|
|
22
|
+
{ category: 'Backend', items: ['Node.js', 'Python', 'PostgreSQL', 'Redis'] },
|
|
23
|
+
{ category: 'DevOps', items: ['Docker', 'AWS', 'CI/CD', 'Linux'] },
|
|
24
|
+
{ category: 'Tools', items: ['Git', 'VS Code', 'Figma', 'Jira'] },
|
|
25
|
+
];
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import SkillsGrid from '../components/SkillsGrid';
|
|
2
|
+
|
|
3
|
+
const timeline = [
|
|
4
|
+
{ year: '2024 - Present', role: 'Senior Frontend Developer', company: 'Tech Corp', desc: 'Leading frontend architecture and mentoring junior developers.' },
|
|
5
|
+
{ year: '2022 - 2024', role: 'Frontend Developer', company: 'StartupXYZ', desc: 'Built and maintained multiple React applications from scratch.' },
|
|
6
|
+
{ year: '2020 - 2022', role: 'Junior Developer', company: 'Web Agency', desc: 'Developed responsive websites and learned modern frameworks.' },
|
|
7
|
+
];
|
|
8
|
+
|
|
9
|
+
function About() {
|
|
10
|
+
return (
|
|
11
|
+
<div className="about-section">
|
|
12
|
+
<h2>About Me</h2>
|
|
13
|
+
<p className="section-subtitle">My journey as a developer</p>
|
|
14
|
+
<div className="about-content">
|
|
15
|
+
<div className="about-bio">
|
|
16
|
+
<span className="about-avatar">👨💻</span>
|
|
17
|
+
<p>
|
|
18
|
+
I am a passionate software engineer with a love for building beautiful, performant
|
|
19
|
+
web applications. With expertise in modern JavaScript frameworks and a keen eye
|
|
20
|
+
for design, I bridge the gap between functionality and aesthetics.
|
|
21
|
+
</p>
|
|
22
|
+
</div>
|
|
23
|
+
<h3 className="timeline-title">Experience</h3>
|
|
24
|
+
<div className="timeline">
|
|
25
|
+
{timeline.map((item, i) => (
|
|
26
|
+
<div key={i} className="timeline-item">
|
|
27
|
+
<span className="timeline-year">{item.year}</span>
|
|
28
|
+
<h4>{item.role}</h4>
|
|
29
|
+
<span className="timeline-company">{item.company}</span>
|
|
30
|
+
<p>{item.desc}</p>
|
|
31
|
+
</div>
|
|
32
|
+
))}
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
<div className="skills-section">
|
|
36
|
+
<h3 className="timeline-title">Skills</h3>
|
|
37
|
+
<SkillsGrid />
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export default About;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
function Contact() {
|
|
2
|
+
return (
|
|
3
|
+
<div className="contact-section">
|
|
4
|
+
<h2>Get In Touch</h2>
|
|
5
|
+
<p className="section-subtitle">Have a project in mind? Let's work together.</p>
|
|
6
|
+
<div className="contact-grid">
|
|
7
|
+
<form className="contact-form" onSubmit={(e) => e.preventDefault()}>
|
|
8
|
+
<div className="form-row">
|
|
9
|
+
<div className="form-group">
|
|
10
|
+
<label htmlFor="name">Name</label>
|
|
11
|
+
<input type="text" id="name" placeholder="Your name" />
|
|
12
|
+
</div>
|
|
13
|
+
<div className="form-group">
|
|
14
|
+
<label htmlFor="email">Email</label>
|
|
15
|
+
<input type="email" id="email" placeholder="your@email.com" />
|
|
16
|
+
</div>
|
|
17
|
+
</div>
|
|
18
|
+
<div className="form-group">
|
|
19
|
+
<label htmlFor="subject">Subject</label>
|
|
20
|
+
<input type="text" id="subject" placeholder="Project inquiry" />
|
|
21
|
+
</div>
|
|
22
|
+
<div className="form-group">
|
|
23
|
+
<label htmlFor="message">Message</label>
|
|
24
|
+
<textarea id="message" rows={5} placeholder="Tell me about your project..." />
|
|
25
|
+
</div>
|
|
26
|
+
<button type="submit" className="btn btn-primary">Send Message</button>
|
|
27
|
+
</form>
|
|
28
|
+
<div className="contact-details">
|
|
29
|
+
<h3>Contact Info</h3>
|
|
30
|
+
<div className="contact-item">
|
|
31
|
+
<span>📧</span>
|
|
32
|
+
<p>hello@developer.com</p>
|
|
33
|
+
</div>
|
|
34
|
+
<div className="contact-item">
|
|
35
|
+
<span>📍</span>
|
|
36
|
+
<p>San Francisco, CA</p>
|
|
37
|
+
</div>
|
|
38
|
+
<div className="contact-item">
|
|
39
|
+
<span>🔗</span>
|
|
40
|
+
<p>github.com/developer</p>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export default Contact;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Link } from 'react-router-dom';
|
|
2
|
+
import ProjectCard from '../components/ProjectCard';
|
|
3
|
+
import SkillsGrid from '../components/SkillsGrid';
|
|
4
|
+
import { projects } from '../data/projects';
|
|
5
|
+
|
|
6
|
+
function Home() {
|
|
7
|
+
const featured = projects.slice(0, 3);
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<div>
|
|
11
|
+
<section className="portfolio-hero">
|
|
12
|
+
<div className="hero-content">
|
|
13
|
+
<span className="hero-greeting">Hi, I'm</span>
|
|
14
|
+
<h1>{'{{projectName}}'}</h1>
|
|
15
|
+
<p className="hero-role">Frontend Developer & Software Engineer</p>
|
|
16
|
+
<p className="hero-desc">
|
|
17
|
+
I craft pixel-perfect, user-centric web experiences with modern technologies.
|
|
18
|
+
Passionate about clean code and great design.
|
|
19
|
+
</p>
|
|
20
|
+
<div className="hero-actions">
|
|
21
|
+
<Link to="/projects" className="btn btn-primary">View My Work</Link>
|
|
22
|
+
<Link to="/contact" className="btn btn-outline">Get In Touch</Link>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
</section>
|
|
26
|
+
<section className="projects-section">
|
|
27
|
+
<h2>Featured Projects</h2>
|
|
28
|
+
<p className="section-subtitle">A selection of my recent work</p>
|
|
29
|
+
<div className="projects-grid">
|
|
30
|
+
{featured.map((project) => (
|
|
31
|
+
<ProjectCard key={project.id} project={project} />
|
|
32
|
+
))}
|
|
33
|
+
</div>
|
|
34
|
+
</section>
|
|
35
|
+
<section className="skills-section">
|
|
36
|
+
<h2>Skills & Technologies</h2>
|
|
37
|
+
<p className="section-subtitle">Technologies I work with daily</p>
|
|
38
|
+
<SkillsGrid />
|
|
39
|
+
</section>
|
|
40
|
+
</div>
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export default Home;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
import ProjectCard from '../components/ProjectCard';
|
|
3
|
+
import { projects } from '../data/projects';
|
|
4
|
+
|
|
5
|
+
const allCategories = ['All', ...Array.from(new Set(projects.map((p) => p.category)))];
|
|
6
|
+
|
|
7
|
+
function Projects() {
|
|
8
|
+
const [active, setActive] = useState('All');
|
|
9
|
+
|
|
10
|
+
const filtered = active === 'All' ? projects : projects.filter((p) => p.category === active);
|
|
11
|
+
|
|
12
|
+
return (
|
|
13
|
+
<section className="projects-section">
|
|
14
|
+
<h2>All Projects</h2>
|
|
15
|
+
<p className="section-subtitle">Browse my complete portfolio</p>
|
|
16
|
+
<div className="filter-bar">
|
|
17
|
+
{allCategories.map((cat) => (
|
|
18
|
+
<button
|
|
19
|
+
key={cat}
|
|
20
|
+
className={`filter-btn ${active === cat ? 'active' : ''}`}
|
|
21
|
+
onClick={() => setActive(cat)}
|
|
22
|
+
>
|
|
23
|
+
{cat}
|
|
24
|
+
</button>
|
|
25
|
+
))}
|
|
26
|
+
</div>
|
|
27
|
+
<div className="projects-grid">
|
|
28
|
+
{filtered.map((project) => (
|
|
29
|
+
<ProjectCard key={project.id} project={project} />
|
|
30
|
+
))}
|
|
31
|
+
</div>
|
|
32
|
+
</section>
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export default Projects;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { createRouter } from './router';
|
|
2
|
+
import { renderHome } from './pages/home';
|
|
3
|
+
import { renderProjects } from './pages/projects';
|
|
4
|
+
import { renderAbout } from './pages/about';
|
|
5
|
+
import { renderContact } from './pages/contact';
|
|
6
|
+
import './style.css';
|
|
7
|
+
|
|
8
|
+
export interface Project {
|
|
9
|
+
id: number;
|
|
10
|
+
title: string;
|
|
11
|
+
description: string;
|
|
12
|
+
image: string;
|
|
13
|
+
tags: string[];
|
|
14
|
+
category: string;
|
|
15
|
+
link: string;
|
|
16
|
+
year: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface Skill {
|
|
20
|
+
name: string;
|
|
21
|
+
level: number;
|
|
22
|
+
icon: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const projects: Project[] = [
|
|
26
|
+
{ id: 1, title: 'E-Commerce Platform', description: 'A full-featured online store with cart management, payment integration, and real-time inventory tracking.', image: '🛒', tags: ['React', 'Node.js', 'Stripe'], category: 'Web App', link: '#', year: '2024' },
|
|
27
|
+
{ id: 2, title: 'Task Management Dashboard', description: 'A collaborative project management tool with drag-and-drop boards, real-time updates, and team analytics.', image: '📋', tags: ['Vue.js', 'Firebase', 'Tailwind'], category: 'Web App', link: '#', year: '2024' },
|
|
28
|
+
{ id: 3, title: 'Weather Forecast App', description: 'A beautiful weather application with interactive maps, 7-day forecasts, and location-based alerts.', image: '🌤️', tags: ['React Native', 'API', 'Maps'], category: 'Mobile', link: '#', year: '2023' },
|
|
29
|
+
{ id: 4, title: 'Portfolio Website', description: 'A sleek and modern portfolio website showcasing creative work with smooth animations and responsive design.', image: '🎨', tags: ['HTML', 'CSS', 'JavaScript'], category: 'Design', link: '#', year: '2023' },
|
|
30
|
+
{ id: 5, title: 'Chat Application', description: 'Real-time messaging platform with group chats, file sharing, emoji reactions, and end-to-end encryption.', image: '💬', tags: ['Socket.io', 'Express', 'MongoDB'], category: 'Web App', link: '#', year: '2023' },
|
|
31
|
+
{ id: 6, title: 'Fitness Tracker', description: 'A health and fitness tracking application with workout logging, progress charts, and meal planning features.', image: '💪', tags: ['Flutter', 'Dart', 'SQLite'], category: 'Mobile', link: '#', year: '2022' },
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
export const skills: Skill[] = [
|
|
35
|
+
{ name: 'JavaScript', level: 95, icon: '🟨' },
|
|
36
|
+
{ name: 'TypeScript', level: 90, icon: '🔷' },
|
|
37
|
+
{ name: 'React', level: 92, icon: '⚛️' },
|
|
38
|
+
{ name: 'Node.js', level: 88, icon: '🟩' },
|
|
39
|
+
{ name: 'CSS/Sass', level: 85, icon: '🎨' },
|
|
40
|
+
{ name: 'Python', level: 78, icon: '🐍' },
|
|
41
|
+
{ name: 'Git', level: 90, icon: '📦' },
|
|
42
|
+
{ name: 'Docker', level: 72, icon: '🐳' },
|
|
43
|
+
];
|
|
44
|
+
|
|
45
|
+
export const experience = [
|
|
46
|
+
{ role: 'Senior Frontend Developer', company: 'TechCorp Inc.', period: '2022 - Present', description: 'Leading the frontend team in building scalable web applications using React and TypeScript.' },
|
|
47
|
+
{ role: 'Full Stack Developer', company: 'StartupHub', period: '2020 - 2022', description: 'Built and maintained multiple web applications from concept to deployment using modern tech stacks.' },
|
|
48
|
+
{ role: 'Junior Developer', company: 'WebAgency', period: '2018 - 2020', description: 'Developed responsive websites and landing pages for various clients across different industries.' },
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
const app = document.querySelector<HTMLElement>('#app')!;
|
|
52
|
+
|
|
53
|
+
createRouter([
|
|
54
|
+
{ path: '/', render: renderHome },
|
|
55
|
+
{ path: '/projects', render: renderProjects },
|
|
56
|
+
{ path: '/about', render: renderAbout },
|
|
57
|
+
{ path: '/contact', render: renderContact },
|
|
58
|
+
], app);
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { skills, experience } from '../main';
|
|
2
|
+
|
|
3
|
+
export function renderAbout(): string {
|
|
4
|
+
return `
|
|
5
|
+
<nav class="navbar">
|
|
6
|
+
<div class="nav-container">
|
|
7
|
+
<a href="#/" class="nav-logo">{{projectName}}</a>
|
|
8
|
+
<div class="nav-links">
|
|
9
|
+
<a href="#/">Home</a>
|
|
10
|
+
<a href="#/projects">Projects</a>
|
|
11
|
+
<a href="#/about" class="active">About</a>
|
|
12
|
+
<a href="#/contact">Contact</a>
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
</nav>
|
|
16
|
+
|
|
17
|
+
<main>
|
|
18
|
+
<section class="page-header">
|
|
19
|
+
<h1>About Me</h1>
|
|
20
|
+
<p>Learn more about my background, experience, and what drives me as a developer.</p>
|
|
21
|
+
</section>
|
|
22
|
+
|
|
23
|
+
<section class="section">
|
|
24
|
+
<div class="about-grid">
|
|
25
|
+
<div class="about-avatar-section">
|
|
26
|
+
<div class="about-avatar">👨💻</div>
|
|
27
|
+
<h2>{{projectName}}</h2>
|
|
28
|
+
<p class="about-subtitle">Full Stack Developer</p>
|
|
29
|
+
<div class="about-social">
|
|
30
|
+
<a href="#" class="social-link">🐙</a>
|
|
31
|
+
<a href="#" class="social-link">💼</a>
|
|
32
|
+
<a href="#" class="social-link">🐦</a>
|
|
33
|
+
<a href="#" class="social-link">📧</a>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
<div class="about-bio">
|
|
37
|
+
<h3>My Story</h3>
|
|
38
|
+
<p>I'm a passionate Full Stack Developer with over 5 years of experience building web and mobile applications. I specialize in creating performant, accessible, and visually appealing digital experiences.</p>
|
|
39
|
+
<p>My journey in software development began when I built my first website at age 15. Since then, I've been constantly learning and growing, working with startups and enterprises alike to deliver impactful solutions.</p>
|
|
40
|
+
<p>When I'm not coding, you can find me contributing to open source projects, writing technical articles, or exploring the great outdoors. I believe in continuous learning and sharing knowledge with the community.</p>
|
|
41
|
+
|
|
42
|
+
<div class="about-details">
|
|
43
|
+
<div class="detail-item">
|
|
44
|
+
<span class="detail-label">Location</span>
|
|
45
|
+
<span class="detail-value">📍 San Francisco, CA</span>
|
|
46
|
+
</div>
|
|
47
|
+
<div class="detail-item">
|
|
48
|
+
<span class="detail-label">Email</span>
|
|
49
|
+
<span class="detail-value">📧 hello@developer.com</span>
|
|
50
|
+
</div>
|
|
51
|
+
<div class="detail-item">
|
|
52
|
+
<span class="detail-label">Availability</span>
|
|
53
|
+
<span class="detail-value">🟢 Open to opportunities</span>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
</section>
|
|
59
|
+
|
|
60
|
+
<section class="section">
|
|
61
|
+
<h2>Experience</h2>
|
|
62
|
+
<div class="timeline">
|
|
63
|
+
${experience.map((exp, i) => `
|
|
64
|
+
<div class="timeline-item">
|
|
65
|
+
<div class="timeline-dot"></div>
|
|
66
|
+
<div class="timeline-content">
|
|
67
|
+
<div class="timeline-header">
|
|
68
|
+
<h3>${exp.role}</h3>
|
|
69
|
+
<span class="timeline-period">${exp.period}</span>
|
|
70
|
+
</div>
|
|
71
|
+
<p class="timeline-company">${exp.company}</p>
|
|
72
|
+
<p class="timeline-description">${exp.description}</p>
|
|
73
|
+
</div>
|
|
74
|
+
</div>
|
|
75
|
+
`).join('')}
|
|
76
|
+
</div>
|
|
77
|
+
</section>
|
|
78
|
+
|
|
79
|
+
<section class="section">
|
|
80
|
+
<h2>Skills & Expertise</h2>
|
|
81
|
+
<div class="skills-grid">
|
|
82
|
+
${skills.map(s => `
|
|
83
|
+
<div class="skill-card">
|
|
84
|
+
<div class="skill-header">
|
|
85
|
+
<span class="skill-icon">${s.icon}</span>
|
|
86
|
+
<span class="skill-name">${s.name}</span>
|
|
87
|
+
<span class="skill-level">${s.level}%</span>
|
|
88
|
+
</div>
|
|
89
|
+
<div class="skill-bar">
|
|
90
|
+
<div class="skill-fill" style="width: ${s.level}%"></div>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
`).join('')}
|
|
94
|
+
</div>
|
|
95
|
+
</section>
|
|
96
|
+
|
|
97
|
+
<section class="section">
|
|
98
|
+
<div class="education-grid">
|
|
99
|
+
<div class="edu-card">
|
|
100
|
+
<div class="edu-icon">🎓</div>
|
|
101
|
+
<h3>B.S. Computer Science</h3>
|
|
102
|
+
<p class="edu-school">University of Technology</p>
|
|
103
|
+
<p class="edu-year">2014 - 2018</p>
|
|
104
|
+
</div>
|
|
105
|
+
<div class="edu-card">
|
|
106
|
+
<div class="edu-icon">📜</div>
|
|
107
|
+
<h3>AWS Certified Developer</h3>
|
|
108
|
+
<p class="edu-school">Amazon Web Services</p>
|
|
109
|
+
<p class="edu-year">2021</p>
|
|
110
|
+
</div>
|
|
111
|
+
<div class="edu-card">
|
|
112
|
+
<div class="edu-icon">📜</div>
|
|
113
|
+
<h3>Google UX Design Certificate</h3>
|
|
114
|
+
<p class="edu-school">Google / Coursera</p>
|
|
115
|
+
<p class="edu-year">2022</p>
|
|
116
|
+
</div>
|
|
117
|
+
</div>
|
|
118
|
+
</section>
|
|
119
|
+
</main>
|
|
120
|
+
|
|
121
|
+
<footer class="footer">
|
|
122
|
+
<div class="footer-content">
|
|
123
|
+
<div class="footer-section">
|
|
124
|
+
<h4>{{projectName}}</h4>
|
|
125
|
+
<p>Full Stack Developer crafting digital experiences that make a difference.</p>
|
|
126
|
+
</div>
|
|
127
|
+
<div class="footer-section">
|
|
128
|
+
<h4>Quick Links</h4>
|
|
129
|
+
<a href="#/">Home</a>
|
|
130
|
+
<a href="#/projects">Projects</a>
|
|
131
|
+
<a href="#/about">About</a>
|
|
132
|
+
<a href="#/contact">Contact</a>
|
|
133
|
+
</div>
|
|
134
|
+
<div class="footer-section">
|
|
135
|
+
<h4>Connect</h4>
|
|
136
|
+
<a href="#">🐙 GitHub</a>
|
|
137
|
+
<a href="#">💼 LinkedIn</a>
|
|
138
|
+
<a href="#">🐦 Twitter</a>
|
|
139
|
+
</div>
|
|
140
|
+
</div>
|
|
141
|
+
<div class="footer-bottom">
|
|
142
|
+
<p>© 2024 {{projectName}}. All rights reserved.</p>
|
|
143
|
+
</div>
|
|
144
|
+
</footer>
|
|
145
|
+
`;
|
|
146
|
+
}
|