@nextworks/blocks-templates 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 +42 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/templates/digitalagency/Page.d.ts +3 -0
- package/dist/templates/digitalagency/Page.d.ts.map +1 -0
- package/dist/templates/digitalagency/Page.js +18 -0
- package/dist/templates/digitalagency/Page.jsx +33 -0
- package/dist/templates/digitalagency/PresetThemeVars.d.ts +11 -0
- package/dist/templates/digitalagency/PresetThemeVars.d.ts.map +1 -0
- package/dist/templates/digitalagency/PresetThemeVars.js +29 -0
- package/dist/templates/digitalagency/PresetThemeVars.jsx +31 -0
- package/dist/templates/digitalagency/components/About.d.ts +3 -0
- package/dist/templates/digitalagency/components/About.d.ts.map +1 -0
- package/dist/templates/digitalagency/components/About.js +45 -0
- package/dist/templates/digitalagency/components/About.jsx +43 -0
- package/dist/templates/digitalagency/components/CTA.d.ts +3 -0
- package/dist/templates/digitalagency/components/CTA.d.ts.map +1 -0
- package/dist/templates/digitalagency/components/CTA.js +33 -0
- package/dist/templates/digitalagency/components/CTA.jsx +31 -0
- package/dist/templates/digitalagency/components/Contact.d.ts +3 -0
- package/dist/templates/digitalagency/components/Contact.d.ts.map +1 -0
- package/dist/templates/digitalagency/components/Contact.js +91 -0
- package/dist/templates/digitalagency/components/Contact.jsx +91 -0
- package/dist/templates/digitalagency/components/Footer.d.ts +8 -0
- package/dist/templates/digitalagency/components/Footer.d.ts.map +1 -0
- package/dist/templates/digitalagency/components/Footer.js +58 -0
- package/dist/templates/digitalagency/components/Footer.jsx +58 -0
- package/dist/templates/digitalagency/components/Hero.d.ts +7 -0
- package/dist/templates/digitalagency/components/Hero.d.ts.map +1 -0
- package/dist/templates/digitalagency/components/Hero.js +69 -0
- package/dist/templates/digitalagency/components/Hero.jsx +71 -0
- package/dist/templates/digitalagency/components/Navbar.d.ts +21 -0
- package/dist/templates/digitalagency/components/Navbar.d.ts.map +1 -0
- package/dist/templates/digitalagency/components/Navbar.js +86 -0
- package/dist/templates/digitalagency/components/Navbar.jsx +85 -0
- package/dist/templates/digitalagency/components/NetworkPattern.d.ts +8 -0
- package/dist/templates/digitalagency/components/NetworkPattern.d.ts.map +1 -0
- package/dist/templates/digitalagency/components/NetworkPattern.js +38 -0
- package/dist/templates/digitalagency/components/NetworkPattern.jsx +128 -0
- package/dist/templates/digitalagency/components/Portfolio.d.ts +3 -0
- package/dist/templates/digitalagency/components/Portfolio.d.ts.map +1 -0
- package/dist/templates/digitalagency/components/Portfolio.js +108 -0
- package/dist/templates/digitalagency/components/Portfolio.jsx +110 -0
- package/dist/templates/digitalagency/components/Pricing.d.ts +3 -0
- package/dist/templates/digitalagency/components/Pricing.d.ts.map +1 -0
- package/dist/templates/digitalagency/components/Pricing.js +82 -0
- package/dist/templates/digitalagency/components/Pricing.jsx +84 -0
- package/dist/templates/digitalagency/components/Process.d.ts +3 -0
- package/dist/templates/digitalagency/components/Process.d.ts.map +1 -0
- package/dist/templates/digitalagency/components/Process.js +38 -0
- package/dist/templates/digitalagency/components/Process.jsx +40 -0
- package/dist/templates/digitalagency/components/Services.d.ts +3 -0
- package/dist/templates/digitalagency/components/Services.d.ts.map +1 -0
- package/dist/templates/digitalagency/components/Services.js +34 -0
- package/dist/templates/digitalagency/components/Services.jsx +36 -0
- package/dist/templates/digitalagency/components/Team.d.ts +3 -0
- package/dist/templates/digitalagency/components/Team.d.ts.map +1 -0
- package/dist/templates/digitalagency/components/Team.js +14 -0
- package/dist/templates/digitalagency/components/Team.jsx +14 -0
- package/dist/templates/digitalagency/components/Testimonials.d.ts +3 -0
- package/dist/templates/digitalagency/components/Testimonials.d.ts.map +1 -0
- package/dist/templates/digitalagency/components/Testimonials.js +38 -0
- package/dist/templates/digitalagency/components/Testimonials.jsx +40 -0
- package/dist/templates/gallery/PresetThemeVars.d.ts +15 -0
- package/dist/templates/gallery/PresetThemeVars.d.ts.map +1 -0
- package/dist/templates/gallery/PresetThemeVars.js +31 -0
- package/dist/templates/gallery/PresetThemeVars.jsx +33 -0
- package/dist/templates/gallery/page.d.ts +2 -0
- package/dist/templates/gallery/page.d.ts.map +1 -0
- package/dist/templates/gallery/page.js +151 -0
- package/dist/templates/gallery/page.jsx +216 -0
- package/dist/templates/productlaunch/Page.d.ts +2 -0
- package/dist/templates/productlaunch/Page.d.ts.map +1 -0
- package/dist/templates/productlaunch/Page.js +20 -0
- package/dist/templates/productlaunch/Page.jsx +42 -0
- package/dist/templates/productlaunch/PresetThemeVars.d.ts +16 -0
- package/dist/templates/productlaunch/PresetThemeVars.d.ts.map +1 -0
- package/dist/templates/productlaunch/PresetThemeVars.js +28 -0
- package/dist/templates/productlaunch/PresetThemeVars.jsx +30 -0
- package/dist/templates/productlaunch/components/About.d.ts +15 -0
- package/dist/templates/productlaunch/components/About.d.ts.map +1 -0
- package/dist/templates/productlaunch/components/About.js +59 -0
- package/dist/templates/productlaunch/components/About.jsx +57 -0
- package/dist/templates/productlaunch/components/CTA.d.ts +3 -0
- package/dist/templates/productlaunch/components/CTA.d.ts.map +1 -0
- package/dist/templates/productlaunch/components/CTA.js +39 -0
- package/dist/templates/productlaunch/components/CTA.jsx +37 -0
- package/dist/templates/productlaunch/components/Contact.d.ts +3 -0
- package/dist/templates/productlaunch/components/Contact.d.ts.map +1 -0
- package/dist/templates/productlaunch/components/Contact.js +93 -0
- package/dist/templates/productlaunch/components/Contact.jsx +93 -0
- package/dist/templates/productlaunch/components/FAQ.d.ts +7 -0
- package/dist/templates/productlaunch/components/FAQ.d.ts.map +1 -0
- package/dist/templates/productlaunch/components/FAQ.js +64 -0
- package/dist/templates/productlaunch/components/FAQ.jsx +63 -0
- package/dist/templates/productlaunch/components/Features.d.ts +6 -0
- package/dist/templates/productlaunch/components/Features.d.ts.map +1 -0
- package/dist/templates/productlaunch/components/Features.js +52 -0
- package/dist/templates/productlaunch/components/Features.jsx +51 -0
- package/dist/templates/productlaunch/components/Footer.d.ts +5 -0
- package/dist/templates/productlaunch/components/Footer.d.ts.map +1 -0
- package/dist/templates/productlaunch/components/Footer.js +103 -0
- package/dist/templates/productlaunch/components/Footer.jsx +102 -0
- package/dist/templates/productlaunch/components/Hero.d.ts +6 -0
- package/dist/templates/productlaunch/components/Hero.d.ts.map +1 -0
- package/dist/templates/productlaunch/components/Hero.js +70 -0
- package/dist/templates/productlaunch/components/Hero.jsx +69 -0
- package/dist/templates/productlaunch/components/Navbar.d.ts +25 -0
- package/dist/templates/productlaunch/components/Navbar.d.ts.map +1 -0
- package/dist/templates/productlaunch/components/Navbar.js +82 -0
- package/dist/templates/productlaunch/components/Navbar.jsx +81 -0
- package/dist/templates/productlaunch/components/Pricing.d.ts +5 -0
- package/dist/templates/productlaunch/components/Pricing.d.ts.map +1 -0
- package/dist/templates/productlaunch/components/Pricing.js +77 -0
- package/dist/templates/productlaunch/components/Pricing.jsx +76 -0
- package/dist/templates/productlaunch/components/ProcessTimeline.d.ts +5 -0
- package/dist/templates/productlaunch/components/ProcessTimeline.d.ts.map +1 -0
- package/dist/templates/productlaunch/components/ProcessTimeline.js +63 -0
- package/dist/templates/productlaunch/components/ProcessTimeline.jsx +62 -0
- package/dist/templates/productlaunch/components/ServicesGrid.d.ts +5 -0
- package/dist/templates/productlaunch/components/ServicesGrid.d.ts.map +1 -0
- package/dist/templates/productlaunch/components/ServicesGrid.js +41 -0
- package/dist/templates/productlaunch/components/ServicesGrid.jsx +40 -0
- package/dist/templates/productlaunch/components/Team.d.ts +5 -0
- package/dist/templates/productlaunch/components/Team.d.ts.map +1 -0
- package/dist/templates/productlaunch/components/Team.js +72 -0
- package/dist/templates/productlaunch/components/Team.jsx +71 -0
- package/dist/templates/productlaunch/components/Testimonials.d.ts +5 -0
- package/dist/templates/productlaunch/components/Testimonials.d.ts.map +1 -0
- package/dist/templates/productlaunch/components/Testimonials.js +55 -0
- package/dist/templates/productlaunch/components/Testimonials.jsx +54 -0
- package/dist/templates/productlaunch/components/TrustBadges.d.ts +5 -0
- package/dist/templates/productlaunch/components/TrustBadges.d.ts.map +1 -0
- package/dist/templates/productlaunch/components/TrustBadges.js +50 -0
- package/dist/templates/productlaunch/components/TrustBadges.jsx +49 -0
- package/dist/templates/saasdashboard/Page.d.ts +2 -0
- package/dist/templates/saasdashboard/Page.d.ts.map +1 -0
- package/dist/templates/saasdashboard/Page.js +15 -0
- package/dist/templates/saasdashboard/Page.jsx +35 -0
- package/dist/templates/saasdashboard/PresetThemeVars.d.ts +11 -0
- package/dist/templates/saasdashboard/PresetThemeVars.d.ts.map +1 -0
- package/dist/templates/saasdashboard/PresetThemeVars.js +27 -0
- package/dist/templates/saasdashboard/PresetThemeVars.jsx +29 -0
- package/dist/templates/saasdashboard/components/Contact.d.ts +3 -0
- package/dist/templates/saasdashboard/components/Contact.d.ts.map +1 -0
- package/dist/templates/saasdashboard/components/Contact.js +83 -0
- package/dist/templates/saasdashboard/components/Contact.jsx +90 -0
- package/dist/templates/saasdashboard/components/Dashboard.d.ts +21 -0
- package/dist/templates/saasdashboard/components/Dashboard.d.ts.map +1 -0
- package/dist/templates/saasdashboard/components/Dashboard.js +120 -0
- package/dist/templates/saasdashboard/components/Dashboard.jsx +168 -0
- package/dist/templates/saasdashboard/components/FAQ.d.ts +2 -0
- package/dist/templates/saasdashboard/components/FAQ.d.ts.map +1 -0
- package/dist/templates/saasdashboard/components/FAQ.js +35 -0
- package/dist/templates/saasdashboard/components/FAQ.jsx +34 -0
- package/dist/templates/saasdashboard/components/Features.d.ts +2 -0
- package/dist/templates/saasdashboard/components/Features.d.ts.map +1 -0
- package/dist/templates/saasdashboard/components/Features.js +55 -0
- package/dist/templates/saasdashboard/components/Features.jsx +54 -0
- package/dist/templates/saasdashboard/components/Footer.d.ts +2 -0
- package/dist/templates/saasdashboard/components/Footer.d.ts.map +1 -0
- package/dist/templates/saasdashboard/components/Footer.js +52 -0
- package/dist/templates/saasdashboard/components/Footer.jsx +51 -0
- package/dist/templates/saasdashboard/components/Hero.d.ts +2 -0
- package/dist/templates/saasdashboard/components/Hero.d.ts.map +1 -0
- package/dist/templates/saasdashboard/components/Hero.js +65 -0
- package/dist/templates/saasdashboard/components/Hero.jsx +70 -0
- package/dist/templates/saasdashboard/components/Hero_mask.d.ts +3 -0
- package/dist/templates/saasdashboard/components/Hero_mask.d.ts.map +1 -0
- package/dist/templates/saasdashboard/components/Hero_mask.js +73 -0
- package/dist/templates/saasdashboard/components/Hero_mask.jsx +85 -0
- package/dist/templates/saasdashboard/components/Navbar.d.ts +25 -0
- package/dist/templates/saasdashboard/components/Navbar.d.ts.map +1 -0
- package/dist/templates/saasdashboard/components/Navbar.js +83 -0
- package/dist/templates/saasdashboard/components/Navbar.jsx +84 -0
- package/dist/templates/saasdashboard/components/Pricing.d.ts +2 -0
- package/dist/templates/saasdashboard/components/Pricing.d.ts.map +1 -0
- package/dist/templates/saasdashboard/components/Pricing.js +65 -0
- package/dist/templates/saasdashboard/components/Pricing.jsx +64 -0
- package/dist/templates/saasdashboard/components/SmoothScroll.d.ts +2 -0
- package/dist/templates/saasdashboard/components/SmoothScroll.d.ts.map +1 -0
- package/dist/templates/saasdashboard/components/SmoothScroll.js +87 -0
- package/dist/templates/saasdashboard/components/SmoothScroll.jsx +87 -0
- package/dist/templates/saasdashboard/components/Testimonials.d.ts +2 -0
- package/dist/templates/saasdashboard/components/Testimonials.d.ts.map +1 -0
- package/dist/templates/saasdashboard/components/Testimonials.js +35 -0
- package/dist/templates/saasdashboard/components/Testimonials.jsx +39 -0
- package/dist/templates/saasdashboard/components/TrustBadges.d.ts +2 -0
- package/dist/templates/saasdashboard/components/TrustBadges.d.ts.map +1 -0
- package/dist/templates/saasdashboard/components/TrustBadges.js +37 -0
- package/dist/templates/saasdashboard/components/TrustBadges.jsx +36 -0
- package/package.json +27 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ComponentProps } from "react";
|
|
2
|
+
import { Navbar as SharedNavbar } from "@nextworks/blocks-sections";
|
|
3
|
+
/**
|
|
4
|
+
* SaaS Dashboard preset Navbar
|
|
5
|
+
*
|
|
6
|
+
* - DashFlow branding with blue/purple gradient logo square (brandNode)
|
|
7
|
+
* - Inter font for brand and links
|
|
8
|
+
* - No CTA button (ctaButton = null)
|
|
9
|
+
* - Blue hover states for links and theme toggle
|
|
10
|
+
* - Glassy background with backdrop blur (light/dark)
|
|
11
|
+
*
|
|
12
|
+
* This preset exposes the Shared Navbar API so devs can override any prop/slot:
|
|
13
|
+
*
|
|
14
|
+
* Example:
|
|
15
|
+
* <Navbar
|
|
16
|
+
* brand="My SaaS"
|
|
17
|
+
* links={{ className: "hover:text-emerald-600" }}
|
|
18
|
+
* container={{ className: "max-w-6xl mx-auto" }}
|
|
19
|
+
* />
|
|
20
|
+
*/
|
|
21
|
+
type SharedNavbarProps = ComponentProps<typeof SharedNavbar>;
|
|
22
|
+
type PresetOverrides = Partial<SharedNavbarProps>;
|
|
23
|
+
export declare function Navbar(overrides?: PresetOverrides): import("react").JSX.Element;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=Navbar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Navbar.d.ts","sourceRoot":"","sources":["../../../../src/templates/saasdashboard/components/Navbar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAEpE;;;;;;;;;;;;;;;;;GAiBG;AACH,KAAK,iBAAiB,GAAG,cAAc,CAAC,OAAO,YAAY,CAAC,CAAC;AAC7D,KAAK,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAsFlD,wBAAgB,MAAM,CAAC,SAAS,GAAE,eAAoB,+BAQrD"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { Navbar as SharedNavbar } from "@nextworks/blocks-sections";
|
|
4
|
+
const defaultProps = {
|
|
5
|
+
brand: "DashFlow",
|
|
6
|
+
// Preserve custom gradient logo block
|
|
7
|
+
brandNode: (_jsx("div", { className: "flex h-8 w-8 items-center justify-center rounded-md bg-gradient-to-br from-blue-600 to-purple-600 font-bold text-white shadow-sm ring-1 ring-white/40", children: "DF" })),
|
|
8
|
+
menuItems: [
|
|
9
|
+
{ label: "Home", href: "#home" },
|
|
10
|
+
{ label: "Features", href: "#features" },
|
|
11
|
+
{ label: "Pricing", href: "#pricing" },
|
|
12
|
+
{ label: "Contact", href: "#contact" },
|
|
13
|
+
],
|
|
14
|
+
ctaButton: null,
|
|
15
|
+
showColorModeToggle: true,
|
|
16
|
+
navHeight: "h-16",
|
|
17
|
+
sticky: true,
|
|
18
|
+
ariaLabel: "DashFlow main navigation",
|
|
19
|
+
// Allow layout constraints to be added at page-level
|
|
20
|
+
className: "",
|
|
21
|
+
// Style slots tuned for the blue SaaS theme
|
|
22
|
+
nav: {
|
|
23
|
+
className: "bg-white/60 dark:bg-gray-900/60 backdrop-blur supports-[backdrop-filter]:bg-white/60 supports-[backdrop-filter]:dark:bg-gray-900/60 text-gray-800 dark:text-white " +
|
|
24
|
+
// Accent variables for this preset (read by toggle, links, mobile links)
|
|
25
|
+
"[--navbar-accent:theme(colors.blue.700)] dark:[--navbar-accent:theme(colors.blue.400)] " +
|
|
26
|
+
"[--navbar-toggle-bg:theme(colors.white)] dark:[--navbar-toggle-bg:theme(colors.gray.900)] " +
|
|
27
|
+
"[--navbar-hover-bg:theme(colors.blue.50)] dark:[--navbar-hover-bg:color-mix(in oklab,oklch(0.23 0.05 264) 20%, transparent)] " +
|
|
28
|
+
"[--navbar-ring:theme(colors.blue.500)] dark:[--navbar-ring:theme(colors.blue.400)] " +
|
|
29
|
+
"[--navbar-border:theme(colors.gray.200)] dark:[--navbar-border:theme(colors.gray.800)]",
|
|
30
|
+
},
|
|
31
|
+
brandText: {
|
|
32
|
+
className: "text-xl font-bold font-inter text-blue-700 dark:text-blue-500",
|
|
33
|
+
},
|
|
34
|
+
links: {
|
|
35
|
+
className: "text-sm font-medium font-inter text-gray-800 dark:text-white hover:text-blue-700 dark:hover:text-blue-400 " +
|
|
36
|
+
"focus:ring-[var(--navbar-ring)]",
|
|
37
|
+
},
|
|
38
|
+
// Preset keeps CTA hidden; if enabled, provide subtle interactive defaults
|
|
39
|
+
ctaButtonStyle: {
|
|
40
|
+
variant: "default",
|
|
41
|
+
size: "default",
|
|
42
|
+
className: "shadow-lg hover:shadow-xl transition-all duration-200 hover:-translate-y-0.5",
|
|
43
|
+
},
|
|
44
|
+
// Additional slots that weren't styled before, now aligned to the theme
|
|
45
|
+
mobileMenu: {
|
|
46
|
+
className: "border-t border-gray-200/80 dark:border-gray-800/80",
|
|
47
|
+
},
|
|
48
|
+
container: {
|
|
49
|
+
className: "max-w-7xl mx-auto",
|
|
50
|
+
},
|
|
51
|
+
brandWrapper: {
|
|
52
|
+
className: "",
|
|
53
|
+
},
|
|
54
|
+
desktopMenu: {
|
|
55
|
+
className: "hidden items-center space-x-1 md:flex lg:space-x-6",
|
|
56
|
+
},
|
|
57
|
+
toggleButton: {
|
|
58
|
+
className: "md:hidden flex items-center justify-center rounded-md p-2 transition-colors " +
|
|
59
|
+
"hover:bg-blue-50 dark:hover:bg-blue-900/20 " +
|
|
60
|
+
"focus:outline-none focus:ring-2 focus:ring-blue-500 dark:focus:ring-blue-400",
|
|
61
|
+
},
|
|
62
|
+
colorModeWrapper: {
|
|
63
|
+
className: "ml-2",
|
|
64
|
+
},
|
|
65
|
+
// With variables above, ThemeToggle can rely on them; explicit override optional
|
|
66
|
+
// themeToggle: { ... }
|
|
67
|
+
ctaButtonWrapper: {
|
|
68
|
+
className: "ml-2",
|
|
69
|
+
},
|
|
70
|
+
mobileMenuInner: {
|
|
71
|
+
className: "space-y-2 px-4 pt-2 pb-4",
|
|
72
|
+
},
|
|
73
|
+
// Mobile links will read --navbar-hover-bg; explicit class optional
|
|
74
|
+
mobileLinks: {
|
|
75
|
+
className: "hover:bg-[var(--navbar-hover-bg)]",
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
export function Navbar(overrides = {}) {
|
|
79
|
+
// Shallow-merge: passing a style-slot object (e.g., links, nav, etc.)
|
|
80
|
+
// replaces the default for that slot. Keeps the API simple and predictable.
|
|
81
|
+
const props = Object.assign(Object.assign({}, defaultProps), overrides);
|
|
82
|
+
return _jsx(SharedNavbar, Object.assign({}, props));
|
|
83
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Navbar as SharedNavbar } from "@nextworks/blocks-sections";
|
|
3
|
+
const defaultProps = {
|
|
4
|
+
brand: "DashFlow",
|
|
5
|
+
// Preserve custom gradient logo block
|
|
6
|
+
brandNode: (<div className="flex h-8 w-8 items-center justify-center rounded-md bg-gradient-to-br from-blue-600 to-purple-600 font-bold text-white shadow-sm ring-1 ring-white/40">
|
|
7
|
+
DF
|
|
8
|
+
</div>),
|
|
9
|
+
menuItems: [
|
|
10
|
+
{ label: "Home", href: "#home" },
|
|
11
|
+
{ label: "Features", href: "#features" },
|
|
12
|
+
{ label: "Pricing", href: "#pricing" },
|
|
13
|
+
{ label: "Contact", href: "#contact" },
|
|
14
|
+
],
|
|
15
|
+
ctaButton: null,
|
|
16
|
+
showColorModeToggle: true,
|
|
17
|
+
navHeight: "h-16",
|
|
18
|
+
sticky: true,
|
|
19
|
+
ariaLabel: "DashFlow main navigation",
|
|
20
|
+
// Allow layout constraints to be added at page-level
|
|
21
|
+
className: "",
|
|
22
|
+
// Style slots tuned for the blue SaaS theme
|
|
23
|
+
nav: {
|
|
24
|
+
className: "bg-white/60 dark:bg-gray-900/60 backdrop-blur supports-[backdrop-filter]:bg-white/60 supports-[backdrop-filter]:dark:bg-gray-900/60 text-gray-800 dark:text-white " +
|
|
25
|
+
// Accent variables for this preset (read by toggle, links, mobile links)
|
|
26
|
+
"[--navbar-accent:theme(colors.blue.700)] dark:[--navbar-accent:theme(colors.blue.400)] " +
|
|
27
|
+
"[--navbar-toggle-bg:theme(colors.white)] dark:[--navbar-toggle-bg:theme(colors.gray.900)] " +
|
|
28
|
+
"[--navbar-hover-bg:theme(colors.blue.50)] dark:[--navbar-hover-bg:color-mix(in oklab,oklch(0.23 0.05 264) 20%, transparent)] " +
|
|
29
|
+
"[--navbar-ring:theme(colors.blue.500)] dark:[--navbar-ring:theme(colors.blue.400)] " +
|
|
30
|
+
"[--navbar-border:theme(colors.gray.200)] dark:[--navbar-border:theme(colors.gray.800)]",
|
|
31
|
+
},
|
|
32
|
+
brandText: {
|
|
33
|
+
className: "text-xl font-bold font-inter text-blue-700 dark:text-blue-500",
|
|
34
|
+
},
|
|
35
|
+
links: {
|
|
36
|
+
className: "text-sm font-medium font-inter text-gray-800 dark:text-white hover:text-blue-700 dark:hover:text-blue-400 " +
|
|
37
|
+
"focus:ring-[var(--navbar-ring)]",
|
|
38
|
+
},
|
|
39
|
+
// Preset keeps CTA hidden; if enabled, provide subtle interactive defaults
|
|
40
|
+
ctaButtonStyle: {
|
|
41
|
+
variant: "default",
|
|
42
|
+
size: "default",
|
|
43
|
+
className: "shadow-lg hover:shadow-xl transition-all duration-200 hover:-translate-y-0.5",
|
|
44
|
+
},
|
|
45
|
+
// Additional slots that weren't styled before, now aligned to the theme
|
|
46
|
+
mobileMenu: {
|
|
47
|
+
className: "border-t border-gray-200/80 dark:border-gray-800/80",
|
|
48
|
+
},
|
|
49
|
+
container: {
|
|
50
|
+
className: "max-w-7xl mx-auto",
|
|
51
|
+
},
|
|
52
|
+
brandWrapper: {
|
|
53
|
+
className: "",
|
|
54
|
+
},
|
|
55
|
+
desktopMenu: {
|
|
56
|
+
className: "hidden items-center space-x-1 md:flex lg:space-x-6",
|
|
57
|
+
},
|
|
58
|
+
toggleButton: {
|
|
59
|
+
className: "md:hidden flex items-center justify-center rounded-md p-2 transition-colors " +
|
|
60
|
+
"hover:bg-blue-50 dark:hover:bg-blue-900/20 " +
|
|
61
|
+
"focus:outline-none focus:ring-2 focus:ring-blue-500 dark:focus:ring-blue-400",
|
|
62
|
+
},
|
|
63
|
+
colorModeWrapper: {
|
|
64
|
+
className: "ml-2",
|
|
65
|
+
},
|
|
66
|
+
// With variables above, ThemeToggle can rely on them; explicit override optional
|
|
67
|
+
// themeToggle: { ... }
|
|
68
|
+
ctaButtonWrapper: {
|
|
69
|
+
className: "ml-2",
|
|
70
|
+
},
|
|
71
|
+
mobileMenuInner: {
|
|
72
|
+
className: "space-y-2 px-4 pt-2 pb-4",
|
|
73
|
+
},
|
|
74
|
+
// Mobile links will read --navbar-hover-bg; explicit class optional
|
|
75
|
+
mobileLinks: {
|
|
76
|
+
className: "hover:bg-[var(--navbar-hover-bg)]",
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
export function Navbar(overrides = {}) {
|
|
80
|
+
// Shallow-merge: passing a style-slot object (e.g., links, nav, etc.)
|
|
81
|
+
// replaces the default for that slot. Keeps the API simple and predictable.
|
|
82
|
+
const props = Object.assign(Object.assign({}, defaultProps), overrides);
|
|
83
|
+
return <SharedNavbar {...props}/>;
|
|
84
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pricing.d.ts","sourceRoot":"","sources":["../../../../src/templates/saasdashboard/components/Pricing.tsx"],"names":[],"mappings":"AA8CA,wBAAgB,OAAO,gCA2CtB"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { Pricing as SharedPricing } from "@nextworks/blocks-sections";
|
|
4
|
+
import { cn } from "@nextworks/blocks-core";
|
|
5
|
+
const DefaultPricingData = [
|
|
6
|
+
{
|
|
7
|
+
pricingPlanHeaderText: "Starter Plan",
|
|
8
|
+
pricingPlanPrice: "$29/month",
|
|
9
|
+
pricingPlanFeatures: [
|
|
10
|
+
"Up to 5 users",
|
|
11
|
+
"3 projects",
|
|
12
|
+
"Basic analytics",
|
|
13
|
+
"email support",
|
|
14
|
+
],
|
|
15
|
+
pricingPlanCTALabel: "Select Plan",
|
|
16
|
+
pricingPlanCTAHref: "#contact",
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
pricingPlanHeaderText: "Professional Plan",
|
|
20
|
+
pricingPlanPrice: "$79.99/month",
|
|
21
|
+
pricingPlanFeatures: [
|
|
22
|
+
"Up to 25 users",
|
|
23
|
+
"Unlimited projects",
|
|
24
|
+
"Advanced analytics",
|
|
25
|
+
"Priority support",
|
|
26
|
+
"Api access",
|
|
27
|
+
],
|
|
28
|
+
pricingPlanCTALabel: "Select Plan",
|
|
29
|
+
pricingPlanCTAHref: "#contact",
|
|
30
|
+
isPopular: true,
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
pricingPlanHeaderText: "Enterprise Plan",
|
|
34
|
+
pricingPlanPrice: "$199.99/month",
|
|
35
|
+
pricingPlanFeatures: [
|
|
36
|
+
"Unlimited users",
|
|
37
|
+
"Custom integrations",
|
|
38
|
+
"Dedicated account manager",
|
|
39
|
+
"SLA guarantee",
|
|
40
|
+
],
|
|
41
|
+
pricingPlanCTALabel: "Select Plan",
|
|
42
|
+
pricingPlanCTAHref: "#contact",
|
|
43
|
+
},
|
|
44
|
+
];
|
|
45
|
+
export function Pricing() {
|
|
46
|
+
return (_jsx(SharedPricing, { pricingPlans: DefaultPricingData, pricingHeadingText: "Simple Pricing That Scales With You", className: cn("relative"), section: {
|
|
47
|
+
className: "pt-20 pb-5 bg-[var(--section-bg,theme(colors.white))] dark:bg-[var(--section-bg,theme(colors.gray.900))]",
|
|
48
|
+
}, heading: {
|
|
49
|
+
className: "text-3xl font-bold font-inter text-center mb-8 text-[var(--heading-fg)]",
|
|
50
|
+
}, card: {
|
|
51
|
+
className: "relative rounded-lg transition-all duration-300 will-change-transform hover:-translate-y-1 bg-[var(--card-bg)] text-[var(--card-fg)] border-[var(--card-border)] shadow-[var(--card-shadow)]",
|
|
52
|
+
}, title: {
|
|
53
|
+
className: "text-xl font-bold font-inter mb-2 text-[var(--card-title-fg)]",
|
|
54
|
+
}, price: {
|
|
55
|
+
className: "text-2xl font-bold font-inter mb-4 text-[var(--card-title-fg)]",
|
|
56
|
+
}, featureItem: {
|
|
57
|
+
className: "flex items-center text-base font-inter text-[var(--card-muted-fg)]",
|
|
58
|
+
}, cta: {
|
|
59
|
+
variant: "default",
|
|
60
|
+
size: "lg",
|
|
61
|
+
className: "w-full font-semibold font-inter shadow-md hover:shadow-lg transition-all duration-200 hover:-translate-y-0.5 [--btn-bg:theme(colors.sky.600)] hover:[--btn-hover-bg:theme(colors.sky.700)] [--btn-fg:theme(colors.white)] hover:[--btn-hover-fg:theme(colors.white)] border-[var(--btn-border)] focus-visible:ring-[var(--btn-ring)]",
|
|
62
|
+
}, popularBadge: {
|
|
63
|
+
className: "absolute -top-3 left-1/2 -translate-x-1/2 px-4 py-1 rounded-full text-xs font-semibold bg-[var(--badge-active-bg)] text-[var(--badge-active-fg)] border-[var(--badge-active-border)]",
|
|
64
|
+
}, ariaLabel: "Pricing section" }));
|
|
65
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Pricing as SharedPricing } from "@nextworks/blocks-sections";
|
|
3
|
+
import { cn } from "@nextworks/blocks-core";
|
|
4
|
+
const DefaultPricingData = [
|
|
5
|
+
{
|
|
6
|
+
pricingPlanHeaderText: "Starter Plan",
|
|
7
|
+
pricingPlanPrice: "$29/month",
|
|
8
|
+
pricingPlanFeatures: [
|
|
9
|
+
"Up to 5 users",
|
|
10
|
+
"3 projects",
|
|
11
|
+
"Basic analytics",
|
|
12
|
+
"email support",
|
|
13
|
+
],
|
|
14
|
+
pricingPlanCTALabel: "Select Plan",
|
|
15
|
+
pricingPlanCTAHref: "#contact",
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
pricingPlanHeaderText: "Professional Plan",
|
|
19
|
+
pricingPlanPrice: "$79.99/month",
|
|
20
|
+
pricingPlanFeatures: [
|
|
21
|
+
"Up to 25 users",
|
|
22
|
+
"Unlimited projects",
|
|
23
|
+
"Advanced analytics",
|
|
24
|
+
"Priority support",
|
|
25
|
+
"Api access",
|
|
26
|
+
],
|
|
27
|
+
pricingPlanCTALabel: "Select Plan",
|
|
28
|
+
pricingPlanCTAHref: "#contact",
|
|
29
|
+
isPopular: true,
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
pricingPlanHeaderText: "Enterprise Plan",
|
|
33
|
+
pricingPlanPrice: "$199.99/month",
|
|
34
|
+
pricingPlanFeatures: [
|
|
35
|
+
"Unlimited users",
|
|
36
|
+
"Custom integrations",
|
|
37
|
+
"Dedicated account manager",
|
|
38
|
+
"SLA guarantee",
|
|
39
|
+
],
|
|
40
|
+
pricingPlanCTALabel: "Select Plan",
|
|
41
|
+
pricingPlanCTAHref: "#contact",
|
|
42
|
+
},
|
|
43
|
+
];
|
|
44
|
+
export function Pricing() {
|
|
45
|
+
return (<SharedPricing pricingPlans={DefaultPricingData} pricingHeadingText="Simple Pricing That Scales With You" className={cn("relative")} section={{
|
|
46
|
+
className: "pt-20 pb-5 bg-[var(--section-bg,theme(colors.white))] dark:bg-[var(--section-bg,theme(colors.gray.900))]",
|
|
47
|
+
}} heading={{
|
|
48
|
+
className: "text-3xl font-bold font-inter text-center mb-8 text-[var(--heading-fg)]",
|
|
49
|
+
}} card={{
|
|
50
|
+
className: "relative rounded-lg transition-all duration-300 will-change-transform hover:-translate-y-1 bg-[var(--card-bg)] text-[var(--card-fg)] border-[var(--card-border)] shadow-[var(--card-shadow)]",
|
|
51
|
+
}} title={{
|
|
52
|
+
className: "text-xl font-bold font-inter mb-2 text-[var(--card-title-fg)]",
|
|
53
|
+
}} price={{
|
|
54
|
+
className: "text-2xl font-bold font-inter mb-4 text-[var(--card-title-fg)]",
|
|
55
|
+
}} featureItem={{
|
|
56
|
+
className: "flex items-center text-base font-inter text-[var(--card-muted-fg)]",
|
|
57
|
+
}} cta={{
|
|
58
|
+
variant: "default",
|
|
59
|
+
size: "lg",
|
|
60
|
+
className: "w-full font-semibold font-inter shadow-md hover:shadow-lg transition-all duration-200 hover:-translate-y-0.5 [--btn-bg:theme(colors.sky.600)] hover:[--btn-hover-bg:theme(colors.sky.700)] [--btn-fg:theme(colors.white)] hover:[--btn-hover-fg:theme(colors.white)] border-[var(--btn-border)] focus-visible:ring-[var(--btn-ring)]",
|
|
61
|
+
}} popularBadge={{
|
|
62
|
+
className: "absolute -top-3 left-1/2 -translate-x-1/2 px-4 py-1 rounded-full text-xs font-semibold bg-[var(--badge-active-bg)] text-[var(--badge-active-fg)] border-[var(--badge-active-border)]",
|
|
63
|
+
}} ariaLabel="Pricing section"/>);
|
|
64
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SmoothScroll.d.ts","sourceRoot":"","sources":["../../../../src/templates/saasdashboard/components/SmoothScroll.tsx"],"names":[],"mappings":"AAKA,wBAAgB,YAAY,SA2F3B"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
// Smoothly scrolls to hash targets with a custom, faster duration (~300ms)
|
|
4
|
+
export function SmoothScroll() {
|
|
5
|
+
useEffect(() => {
|
|
6
|
+
let suppressClick = false;
|
|
7
|
+
const animateTo = (href) => {
|
|
8
|
+
const el = document.querySelector(href);
|
|
9
|
+
if (!el)
|
|
10
|
+
return;
|
|
11
|
+
const navbarOffsetPx = 64; // matches h-16 sticky navbar
|
|
12
|
+
const start = window.scrollY;
|
|
13
|
+
const targetTop = el.getBoundingClientRect().top + window.scrollY - navbarOffsetPx;
|
|
14
|
+
const distance = targetTop - start;
|
|
15
|
+
const duration = 300; // ms
|
|
16
|
+
const startTime = performance.now();
|
|
17
|
+
// iOS-like easing
|
|
18
|
+
const easeOutQuart = (t) => 1 - Math.pow(1 - t, 4);
|
|
19
|
+
const step = (now) => {
|
|
20
|
+
const elapsed = now - startTime;
|
|
21
|
+
const t = Math.min(1, elapsed / duration);
|
|
22
|
+
const eased = easeOutQuart(t);
|
|
23
|
+
window.scrollTo(0, start + distance * eased);
|
|
24
|
+
if (t < 1)
|
|
25
|
+
requestAnimationFrame(step);
|
|
26
|
+
else
|
|
27
|
+
history.replaceState(null, "", href);
|
|
28
|
+
};
|
|
29
|
+
requestAnimationFrame(step);
|
|
30
|
+
};
|
|
31
|
+
const onPointerDown = (e) => {
|
|
32
|
+
const ev = e;
|
|
33
|
+
const target = e.currentTarget;
|
|
34
|
+
const href = target.getAttribute("href");
|
|
35
|
+
if (!href || !href.startsWith("#"))
|
|
36
|
+
return;
|
|
37
|
+
// Only primary button, no modifiers
|
|
38
|
+
if (ev.button !== 0 ||
|
|
39
|
+
ev.metaKey ||
|
|
40
|
+
ev.ctrlKey ||
|
|
41
|
+
ev.altKey ||
|
|
42
|
+
ev.shiftKey)
|
|
43
|
+
return;
|
|
44
|
+
e.preventDefault();
|
|
45
|
+
suppressClick = true;
|
|
46
|
+
animateTo(href);
|
|
47
|
+
};
|
|
48
|
+
const onClick = (e) => {
|
|
49
|
+
const target = e.currentTarget;
|
|
50
|
+
const href = target.getAttribute("href");
|
|
51
|
+
if (!href || !href.startsWith("#"))
|
|
52
|
+
return;
|
|
53
|
+
if (suppressClick) {
|
|
54
|
+
e.preventDefault();
|
|
55
|
+
suppressClick = false;
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
e.preventDefault();
|
|
59
|
+
animateTo(href);
|
|
60
|
+
};
|
|
61
|
+
const onKeyDown = (e) => {
|
|
62
|
+
const ev = e;
|
|
63
|
+
if (ev.key !== "Enter" && ev.key !== " ")
|
|
64
|
+
return;
|
|
65
|
+
const target = e.currentTarget;
|
|
66
|
+
const href = target.getAttribute("href");
|
|
67
|
+
if (!href || !href.startsWith("#"))
|
|
68
|
+
return;
|
|
69
|
+
e.preventDefault();
|
|
70
|
+
animateTo(href);
|
|
71
|
+
};
|
|
72
|
+
const links = Array.from(document.querySelectorAll('a[href^="#"]'));
|
|
73
|
+
links.forEach((a) => {
|
|
74
|
+
a.addEventListener("pointerdown", onPointerDown);
|
|
75
|
+
a.addEventListener("click", onClick);
|
|
76
|
+
a.addEventListener("keydown", onKeyDown);
|
|
77
|
+
});
|
|
78
|
+
return () => {
|
|
79
|
+
links.forEach((a) => {
|
|
80
|
+
a.removeEventListener("pointerdown", onPointerDown);
|
|
81
|
+
a.removeEventListener("click", onClick);
|
|
82
|
+
a.removeEventListener("keydown", onKeyDown);
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
}, []);
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
// Smoothly scrolls to hash targets with a custom, faster duration (~300ms)
|
|
4
|
+
export function SmoothScroll() {
|
|
5
|
+
useEffect(() => {
|
|
6
|
+
let suppressClick = false;
|
|
7
|
+
const animateTo = (href) => {
|
|
8
|
+
const el = document.querySelector(href);
|
|
9
|
+
if (!el)
|
|
10
|
+
return;
|
|
11
|
+
const navbarOffsetPx = 64; // matches h-16 sticky navbar
|
|
12
|
+
const start = window.scrollY;
|
|
13
|
+
const targetTop = el.getBoundingClientRect().top + window.scrollY - navbarOffsetPx;
|
|
14
|
+
const distance = targetTop - start;
|
|
15
|
+
const duration = 300; // ms
|
|
16
|
+
const startTime = performance.now();
|
|
17
|
+
// iOS-like easing
|
|
18
|
+
const easeOutQuart = (t) => 1 - Math.pow(1 - t, 4);
|
|
19
|
+
const step = (now) => {
|
|
20
|
+
const elapsed = now - startTime;
|
|
21
|
+
const t = Math.min(1, elapsed / duration);
|
|
22
|
+
const eased = easeOutQuart(t);
|
|
23
|
+
window.scrollTo(0, start + distance * eased);
|
|
24
|
+
if (t < 1)
|
|
25
|
+
requestAnimationFrame(step);
|
|
26
|
+
else
|
|
27
|
+
history.replaceState(null, "", href);
|
|
28
|
+
};
|
|
29
|
+
requestAnimationFrame(step);
|
|
30
|
+
};
|
|
31
|
+
const onPointerDown = (e) => {
|
|
32
|
+
const ev = e;
|
|
33
|
+
const target = e.currentTarget;
|
|
34
|
+
const href = target.getAttribute("href");
|
|
35
|
+
if (!href || !href.startsWith("#"))
|
|
36
|
+
return;
|
|
37
|
+
// Only primary button, no modifiers
|
|
38
|
+
if (ev.button !== 0 ||
|
|
39
|
+
ev.metaKey ||
|
|
40
|
+
ev.ctrlKey ||
|
|
41
|
+
ev.altKey ||
|
|
42
|
+
ev.shiftKey)
|
|
43
|
+
return;
|
|
44
|
+
e.preventDefault();
|
|
45
|
+
suppressClick = true;
|
|
46
|
+
animateTo(href);
|
|
47
|
+
};
|
|
48
|
+
const onClick = (e) => {
|
|
49
|
+
const target = e.currentTarget;
|
|
50
|
+
const href = target.getAttribute("href");
|
|
51
|
+
if (!href || !href.startsWith("#"))
|
|
52
|
+
return;
|
|
53
|
+
if (suppressClick) {
|
|
54
|
+
e.preventDefault();
|
|
55
|
+
suppressClick = false;
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
e.preventDefault();
|
|
59
|
+
animateTo(href);
|
|
60
|
+
};
|
|
61
|
+
const onKeyDown = (e) => {
|
|
62
|
+
const ev = e;
|
|
63
|
+
if (ev.key !== "Enter" && ev.key !== " ")
|
|
64
|
+
return;
|
|
65
|
+
const target = e.currentTarget;
|
|
66
|
+
const href = target.getAttribute("href");
|
|
67
|
+
if (!href || !href.startsWith("#"))
|
|
68
|
+
return;
|
|
69
|
+
e.preventDefault();
|
|
70
|
+
animateTo(href);
|
|
71
|
+
};
|
|
72
|
+
const links = Array.from(document.querySelectorAll('a[href^="#"]'));
|
|
73
|
+
links.forEach((a) => {
|
|
74
|
+
a.addEventListener("pointerdown", onPointerDown);
|
|
75
|
+
a.addEventListener("click", onClick);
|
|
76
|
+
a.addEventListener("keydown", onKeyDown);
|
|
77
|
+
});
|
|
78
|
+
return () => {
|
|
79
|
+
links.forEach((a) => {
|
|
80
|
+
a.removeEventListener("pointerdown", onPointerDown);
|
|
81
|
+
a.removeEventListener("click", onClick);
|
|
82
|
+
a.removeEventListener("keydown", onKeyDown);
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
}, []);
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Testimonials.d.ts","sourceRoot":"","sources":["../../../../src/templates/saasdashboard/components/Testimonials.tsx"],"names":[],"mappings":"AAKA,wBAAgB,YAAY,gCAkE3B"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Testimonials as SharedTestimonials } from "@nextworks/blocks-sections";
|
|
4
|
+
import { cn } from "@nextworks/blocks-core";
|
|
5
|
+
export function Testimonials() {
|
|
6
|
+
return (_jsxs("div", { className: "relative", children: [_jsx("div", { "aria-hidden": true, className: "pointer-events-none absolute inset-0 -z-10 [background-image:radial-gradient(60rem_60rem_at_0%_0%,rgba(59,130,246,0.08),transparent_40%),radial-gradient(50rem_50rem_at_100%_100%,rgba(168,85,247,0.06),transparent_40%)] opacity-20" }), _jsx("div", { "aria-hidden": true, className: "pointer-events-none absolute inset-0 -z-10 [background-image:radial-gradient(rgba(255,255,255,0.07)_1px,transparent_1px)] [background-size:14px_14px] opacity-[0.05]" }), _jsx(SharedTestimonials, { testimonials: [
|
|
7
|
+
{
|
|
8
|
+
testimonialText: "DashFlow replaced 6 different tools for us. Our team productivity increased 40% in the first month.",
|
|
9
|
+
testimonialAuthor: "- Sarah Chen, Marketing Director at TechStart",
|
|
10
|
+
testimonialAuthorInitials: "SC",
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
testimonialText: "Finally, a dashboard that actually makes sense. Setup took 10 minutes, not 10 hours.",
|
|
14
|
+
testimonialAuthor: "- Mike Rodriguez, Operations Manager",
|
|
15
|
+
testimonialAuthorInitials: "MR",
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
testimonialText: "The analytics alone pay for the subscription. We spot trends weeks earlier now.",
|
|
19
|
+
testimonialAuthor: "- Lisa Park, CEO of GrowthCo",
|
|
20
|
+
testimonialAuthorInitials: "LP",
|
|
21
|
+
},
|
|
22
|
+
], testimonialSectionHeader: "What Our Customers Say", className: cn("relative"), section: { className: "py-16 px-6 bg-background" }, container: { className: "max-w-7xl mx-auto" }, header: { className: "text-center mb-12" }, heading: {
|
|
23
|
+
className: "text-3xl md:text-4xl font-bold font-inter text-[var(--heading-fg)]",
|
|
24
|
+
}, grid: {
|
|
25
|
+
className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8",
|
|
26
|
+
}, card: {
|
|
27
|
+
className: "p-6 rounded-lg transition-transform duration-200 hover:-translate-y-1 bg-[var(--card-bg)] text-[var(--card-fg)] border-[var(--card-border)] shadow-[var(--card-shadow)]",
|
|
28
|
+
}, text: {
|
|
29
|
+
className: "italic font-inter font-normal text-base text-[var(--card-fg)]",
|
|
30
|
+
}, author: {
|
|
31
|
+
className: "text-sm font-medium font-inter text-[var(--card-muted-fg)]",
|
|
32
|
+
}, avatar: {
|
|
33
|
+
className: "w-12 h-12 rounded-full flex items-center justify-center text-lg font-bold bg-[var(--badge-bg)] text-[var(--badge-fg)] border-[var(--badge-border)]",
|
|
34
|
+
}, avatarText: { className: "font-bold" }, ariaLabel: "Customer testimonials" })] }));
|
|
35
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Testimonials as SharedTestimonials } from "@nextworks/blocks-sections";
|
|
3
|
+
import { cn } from "@nextworks/blocks-core";
|
|
4
|
+
export function Testimonials() {
|
|
5
|
+
return (<div className="relative">
|
|
6
|
+
{/* Gradient mesh + fine noise overlays for depth */}
|
|
7
|
+
<div aria-hidden className="pointer-events-none absolute inset-0 -z-10 [background-image:radial-gradient(60rem_60rem_at_0%_0%,rgba(59,130,246,0.08),transparent_40%),radial-gradient(50rem_50rem_at_100%_100%,rgba(168,85,247,0.06),transparent_40%)] opacity-20"/>
|
|
8
|
+
<div aria-hidden className="pointer-events-none absolute inset-0 -z-10 [background-image:radial-gradient(rgba(255,255,255,0.07)_1px,transparent_1px)] [background-size:14px_14px] opacity-[0.05]"/>
|
|
9
|
+
<SharedTestimonials testimonials={[
|
|
10
|
+
{
|
|
11
|
+
testimonialText: "DashFlow replaced 6 different tools for us. Our team productivity increased 40% in the first month.",
|
|
12
|
+
testimonialAuthor: "- Sarah Chen, Marketing Director at TechStart",
|
|
13
|
+
testimonialAuthorInitials: "SC",
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
testimonialText: "Finally, a dashboard that actually makes sense. Setup took 10 minutes, not 10 hours.",
|
|
17
|
+
testimonialAuthor: "- Mike Rodriguez, Operations Manager",
|
|
18
|
+
testimonialAuthorInitials: "MR",
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
testimonialText: "The analytics alone pay for the subscription. We spot trends weeks earlier now.",
|
|
22
|
+
testimonialAuthor: "- Lisa Park, CEO of GrowthCo",
|
|
23
|
+
testimonialAuthorInitials: "LP",
|
|
24
|
+
},
|
|
25
|
+
]} testimonialSectionHeader="What Our Customers Say" className={cn("relative")} section={{ className: "py-16 px-6 bg-background" }} container={{ className: "max-w-7xl mx-auto" }} header={{ className: "text-center mb-12" }} heading={{
|
|
26
|
+
className: "text-3xl md:text-4xl font-bold font-inter text-[var(--heading-fg)]",
|
|
27
|
+
}} grid={{
|
|
28
|
+
className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8",
|
|
29
|
+
}} card={{
|
|
30
|
+
className: "p-6 rounded-lg transition-transform duration-200 hover:-translate-y-1 bg-[var(--card-bg)] text-[var(--card-fg)] border-[var(--card-border)] shadow-[var(--card-shadow)]",
|
|
31
|
+
}} text={{
|
|
32
|
+
className: "italic font-inter font-normal text-base text-[var(--card-fg)]",
|
|
33
|
+
}} author={{
|
|
34
|
+
className: "text-sm font-medium font-inter text-[var(--card-muted-fg)]",
|
|
35
|
+
}} avatar={{
|
|
36
|
+
className: "w-12 h-12 rounded-full flex items-center justify-center text-lg font-bold bg-[var(--badge-bg)] text-[var(--badge-fg)] border-[var(--badge-border)]",
|
|
37
|
+
}} avatarText={{ className: "font-bold" }} ariaLabel="Customer testimonials"/>
|
|
38
|
+
</div>);
|
|
39
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TrustBadges.d.ts","sourceRoot":"","sources":["../../../../src/templates/saasdashboard/components/TrustBadges.tsx"],"names":[],"mappings":"AA4BA,wBAAgB,WAAW,gCAwB1B"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { TrustBadges as SharedTrustBadges } from "@nextworks/blocks-sections";
|
|
4
|
+
import { cn } from "@nextworks/blocks-core";
|
|
5
|
+
const defaultBadgesInfo = [
|
|
6
|
+
{
|
|
7
|
+
badgeText: "10,000+ businesses",
|
|
8
|
+
badgeDescription: "Trusted by",
|
|
9
|
+
badgeIcon: "📊",
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
badgeText: "SOC 2 Compliant",
|
|
13
|
+
badgeDescription: "Enterprise security",
|
|
14
|
+
badgeIcon: "🔒",
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
badgeText: "99.9% Uptime",
|
|
18
|
+
badgeDescription: "Reliable service",
|
|
19
|
+
badgeIcon: "⚡",
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
badgeText: "4.9/5 Rating",
|
|
23
|
+
badgeDescription: "Customer satisfaction",
|
|
24
|
+
badgeIcon: "⭐",
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
export function TrustBadges() {
|
|
28
|
+
return (_jsx(SharedTrustBadges, { badges: defaultBadgesInfo, className: cn("relative"), section: { className: "py-8 px-6 bg-blue-950/10 dark:bg-blue-950" }, heading: {
|
|
29
|
+
className: "text-2xl font-bold font-inter text-gray-700 dark:text-gray-200",
|
|
30
|
+
}, badgesContainer: {
|
|
31
|
+
className: "flex flex-wrap items-center justify-center gap-8",
|
|
32
|
+
}, badge: {
|
|
33
|
+
className: "transition-all duration-200 grayscale hover:grayscale-0 hover:-translate-y-0.5",
|
|
34
|
+
}, text: {
|
|
35
|
+
className: "text-base font-medium font-inter text-gray-900 dark:text-white",
|
|
36
|
+
}, ariaLabel: "Trust badges section" }));
|
|
37
|
+
}
|