@nextworks/blocks-sections 0.1.0-alpha.8 → 0.2.0-alpha.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.
Files changed (65) hide show
  1. package/README.md +16 -11
  2. package/dist/components/Features.d.ts +4 -2
  3. package/dist/components/Features.d.ts.map +1 -1
  4. package/dist/components/Features.jsx +2 -2
  5. package/dist/components/HeroMotion.d.ts +4 -2
  6. package/dist/components/HeroMotion.d.ts.map +1 -1
  7. package/dist-types/components/About.d.ts +93 -0
  8. package/dist-types/components/About.d.ts.map +1 -0
  9. package/dist-types/components/CTA.d.ts +118 -0
  10. package/dist-types/components/CTA.d.ts.map +1 -0
  11. package/dist-types/components/Contact.d.ts +111 -0
  12. package/dist-types/components/Contact.d.ts.map +1 -0
  13. package/dist-types/components/FAQ.d.ts +89 -0
  14. package/dist-types/components/FAQ.d.ts.map +1 -0
  15. package/dist-types/components/Features.d.ts +113 -0
  16. package/dist-types/components/Features.d.ts.map +1 -0
  17. package/dist-types/components/Footer.d.ts +120 -0
  18. package/dist-types/components/Footer.d.ts.map +1 -0
  19. package/dist-types/components/HeroMotion.d.ts +109 -0
  20. package/dist-types/components/HeroMotion.d.ts.map +1 -0
  21. package/dist-types/components/HeroOverlay.d.ts +116 -0
  22. package/dist-types/components/HeroOverlay.d.ts.map +1 -0
  23. package/dist-types/components/HeroSplit.d.ts +98 -0
  24. package/dist-types/components/HeroSplit.d.ts.map +1 -0
  25. package/dist-types/components/Navbar.d.ts +112 -0
  26. package/dist-types/components/Navbar.d.ts.map +1 -0
  27. package/dist-types/components/Newsletter.d.ts +59 -0
  28. package/dist-types/components/Newsletter.d.ts.map +1 -0
  29. package/dist-types/components/PortfolioSimple.d.ts +137 -0
  30. package/dist-types/components/PortfolioSimple.d.ts.map +1 -0
  31. package/dist-types/components/Pricing.d.ts +96 -0
  32. package/dist-types/components/Pricing.d.ts.map +1 -0
  33. package/dist-types/components/ProcessTimeline.d.ts +121 -0
  34. package/dist-types/components/ProcessTimeline.d.ts.map +1 -0
  35. package/dist-types/components/ServicesGrid.d.ts +64 -0
  36. package/dist-types/components/ServicesGrid.d.ts.map +1 -0
  37. package/dist-types/components/Team.d.ts +115 -0
  38. package/dist-types/components/Team.d.ts.map +1 -0
  39. package/dist-types/components/Testimonials.d.ts +81 -0
  40. package/dist-types/components/Testimonials.d.ts.map +1 -0
  41. package/dist-types/components/TrustBadges.d.ts +80 -0
  42. package/dist-types/components/TrustBadges.d.ts.map +1 -0
  43. package/dist-types/components/index.d.ts +21 -0
  44. package/dist-types/components/index.d.ts.map +1 -0
  45. package/dist-types/index.d.ts +2 -0
  46. package/dist-types/index.d.ts.map +1 -0
  47. package/package.json +8 -6
  48. package/dist/components/About.js +0 -129
  49. package/dist/components/CTA.js +0 -58
  50. package/dist/components/Contact.js +0 -82
  51. package/dist/components/FAQ.js +0 -78
  52. package/dist/components/Features.js +0 -109
  53. package/dist/components/Footer.js +0 -101
  54. package/dist/components/HeroMotion.js +0 -55
  55. package/dist/components/HeroOverlay.js +0 -111
  56. package/dist/components/HeroSplit.js +0 -100
  57. package/dist/components/Navbar.js +0 -80
  58. package/dist/components/Newsletter.js +0 -34
  59. package/dist/components/PortfolioSimple.js +0 -180
  60. package/dist/components/Pricing.js +0 -91
  61. package/dist/components/ProcessTimeline.js +0 -88
  62. package/dist/components/ServicesGrid.js +0 -72
  63. package/dist/components/Team.js +0 -107
  64. package/dist/components/Testimonials.js +0 -46
  65. package/dist/components/TrustBadges.js +0 -46
