@beknurakhmed/webforge-cli 0.1.1 → 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 -226
- 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
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { ref } from 'vue'
|
|
3
|
+
import { categories } from '../data'
|
|
4
|
+
|
|
5
|
+
const email = ref('')
|
|
6
|
+
const subscribed = ref(false)
|
|
7
|
+
|
|
8
|
+
const subscribe = () => {
|
|
9
|
+
if (email.value) {
|
|
10
|
+
subscribed.value = true
|
|
11
|
+
email.value = ''
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
<template>
|
|
17
|
+
<aside class="blog-sidebar">
|
|
18
|
+
<h3>Categories</h3>
|
|
19
|
+
<ul class="category-list">
|
|
20
|
+
<li v-for="cat in categories" :key="cat">
|
|
21
|
+
<RouterLink :to="`/category/${cat.toLowerCase().replace('.', '')}`">{{ cat }}</RouterLink>
|
|
22
|
+
</li>
|
|
23
|
+
</ul>
|
|
24
|
+
<h3>Newsletter</h3>
|
|
25
|
+
<div class="newsletter-form">
|
|
26
|
+
<input v-model="email" type="email" placeholder="your@email.com" />
|
|
27
|
+
<button @click="subscribe">Subscribe</button>
|
|
28
|
+
<p v-if="subscribed" style="color: #059669; font-size: 0.8rem; margin-top: 0.4rem;">Subscribed!</p>
|
|
29
|
+
</div>
|
|
30
|
+
</aside>
|
|
31
|
+
</template>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type { Post } from '../data'
|
|
3
|
+
|
|
4
|
+
defineProps<{ post: Post }>()
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<template>
|
|
8
|
+
<RouterLink :to="`/post/${post.id}`" class="post-card" style="text-decoration: none; color: inherit;">
|
|
9
|
+
<div class="post-image">{{ post.image }}</div>
|
|
10
|
+
<div class="post-body">
|
|
11
|
+
<div class="post-category">{{ post.category }}</div>
|
|
12
|
+
<div class="post-title">{{ post.title }}</div>
|
|
13
|
+
<div class="post-excerpt">{{ post.excerpt }}</div>
|
|
14
|
+
<div class="post-meta">{{ post.author }} · {{ post.date }} · {{ post.readTime }}</div>
|
|
15
|
+
</div>
|
|
16
|
+
</RouterLink>
|
|
17
|
+
</template>
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export interface Post {
|
|
2
|
+
id: number
|
|
3
|
+
title: string
|
|
4
|
+
excerpt: string
|
|
5
|
+
content: string
|
|
6
|
+
category: string
|
|
7
|
+
author: string
|
|
8
|
+
date: string
|
|
9
|
+
readTime: string
|
|
10
|
+
image: string
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const categories = ['React', 'TypeScript', 'CSS', 'JavaScript', 'Node.js', 'DevOps']
|
|
14
|
+
|
|
15
|
+
export const posts: Post[] = [
|
|
16
|
+
{
|
|
17
|
+
id: 1,
|
|
18
|
+
title: 'Getting Started with React Hooks',
|
|
19
|
+
excerpt: 'Learn how to use useState and useEffect to manage state and side effects in functional components.',
|
|
20
|
+
content: 'React Hooks revolutionized how we write components. With useState, you can add state to functional components without converting them to classes. The useEffect hook handles side effects like data fetching, subscriptions, and DOM manipulation. Together, they provide a cleaner and more composable way to build React applications.',
|
|
21
|
+
category: 'React',
|
|
22
|
+
author: 'Jane Developer',
|
|
23
|
+
date: 'Mar 15, 2025',
|
|
24
|
+
readTime: '5 min read',
|
|
25
|
+
image: '⚛️',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: 2,
|
|
29
|
+
title: 'TypeScript Best Practices for 2025',
|
|
30
|
+
excerpt: 'Explore advanced TypeScript patterns including generics, utility types, and strict configurations.',
|
|
31
|
+
content: 'TypeScript continues to evolve with powerful features. Generics allow you to write reusable, type-safe code. Utility types like Partial, Pick, and Omit help you transform existing types. Enabling strict mode catches more bugs at compile time. These practices lead to more maintainable and robust codebases.',
|
|
32
|
+
category: 'TypeScript',
|
|
33
|
+
author: 'Jane Developer',
|
|
34
|
+
date: 'Mar 10, 2025',
|
|
35
|
+
readTime: '7 min read',
|
|
36
|
+
image: '📘',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: 3,
|
|
40
|
+
title: 'Modern CSS Layout Techniques',
|
|
41
|
+
excerpt: 'Master CSS Grid and Flexbox to create responsive layouts without frameworks.',
|
|
42
|
+
content: 'CSS Grid and Flexbox are the foundation of modern web layouts. Grid excels at two-dimensional layouts while Flexbox handles one-dimensional alignment. Combined with container queries and logical properties, you can build truly responsive designs that adapt to any context without relying on external frameworks.',
|
|
43
|
+
category: 'CSS',
|
|
44
|
+
author: 'Alex Writer',
|
|
45
|
+
date: 'Mar 5, 2025',
|
|
46
|
+
readTime: '6 min read',
|
|
47
|
+
image: '🎨',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: 4,
|
|
51
|
+
title: 'Building REST APIs with Node.js',
|
|
52
|
+
excerpt: 'A comprehensive guide to creating scalable REST APIs using Express and Node.js.',
|
|
53
|
+
content: 'Node.js makes it straightforward to build performant REST APIs. Using Express as your framework, you can define routes, middleware, and error handlers. Add validation with libraries like Zod, connect to databases with ORMs, and implement authentication with JWT tokens for a complete backend solution.',
|
|
54
|
+
category: 'Node.js',
|
|
55
|
+
author: 'Alex Writer',
|
|
56
|
+
date: 'Feb 28, 2025',
|
|
57
|
+
readTime: '8 min read',
|
|
58
|
+
image: '🟢',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
id: 5,
|
|
62
|
+
title: 'JavaScript ES2025 Features',
|
|
63
|
+
excerpt: 'Discover the latest JavaScript features including new array methods and pattern matching.',
|
|
64
|
+
content: 'ES2025 brings exciting additions to JavaScript. New array methods like groupBy simplify data transformations. The pipeline operator makes function composition more readable. Pattern matching with the match expression provides powerful control flow. These features make JavaScript more expressive and developer-friendly.',
|
|
65
|
+
category: 'JavaScript',
|
|
66
|
+
author: 'Jane Developer',
|
|
67
|
+
date: 'Feb 20, 2025',
|
|
68
|
+
readTime: '4 min read',
|
|
69
|
+
image: '✨',
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
id: 6,
|
|
73
|
+
title: 'Docker for Frontend Developers',
|
|
74
|
+
excerpt: 'Learn how to containerize your frontend applications for consistent deployments.',
|
|
75
|
+
content: 'Docker simplifies deployment by packaging your application with its dependencies. Create a Dockerfile for your frontend app, use multi-stage builds to optimize image size, and deploy consistently across environments. Docker Compose helps manage multi-service setups with databases and API servers alongside your frontend.',
|
|
76
|
+
category: 'DevOps',
|
|
77
|
+
author: 'Alex Writer',
|
|
78
|
+
date: 'Feb 15, 2025',
|
|
79
|
+
readTime: '6 min read',
|
|
80
|
+
image: '🐳',
|
|
81
|
+
},
|
|
82
|
+
]
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
</script>
|
|
3
|
+
|
|
4
|
+
<template>
|
|
5
|
+
<div class="about-page">
|
|
6
|
+
<div class="about-avatar">👩💻</div>
|
|
7
|
+
<h1>Jane Developer</h1>
|
|
8
|
+
<p class="about-role">Full-Stack Developer & Technical Writer</p>
|
|
9
|
+
<div class="about-bio">
|
|
10
|
+
<p>Hi! I'm Jane, a passionate developer with over 8 years of experience building web applications. I write about React, TypeScript, Node.js, and modern web development practices.</p>
|
|
11
|
+
<br />
|
|
12
|
+
<p>When I'm not coding, you can find me contributing to open-source projects, mentoring junior developers, or exploring new technologies. I believe in writing clean, maintainable code and sharing knowledge with the community.</p>
|
|
13
|
+
<br />
|
|
14
|
+
<p>This blog is my space to share tutorials, best practices, and insights from real-world projects. Feel free to reach out if you have questions or want to collaborate!</p>
|
|
15
|
+
</div>
|
|
16
|
+
</div>
|
|
17
|
+
</template>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { computed } from 'vue'
|
|
3
|
+
import { useRoute } from 'vue-router'
|
|
4
|
+
import PostCard from '../components/PostCard.vue'
|
|
5
|
+
import { posts } from '../data'
|
|
6
|
+
|
|
7
|
+
const route = useRoute()
|
|
8
|
+
|
|
9
|
+
const slug = computed(() => route.params.slug as string)
|
|
10
|
+
|
|
11
|
+
const filtered = computed(() =>
|
|
12
|
+
posts.filter(p => p.category.toLowerCase().replace('.', '') === slug.value)
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
const categoryName = computed(() =>
|
|
16
|
+
filtered.value.length ? filtered.value[0].category : slug.value
|
|
17
|
+
)
|
|
18
|
+
</script>
|
|
19
|
+
|
|
20
|
+
<template>
|
|
21
|
+
<div>
|
|
22
|
+
<div class="category-header">
|
|
23
|
+
<h1>{{ categoryName }}</h1>
|
|
24
|
+
<p style="color: #6b7280; margin-bottom: 1rem;">{{ filtered.length }} post(s) in this category</p>
|
|
25
|
+
</div>
|
|
26
|
+
<div class="posts-grid">
|
|
27
|
+
<PostCard v-for="post in filtered" :key="post.id" :post="post" />
|
|
28
|
+
</div>
|
|
29
|
+
<p v-if="!filtered.length" style="color: #6b7280;">No posts found in this category.</p>
|
|
30
|
+
<RouterLink to="/" style="display: inline-block; margin-top: 1rem;">← Back to all posts</RouterLink>
|
|
31
|
+
</div>
|
|
32
|
+
</template>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import PostCard from '../components/PostCard.vue'
|
|
3
|
+
import BlogSidebar from '../components/BlogSidebar.vue'
|
|
4
|
+
import { posts } from '../data'
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<template>
|
|
8
|
+
<div class="blog-layout">
|
|
9
|
+
<div class="posts-grid">
|
|
10
|
+
<PostCard v-for="post in posts" :key="post.id" :post="post" />
|
|
11
|
+
</div>
|
|
12
|
+
<BlogSidebar />
|
|
13
|
+
</div>
|
|
14
|
+
</template>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { computed } from 'vue'
|
|
3
|
+
import { useRoute } from 'vue-router'
|
|
4
|
+
import { posts } from '../data'
|
|
5
|
+
|
|
6
|
+
const route = useRoute()
|
|
7
|
+
const post = computed(() => posts.find(p => p.id === Number(route.params.id)))
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<template>
|
|
11
|
+
<div class="post-detail" v-if="post">
|
|
12
|
+
<RouterLink to="/" class="back-link">← Back to posts</RouterLink>
|
|
13
|
+
<div class="post-hero-image">{{ post.image }}</div>
|
|
14
|
+
<h1>{{ post.title }}</h1>
|
|
15
|
+
<div class="detail-meta">{{ post.author }} · {{ post.date }} · {{ post.readTime }}</div>
|
|
16
|
+
<div class="post-content">{{ post.content }}</div>
|
|
17
|
+
</div>
|
|
18
|
+
<div v-else class="post-detail">
|
|
19
|
+
<RouterLink to="/" class="back-link">← Back to posts</RouterLink>
|
|
20
|
+
<p>Post not found.</p>
|
|
21
|
+
</div>
|
|
22
|
+
</template>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createRouter, createWebHistory } from 'vue-router'
|
|
2
|
+
import Home from './pages/Home.vue'
|
|
3
|
+
import PostDetail from './pages/PostDetail.vue'
|
|
4
|
+
import Category from './pages/Category.vue'
|
|
5
|
+
import About from './pages/About.vue'
|
|
6
|
+
|
|
7
|
+
const routes = [
|
|
8
|
+
{ path: '/', component: Home },
|
|
9
|
+
{ path: '/post/:id', component: PostDetail },
|
|
10
|
+
{ path: '/category/:slug', component: Category },
|
|
11
|
+
{ path: '/about', component: About },
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
const router = createRouter({
|
|
15
|
+
history: createWebHistory(),
|
|
16
|
+
routes,
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
export default router
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
/* Blog Global Styles */
|
|
2
|
+
*,
|
|
3
|
+
*::before,
|
|
4
|
+
*::after {
|
|
5
|
+
box-sizing: border-box;
|
|
6
|
+
margin: 0;
|
|
7
|
+
padding: 0;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
body {
|
|
11
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
12
|
+
color: #374151;
|
|
13
|
+
background: #f9fafb;
|
|
14
|
+
line-height: 1.7;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
a {
|
|
18
|
+
color: #4f46e5;
|
|
19
|
+
text-decoration: none;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
a:hover {
|
|
23
|
+
text-decoration: underline;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/* Header */
|
|
27
|
+
.blog-header {
|
|
28
|
+
background: #fff;
|
|
29
|
+
border-bottom: 1px solid #e5e7eb;
|
|
30
|
+
padding: 1rem 2rem;
|
|
31
|
+
display: flex;
|
|
32
|
+
align-items: center;
|
|
33
|
+
justify-content: space-between;
|
|
34
|
+
max-width: 1100px;
|
|
35
|
+
width: 100%;
|
|
36
|
+
margin: 0 auto;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.blog-header-wrap {
|
|
40
|
+
background: #fff;
|
|
41
|
+
border-bottom: 1px solid #e5e7eb;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.blog-header .logo {
|
|
45
|
+
font-size: 1.35rem;
|
|
46
|
+
font-weight: 700;
|
|
47
|
+
color: #111827;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.blog-header nav {
|
|
51
|
+
display: flex;
|
|
52
|
+
gap: 1.5rem;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.blog-header nav a {
|
|
56
|
+
color: #6b7280;
|
|
57
|
+
font-weight: 500;
|
|
58
|
+
font-size: 0.95rem;
|
|
59
|
+
text-decoration: none;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.blog-header nav a:hover,
|
|
63
|
+
.blog-header nav a.router-link-exact-active {
|
|
64
|
+
color: #4f46e5;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* Post Cards */
|
|
68
|
+
.posts-grid {
|
|
69
|
+
display: flex;
|
|
70
|
+
flex-direction: column;
|
|
71
|
+
gap: 1.5rem;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.post-card {
|
|
75
|
+
background: #fff;
|
|
76
|
+
border-radius: 8px;
|
|
77
|
+
overflow: hidden;
|
|
78
|
+
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
|
|
79
|
+
display: flex;
|
|
80
|
+
transition: box-shadow 0.2s;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.post-card:hover {
|
|
84
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.post-card .post-image {
|
|
88
|
+
width: 180px;
|
|
89
|
+
min-height: 140px;
|
|
90
|
+
background: #eef2ff;
|
|
91
|
+
display: flex;
|
|
92
|
+
align-items: center;
|
|
93
|
+
justify-content: center;
|
|
94
|
+
font-size: 3rem;
|
|
95
|
+
flex-shrink: 0;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.post-card .post-body {
|
|
99
|
+
padding: 1.25rem;
|
|
100
|
+
flex: 1;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.post-card .post-category {
|
|
104
|
+
font-size: 0.75rem;
|
|
105
|
+
font-weight: 600;
|
|
106
|
+
color: #4f46e5;
|
|
107
|
+
text-transform: uppercase;
|
|
108
|
+
letter-spacing: 0.05em;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.post-card .post-title {
|
|
112
|
+
font-size: 1.15rem;
|
|
113
|
+
font-weight: 700;
|
|
114
|
+
color: #111827;
|
|
115
|
+
margin: 0.3rem 0 0.4rem;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.post-card .post-excerpt {
|
|
119
|
+
font-size: 0.9rem;
|
|
120
|
+
color: #6b7280;
|
|
121
|
+
line-height: 1.5;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.post-card .post-meta {
|
|
125
|
+
margin-top: 0.75rem;
|
|
126
|
+
font-size: 0.8rem;
|
|
127
|
+
color: #9ca3af;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/* Post Detail */
|
|
131
|
+
.post-detail {
|
|
132
|
+
max-width: 720px;
|
|
133
|
+
margin: 0 auto;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.post-detail .back-link {
|
|
137
|
+
display: inline-block;
|
|
138
|
+
margin-bottom: 1.5rem;
|
|
139
|
+
font-size: 0.9rem;
|
|
140
|
+
color: #4f46e5;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.post-detail .post-hero-image {
|
|
144
|
+
font-size: 4rem;
|
|
145
|
+
text-align: center;
|
|
146
|
+
background: #eef2ff;
|
|
147
|
+
padding: 2rem;
|
|
148
|
+
border-radius: 8px;
|
|
149
|
+
margin-bottom: 1.5rem;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.post-detail h1 {
|
|
153
|
+
font-size: 2rem;
|
|
154
|
+
color: #111827;
|
|
155
|
+
margin-bottom: 0.5rem;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.post-detail .detail-meta {
|
|
159
|
+
color: #6b7280;
|
|
160
|
+
font-size: 0.9rem;
|
|
161
|
+
margin-bottom: 1.5rem;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.post-detail .post-content {
|
|
165
|
+
font-size: 1.05rem;
|
|
166
|
+
line-height: 1.8;
|
|
167
|
+
color: #374151;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/* Blog Sidebar */
|
|
171
|
+
.blog-layout {
|
|
172
|
+
display: grid;
|
|
173
|
+
grid-template-columns: 1fr 300px;
|
|
174
|
+
gap: 2rem;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.blog-sidebar {
|
|
178
|
+
background: #fff;
|
|
179
|
+
border-radius: 8px;
|
|
180
|
+
padding: 1.25rem;
|
|
181
|
+
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
|
|
182
|
+
height: fit-content;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.blog-sidebar h3 {
|
|
186
|
+
font-size: 0.95rem;
|
|
187
|
+
color: #111827;
|
|
188
|
+
margin-bottom: 0.75rem;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
.blog-sidebar .category-list {
|
|
192
|
+
list-style: none;
|
|
193
|
+
margin-bottom: 1.5rem;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
.blog-sidebar .category-list li {
|
|
197
|
+
margin-bottom: 0.4rem;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
.blog-sidebar .category-list a {
|
|
201
|
+
font-size: 0.9rem;
|
|
202
|
+
color: #6b7280;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.blog-sidebar .category-list a:hover {
|
|
206
|
+
color: #4f46e5;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
.blog-sidebar .newsletter-form input {
|
|
210
|
+
width: 100%;
|
|
211
|
+
padding: 0.5rem 0.75rem;
|
|
212
|
+
border: 1px solid #d1d5db;
|
|
213
|
+
border-radius: 6px;
|
|
214
|
+
font-size: 0.85rem;
|
|
215
|
+
margin-bottom: 0.5rem;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
.blog-sidebar .newsletter-form button {
|
|
219
|
+
width: 100%;
|
|
220
|
+
padding: 0.5rem;
|
|
221
|
+
background: #4f46e5;
|
|
222
|
+
color: #fff;
|
|
223
|
+
border: none;
|
|
224
|
+
border-radius: 6px;
|
|
225
|
+
font-size: 0.85rem;
|
|
226
|
+
font-weight: 600;
|
|
227
|
+
cursor: pointer;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
.blog-sidebar .newsletter-form button:hover {
|
|
231
|
+
background: #4338ca;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/* About Page */
|
|
235
|
+
.about-page {
|
|
236
|
+
max-width: 680px;
|
|
237
|
+
margin: 0 auto;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
.about-page .about-avatar {
|
|
241
|
+
font-size: 4rem;
|
|
242
|
+
text-align: center;
|
|
243
|
+
margin-bottom: 1rem;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.about-page h1 {
|
|
247
|
+
font-size: 1.75rem;
|
|
248
|
+
color: #111827;
|
|
249
|
+
text-align: center;
|
|
250
|
+
margin-bottom: 0.5rem;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
.about-page .about-role {
|
|
254
|
+
text-align: center;
|
|
255
|
+
color: #6b7280;
|
|
256
|
+
margin-bottom: 1.5rem;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
.about-page .about-bio {
|
|
260
|
+
font-size: 1rem;
|
|
261
|
+
line-height: 1.8;
|
|
262
|
+
color: #374151;
|
|
263
|
+
background: #fff;
|
|
264
|
+
padding: 1.5rem;
|
|
265
|
+
border-radius: 8px;
|
|
266
|
+
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/* Category Page */
|
|
270
|
+
.category-header {
|
|
271
|
+
margin-bottom: 1.5rem;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
.category-header h1 {
|
|
275
|
+
font-size: 1.5rem;
|
|
276
|
+
color: #111827;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/* Footer */
|
|
280
|
+
.blog-footer {
|
|
281
|
+
text-align: center;
|
|
282
|
+
padding: 1.5rem;
|
|
283
|
+
color: #9ca3af;
|
|
284
|
+
font-size: 0.85rem;
|
|
285
|
+
border-top: 1px solid #e5e7eb;
|
|
286
|
+
background: #fff;
|
|
287
|
+
margin-top: auto;
|
|
288
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';
|
|
3
|
+
|
|
4
|
+
@Component({
|
|
5
|
+
selector: 'app-root',
|
|
6
|
+
standalone: true,
|
|
7
|
+
imports: [RouterOutlet, RouterLink, RouterLinkActive],
|
|
8
|
+
template: `
|
|
9
|
+
<div class="layout">
|
|
10
|
+
<aside class="sidebar">
|
|
11
|
+
<div class="logo">{{projectName}}</div>
|
|
12
|
+
<nav>
|
|
13
|
+
<a routerLink="/" routerLinkActive="active"
|
|
14
|
+
[routerLinkActiveOptions]="{ exact: true }">
|
|
15
|
+
<span class="nav-icon">📊</span> Dashboard
|
|
16
|
+
</a>
|
|
17
|
+
<a routerLink="/contacts" routerLinkActive="active">
|
|
18
|
+
<span class="nav-icon">👤</span> Contacts
|
|
19
|
+
</a>
|
|
20
|
+
<a routerLink="/deals" routerLinkActive="active">
|
|
21
|
+
<span class="nav-icon">💼</span> Deals
|
|
22
|
+
</a>
|
|
23
|
+
<a routerLink="/settings" routerLinkActive="active">
|
|
24
|
+
<span class="nav-icon">⚙️</span> Settings
|
|
25
|
+
</a>
|
|
26
|
+
</nav>
|
|
27
|
+
</aside>
|
|
28
|
+
<main class="content">
|
|
29
|
+
<router-outlet />
|
|
30
|
+
</main>
|
|
31
|
+
</div>
|
|
32
|
+
`,
|
|
33
|
+
styles: [`
|
|
34
|
+
.layout {
|
|
35
|
+
display: flex;
|
|
36
|
+
min-height: 100vh;
|
|
37
|
+
background: #f9fafb;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.sidebar {
|
|
41
|
+
width: 240px;
|
|
42
|
+
background: #111827;
|
|
43
|
+
color: #fff;
|
|
44
|
+
padding: 24px 16px;
|
|
45
|
+
display: flex;
|
|
46
|
+
flex-direction: column;
|
|
47
|
+
gap: 32px;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.logo {
|
|
51
|
+
font-size: 20px;
|
|
52
|
+
font-weight: 700;
|
|
53
|
+
color: #fff;
|
|
54
|
+
padding: 0 8px;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
nav {
|
|
58
|
+
display: flex;
|
|
59
|
+
flex-direction: column;
|
|
60
|
+
gap: 4px;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
nav a {
|
|
64
|
+
display: flex;
|
|
65
|
+
align-items: center;
|
|
66
|
+
gap: 12px;
|
|
67
|
+
padding: 10px 12px;
|
|
68
|
+
border-radius: 8px;
|
|
69
|
+
color: #9ca3af;
|
|
70
|
+
text-decoration: none;
|
|
71
|
+
font-size: 14px;
|
|
72
|
+
font-weight: 500;
|
|
73
|
+
transition: all 0.2s;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
nav a:hover {
|
|
77
|
+
background: #1f2937;
|
|
78
|
+
color: #fff;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
nav a.active {
|
|
82
|
+
background: #4f46e5;
|
|
83
|
+
color: #fff;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.nav-icon { font-size: 18px; }
|
|
87
|
+
|
|
88
|
+
.content {
|
|
89
|
+
flex: 1;
|
|
90
|
+
padding: 32px;
|
|
91
|
+
overflow-y: auto;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
@media (max-width: 768px) {
|
|
95
|
+
.layout { flex-direction: column; }
|
|
96
|
+
|
|
97
|
+
.sidebar {
|
|
98
|
+
width: 100%;
|
|
99
|
+
padding: 16px;
|
|
100
|
+
gap: 16px;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
nav {
|
|
104
|
+
flex-direction: row;
|
|
105
|
+
overflow-x: auto;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
`]
|
|
109
|
+
})
|
|
110
|
+
export class AppComponent {}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Routes } from '@angular/router';
|
|
2
|
+
import { DashboardHomeComponent } from './pages/dashboard-home.component';
|
|
3
|
+
import { ContactsComponent } from './pages/contacts.component';
|
|
4
|
+
import { DealsComponent } from './pages/deals.component';
|
|
5
|
+
import { SettingsComponent } from './pages/settings.component';
|
|
6
|
+
|
|
7
|
+
export const routes: Routes = [
|
|
8
|
+
{ path: '', component: DashboardHomeComponent },
|
|
9
|
+
{ path: 'contacts', component: ContactsComponent },
|
|
10
|
+
{ path: 'deals', component: DealsComponent },
|
|
11
|
+
{ path: 'settings', component: SettingsComponent },
|
|
12
|
+
];
|