nextworks 0.0.1 → 0.1.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +209 -30
- package/dist/.gitkeep +0 -0
- package/dist/cli_manifests/auth_manifest.json +86 -0
- package/dist/cli_manifests/blocks_manifest.json +185 -0
- package/dist/cli_manifests/data_manifest.json +51 -0
- package/dist/cli_manifests/forms_manifest.json +61 -0
- package/dist/commands/admin-posts.d.ts +2 -0
- package/dist/commands/admin-posts.d.ts.map +1 -0
- package/dist/commands/admin-posts.js +15 -0
- package/dist/commands/admin-posts.js.map +1 -0
- package/dist/commands/admin-users.d.ts +2 -0
- package/dist/commands/admin-users.d.ts.map +1 -0
- package/dist/commands/admin-users.js +15 -0
- package/dist/commands/admin-users.js.map +1 -0
- package/dist/commands/auth-core.d.ts +2 -0
- package/dist/commands/auth-core.d.ts.map +1 -0
- package/dist/commands/auth-core.js +83 -0
- package/dist/commands/auth-core.js.map +1 -0
- package/dist/commands/auth-forms.d.ts +2 -0
- package/dist/commands/auth-forms.d.ts.map +1 -0
- package/dist/commands/auth-forms.js +15 -0
- package/dist/commands/auth-forms.js.map +1 -0
- package/dist/commands/blocks-options.d.ts +7 -0
- package/dist/commands/blocks-options.d.ts.map +1 -0
- package/dist/commands/blocks-options.js +19 -0
- package/dist/commands/blocks-options.js.map +1 -0
- package/dist/commands/blocks.d.ts +7 -0
- package/dist/commands/blocks.d.ts.map +1 -0
- package/dist/commands/blocks.js +140 -0
- package/dist/commands/blocks.js.map +1 -0
- package/dist/commands/data.d.ts +3 -0
- package/dist/commands/data.d.ts.map +1 -0
- package/dist/commands/data.js +88 -0
- package/dist/commands/data.js.map +1 -0
- package/dist/commands/forms.d.ts +6 -0
- package/dist/commands/forms.d.ts.map +1 -0
- package/dist/commands/forms.js +107 -0
- package/dist/commands/forms.js.map +1 -0
- package/dist/commands/remove-auth-core.d.ts +2 -0
- package/dist/commands/remove-auth-core.d.ts.map +1 -0
- package/dist/commands/remove-auth-core.js +69 -0
- package/dist/commands/remove-auth-core.js.map +1 -0
- package/dist/commands/remove-blocks.d.ts +2 -0
- package/dist/commands/remove-blocks.d.ts.map +1 -0
- package/dist/commands/remove-blocks.js +36 -0
- package/dist/commands/remove-blocks.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/kits/auth-core/README.md +82 -0
- package/dist/kits/auth-core/app/(protected)/dashboard/page.tsx +8 -0
- package/dist/kits/auth-core/app/(protected)/layout.tsx +18 -0
- package/dist/kits/auth-core/app/(protected)/settings/profile/page.tsx +15 -0
- package/dist/kits/auth-core/app/(protected)/settings/profile/profile-form.tsx +114 -0
- package/dist/kits/auth-core/app/api/auth/[...nextauth]/route.ts +1 -0
- package/dist/kits/auth-core/app/api/auth/forgot-password/route.ts +114 -0
- package/dist/kits/auth-core/app/api/auth/providers/route.ts +6 -0
- package/dist/kits/auth-core/app/api/auth/reset-password/route.ts +63 -0
- package/dist/kits/auth-core/app/api/auth/send-verify-email/route.ts +6 -0
- package/dist/kits/auth-core/app/api/signup/route.ts +41 -0
- package/dist/kits/auth-core/app/auth/forgot-password/page.tsx +21 -0
- package/dist/kits/auth-core/app/auth/login/page.tsx +5 -0
- package/dist/kits/auth-core/app/auth/reset-password/page.tsx +187 -0
- package/dist/kits/auth-core/app/auth/signup/page.tsx +5 -0
- package/dist/kits/auth-core/app/auth/verify-email/page.tsx +11 -0
- package/dist/kits/auth-core/components/admin/admin-header.tsx +57 -0
- package/dist/kits/auth-core/components/auth/dashboard.tsx +237 -0
- package/dist/kits/auth-core/components/auth/forgot-password-form.tsx +90 -0
- package/dist/kits/auth-core/components/auth/login-form.tsx +467 -0
- package/dist/kits/auth-core/components/auth/logout-button.tsx +50 -0
- package/dist/kits/auth-core/components/auth/minimal-logout-button.tsx +40 -0
- package/dist/kits/auth-core/components/auth/signup-form.tsx +468 -0
- package/dist/kits/auth-core/components/require-auth.tsx +59 -0
- package/dist/kits/auth-core/components/session-provider.tsx +11 -0
- package/dist/kits/auth-core/components/ui/README.txt +1 -0
- package/dist/kits/auth-core/components/ui/button.tsx +55 -0
- package/dist/kits/auth-core/components/ui/input.tsx +25 -0
- package/dist/kits/auth-core/components/ui/label.tsx +23 -0
- package/dist/kits/auth-core/lib/api/errors.ts +14 -0
- package/dist/kits/auth-core/lib/auth-helpers.ts +29 -0
- package/dist/kits/auth-core/lib/auth.ts +142 -0
- package/dist/kits/auth-core/lib/email/dev-transport.ts +42 -0
- package/dist/kits/auth-core/lib/email/index.ts +28 -0
- package/dist/kits/auth-core/lib/email/provider-smtp.ts +36 -0
- package/dist/kits/auth-core/lib/forms/map-errors.ts +11 -0
- package/dist/kits/auth-core/lib/hash.ts +6 -0
- package/dist/kits/auth-core/lib/prisma.ts +15 -0
- package/dist/kits/auth-core/lib/server/result.ts +45 -0
- package/dist/kits/auth-core/lib/utils.ts +6 -0
- package/dist/kits/auth-core/lib/validation/forms.ts +88 -0
- package/dist/kits/auth-core/package-deps.json +19 -0
- package/dist/kits/auth-core/prisma/auth-models.prisma +81 -0
- package/dist/kits/auth-core/prisma/schema.prisma +81 -0
- package/dist/kits/auth-core/scripts/populate-tokenhash.mjs +26 -0
- package/dist/kits/auth-core/scripts/promote-admin.mjs +33 -0
- package/dist/kits/auth-core/scripts/seed-demo.mjs +40 -0
- package/dist/kits/auth-core/types/next-auth.d.ts +25 -0
- package/dist/kits/blocks/README.md +53 -0
- package/dist/kits/blocks/app/globals.css +175 -0
- package/dist/kits/blocks/app/templates/digitalagency/PresetThemeVars.tsx +80 -0
- package/dist/kits/blocks/app/templates/digitalagency/README.md +36 -0
- package/dist/kits/blocks/app/templates/digitalagency/components/About.tsx +99 -0
- package/dist/kits/blocks/app/templates/digitalagency/components/CTA.tsx +74 -0
- package/dist/kits/blocks/app/templates/digitalagency/components/Contact.tsx +227 -0
- package/dist/kits/blocks/app/templates/digitalagency/components/Footer.tsx +89 -0
- package/dist/kits/blocks/app/templates/digitalagency/components/Hero.tsx +90 -0
- package/dist/kits/blocks/app/templates/digitalagency/components/Navbar.tsx +168 -0
- package/dist/kits/blocks/app/templates/digitalagency/components/NetworkPattern.tsx +297 -0
- package/dist/kits/blocks/app/templates/digitalagency/components/Portfolio.tsx +157 -0
- package/dist/kits/blocks/app/templates/digitalagency/components/Pricing.tsx +114 -0
- package/dist/kits/blocks/app/templates/digitalagency/components/Process.tsx +59 -0
- package/dist/kits/blocks/app/templates/digitalagency/components/Services.tsx +55 -0
- package/dist/kits/blocks/app/templates/digitalagency/components/Team.tsx +28 -0
- package/dist/kits/blocks/app/templates/digitalagency/components/Testimonials.tsx +65 -0
- package/dist/kits/blocks/app/templates/digitalagency/page.tsx +38 -0
- package/dist/kits/blocks/app/templates/gallery/PresetThemeVars.tsx +85 -0
- package/dist/kits/blocks/app/templates/gallery/page.tsx +303 -0
- package/dist/kits/blocks/app/templates/productlaunch/PresetThemeVars.tsx +74 -0
- package/dist/kits/blocks/app/templates/productlaunch/README.md +55 -0
- package/dist/kits/blocks/app/templates/productlaunch/components/About.tsx +178 -0
- package/dist/kits/blocks/app/templates/productlaunch/components/CTA.tsx +93 -0
- package/dist/kits/blocks/app/templates/productlaunch/components/Contact.tsx +231 -0
- package/dist/kits/blocks/app/templates/productlaunch/components/FAQ.tsx +93 -0
- package/dist/kits/blocks/app/templates/productlaunch/components/Features.tsx +84 -0
- package/dist/kits/blocks/app/templates/productlaunch/components/Footer.tsx +132 -0
- package/dist/kits/blocks/app/templates/productlaunch/components/Hero.tsx +89 -0
- package/dist/kits/blocks/app/templates/productlaunch/components/Navbar.tsx +162 -0
- package/dist/kits/blocks/app/templates/productlaunch/components/Pricing.tsx +106 -0
- package/dist/kits/blocks/app/templates/productlaunch/components/ProcessTimeline.tsx +110 -0
- package/dist/kits/blocks/app/templates/productlaunch/components/ServicesGrid.tsx +68 -0
- package/dist/kits/blocks/app/templates/productlaunch/components/Team.tsx +104 -0
- package/dist/kits/blocks/app/templates/productlaunch/components/Testimonials.tsx +89 -0
- package/dist/kits/blocks/app/templates/productlaunch/components/TrustBadges.tsx +76 -0
- package/dist/kits/blocks/app/templates/productlaunch/page.tsx +45 -0
- package/dist/kits/blocks/app/templates/saasdashboard/PresetThemeVars.tsx +80 -0
- package/dist/kits/blocks/app/templates/saasdashboard/README.md +38 -0
- package/dist/kits/blocks/app/templates/saasdashboard/components/Contact.tsx +176 -0
- package/dist/kits/blocks/app/templates/saasdashboard/components/Dashboard.tsx +293 -0
- package/dist/kits/blocks/app/templates/saasdashboard/components/FAQ.tsx +55 -0
- package/dist/kits/blocks/app/templates/saasdashboard/components/Features.tsx +91 -0
- package/dist/kits/blocks/app/templates/saasdashboard/components/Footer.tsx +77 -0
- package/dist/kits/blocks/app/templates/saasdashboard/components/Hero.tsx +105 -0
- package/dist/kits/blocks/app/templates/saasdashboard/components/Hero_mask.tsx +127 -0
- package/dist/kits/blocks/app/templates/saasdashboard/components/Navbar.tsx +159 -0
- package/dist/kits/blocks/app/templates/saasdashboard/components/Pricing.tsx +90 -0
- package/dist/kits/blocks/app/templates/saasdashboard/components/SmoothScroll.tsx +97 -0
- package/dist/kits/blocks/app/templates/saasdashboard/components/Testimonials.tsx +72 -0
- package/dist/kits/blocks/app/templates/saasdashboard/components/TrustBadges.tsx +53 -0
- package/dist/kits/blocks/app/templates/saasdashboard/page.tsx +39 -0
- package/dist/kits/blocks/components/app-providers.tsx +1 -0
- package/dist/kits/blocks/components/enhanced-theme-provider.tsx +195 -0
- package/dist/kits/blocks/components/sections/About.tsx +291 -0
- package/dist/kits/blocks/components/sections/CTA.tsx +258 -0
- package/dist/kits/blocks/components/sections/Contact.tsx +267 -0
- package/dist/kits/blocks/components/sections/FAQ.tsx +226 -0
- package/dist/kits/blocks/components/sections/Features.tsx +269 -0
- package/dist/kits/blocks/components/sections/Footer.tsx +302 -0
- package/dist/kits/blocks/components/sections/HeroMotion.tsx +307 -0
- package/dist/kits/blocks/components/sections/HeroOverlay.tsx +358 -0
- package/dist/kits/blocks/components/sections/HeroSplit.tsx +352 -0
- package/dist/kits/blocks/components/sections/Navbar.tsx +353 -0
- package/dist/kits/blocks/components/sections/Newsletter.tsx +156 -0
- package/dist/kits/blocks/components/sections/PortfolioSimple.tsx +550 -0
- package/dist/kits/blocks/components/sections/Pricing.tsx +264 -0
- package/dist/kits/blocks/components/sections/ProcessTimeline.tsx +325 -0
- package/dist/kits/blocks/components/sections/ServicesGrid.tsx +210 -0
- package/dist/kits/blocks/components/sections/Team.tsx +309 -0
- package/dist/kits/blocks/components/sections/Testimonials.tsx +158 -0
- package/dist/kits/blocks/components/sections/TrustBadges.tsx +162 -0
- package/dist/kits/blocks/components/theme-provider.tsx +34 -0
- package/dist/kits/blocks/components/ui/alert-dialog.tsx +134 -0
- package/dist/kits/blocks/components/ui/brand-node.tsx +121 -0
- package/dist/kits/blocks/components/ui/button.tsx +122 -0
- package/dist/kits/blocks/components/ui/button_bck.tsx +93 -0
- package/dist/kits/blocks/components/ui/card.tsx +95 -0
- package/dist/kits/blocks/components/ui/checkbox.tsx +30 -0
- package/dist/kits/blocks/components/ui/cta-button.tsx +125 -0
- package/dist/kits/blocks/components/ui/dropdown-menu.tsx +201 -0
- package/dist/kits/blocks/components/ui/feature-card.tsx +91 -0
- package/dist/kits/blocks/components/ui/input.tsx +27 -0
- package/dist/kits/blocks/components/ui/label.tsx +29 -0
- package/dist/kits/blocks/components/ui/pricing-card.tsx +120 -0
- package/dist/kits/blocks/components/ui/select.tsx +25 -0
- package/dist/kits/blocks/components/ui/skeleton.tsx +13 -0
- package/dist/kits/blocks/components/ui/switch.tsx +78 -0
- package/dist/kits/blocks/components/ui/table.tsx +98 -0
- package/dist/kits/blocks/components/ui/testimonial-card.tsx +108 -0
- package/dist/kits/blocks/components/ui/textarea.tsx +26 -0
- package/dist/kits/blocks/components/ui/theme-selector.tsx +247 -0
- package/dist/kits/blocks/components/ui/theme-toggle.tsx +74 -0
- package/dist/kits/blocks/components/ui/toaster.tsx +7 -0
- package/dist/kits/blocks/lib/themes.ts +399 -0
- package/dist/kits/blocks/lib/themes_old.ts +37 -0
- package/dist/kits/blocks/lib/utils.ts +9 -0
- package/dist/kits/blocks/next.config.ts +11 -0
- package/dist/kits/blocks/notes/THEME_GUIDE.md +29 -0
- package/dist/kits/blocks/notes/THEMING_CONVERSION_SUMMARY.md +14 -0
- package/dist/kits/blocks/package-deps.json +22 -0
- package/dist/kits/blocks/public/placeholders/gallery/hero-pexels-broken-9945014.avif +0 -0
- package/dist/kits/blocks/public/placeholders/gallery/pexels-googledeepmind-25626431.jpg +0 -0
- package/dist/kits/blocks/public/placeholders/gallery/pexels-googledeepmind-25626432.jpg +0 -0
- package/dist/kits/blocks/public/placeholders/gallery/pexels-googledeepmind-25626434.jpg +0 -0
- package/dist/kits/blocks/public/placeholders/gallery/pexels-googledeepmind-25626436.jpg +0 -0
- package/dist/kits/blocks/public/placeholders/product_launch/feature_1.png +0 -0
- package/dist/kits/blocks/public/placeholders/product_launch/feature_2.png +0 -0
- package/dist/kits/blocks/public/placeholders/product_launch/feature_3.png +0 -0
- package/dist/kits/blocks/public/placeholders/product_launch/feature_4.png +0 -0
- package/dist/kits/blocks/public/placeholders/product_launch/hero.png +0 -0
- package/dist/kits/blocks/public/placeholders/saas_dashboard/analytics.png +0 -0
- package/dist/kits/blocks/public/placeholders/saas_dashboard/chat.png +0 -0
- package/dist/kits/blocks/public/placeholders/saas_dashboard/projectBoard.png +0 -0
- package/dist/kits/data/.gitkeep +0 -0
- package/dist/kits/data/README.md +80 -0
- package/dist/kits/data/app/(protected)/admin/posts/page.tsx +5 -0
- package/dist/kits/data/app/(protected)/admin/users/page.tsx +5 -0
- package/dist/kits/data/app/api/posts/[id]/route.ts +83 -0
- package/dist/kits/data/app/api/posts/route.ts +138 -0
- package/dist/kits/data/app/api/seed-demo/route.ts +45 -0
- package/dist/kits/data/app/api/users/[id]/route.ts +127 -0
- package/dist/kits/data/app/api/users/check-email/route.ts +18 -0
- package/dist/kits/data/app/api/users/check-unique/route.ts +27 -0
- package/dist/kits/data/app/api/users/route.ts +79 -0
- package/dist/kits/data/app/examples/demo/README.md +4 -0
- package/dist/kits/data/app/examples/demo/create-post-form.tsx +106 -0
- package/dist/kits/data/app/examples/demo/page.tsx +118 -0
- package/dist/kits/data/app/examples/demo/seed-demo-button.tsx +37 -0
- package/dist/kits/data/components/admin/posts-manager.tsx +719 -0
- package/dist/kits/data/components/admin/users-manager.tsx +432 -0
- package/dist/kits/data/lib/prisma.ts +15 -0
- package/dist/kits/data/lib/server/result.ts +90 -0
- package/dist/kits/data/package-deps.json +11 -0
- package/dist/kits/data/scripts/seed-demo.mjs +41 -0
- package/dist/kits/forms/.gitkeep +0 -0
- package/dist/kits/forms/README.md +49 -0
- package/dist/kits/forms/app/.gitkeep +0 -0
- package/dist/kits/forms/app/api/wizard/route.ts +71 -0
- package/dist/kits/forms/app/examples/forms/basic/page.tsx +124 -0
- package/dist/kits/forms/app/examples/forms/server-action/form-client.tsx +28 -0
- package/dist/kits/forms/app/examples/forms/server-action/page.tsx +71 -0
- package/dist/kits/forms/app/examples/forms/wizard/page.tsx +15 -0
- package/dist/kits/forms/app/examples/forms/wizard/wizard-client.tsx +2 -0
- package/dist/kits/forms/components/.gitkeep +0 -0
- package/dist/kits/forms/components/examples/wizard-client.tsx +231 -0
- package/dist/kits/forms/components/hooks/useCheckUnique.ts +79 -0
- package/dist/kits/forms/components/ui/button.tsx +122 -0
- package/dist/kits/forms/components/ui/checkbox.tsx +30 -0
- package/dist/kits/forms/components/ui/form/context.ts +33 -0
- package/dist/kits/forms/components/ui/form/form-control.tsx +28 -0
- package/dist/kits/forms/components/ui/form/form-description.tsx +22 -0
- package/dist/kits/forms/components/ui/form/form-field.tsx +36 -0
- package/dist/kits/forms/components/ui/form/form-item.tsx +21 -0
- package/dist/kits/forms/components/ui/form/form-label.tsx +24 -0
- package/dist/kits/forms/components/ui/form/form-message.tsx +29 -0
- package/dist/kits/forms/components/ui/form/form.tsx +26 -0
- package/dist/kits/forms/components/ui/input.tsx +27 -0
- package/dist/kits/forms/components/ui/label.tsx +29 -0
- package/dist/kits/forms/components/ui/select.tsx +25 -0
- package/dist/kits/forms/components/ui/switch.tsx +78 -0
- package/dist/kits/forms/components/ui/textarea.tsx +26 -0
- package/dist/kits/forms/lib/.gitkeep +0 -0
- package/dist/kits/forms/lib/forms/map-errors.ts +29 -0
- package/dist/kits/forms/lib/prisma.ts +16 -0
- package/dist/kits/forms/lib/utils.ts +9 -0
- package/dist/kits/forms/lib/validation/forms.ts +88 -0
- package/dist/kits/forms/lib/validation/wizard.ts +32 -0
- package/dist/kits/forms/package-deps.json +17 -0
- package/dist/utils/file-operations.d.ts +18 -0
- package/dist/utils/file-operations.d.ts.map +1 -0
- package/dist/utils/file-operations.js +327 -0
- package/dist/utils/file-operations.js.map +1 -0
- package/dist/utils/installation-tracker.d.ts +26 -0
- package/dist/utils/installation-tracker.d.ts.map +1 -0
- package/dist/utils/installation-tracker.js +98 -0
- package/dist/utils/installation-tracker.js.map +1 -0
- package/package.json +51 -21
- package/index.js +0 -1
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import bcrypt from "bcryptjs";
|
|
2
|
+
import { PrismaClient } from "@prisma/client";
|
|
3
|
+
|
|
4
|
+
const prisma = new PrismaClient();
|
|
5
|
+
|
|
6
|
+
async function main() {
|
|
7
|
+
const email = process.env.SEED_ADMIN_EMAIL || "admin@example.com";
|
|
8
|
+
const password = process.env.SEED_ADMIN_PASSWORD || "password123";
|
|
9
|
+
|
|
10
|
+
const hashed = await bcrypt.hash(password, 10);
|
|
11
|
+
|
|
12
|
+
let user = await prisma.user.findUnique({ where: { email } });
|
|
13
|
+
if (!user) {
|
|
14
|
+
user = await prisma.user.create({
|
|
15
|
+
data: { email, name: "Seed Admin", password: hashed, role: "admin" },
|
|
16
|
+
});
|
|
17
|
+
console.log("Created admin user:", email);
|
|
18
|
+
} else {
|
|
19
|
+
user = await prisma.user.update({ where: { email }, data: { role: "admin", password: hashed } });
|
|
20
|
+
console.log("Updated admin user:", email);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const postsData = [
|
|
24
|
+
{ title: "Welcome to Nextworks", content: "This is a seeded post.", authorId: user.id, published: true },
|
|
25
|
+
{ title: "Seeded Demo Post", content: "Another seeded post.", authorId: user.id, published: false },
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
for (const p of postsData) {
|
|
29
|
+
const existing = await prisma.post.findFirst({ where: { title: p.title } });
|
|
30
|
+
if (existing) await prisma.post.update({ where: { id: existing.id }, data: p });
|
|
31
|
+
else await prisma.post.create({ data: p });
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
console.log("Seeded posts.");
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
main().catch((e) => {
|
|
38
|
+
console.error(e);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}).finally(async () => await prisma.$disconnect());
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Copyright (c) 2025 Jakob Bro Liebe Hansen
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
|
|
4
|
+
import NextAuth, { DefaultSession } from "next-auth";
|
|
5
|
+
|
|
6
|
+
declare module "next-auth" {
|
|
7
|
+
interface Session {
|
|
8
|
+
user: {
|
|
9
|
+
id: string;
|
|
10
|
+
email: string;
|
|
11
|
+
name?: string | null;
|
|
12
|
+
image?: string | null;
|
|
13
|
+
role?: string;
|
|
14
|
+
} & DefaultSession["user"];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
declare module "next-auth/jwt" {
|
|
19
|
+
interface JWT {
|
|
20
|
+
id: string;
|
|
21
|
+
name: string;
|
|
22
|
+
email: string;
|
|
23
|
+
role?: string;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
Blocks kit (cli/kits/blocks)
|
|
2
|
+
|
|
3
|
+
This folder contains the files that the CLI copies into a target Next.js project when installing the "blocks" kit.
|
|
4
|
+
|
|
5
|
+
What the kit includes
|
|
6
|
+
|
|
7
|
+
- UI primitive components (Button, Input, Card, Form primitives, Checkbox, Switch, Toaster)
|
|
8
|
+
- Sections and templates (About, CTA, Contact, Hero variants, Navbar, Pricing, Features, etc.)
|
|
9
|
+
- Theme and provider utilities (theme-provider, enhanced-theme-provider, lib/themes)
|
|
10
|
+
- app/globals.css and placeholder assets used by templates
|
|
11
|
+
|
|
12
|
+
Files included are defined in `cli/cli_manifests/blocks_manifest.json` in the Nextworks repository. When updating this kit inside the repo, keep that manifest and this kit folder in sync.
|
|
13
|
+
|
|
14
|
+
Post-install notes
|
|
15
|
+
|
|
16
|
+
1. Install dependencies copied by the kit (the CLI will merge package-deps.json into your package.json):
|
|
17
|
+
|
|
18
|
+
npm install
|
|
19
|
+
|
|
20
|
+
2. Wrap your app with the AppProviders wrapper in app/layout.tsx to enable fonts, presets, CSS variable injection, session provider, and the app toaster. Example:
|
|
21
|
+
|
|
22
|
+
// at the top of app/layout.tsx
|
|
23
|
+
import "./globals.css"; // optional if you already import it elsewhere in your project
|
|
24
|
+
import AppProviders from "@/components/app-providers";
|
|
25
|
+
|
|
26
|
+
export default function RootLayout({ children }) {
|
|
27
|
+
return (
|
|
28
|
+
<html lang="en">
|
|
29
|
+
<body>
|
|
30
|
+
<AppProviders>
|
|
31
|
+
{children}
|
|
32
|
+
</AppProviders>
|
|
33
|
+
</body>
|
|
34
|
+
</html>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
Notes:
|
|
39
|
+
- AppProviders imports globals.css for you, so you don't strictly need to import it separately, but ensure you have the file copied into your project (app/globals.css).
|
|
40
|
+
- If you prefer to only use the EnhancedThemeProvider, you can still import it directly from "@/components/enhanced-theme-provider".
|
|
41
|
+
|
|
42
|
+
3. Ensure `app/globals.css` exists in your project and that Tailwind is configured.
|
|
43
|
+
|
|
44
|
+
4. Placeholder assets are located under `public/placeholders`. These should already have been copied by the CLI; if you move files around, keep the paths aligned or update the template image references.
|
|
45
|
+
|
|
46
|
+
Publishing notes (for maintainers)
|
|
47
|
+
|
|
48
|
+
- This kit is UI-only and has no server/api or prisma files.
|
|
49
|
+
- The manifest file `cli/cli_manifests/blocks_manifest.json` is used by the CLI to determine which files to copy when you build and publish the `nextworks` CLI.
|
|
50
|
+
|
|
51
|
+
CLI behavior (for maintainers)
|
|
52
|
+
|
|
53
|
+
- The CLI copies the files listed in `cli/cli_manifests/blocks_manifest.json`. Keep that manifest and this kit folder in sync when editing the Nextworks repo.
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
@import "tailwindcss";
|
|
2
|
+
@import "tw-animate-css";
|
|
3
|
+
|
|
4
|
+
@custom-variant dark (&:is(.dark *));
|
|
5
|
+
|
|
6
|
+
@theme inline {
|
|
7
|
+
--color-background: var(--background);
|
|
8
|
+
--color-foreground: var(--foreground);
|
|
9
|
+
--font-sans: var(--font-geist-sans);
|
|
10
|
+
--font-mono: var(--font-geist-mono);
|
|
11
|
+
--font-outfit: var(--font-outfit);
|
|
12
|
+
--font-inter: var(--font-inter);
|
|
13
|
+
--font-poppins: var(--font-poppins);
|
|
14
|
+
--color-sidebar-ring: var(--sidebar-ring);
|
|
15
|
+
--color-sidebar-border: var(--sidebar-border);
|
|
16
|
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
17
|
+
--color-sidebar-accent: var(--sidebar-accent);
|
|
18
|
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
19
|
+
--color-sidebar-primary: var(--sidebar-primary);
|
|
20
|
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
21
|
+
--color-sidebar: var(--sidebar);
|
|
22
|
+
--color-chart-5: var(--chart-5);
|
|
23
|
+
--color-chart-4: var(--chart-4);
|
|
24
|
+
--color-chart-3: var(--chart-3);
|
|
25
|
+
--color-chart-2: var(--chart-2);
|
|
26
|
+
--color-chart-1: var(--chart-1);
|
|
27
|
+
--color-ring: var(--ring);
|
|
28
|
+
--color-input: var(--input);
|
|
29
|
+
--color-border: var(--border);
|
|
30
|
+
--color-destructive: var(--destructive);
|
|
31
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
32
|
+
--color-accent: var(--accent);
|
|
33
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
34
|
+
--color-muted: var(--muted);
|
|
35
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
36
|
+
--color-secondary: var(--secondary);
|
|
37
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
38
|
+
--color-primary: var(--primary);
|
|
39
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
40
|
+
--color-popover: var(--popover);
|
|
41
|
+
--color-card-foreground: var(--card-foreground);
|
|
42
|
+
--color-card: var(--card);
|
|
43
|
+
--radius-sm: calc(var(--radius) - 4px);
|
|
44
|
+
--radius-md: calc(var(--radius) - 2px);
|
|
45
|
+
--radius-lg: var(--radius);
|
|
46
|
+
--radius-xl: calc(var(--radius) + 4px);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
:root {
|
|
50
|
+
--radius: 0.625rem;
|
|
51
|
+
--background: oklch(1 0 0);
|
|
52
|
+
--foreground: oklch(0.145 0 0);
|
|
53
|
+
--card: oklch(1 0 0);
|
|
54
|
+
--card-foreground: oklch(0.145 0 0);
|
|
55
|
+
--popover: oklch(1 0 0);
|
|
56
|
+
--popover-foreground: oklch(0.145 0 0);
|
|
57
|
+
--primary: oklch(0.205 0 0);
|
|
58
|
+
--primary-foreground: oklch(0.985 0 0);
|
|
59
|
+
/* Switch thumb color by default (light theme): dark thumb on very light tracks */
|
|
60
|
+
--switch-thumb: oklch(0.145 0 0);
|
|
61
|
+
--secondary: oklch(0.97 0 0);
|
|
62
|
+
--secondary-foreground: oklch(0.205 0 0);
|
|
63
|
+
--muted: oklch(0.97 0 0);
|
|
64
|
+
--muted-foreground: oklch(0.556 0 0);
|
|
65
|
+
--accent: oklch(0.97 0 0);
|
|
66
|
+
--accent-foreground: oklch(0.205 0 0);
|
|
67
|
+
--destructive: oklch(0.577 0.245 27.325);
|
|
68
|
+
--border: oklch(0.922 0 0);
|
|
69
|
+
--input: oklch(0.922 0 0);
|
|
70
|
+
--ring: oklch(0.708 0 0);
|
|
71
|
+
--chart-1: oklch(0.646 0.222 41.116);
|
|
72
|
+
--chart-2: oklch(0.6 0.118 184.704);
|
|
73
|
+
--chart-3: oklch(0.398 0.07 227.392);
|
|
74
|
+
--chart-4: oklch(0.828 0.189 84.429);
|
|
75
|
+
--chart-5: oklch(0.769 0.188 70.08);
|
|
76
|
+
--sidebar: oklch(0.985 0 0);
|
|
77
|
+
--sidebar-foreground: oklch(0.145 0 0);
|
|
78
|
+
--sidebar-primary: oklch(0.205 0 0);
|
|
79
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
80
|
+
--sidebar-accent: oklch(0.97 0 0);
|
|
81
|
+
--sidebar-accent-foreground: oklch(0.205 0 0);
|
|
82
|
+
--sidebar-border: oklch(0.922 0 0);
|
|
83
|
+
--sidebar-ring: oklch(0.708 0 0);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.dark {
|
|
87
|
+
--background: oklch(0.145 0 0);
|
|
88
|
+
--foreground: oklch(0.985 0 0);
|
|
89
|
+
--card: oklch(0.205 0 0);
|
|
90
|
+
--card-foreground: oklch(0.985 0 0);
|
|
91
|
+
--popover: oklch(0.205 0 0);
|
|
92
|
+
--popover-foreground: oklch(0.985 0 0);
|
|
93
|
+
--primary: oklch(0.922 0 0);
|
|
94
|
+
--primary-foreground: oklch(0.205 0 0);
|
|
95
|
+
--switch-thumb: oklch(0.985 0 0);
|
|
96
|
+
--secondary: oklch(0.269 0 0);
|
|
97
|
+
--secondary-foreground: oklch(0.985 0 0);
|
|
98
|
+
--muted: oklch(0.269 0 0);
|
|
99
|
+
--muted-foreground: oklch(0.708 0 0);
|
|
100
|
+
--accent: oklch(0.269 0 0);
|
|
101
|
+
--accent-foreground: oklch(0.985 0 0);
|
|
102
|
+
--destructive: oklch(0.704 0.191 22.216);
|
|
103
|
+
--border: oklch(1 0 0 / 10%);
|
|
104
|
+
--input: oklch(1 0 0 / 15%);
|
|
105
|
+
--ring: oklch(0.556 0 0);
|
|
106
|
+
--chart-1: oklch(0.488 0.243 264.376);
|
|
107
|
+
--chart-2: oklch(0.696 0.17 162.48);
|
|
108
|
+
--chart-3: oklch(0.769 0.188 70.08);
|
|
109
|
+
--chart-4: oklch(0.627 0.265 303.9);
|
|
110
|
+
--chart-5: oklch(0.645 0.246 16.439);
|
|
111
|
+
--sidebar: oklch(0.205 0 0);
|
|
112
|
+
--sidebar-foreground: oklch(0.985 0 0);
|
|
113
|
+
--sidebar-primary: oklch(0.488 0.243 264.376);
|
|
114
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
115
|
+
--sidebar-accent: oklch(0.269 0 0);
|
|
116
|
+
--sidebar-accent-foreground: oklch(0.985 0 0);
|
|
117
|
+
--sidebar-border: oklch(1 0 0 / 10%);
|
|
118
|
+
--sidebar-ring: oklch(0.556 0 0);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
@layer base {
|
|
122
|
+
* {
|
|
123
|
+
@apply border-border outline-ring/50;
|
|
124
|
+
}
|
|
125
|
+
body {
|
|
126
|
+
@apply bg-background text-foreground;
|
|
127
|
+
/* Fallback to avoid horizontal layout shift between pages with and without scrollbars */
|
|
128
|
+
overflow-y: scroll;
|
|
129
|
+
}
|
|
130
|
+
html {
|
|
131
|
+
scroll-behavior: smooth;
|
|
132
|
+
/* Reserve gutter space for the scrollbar to prevent content from shifting */
|
|
133
|
+
scrollbar-gutter: stable;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/* Font utility classes */
|
|
138
|
+
.font-poppins {
|
|
139
|
+
font-family: var(--font-poppins), var(--font-sans);
|
|
140
|
+
}
|
|
141
|
+
.font-inter {
|
|
142
|
+
font-family: var(--font-inter), var(--font-sans);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/* Hero pattern overlay */
|
|
146
|
+
.hero-pattern {
|
|
147
|
+
position: relative;
|
|
148
|
+
}
|
|
149
|
+
.hero-pattern::after {
|
|
150
|
+
content: "";
|
|
151
|
+
position: absolute;
|
|
152
|
+
inset: 0;
|
|
153
|
+
pointer-events: none;
|
|
154
|
+
background-image:
|
|
155
|
+
linear-gradient(rgba(255, 255, 255, 0.08) 1px, transparent 1px),
|
|
156
|
+
linear-gradient(90deg, rgba(255, 255, 255, 0.08) 1px, transparent 1px);
|
|
157
|
+
background-size: 28px 28px;
|
|
158
|
+
opacity: 0.5;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/* Monochrome gallery only for 'default' and 'monochrome' theme variants */
|
|
162
|
+
html[data-theme-variant="default"] .component-gallery,
|
|
163
|
+
html[data-theme-variant="monochrome"] .component-gallery,
|
|
164
|
+
html[data-theme-variant="default"] [data-radix-portal],
|
|
165
|
+
html[data-theme-variant="monochrome"] [data-radix-portal] {
|
|
166
|
+
filter: grayscale(1);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/* Explicitly removes filter for other variants */
|
|
170
|
+
html:not([data-theme-variant="default"]):not([data-theme-variant="monochrome"])
|
|
171
|
+
.component-gallery,
|
|
172
|
+
html:not([data-theme-variant="default"]):not([data-theme-variant="monochrome"])
|
|
173
|
+
[data-radix-portal] {
|
|
174
|
+
filter: none;
|
|
175
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { cn } from "@/lib/utils";
|
|
3
|
+
|
|
4
|
+
type Props = React.PropsWithChildren<{ className?: string }>;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* DigitalAgency template theme variables wrapper.
|
|
8
|
+
* Emerald-leaning palette; adjust to match your preset exactly.
|
|
9
|
+
*/
|
|
10
|
+
export function PresetThemeVars({ className, children }: Props) {
|
|
11
|
+
return (
|
|
12
|
+
<div
|
|
13
|
+
className={cn(
|
|
14
|
+
// Shared button ring
|
|
15
|
+
"[--btn-ring:theme(colors.emerald.500)] dark:[--btn-ring:theme(colors.emerald.400)]",
|
|
16
|
+
|
|
17
|
+
// Inputs
|
|
18
|
+
"[--input-bg:theme(colors.white)] dark:[--input-bg:theme(colors.gray.900)]",
|
|
19
|
+
"[--input-fg:theme(colors.gray.900)] dark:[--input-fg:theme(colors.gray.100)]",
|
|
20
|
+
"[--input-placeholder:theme(colors.gray.400)] dark:[--input-placeholder:theme(colors.gray.500)]",
|
|
21
|
+
"[--input-border:theme(colors.emerald.200)] dark:[--input-border:theme(colors.emerald.700)]",
|
|
22
|
+
"[--input-focus-ring:theme(colors.emerald.500)] dark:[--input-focus-ring:theme(colors.emerald.400)]",
|
|
23
|
+
"[--input-ring-offset:theme(colors.white)] dark:[--input-ring-offset:theme(colors.gray.900)]",
|
|
24
|
+
|
|
25
|
+
// Cards
|
|
26
|
+
"[--card-bg:theme(colors.white)] dark:[--card-bg:theme(colors.gray.900)]",
|
|
27
|
+
"[--card-fg:theme(colors.gray.900)] dark:[--card-fg:theme(colors.gray.100)]",
|
|
28
|
+
"[--card-title-fg:theme(colors.gray.900)] dark:[--card-title-fg:theme(colors.gray.100)]",
|
|
29
|
+
"[--card-muted-fg:theme(colors.gray.500)] dark:[--card-muted-fg:theme(colors.gray.400)]",
|
|
30
|
+
"[--card-border:theme(colors.gray.200)] dark:[--card-border:theme(colors.gray.800)]",
|
|
31
|
+
"[--card-shadow:0_6px_20px_rgba(0,0,0,0.06)]",
|
|
32
|
+
|
|
33
|
+
// Badges/Chips
|
|
34
|
+
"[--badge-bg:theme(colors.emerald.50)] dark:[--badge-bg:theme(colors.emerald.950)]",
|
|
35
|
+
"[--badge-fg:theme(colors.emerald.700)] dark:[--badge-fg:theme(colors.emerald.300)]",
|
|
36
|
+
"[--badge-border:theme(colors.emerald.200)] dark:[--badge-border:theme(colors.emerald.800)]",
|
|
37
|
+
"[--badge-active-bg:theme(colors.emerald.600)] dark:[--badge-active-bg:theme(colors.emerald.500)]",
|
|
38
|
+
"[--badge-active-fg:theme(colors.white)] dark:[--badge-active-fg:theme(colors.white)]",
|
|
39
|
+
"[--badge-active-border:theme(colors.emerald.700)] dark:[--badge-active-border:theme(colors.emerald.400)]",
|
|
40
|
+
|
|
41
|
+
// Headings/Subheadings
|
|
42
|
+
"[--heading-fg:theme(colors.gray.900)] dark:[--heading-fg:theme(colors.gray.100)]",
|
|
43
|
+
"[--subheading-fg:theme(colors.gray.600)] dark:[--subheading-fg:theme(colors.gray.300)]",
|
|
44
|
+
"[--description-fg:theme(colors.gray.700)] dark:[--description-fg:theme(colors.gray.200)]",
|
|
45
|
+
|
|
46
|
+
// Process timeline
|
|
47
|
+
"[--process-step-bg:theme(colors.fuchsia.600)] dark:[--process-step-bg:theme(colors.fuchsia.500)]",
|
|
48
|
+
"[--process-step-fg:theme(colors.white)] dark:[--process-step-fg:theme(colors.white)]",
|
|
49
|
+
"[--process-connector:theme(colors.gray.300)] dark:[--process-connector:theme(colors.gray.600)]",
|
|
50
|
+
|
|
51
|
+
// Portfolio metrics color
|
|
52
|
+
"[--metric-fg:theme(colors.fuchsia.600)] dark:[--metric-fg:theme(colors.fuchsia.400)]",
|
|
53
|
+
|
|
54
|
+
// Footer
|
|
55
|
+
"[--footer-bg:transparent] dark:[--footer-bg:transparent]",
|
|
56
|
+
"[--footer-fg:theme(colors.gray.800)] dark:[--footer-fg:theme(colors.gray.100)]",
|
|
57
|
+
"[--footer-heading-fg:theme(colors.gray.900)] dark:[--footer-heading-fg:theme(colors.gray.100)]",
|
|
58
|
+
"[--footer-link-fg:theme(colors.gray.700)] dark:[--footer-link-fg:theme(colors.gray.300)]",
|
|
59
|
+
"[--footer-link-hover-fg:theme(colors.emerald.700)] dark:[--footer-link-hover-fg:theme(colors.emerald.400)]",
|
|
60
|
+
"[--footer-link-hover-bg:theme(colors.emerald.50)] dark:[--footer-link-hover-bg:color-mix(in_oklab,oklch(0.17_0.05_152)_20%,transparent)]",
|
|
61
|
+
"[--footer-muted-fg:theme(colors.gray.500)] dark:[--footer-muted-fg:theme(colors.gray.400)]",
|
|
62
|
+
"[--footer-border:theme(colors.gray.200)] dark:[--footer-border:theme(colors.gray.800)]",
|
|
63
|
+
|
|
64
|
+
// Table (optional)
|
|
65
|
+
"[--table-fg:inherit]",
|
|
66
|
+
"[--table-muted-fg:theme(colors.gray.500)] dark:[--table-muted-fg:theme(colors.gray.400)]",
|
|
67
|
+
"[--table-head-fg:theme(colors.gray.700)] dark:[--table-head-fg:theme(colors.gray.300)]",
|
|
68
|
+
"[--table-border:theme(colors.gray.200)] dark:[--table-border:theme(colors.gray.800)]",
|
|
69
|
+
"[--table-row-hover-bg:theme(colors.gray.50)] dark:[--table-row-hover-bg:theme(colors.gray.900)]",
|
|
70
|
+
|
|
71
|
+
// About section accent
|
|
72
|
+
"[--about-accent:theme(colors.fuchsia.600)] dark:[--about-accent:theme(colors.fuchsia.400)]",
|
|
73
|
+
|
|
74
|
+
className,
|
|
75
|
+
)}
|
|
76
|
+
>
|
|
77
|
+
{children}
|
|
78
|
+
</div>
|
|
79
|
+
);
|
|
80
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# DigitalAgency Template Theming
|
|
2
|
+
|
|
3
|
+
This template is preset-first. It’s wrapped with `PresetThemeVars` to set a template-wide emerald palette. Shared components read variables with safe token fallbacks. Use local overrides sparingly (e.g., a specific CTA state).
|
|
4
|
+
|
|
5
|
+
## Where it’s wired
|
|
6
|
+
|
|
7
|
+
- Wrapper: `components/templates/digitalagency/PresetThemeVars.tsx`
|
|
8
|
+
- Page: `app/templates/digitalagency/page.tsx`
|
|
9
|
+
|
|
10
|
+
## Core variables
|
|
11
|
+
|
|
12
|
+
- Buttons: `--btn-bg`, `--btn-fg`, `--btn-hover-bg`, `--btn-hover-fg`, `--btn-border`, `--btn-ring`
|
|
13
|
+
- Inputs/Textareas: `--input-bg`, `--input-fg`, `--input-placeholder`, `--input-border`, `--input-focus-ring`, `--input-ring-offset`
|
|
14
|
+
- Cards: `--card-bg`, `--card-fg`, `--card-title-fg`, `--card-muted-fg`, `--card-border`, `--card-shadow`
|
|
15
|
+
- Badges/Chips: `--badge-bg`, `--badge-fg`, `--badge-border`, plus active variants
|
|
16
|
+
- Headings: `--heading-fg`, `--subheading-fg`, `--description-fg`
|
|
17
|
+
- Footer: `--footer-bg`, `--footer-fg`, `--footer-heading-fg`, `--footer-link-fg`, `--footer-link-hover-fg`, `--footer-link-hover-bg`, `--footer-muted-fg`, `--footer-border`
|
|
18
|
+
- Table: `--table-fg`, `--table-muted-fg`, `--table-head-fg`, `--table-border`, `--table-row-hover-bg`
|
|
19
|
+
|
|
20
|
+
## Per-section overrides
|
|
21
|
+
|
|
22
|
+
This template should be styled primarily by PresetThemeVars. Override on a specific section only when needed:
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
<section className="[--btn-ring:theme(colors.emerald.600)]">
|
|
26
|
+
<CTA />
|
|
27
|
+
</section>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Outline buttons
|
|
31
|
+
|
|
32
|
+
Always set `--btn-bg:transparent` and keep a border width class present when overriding outline colors.
|
|
33
|
+
|
|
34
|
+
## Should preset components be refactored?
|
|
35
|
+
|
|
36
|
+
Not mandatory. As you touch presets, prefer removing hard-coded color classes and let the var contract style them. Keep structure (spacing, layout, motion) classes.
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import React from "react";
|
|
4
|
+
import { About as SharedAbout } from "@/components/sections/About";
|
|
5
|
+
|
|
6
|
+
export function About() {
|
|
7
|
+
return (
|
|
8
|
+
<SharedAbout
|
|
9
|
+
// Content
|
|
10
|
+
aboutSubheadingText="About Us"
|
|
11
|
+
aboutHeadingText="Your Success Is Our Mission"
|
|
12
|
+
aboutContentText="With 50+ successful projects and 5 years of experience, we specialize in creating digital solutions that drive real business growth. Our team combines creative design with data-driven strategy."
|
|
13
|
+
aboutTextAlign="center"
|
|
14
|
+
// Stats
|
|
15
|
+
showStats={true}
|
|
16
|
+
animateStats={true}
|
|
17
|
+
aboutStats={[
|
|
18
|
+
{ value: "2.5", suffix: "k+", label: "Leads Generated" },
|
|
19
|
+
{ value: "4.8", suffix: "%", label: "Avg. CTR" },
|
|
20
|
+
{ value: "92", suffix: "%", label: "Client Retention" },
|
|
21
|
+
{ value: "12", suffix: "M", label: "Ad Spend Managed" },
|
|
22
|
+
]}
|
|
23
|
+
// Slots / styling
|
|
24
|
+
section={{
|
|
25
|
+
className: "py-16 md:py-20 lg:py-24 bg-white dark:bg-gray-800",
|
|
26
|
+
}}
|
|
27
|
+
container={{
|
|
28
|
+
className: "max-w-7xl mx-auto px-6",
|
|
29
|
+
}}
|
|
30
|
+
inner={{
|
|
31
|
+
className: "flex flex-col gap-12",
|
|
32
|
+
}}
|
|
33
|
+
contentContainer={{
|
|
34
|
+
className: "max-w-4xl mx-auto",
|
|
35
|
+
}}
|
|
36
|
+
contentStack={{
|
|
37
|
+
className: "flex flex-col gap-6",
|
|
38
|
+
}}
|
|
39
|
+
subheading={{
|
|
40
|
+
className:
|
|
41
|
+
"text-sm font-semibold font-poppins uppercase tracking-wider text-[var(--about-accent)]",
|
|
42
|
+
}}
|
|
43
|
+
heading={{
|
|
44
|
+
className:
|
|
45
|
+
"text-4xl md:text-5xl lg:text-6xl font-bold leading-tight text-[var(--heading-fg)]",
|
|
46
|
+
}}
|
|
47
|
+
content={{
|
|
48
|
+
className:
|
|
49
|
+
"text-xl md:text-2xl max-w-3xl mx-auto leading-relaxed text-[var(--subheading-fg)]",
|
|
50
|
+
}}
|
|
51
|
+
statsSection={{
|
|
52
|
+
className:
|
|
53
|
+
"bg-card p-8 rounded-xl shadow-lg mx-auto max-w-5xl w-full border border-border bg-[var(--card-bg)] text-[var(--card-fg)] border-[var(--card-border)]",
|
|
54
|
+
}}
|
|
55
|
+
statsGrid={{
|
|
56
|
+
className: "grid grid-cols-2 md:grid-cols-4 gap-8 justify-items-center",
|
|
57
|
+
}}
|
|
58
|
+
statItem={{
|
|
59
|
+
className: "flex flex-col items-center gap-2",
|
|
60
|
+
}}
|
|
61
|
+
statNumber={{
|
|
62
|
+
className:
|
|
63
|
+
"text-4xl md:text-5xl font-bold font-poppins leading-none text-[var(--about-accent)]",
|
|
64
|
+
}}
|
|
65
|
+
statLabel={{
|
|
66
|
+
className:
|
|
67
|
+
"text-sm font-medium font-inter text-center text-[var(--card-muted-fg)]",
|
|
68
|
+
}}
|
|
69
|
+
/>
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// "use client";
|
|
74
|
+
|
|
75
|
+
// import React from "react";
|
|
76
|
+
// import { About as SharedAbout } from "@/components/sections/About";
|
|
77
|
+
|
|
78
|
+
// export function About() {
|
|
79
|
+
// return (
|
|
80
|
+
// <SharedAbout
|
|
81
|
+
// aboutHeadingText="Your Success Is Our Mission"
|
|
82
|
+
// aboutContentText="With 50+ successful projects and 5 years of experience, we specialize in creating digital solutions that drive real business growth. Our team combines creative design with data-driven strategy."
|
|
83
|
+
// aboutTextAlign="center"
|
|
84
|
+
// showStats={true}
|
|
85
|
+
// section={{
|
|
86
|
+
// className: "py-16 md:py-20 lg:py-24 bg-white dark:bg-gray-800",
|
|
87
|
+
// }}
|
|
88
|
+
// heading={{
|
|
89
|
+
// className: "text-4xl md:text-5xl lg:text-6xl font-bold text-foreground",
|
|
90
|
+
// }}
|
|
91
|
+
// content={{
|
|
92
|
+
// className:
|
|
93
|
+
// "text-xl md:text-2xl text-muted-foreground max-w-3xl mx-auto leading-relaxed",
|
|
94
|
+
// }}
|
|
95
|
+
// />
|
|
96
|
+
// );
|
|
97
|
+
// }
|
|
98
|
+
|
|
99
|
+
// export default About;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import React from "react";
|
|
4
|
+
import { CTA as SharedCTA } from "@/components/sections/CTA";
|
|
5
|
+
|
|
6
|
+
export function CTA() {
|
|
7
|
+
return (
|
|
8
|
+
<SharedCTA
|
|
9
|
+
// Background colors moved to the section slot
|
|
10
|
+
section={{
|
|
11
|
+
className:
|
|
12
|
+
"bg-sky-50 dark:bg-gray-900 text-foreground [--heading-fg:rgb(17,24,39)] dark:[--heading-fg:white] [--subheading-fg:rgba(17,24,39,0.8)] dark:[--subheading-fg:rgba(255,255,255,0.85)] [--description-fg:rgba(17,24,39,0.75)] dark:[--description-fg:rgba(255,255,255,0.75)]",
|
|
13
|
+
}}
|
|
14
|
+
// Layout/height/centering handled by the container slot
|
|
15
|
+
container={{
|
|
16
|
+
className:
|
|
17
|
+
"mx-auto flex h-[32vh] w-full max-w-6xl flex-col items-center justify-center overflow-hidden px-4 pb-8",
|
|
18
|
+
}}
|
|
19
|
+
// Heading mapped to the new headingText slot
|
|
20
|
+
headingText={{
|
|
21
|
+
text: "Ready To Transform Your Business?",
|
|
22
|
+
className:
|
|
23
|
+
"text-4xl md:text-5xl lg:text-6xl font-bold font-poppins leading-tight",
|
|
24
|
+
}}
|
|
25
|
+
// Use actionsWrapper for spacing instead of margin on the button
|
|
26
|
+
actionsWrapper={{
|
|
27
|
+
className:
|
|
28
|
+
"mt-6 flex flex-col items-center gap-3 sm:flex-row [--btn-ring:rgba(192,38,211,0.35)] dark:[--btn-ring:rgba(192,38,211,0.45)]",
|
|
29
|
+
}}
|
|
30
|
+
// Primary CTA mapped to ctaButton + ctaButtonStyle
|
|
31
|
+
ctaButton={{ label: "Get Your Free Quote", href: "#contact" }}
|
|
32
|
+
ctaButtonStyle={{
|
|
33
|
+
variant: "default",
|
|
34
|
+
size: "lg",
|
|
35
|
+
className:
|
|
36
|
+
"font-poppins shadow-lg hover:shadow-xl transition-all duration-200 hover:-translate-y-0.5 [--btn-bg:#c026d3] dark:[--btn-bg:#c026d3] [--btn-hover-bg:#a21caf] dark:[--btn-hover-bg:#a21caf] [--btn-fg:#ffffff] dark:[--btn-fg:#ffffff] hover:[--btn-hover-fg:#ffffff] dark:hover:[--btn-hover-fg:#ffffff] [--btn-border:transparent]",
|
|
37
|
+
}}
|
|
38
|
+
// Preserve the previous top margin on the heading
|
|
39
|
+
spacing={{ topMargin: "mt-[8vh]" }}
|
|
40
|
+
/>
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// "use client";
|
|
45
|
+
|
|
46
|
+
// import React from "react";
|
|
47
|
+
// import { CTA as SharedCTA } from "@/components/sections/CTA";
|
|
48
|
+
|
|
49
|
+
// export function CTA() {
|
|
50
|
+
// return (
|
|
51
|
+
// <SharedCTA
|
|
52
|
+
// heading={{
|
|
53
|
+
// text: "Ready To Transform Your Business?",
|
|
54
|
+
// className:
|
|
55
|
+
// "text-4xl md:text-5xl lg:text-6xl font-bold font-poppins leading-tight",
|
|
56
|
+
// }}
|
|
57
|
+
// section={{
|
|
58
|
+
// className:
|
|
59
|
+
// "flex h-[32vh] flex-col items-center overflow-hidden bg-fuchsia-50 dark:bg-gray-900",
|
|
60
|
+
// }}
|
|
61
|
+
// button={{
|
|
62
|
+
// text: "Get Your Free Quote",
|
|
63
|
+
// href: "#contact",
|
|
64
|
+
// variant: "default",
|
|
65
|
+
// size: "lg",
|
|
66
|
+
// className:
|
|
67
|
+
// "mt-6 bg-fuchsia-600 hover:bg-fuchsia-700 text-white font-poppins shadow-lg hover:shadow-xl transition-all duration-200 hover:-translate-y-0.5",
|
|
68
|
+
// }}
|
|
69
|
+
// spacing={{ topMargin: "mt-[8vh]" }}
|
|
70
|
+
// />
|
|
71
|
+
// );
|
|
72
|
+
// }
|
|
73
|
+
|
|
74
|
+
// export default CTA;
|