@@ -0,0 +1,115 @@
1
+ import React from "react";
2
+ /**
3
+ * A social link shown on a team member card.
4
+ * @public
5
+ */
6
+ export interface SocialLink {
7
+ /** Platform name (e.g., "LinkedIn") */
8
+ platform: string;
9
+ /** Destination URL */
10
+ url: string;
11
+ /** Icon identifier or emoji; replace with SVGs in real usage */
12
+ icon: string;
13
+ }
14
+ /**
15
+ * Team member data rendered by Team.
16
+ * @public
17
+ */
18
+ export interface TeamMemberData {
19
+ /** Member name */
20
+ name?: string;
21
+ /** Job role or title */
22
+ role?: string;
23
+ /** Short bio or description */
24
+ bio?: string;
25
+ /** Avatar content (emoji or image URL if swapped out) */
26
+ avatar?: string;
27
+ /** Optional social links */
28
+ socialLinks?: SocialLink[];
29
+ }
30
+ /**
31
+ * Props for the Team section component.
32
+ *
33
+ * @remarks
34
+ * - Styling: slot-style className overrides are merged after defaults via cn().
35
+ * - Motion: enableMotion controls hover lift on cards.
36
+ * - Accessibility: semantic <section> with aria-label.
37
+ */
38
+ export interface TeamProps {
39
+ /** Optional id on root. @defaultValue "team" */
40
+ id?: string;
41
+ /** Top-level className override */
42
+ className?: string;
43
+ /** Section heading text or object. @defaultValue "Meet Our Team" */
44
+ teamHeadingText?: string | {
45
+ text?: string;
46
+ className?: string;
47
+ };
48
+ /** Optional subheading text or object. @defaultValue "The talented people behind your success" */
49
+ teamSubheadingText?: string | {
50
+ text?: string;
51
+ className?: string;
52
+ };
53
+ /** Members to render. @defaultValue DefaultTeamData */
54
+ teamMembers?: TeamMemberData[];
55
+ /** Slot-style overrides */
56
+ section?: {
57
+ className?: string;
58
+ };
59
+ container?: {
60
+ className?: string;
61
+ };
62
+ header?: {
63
+ className?: string;
64
+ };
65
+ heading?: {
66
+ className?: string;
67
+ };
68
+ subheading?: {
69
+ className?: string;
70
+ };
71
+ grid?: {
72
+ className?: string;
73
+ };
74
+ card?: {
75
+ className?: string;
76
+ };
77
+ cardContent?: {
78
+ className?: string;
79
+ };
80
+ avatar?: {
81
+ className?: string;
82
+ };
83
+ name?: {
84
+ className?: string;
85
+ };
86
+ role?: {
87
+ className?: string;
88
+ };
89
+ bio?: {
90
+ className?: string;
91
+ };
92
+ socialLinks?: {
93
+ className?: string;
94
+ };
95
+ socialLink?: {
96
+ className?: string;
97
+ };
98
+ /** When false, removes hover lift on cards */
99
+ enableMotion?: boolean;
100
+ /** ARIA label for the section. @defaultValue "Team section" */
101
+ ariaLabel?: string;
102
+ }
103
+ /**
104
+ * Team section with heading, subheading, and a responsive member grid.
105
+ *
106
+ * @remarks
107
+ * - Uses a slot-style API for className overrides merged via cn().
108
+ * - Motion: enableMotion toggles hover lift on cards.
109
+ * - Accessibility: semantic <section> with aria-label.
110
+ *
111
+ * @example
112
+ * <Team teamMembers={[{ name: 'Alex', role: 'Engineer' }]} />
113
+ */
114
+ export declare function Team({ id, className, teamMembers, teamHeadingText, teamSubheadingText, section, container, header, heading, subheading, grid, card, cardContent, avatar, name, role, bio, socialLinks, socialLink, enableMotion, ariaLabel, }: TeamProps): React.JSX.Element;
115
+ //# sourceMappingURL=Team.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Team.d.ts","sourceRoot":"","sources":["../../src/components/Team.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,kBAAkB;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,SAAS;IACxB,gDAAgD;IAChD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,eAAe,CAAC,EAAE,MAAM,GAAG;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,kGAAkG;IAClG,kBAAkB,CAAC,EAAE,MAAM,GAAG;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACpE,uDAAuD;IACvD,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAE/B,2BAA2B;IAC3B,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,SAAS,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,UAAU,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,WAAW,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,GAAG,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,WAAW,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,UAAU,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAEpC,8CAA8C;IAC9C,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAqFD;;;;;;;;;;GAUG;AACH,wBAAgB,IAAI,CAAC,EACnB,EAAE,EACF,SAAS,EACT,WAA6B,EAC7B,eAAiC,EACjC,kBAA8D,EAC9D,OAAO,EACP,SAAS,EACT,MAAM,EACN,OAAO,EACP,UAAU,EACV,IAAI,EACJ,IAAI,EACJ,WAAW,EACX,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,GAAG,EACH,WAAW,EACX,UAAU,EACV,YAAmB,EACnB,SAA0B,GAC3B,EAAE,SAAS,qBAiHX"}
@@ -0,0 +1,81 @@
1
+ import React from "react";
2
+ /**
3
+ * Data used to render a TestimonialCard.
4
+ * @public
5
+ */
6
+ export interface TestimonialCardData {
7
+ /** The testimonial quote text */
8
+ testimonialText: string;
9
+ /** The author's display name (prefixed with hyphen in defaults) */
10
+ testimonialAuthor: string;
11
+ /** Author initials displayed in the avatar */
12
+ testimonialAuthorInitials: string;
13
+ }
14
+ /**
15
+ * Props for the Testimonials section component.
16
+ *
17
+ * @remarks
18
+ * - Styling: slot-style className overrides are merged after defaults via cn().
19
+ * - Motion: enableMotion toggles card hover transitions.
20
+ * - Accessibility: semantic <section> with aria-label.
21
+ */
22
+ export interface TestimonialsProps {
23
+ /** Optional id */
24
+ id?: string;
25
+ /** Root className merged into slots */
26
+ className?: string;
27
+ /** Testimonial items to render. @defaultValue defaultTestimonialData */
28
+ testimonials?: TestimonialCardData[];
29
+ /** Heading displayed above the grid. @defaultValue "What Our Customers Say" */
30
+ testimonialSectionHeader?: string;
31
+ /** When false, disables hover transitions on cards */
32
+ enableMotion?: boolean;
33
+ /** Slot-style overrides */
34
+ section?: {
35
+ className?: string;
36
+ };
37
+ container?: {
38
+ className?: string;
39
+ };
40
+ header?: {
41
+ className?: string;
42
+ };
43
+ heading?: {
44
+ className?: string;
45
+ };
46
+ grid?: {
47
+ className?: string;
48
+ };
49
+ card?: {
50
+ className?: string;
51
+ };
52
+ content?: {
53
+ className?: string;
54
+ };
55
+ text?: {
56
+ className?: string;
57
+ };
58
+ author?: {
59
+ className?: string;
60
+ };
61
+ avatar?: {
62
+ className?: string;
63
+ };
64
+ avatarText?: {
65
+ className?: string;
66
+ };
67
+ /** ARIA label for the section. @defaultValue "Testimonials section" */
68
+ ariaLabel?: string;
69
+ }
70
+ /**
71
+ * Testimonials section that renders a grid of TestimonialCard items.
72
+ *
73
+ * @remarks
74
+ * - Slot-style overrides match TestimonialCard sub-slots (card, content, text, etc.).
75
+ * - Motion can be disabled via enableMotion.
76
+ *
77
+ * @example
78
+ * <Testimonials testimonials={[{ testimonialText: 'Great!', testimonialAuthor: ' - Jane', testimonialAuthorInitials: 'J' }]} />
79
+ */
80
+ export declare function Testimonials({ id, className, testimonials, testimonialSectionHeader, enableMotion, section, container, header, heading, grid, card, content, text, author, avatar, avatarText, ariaLabel, }: TestimonialsProps): React.JSX.Element;
81
+ //# sourceMappingURL=Testimonials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Testimonials.d.ts","sourceRoot":"","sources":["../../src/components/Testimonials.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,iCAAiC;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,8CAA8C;IAC9C,yBAAyB,EAAE,MAAM,CAAC;CACnC;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,kBAAkB;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,wEAAwE;IACxE,YAAY,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACrC,+EAA+E;IAC/E,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAElC,sDAAsD;IACtD,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,2BAA2B;IAC3B,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,SAAS,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,UAAU,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAEpC,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAqBD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,EAC3B,EAAE,EACF,SAAS,EACT,YAAqC,EACrC,wBAAmD,EACnD,YAAmB,EACnB,OAA8C,EAC9C,SAA8C,EAC9C,MAA2C,EAC3C,OAEC,EACD,IAA4E,EAC5E,IAGC,EACD,OAAkD,EAClD,IAGC,EACD,MAGC,EACD,MAGC,EACD,UAA+D,EAC/D,SAAkC,GACnC,EAAE,iBAAiB,qBAsCnB"}
@@ -0,0 +1,80 @@
1
+ import React from "react";
2
+ /**
3
+ * A single trust badge (stat or certification).
4
+ * @public
5
+ */
6
+ export interface TrustBadgeData {
7
+ /** Main badge text (e.g., "99.9% Uptime") */
8
+ badgeText: string;
9
+ /** Optional short descriptor above/below the text */
10
+ badgeDescription?: string;
11
+ /** Optional icon/emoji representation */
12
+ badgeIcon?: string;
13
+ }
14
+ /**
15
+ * Props for the TrustBadges section component.
16
+ *
17
+ * @remarks
18
+ * - Layout: choose horizontal row or vertical stack via layout.
19
+ * - Styling: slot-style overrides are merged after defaults via cn().
20
+ * - Motion: enableMotion toggles hover scale.
21
+ */
22
+ export interface TrustBadgesProps {
23
+ /** Optional id on root. @defaultValue "trust-badges" */
24
+ id?: string;
25
+ /** Root className merged into section slot */
26
+ className?: string;
27
+ /** Badges to display. @defaultValue defaultTrustBadgeData */
28
+ badges?: TrustBadgeData[];
29
+ /** Optional heading above badges */
30
+ trustBadgesSectionHeader?: string;
31
+ /** Slot-style overrides */
32
+ section?: {
33
+ className?: string;
34
+ };
35
+ container?: {
36
+ className?: string;
37
+ };
38
+ header?: {
39
+ className?: string;
40
+ };
41
+ heading?: {
42
+ className?: string;
43
+ };
44
+ badgesContainer?: {
45
+ className?: string;
46
+ };
47
+ badge?: {
48
+ className?: string;
49
+ };
50
+ badgeContent?: {
51
+ className?: string;
52
+ };
53
+ icon?: {
54
+ className?: string;
55
+ };
56
+ description?: {
57
+ className?: string;
58
+ };
59
+ text?: {
60
+ className?: string;
61
+ };
62
+ /** Layout orientation. @defaultValue "horizontal" */
63
+ layout?: "horizontal" | "vertical";
64
+ /** When false, disables hover scale */
65
+ enableMotion?: boolean;
66
+ /** ARIA label for the section. @defaultValue "Trust badges section" */
67
+ ariaLabel?: string;
68
+ }
69
+ /**
70
+ * Compact section to showcase trust signals like usage stats and compliance.
71
+ *
72
+ * @remarks
73
+ * - Horizontal by default; switch to vertical with layout="vertical".
74
+ * - Hover motion can be disabled via enableMotion.
75
+ *
76
+ * @example
77
+ * <TrustBadges badges={[{ badgeText: 'SOC 2', badgeDescription: 'Security', badgeIcon: '🔒' }]} />
78
+ */
79
+ export declare function TrustBadges({ id, className, badges, trustBadgesSectionHeader, section, container, header, heading, badgesContainer, badge, badgeContent, icon, description, text, layout, enableMotion, ariaLabel, }: TrustBadgesProps): React.JSX.Element;
80
+ //# sourceMappingURL=TrustBadges.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TrustBadges.d.ts","sourceRoot":"","sources":["../../src/components/TrustBadges.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC/B,wDAAwD;IACxD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;IAC1B,oCAAoC;IACpC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAElC,2BAA2B;IAC3B,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,SAAS,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,eAAe,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,KAAK,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,YAAY,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,WAAW,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAE9B,qDAAqD;IACrD,MAAM,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACnC,uCAAuC;IACvC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAoBD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,EAC1B,EAAE,EACF,SAAS,EACT,MAA8B,EAC9B,wBAAwB,EACxB,OAA6C,EAC7C,SAA8C,EAC9C,MAA0C,EAC1C,OAEC,EACD,eAGC,EACD,KAGC,EACD,YAAoE,EACpE,IAAqC,EACrC,WAGC,EACD,IAEC,EACD,MAAqB,EACrB,YAAmB,EACnB,SAAkC,GACnC,EAAE,gBAAgB,qBA6ClB"}
@@ -0,0 +1,21 @@
1
+ export type { AboutStatData } from "./About";
2
+ export { About } from "./About";
3
+ export * from "./Contact";
4
+ export * from "./CTA";
5
+ export * from "./FAQ";
6
+ export * from "./Features";
7
+ export type { FooterProps, NavLinkItem, NavLinkGroup, SocialLink, } from "./Footer";
8
+ export { Footer } from "./Footer";
9
+ export * from "./HeroMotion";
10
+ export * from "./HeroOverlay";
11
+ export * from "./HeroSplit";
12
+ export * from "./Navbar";
13
+ export * from "./Newsletter";
14
+ export * from "./PortfolioSimple";
15
+ export * from "./Pricing";
16
+ export * from "./ProcessTimeline";
17
+ export * from "./ServicesGrid";
18
+ export * from "./Team";
19
+ export * from "./Testimonials";
20
+ export * from "./TrustBadges";
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,OAAO,CAAC;AACtB,cAAc,OAAO,CAAC;AACtB,cAAc,YAAY,CAAC;AAC3B,YAAY,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,UAAU,GACX,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,QAAQ,CAAC;AACvB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./components";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
package/package.json CHANGED
@@ -1,25 +1,27 @@
1
1
  {
2
2
  "name": "@nextworks/blocks-sections",
3
- "version": "0.1.0-alpha.8",
3
+ "version": "0.2.0-alpha.2",
4
4
  "private": false,
5
5
  "main": "dist/index.js",
6
- "types": "dist/index.d.ts",
6
+ "types": "dist-types/index.d.ts",
7
7
  "files": [
8
8
  "dist",
9
+ "dist-types",
9
10
  "package.json",
10
11
  "README.md"
11
12
  ],
12
13
  "repository": "github:jblh/nextworks-cli",
13
- "bugs": "https://github.com/jblh/nextworks-cli/issues",
14
- "homepage": "https://github.com/jblh/nextworks-cli#readme",
14
+ "bugs": "https://github.com/jblh/nextworks-cli/issues",
15
+ "homepage": "https://github.com/jblh/nextworks-cli#readme",
15
16
  "publishConfig": {
16
17
  "access": "public"
17
18
  },
18
19
  "scripts": {
19
- "build": "npx tsc -p tsconfig.json"
20
+ "clean": "powershell.exe -NoProfile -Command \"Remove-Item -Recurse -Force dist -ErrorAction SilentlyContinue; Remove-Item -Recurse -Force dist-types -ErrorAction SilentlyContinue\"",
21
+ "build": "npx tsc -p tsconfig.json && npx tsc -p tsconfig.json --emitDeclarationOnly --declaration --outDir dist-types"
20
22
  },
21
23
  "dependencies": {
22
- "@nextworks/blocks-core": "0.1.0-alpha.8",
24
+ "@nextworks/blocks-core": "0.2.0-alpha.2",
23
25
  "lucide-react": "^0.542.0",
24
26
  "motion": "^12.23.12"
25
27
  },
@@ -1,129 +0,0 @@
1
- "use client";
2
- import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import React from "react";
4
- import { cn } from "@nextworks/blocks-core";
5
- /**
6
- * Default statistics displayed if no aboutStats are provided.
7
- */
8
- const defaultStatsData = [
9
- { value: "50", label: "Successful Projects", suffix: "+" },
10
- { value: "5", label: "Years Experience", suffix: "+" },
11
- { value: "100", label: "Happy Clients", suffix: "%" },
12
- { value: "24", label: "Support Hours", suffix: "/7" },
13
- ];
14
- /**
15
- * About section with a heading, optional subheading/content, and an optional
16
- * stats block.
17
- *
18
- * @remarks
19
- * - Styling: exposes slot-style className overrides. Consumer classes are
20
- * merged after defaults via cn().
21
- * - Layout: control text alignment with aboutTextAlign.
22
- * - Accessibility: rendered as a semantic <section> with aria-label.
23
- *
24
- * @example
25
- * <About
26
- * aboutHeadingText="Your Success Is Our Mission"
27
- * aboutContentText="We build digital products that convert."
28
- * aboutStats={[{ value: "50", label: "Successful Projects", suffix: "+" }]}
29
- * />
30
- */
31
- /**
32
- * About section with a heading, optional subheading/content, and an optional
33
- * stats block.
34
- *
35
- * @remarks
36
- * - Styling: exposes slot-style className overrides. Consumer classes are
37
- * merged after defaults via cn().
38
- * - Layout: control text alignment with aboutTextAlign.
39
- * - Accessibility: rendered as a semantic <section> with aria-label.
40
- *
41
- * @example
42
- * <About
43
- * aboutHeadingText="Your Success Is Our Mission"
44
- * aboutContentText="We build digital products that convert."
45
- * aboutStats={[{ value: "50", label: "Successful Projects", suffix: "+" }]}
46
- * />
47
- */
48
- /**
49
- * Animated count-up for integers using requestAnimationFrame.
50
- * Eases out and runs once when shouldStart becomes true.
51
- */
52
- function AnimatedCount({ end, shouldStart, duration = 1500, }) {
53
- const [value, setValue] = React.useState(0);
54
- const [done, setDone] = React.useState(false);
55
- const prefersReduced = React.useMemo(() => {
56
- if (typeof window === "undefined")
57
- return false;
58
- return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
59
- }, []);
60
- React.useEffect(() => {
61
- if (prefersReduced)
62
- return; // show end value immediately below
63
- if (!shouldStart || done)
64
- return;
65
- let raf;
66
- const startTs = performance.now();
67
- const tick = (now) => {
68
- const progress = Math.min((now - startTs) / duration, 1);
69
- const eased = 1 - Math.pow(1 - progress, 3);
70
- const next = Math.round(eased * end);
71
- setValue(next);
72
- if (progress < 1) {
73
- raf = requestAnimationFrame(tick);
74
- }
75
- else {
76
- setDone(true);
77
- }
78
- };
79
- raf = requestAnimationFrame(tick);
80
- return () => cancelAnimationFrame(raf);
81
- }, [shouldStart, end, duration, done, prefersReduced]);
82
- if (prefersReduced)
83
- return _jsx(_Fragment, { children: end });
84
- return _jsx(_Fragment, { children: value });
85
- }
86
- export function About({ aboutHeadingText = "Your Success Is Our Mission", aboutSubheadingText, aboutContentText = "With 50+ successful projects and 5 years of experience, we specialize in creating digital solutions that drive real business growth.", aboutStats = defaultStatsData, className, section = { className: "py-20 bg-muted text-foreground" }, container = { className: "max-w-7xl mx-auto px-6" }, inner = { className: "flex flex-col gap-12" }, contentContainer = { className: "max-w-4xl mx-auto" }, contentStack = { className: "flex flex-col gap-6" }, subheading = {
87
- className: "text-sm font-semibold font-poppins text-primary uppercase tracking-wider",
88
- }, heading = {
89
- className: "text-3xl font-bold font-poppins text-foreground leading-tight",
90
- }, content = {
91
- className: "text-lg font-inter text-foreground leading-relaxed opacity-90 max-w-3xl",
92
- }, statsSection = {
93
- className: "bg-card p-8 rounded-xl shadow-lg mx-auto max-w-5xl w-full border border-border",
94
- }, statsGrid = {
95
- className: "grid grid-cols-2 md:grid-cols-4 gap-8 justify-items-center",
96
- }, statItem = { className: "flex flex-col items-center gap-2" }, statNumber = {
97
- className: "text-4xl font-bold font-poppins text-foreground leading-none",
98
- }, statLabel = {
99
- className: "text-sm font-medium font-inter text-foreground text-center opacity-80",
100
- }, aboutTextAlign = "center", showStats = true, animateStats = false, ariaLabel = "About section", }) {
101
- const textAlignClasses = {
102
- left: "text-left",
103
- right: "text-right",
104
- center: "text-center",
105
- };
106
- const statsSectionRef = React.useRef(null);
107
- const [shouldStartCount, setShouldStartCount] = React.useState(false);
108
- React.useEffect(() => {
109
- if (!animateStats)
110
- return;
111
- if (!statsSectionRef.current)
112
- return;
113
- const observer = new IntersectionObserver((entries) => {
114
- for (const entry of entries) {
115
- if (entry.isIntersecting) {
116
- setShouldStartCount(true);
117
- observer.disconnect();
118
- break;
119
- }
120
- }
121
- }, { threshold: 0.3 });
122
- observer.observe(statsSectionRef.current);
123
- return () => observer.disconnect();
124
- }, [animateStats]);
125
- return (_jsx("section", { className: cn(section.className, className), "aria-label": ariaLabel, children: _jsx("div", { className: cn(container.className), children: _jsxs("div", { className: cn(inner.className), children: [_jsx("div", { className: cn(contentContainer.className, textAlignClasses[aboutTextAlign]), children: _jsxs("div", { className: cn(contentStack.className), children: [aboutSubheadingText && (_jsx("div", { className: cn(subheading.className), children: aboutSubheadingText })), _jsx("h2", { className: cn(heading.className), children: aboutHeadingText }), _jsx("p", { className: cn(content.className), children: aboutContentText })] }) }), showStats && (aboutStats === null || aboutStats === void 0 ? void 0 : aboutStats.length) ? (_jsx("div", { ref: statsSectionRef, className: cn(statsSection.className), children: _jsx("div", { className: cn(statsGrid.className), children: aboutStats.map((s, i) => {
126
- var _a;
127
- return (_jsxs("div", { className: cn(statItem.className), children: [_jsxs("div", { className: cn(statNumber.className), children: [animateStats && Number.isFinite(Number(s.value)) ? (_jsx(AnimatedCount, { end: Number(s.value), shouldStart: shouldStartCount })) : (s.value), s.suffix] }), _jsx("div", { className: cn(statLabel.className), children: s.label })] }, `${(_a = s.label) !== null && _a !== void 0 ? _a : "stat"}-${i}`));
128
- }) }) })) : null] }) }) }));
129
- }
@@ -1,58 +0,0 @@
1
- "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import Link from "next/link";
4
- import { Button } from "@nextworks/blocks-core";
5
- import { cn } from "@nextworks/blocks-core";
6
- /**
7
- * Call-to-Action section with a heading, optional subheading/description,
8
- * and up to two actions (primary and secondary).
9
- *
10
- * @remarks
11
- * - Styling: exposes slot-style className overrides (section, container,
12
- * contentWrapper, headingText, subheadingText, descriptionText, actionsWrapper,
13
- * ctaButtonStyle, secondaryButtonStyle). Consumer classes are merged after
14
- * defaults via cn().
15
- * - Accessibility: rendered as a semantic <section> with aria-label. The role
16
- * defaults to "region" but can be customized with the role prop.
17
- * - Motion: subtle hover lift effects on buttons are included by default.
18
- *
19
- * @example
20
- * <CTA
21
- * headingText={{ text: "Join The Launch Today!" }}
22
- * descriptionText={{ text: "Start your free trial in minutes." }}
23
- * ctaButton={{ label: "Sign Up", href: "#contact" }}
24
- * secondaryButton={{ label: "Learn More", href: "#features" }}
25
- * />
26
- */
27
- export function CTA({ id = "cta", className, section = {
28
- className: "bg-background text-foreground",
29
- }, container = {
30
- className: "mx-auto flex min-h-[42vh] w-full max-w-6xl flex-col items-center justify-center overflow-hidden px-4 pb-7",
31
- }, contentWrapper = {
32
- className: "flex w-full flex-col items-center text-center",
33
- }, headingText = {
34
- text: "Join The Launch Today!",
35
- className: "text-3xl font-bold leading-[1.1] text-primary sm:text-4xl md:text-5xl text-[var(--heading-fg)]",
36
- }, subheadingText = {
37
- text: "",
38
- className: "mt-2 text-lg font-medium text-muted-foreground sm:text-xl text-[var(--subheading-fg)]",
39
- }, descriptionText = {
40
- text: "",
41
- className: "mt-3 max-w-2xl text-base text-foreground/80 sm:text-lg text-[var(--description-fg)]",
42
- }, actionsWrapper = {
43
- className: "mt-6 flex flex-col items-center gap-3 sm:flex-row",
44
- }, ctaButton = { label: "Sign Up Now", href: "#contact" }, ctaButtonStyle = {
45
- variant: "default",
46
- size: "default",
47
- className: "shadow-lg transition-all duration-200 hover:-translate-y-0.5 hover:shadow-xl border-[var(--btn-border)] focus-visible:ring-[var(--btn-ring)]",
48
- }, ctaButtonWrapper = { className: "" }, secondaryButton = null, secondaryButtonStyle = {
49
- variant: "outline",
50
- size: "default",
51
- className: "transition-transform duration-200 hover:-translate-y-0.5 border-[var(--btn-border)] focus-visible:ring-[var(--btn-ring)]",
52
- }, secondaryButtonWrapper = { className: "" }, spacing = { topMargin: "mt-0 sm:mt-12" },
53
- // spacing = { topMargin: "mt-[17vh]" },
54
- ariaLabel = "Call to action section", role = "region", }) {
55
- // default class for actions wrapper (keeps a gap and responsive row layout)
56
- const actionsWrapperDefault = "mt-6 flex flex-col items-center gap-3 sm:flex-row";
57
- return (_jsx("section", { id: id, role: role, "aria-label": ariaLabel, className: cn("w-full", section.className, className), children: _jsx("div", { className: cn(container.className), children: _jsxs("div", { className: cn(contentWrapper.className), children: [(headingText === null || headingText === void 0 ? void 0 : headingText.text) ? (_jsx("h2", { className: cn("text-center", spacing === null || spacing === void 0 ? void 0 : spacing.topMargin, headingText.className), children: headingText.text })) : null, (subheadingText === null || subheadingText === void 0 ? void 0 : subheadingText.text) ? (_jsx("p", { className: cn(subheadingText.className), children: subheadingText.text })) : null, (descriptionText === null || descriptionText === void 0 ? void 0 : descriptionText.text) ? (_jsx("p", { className: cn(descriptionText.className), children: descriptionText.text })) : null, _jsxs("div", { className: cn(actionsWrapperDefault, actionsWrapper.className), children: [ctaButton && (_jsx(Button, { asChild: true, unstyled: ctaButtonStyle.unstyled, variant: ctaButtonStyle.variant, size: ctaButtonStyle.size, className: cn(ctaButtonWrapper.className, ctaButtonStyle.className), style: ctaButtonStyle.style, children: _jsx(Link, { href: ctaButton.href, "aria-label": ctaButton.label, children: ctaButton.label }) })), secondaryButton && (_jsx(Button, { asChild: true, unstyled: secondaryButtonStyle.unstyled, variant: secondaryButtonStyle.variant, size: secondaryButtonStyle.size, className: cn(secondaryButtonWrapper.className, secondaryButtonStyle.className), style: secondaryButtonStyle.style, children: _jsx(Link, { href: secondaryButton.href, "aria-label": secondaryButton.label, children: secondaryButton.label }) }))] })] }) }) }));
58
- }
@@ -1,82 +0,0 @@
1
- "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { cn } from "@nextworks/blocks-core";
4
- import { Button, Input, Textarea, Label } from "@nextworks/blocks-core";
5
- const defaultFormData = [
6
- {
7
- id: "name",
8
- label: "Your Full Name",
9
- placeholder: "John Doe",
10
- required: true,
11
- type: "text",
12
- },
13
- {
14
- id: "email",
15
- label: "Email Address",
16
- placeholder: "you@example.com",
17
- required: true,
18
- type: "email",
19
- },
20
- {
21
- id: "phone",
22
- label: "Phone Number",
23
- placeholder: "Enter your phone number",
24
- required: false,
25
- type: "tel",
26
- },
27
- {
28
- id: "company",
29
- label: "Company",
30
- placeholder: "Enter your company name",
31
- required: false,
32
- type: "text",
33
- },
34
- {
35
- id: "message",
36
- label: "Message",
37
- placeholder: "Tell us about your project...",
38
- required: true,
39
- type: "textarea",
40
- },
41
- ];
42
- /**
43
- * Contact section with a configurable form and submit action.
44
- *
45
- * @remarks
46
- * - Styling: slot-style className overrides are merged via cn().
47
- * - Behavior: onSubmit is invoked with the form event after calling
48
- * preventDefault().
49
- * - Motion: enableMotion toggles the button hover lift/transition.
50
- * - Accessibility: Uses a semantic <section> with aria-label.
51
- *
52
- * @example
53
- * <Contact onSubmit={(e) => { // send to your API }} />
54
- */
55
- export function Contact({ fields = defaultFormData, contactHeaderText = "Ready to Grow Your Business?", contactSubHeaderText = "Schedule a free consultation with our experts.", id = "contact", className, section = { className: "py-16 px-4 bg-primary" }, container = { className: "mx-auto max-w-4xl" }, headerWrapper = { className: "mb-8 text-center" }, headerText = {
56
- className: "text-2xl font-bold font-poppins text-primary-foreground",
57
- }, subheaderText = {
58
- className: "mt-2 text-lg font-inter text-primary-foreground px-4 md:px-14",
59
- }, form = {
60
- className: "bg-card p-8 rounded-lg shadow-md border border-border bg-[var(--card-bg)] text-[var(--card-fg)] border-[var(--card-border)] shadow-[var(--card-shadow)]",
61
- }, fieldsWrapper = { className: "space-y-4" }, field = { className: "space-y-2" }, label = {
62
- className: "text-card-foreground text-sm font-medium font-poppins block text-[var(--label-fg)]",
63
- }, input = {
64
- className: "w-full p-3 border border-input rounded-md bg-background text-foreground placeholder-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent font-inter border-[var(--input-border)] bg-[var(--input-bg)] text-[var(--input-fg)] placeholder:text-[var(--input-placeholder)] focus-visible:ring-[var(--input-focus-ring)] focus-visible:ring-offset-[var(--input-ring-offset)]",
65
- }, textarea = {
66
- className: "w-full p-3 border border-input rounded-md bg-background text-foreground placeholder-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent resize-vertical min-h-[120px] font-inter border-[var(--input-border)] bg-[var(--input-bg)] text-[var(--input-fg)] placeholder:text-[var(--input-placeholder)] focus-visible:ring-[var(--input-focus-ring)] focus-visible:ring-offset-[var(--input-ring-offset)]",
67
- }, submitButtonWrapper = { className: "pt-2" }, submitButtonStyle = {
68
- variant: "default",
69
- size: "lg",
70
- className: "w-full shadow-lg hover:shadow-xl transition-all duration-200 hover:-translate-y-0.5 border-[var(--btn-border)] focus-visible:ring-[var(--btn-ring)]",
71
- }, submitButtonText = "Schedule Free Consultation", onSubmit, ariaLabel = "Contact section", enableMotion = true, }) {
72
- const handleSubmit = (e) => {
73
- e.preventDefault();
74
- onSubmit === null || onSubmit === void 0 ? void 0 : onSubmit(e);
75
- };
76
- return (_jsx("section", { id: id, className: cn("w-full", section.className, className), "aria-label": ariaLabel, children: _jsxs("div", { className: cn(container.className), children: [_jsxs("div", { className: cn(headerWrapper.className), children: [contactHeaderText && (_jsx("h2", { className: cn(headerText.className), children: contactHeaderText })), contactSubHeaderText && (_jsx("p", { className: cn(subheaderText.className), children: contactSubHeaderText }))] }), _jsx("form", { onSubmit: handleSubmit, className: cn(form.className), children: _jsxs("div", { className: cn(fieldsWrapper.className), children: [fields.map((f) => {
77
- var _a;
78
- const isTextarea = f.type === "textarea";
79
- return (_jsxs("div", { className: cn(field.className), children: [_jsxs(Label, { htmlFor: f.id, className: cn(label.className), children: [f.label, f.required && (_jsx("span", { className: "text-destructive ml-1", children: "*" }))] }), isTextarea ? (_jsx(Textarea, { id: f.id, name: f.id, placeholder: f.placeholder, required: f.required, rows: 4, className: cn(textarea.className) })) : (_jsx(Input, { type: (_a = f.type) !== null && _a !== void 0 ? _a : "text", id: f.id, name: f.id, placeholder: f.placeholder, required: f.required, className: cn(input.className) }))] }, f.id));
80
- }), _jsx("div", { className: cn(submitButtonWrapper.className), children: _jsx(Button, { type: "submit", unstyled: submitButtonStyle.unstyled, variant: submitButtonStyle.variant, size: submitButtonStyle.size, className: cn(submitButtonStyle.className, !enableMotion &&
81
- "transition-none hover:!translate-y-0 hover:shadow-none"), style: submitButtonStyle.style, children: submitButtonText }) })] }) })] }) }));
82
- }