@vadimcomanescu/nadicode-design-system 2.0.9 → 4.0.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.
Files changed (136) hide show
  1. package/.agents/skills/seed/SKILL.md +19 -10
  2. package/.agents/skills/seed/contract.md +9 -2
  3. package/.agents/skills/seed/references/blocks.md +5 -5
  4. package/.agents/skills/seed/references/components.md +2 -2
  5. package/.agents/skills/seed/references/nextjs.md +2 -2
  6. package/README.md +3 -3
  7. package/contracts/consumer-intent-map.json +1 -2
  8. package/contracts/release-governance-baseline.json +3 -37
  9. package/dist/catalog/catalog.d.ts +2220 -0
  10. package/dist/catalog/catalog.js +1913 -0
  11. package/dist/catalog/components.d.ts +201 -0
  12. package/dist/catalog/components.js +407 -0
  13. package/dist/catalog/types.d.ts +4 -0
  14. package/dist/catalog/types.js +1 -0
  15. package/dist/chunk-224KPIOG.js +60 -0
  16. package/dist/chunk-25BOZMXA.js +169 -0
  17. package/dist/chunk-32OLQ7FC.js +130 -0
  18. package/dist/chunk-3JJBJ4VR.js +47 -0
  19. package/dist/chunk-3U56FXYC.js +30 -0
  20. package/dist/chunk-4MWKE6F5.js +86 -0
  21. package/dist/chunk-6HGSU24S.js +94 -0
  22. package/dist/chunk-7IADIXDV.js +168 -0
  23. package/dist/chunk-7NS3VFD7.js +86 -0
  24. package/dist/chunk-7XLZCXUL.js +175 -0
  25. package/dist/chunk-ALA6OM7K.js +134 -0
  26. package/dist/chunk-AN5TW4AL.js +50 -0
  27. package/dist/chunk-AWZFQQGN.js +167 -0
  28. package/dist/chunk-BRCBJ3S4.js +42 -0
  29. package/dist/chunk-BRICSLHJ.js +30 -0
  30. package/dist/chunk-BYEHHZZN.js +115 -0
  31. package/dist/chunk-C33GUEDY.js +149 -0
  32. package/dist/chunk-CUDMDYKE.js +150 -0
  33. package/dist/chunk-CVTMWSNS.js +145 -0
  34. package/dist/chunk-DEZXWNYF.js +165 -0
  35. package/dist/chunk-DNJEVMDY.js +40 -0
  36. package/dist/chunk-DNJOBML6.js +66 -0
  37. package/dist/chunk-FTGFOK6T.js +69 -0
  38. package/dist/chunk-HFBJ6L6O.js +104 -0
  39. package/dist/chunk-HPTHS7SX.js +52 -0
  40. package/dist/chunk-KNR3WB5C.js +147 -0
  41. package/dist/chunk-KQ7ZC6EM.js +66 -0
  42. package/dist/chunk-LGW7FVG5.js +83 -0
  43. package/dist/chunk-LP6ZZYOQ.js +36 -0
  44. package/dist/chunk-LV4P7WVM.js +54 -0
  45. package/dist/chunk-MGSGCARB.js +164 -0
  46. package/dist/chunk-N3YFYMNZ.js +73 -0
  47. package/dist/chunk-Q5IYBNA7.js +56 -0
  48. package/dist/chunk-QJCE7NZF.js +85 -0
  49. package/dist/chunk-QW5II6YK.js +96 -0
  50. package/dist/chunk-RMGDDOCD.js +138 -0
  51. package/dist/chunk-RNCX4JIE.js +70 -0
  52. package/dist/chunk-RWCL5OPX.js +112 -0
  53. package/dist/chunk-S5OY2B63.js +28 -0
  54. package/dist/chunk-SIQNG72C.js +257 -0
  55. package/dist/chunk-SP7NIZFP.js +117 -0
  56. package/dist/chunk-SWRJWMGG.js +30 -0
  57. package/dist/chunk-TCQIJ3DO.js +85 -0
  58. package/dist/chunk-TPJ6JJ2F.js +290 -0
  59. package/dist/chunk-TUJZMJXW.js +72 -0
  60. package/dist/chunk-UR43ANYS.js +159 -0
  61. package/dist/chunk-VRGPG2YN.js +79 -0
  62. package/dist/chunk-WSBLCWY7.js +126 -0
  63. package/dist/chunk-XKKFSFYO.js +93 -0
  64. package/dist/chunk-XO7TBM47.js +32 -0
  65. package/dist/chunk-YDYDGG5K.js +132 -0
  66. package/dist/chunk-YMJOUYMT.js +171 -0
  67. package/dist/chunk-Z2WION42.js +32 -0
  68. package/dist/chunk-ZFKSVEYW.js +35 -0
  69. package/dist/components/blocks/AgentProfileGridBlock.js +8 -86
  70. package/dist/components/blocks/AgentRunOverviewBlock.js +8 -147
  71. package/dist/components/blocks/AgentWorkbenchBlock.js +15 -257
  72. package/dist/components/blocks/AudioVisualizerBlock.js +2 -50
  73. package/dist/components/blocks/AuthLayout.js +9 -73
  74. package/dist/components/blocks/BannerBlock.js +8 -66
  75. package/dist/components/blocks/BarChartBlock.js +5 -47
  76. package/dist/components/blocks/ChartBlock.js +7 -54
  77. package/dist/components/blocks/ChartCollectionBlock.js +11 -171
  78. package/dist/components/blocks/ChatLayout.js +12 -126
  79. package/dist/components/blocks/CreateBlock.js +9 -104
  80. package/dist/components/blocks/DataGridBlock.js +9 -117
  81. package/dist/components/blocks/DirectoryBlock.js +12 -85
  82. package/dist/components/blocks/FeatureGridBlock.js +6 -56
  83. package/dist/components/blocks/GalleryBlock.js +6 -69
  84. package/dist/components/blocks/HeroSectionBlock.js +10 -134
  85. package/dist/components/blocks/IntegrationsBlock.js +13 -94
  86. package/dist/components/blocks/InteractiveAreaChartBlock.js +5 -290
  87. package/dist/components/blocks/KanbanDemoBlock.js +8 -145
  88. package/dist/components/blocks/LogoCloud.js +4 -35
  89. package/dist/components/blocks/NavUser.js +5 -85
  90. package/dist/components/blocks/NotFoundBlock.js +8 -32
  91. package/dist/components/blocks/OnboardingBlock.js +7 -66
  92. package/dist/components/blocks/SettingsLayout.js +13 -86
  93. package/dist/components/blocks/SignUpBlock.js +8 -168
  94. package/dist/components/blocks/SolutionShowcaseBlock.js +11 -112
  95. package/dist/components/blocks/StatsBlock.js +6 -60
  96. package/dist/components/blocks/UsageDonutBlock.js +5 -79
  97. package/dist/components/blocks/WizardBlock.js +12 -93
  98. package/dist/components/blocks/user/InviteUserModal.js +10 -132
  99. package/dist/components/page-kits/AccountLockedPageKit.js +3 -40
  100. package/dist/components/page-kits/AgentsChatPageKit.js +11 -159
  101. package/dist/components/page-kits/AnalyticsPageKit.js +12 -150
  102. package/dist/components/page-kits/BlogContentPageKit.js +12 -167
  103. package/dist/components/page-kits/CheckoutPageKit.js +9 -83
  104. package/dist/components/page-kits/CompanySuitePageKit.js +9 -96
  105. package/dist/components/page-kits/DashboardPageKit.js +11 -149
  106. package/dist/components/page-kits/ErrorPageKit.js +5 -52
  107. package/dist/components/page-kits/KanbanBoardPageKit.js +7 -169
  108. package/dist/components/page-kits/LandingPageKit.js +11 -72
  109. package/dist/components/page-kits/LoginPageKit.js +3 -32
  110. package/dist/components/page-kits/OnboardingPageKit.js +6 -115
  111. package/dist/components/page-kits/PricingPageKit.js +12 -138
  112. package/dist/components/page-kits/ProfileSettingsPageKit.js +10 -164
  113. package/dist/components/page-kits/RecoveryPageKit.js +3 -42
  114. package/dist/components/page-kits/ResetPageKit.js +3 -36
  115. package/dist/components/page-kits/ServiceSuitePageKit.js +10 -175
  116. package/dist/components/page-kits/SignupPageKit.js +3 -30
  117. package/dist/components/page-kits/SuccessPageKit.js +4 -30
  118. package/dist/components/page-kits/TeamSettingsPageKit.js +9 -165
  119. package/dist/components/page-kits/TwoFactorPageKit.js +4 -28
  120. package/dist/components/page-kits/VerifyEmailPageKit.js +4 -30
  121. package/dist/components/page-kits/VoiceAgentsPageKit.js +13 -130
  122. package/dist/components/ui/CheckoutForm.js +5 -70
  123. package/eslint-rules/nadicode/config.js +1 -0
  124. package/eslint-rules/nadicode/data/catalog-names.json +93 -0
  125. package/eslint-rules/nadicode/index.js +2 -0
  126. package/eslint-rules/nadicode/rules/__tests__/require-catalog-component.test.js +77 -0
  127. package/eslint-rules/nadicode/rules/require-catalog-component.js +79 -0
  128. package/package.json +18 -25
  129. package/contracts/block-props-schemas.json +0 -2186
  130. package/contracts/component-props-schemas.json +0 -8322
  131. package/contracts/consumer-contract.json +0 -178
  132. package/contracts/page-kit-props-schemas.json +0 -1894
  133. package/contracts/public-surface-registry.json +0 -5822
  134. package/contracts/public-surface-registry.schema.json +0 -219
  135. package/contracts/spec-manifest.json +0 -46
  136. package/dist/catalog.json +0 -5221
@@ -0,0 +1,168 @@
1
+ import { LogoIcon } from './chunk-GHIBG7OM.js';
2
+ import { Heading } from './chunk-WI547C47.js';
3
+ import { Field, FieldLabel } from './chunk-RX5EUODB.js';
4
+ import { siteConfig } from './chunk-A7NUWD76.js';
5
+ import { Input } from './chunk-AP3XXYAY.js';
6
+ import { GoogleIcon, MicrosoftIcon } from './chunk-DJTF3XFB.js';
7
+ import { Button } from './chunk-7KIDDF3I.js';
8
+ import Link from 'next/link';
9
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
10
+
11
+ function SignUpBlock({
12
+ title = `Create a ${siteConfig.name} Account`,
13
+ description = "Welcome! Create an account to get started",
14
+ showSocial = true,
15
+ signInHref = "#",
16
+ onSubmit,
17
+ className
18
+ }) {
19
+ return /* @__PURE__ */ jsx("section", { className: className ?? "flex min-h-dvh bg-background px-4 py-16 md:py-32 dark:bg-transparent", children: /* @__PURE__ */ jsxs(
20
+ "form",
21
+ {
22
+ action: "",
23
+ onSubmit,
24
+ className: "bg-surface m-auto h-fit w-full max-w-sm rounded-[calc(var(--radius)+.125rem)] border p-0.5 shadow-md dark:[--color-muted:var(--color-surface)]",
25
+ children: [
26
+ /* @__PURE__ */ jsxs("div", { className: "p-8 pb-6", children: [
27
+ /* @__PURE__ */ jsxs("div", { children: [
28
+ /* @__PURE__ */ jsx(
29
+ Link,
30
+ {
31
+ href: "#",
32
+ "aria-label": "go home",
33
+ children: /* @__PURE__ */ jsx(LogoIcon, {})
34
+ }
35
+ ),
36
+ /* @__PURE__ */ jsx(Heading, { level: 1, size: "title", className: "mb-1.5 mt-4", children: title }),
37
+ /* @__PURE__ */ jsx("p", { className: "text-sm", children: description })
38
+ ] }),
39
+ !!showSocial && /* @__PURE__ */ jsxs(Fragment, { children: [
40
+ /* @__PURE__ */ jsxs("div", { className: "mt-6 grid grid-cols-2 gap-4", children: [
41
+ /* @__PURE__ */ jsxs(
42
+ Button,
43
+ {
44
+ type: "button",
45
+ variant: "outline",
46
+ className: "h-11",
47
+ children: [
48
+ /* @__PURE__ */ jsx(GoogleIcon, {}),
49
+ /* @__PURE__ */ jsx("span", { children: "Google" })
50
+ ]
51
+ }
52
+ ),
53
+ /* @__PURE__ */ jsxs(
54
+ Button,
55
+ {
56
+ type: "button",
57
+ variant: "outline",
58
+ className: "h-11",
59
+ children: [
60
+ /* @__PURE__ */ jsx(MicrosoftIcon, {}),
61
+ /* @__PURE__ */ jsx("span", { children: "Microsoft" })
62
+ ]
63
+ }
64
+ )
65
+ ] }),
66
+ /* @__PURE__ */ jsx("hr", { className: "my-4 border-dashed" })
67
+ ] }),
68
+ /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
69
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
70
+ /* @__PURE__ */ jsxs(Field, { children: [
71
+ /* @__PURE__ */ jsx(
72
+ FieldLabel,
73
+ {
74
+ htmlFor: "firstname",
75
+ className: "block text-sm",
76
+ children: "Firstname"
77
+ }
78
+ ),
79
+ /* @__PURE__ */ jsx(
80
+ Input,
81
+ {
82
+ type: "text",
83
+ required: true,
84
+ name: "firstname",
85
+ id: "firstname"
86
+ }
87
+ )
88
+ ] }),
89
+ /* @__PURE__ */ jsxs(Field, { children: [
90
+ /* @__PURE__ */ jsx(
91
+ FieldLabel,
92
+ {
93
+ htmlFor: "lastname",
94
+ className: "block text-sm",
95
+ children: "Lastname"
96
+ }
97
+ ),
98
+ /* @__PURE__ */ jsx(
99
+ Input,
100
+ {
101
+ type: "text",
102
+ required: true,
103
+ name: "lastname",
104
+ id: "lastname"
105
+ }
106
+ )
107
+ ] })
108
+ ] }),
109
+ /* @__PURE__ */ jsxs(Field, { children: [
110
+ /* @__PURE__ */ jsx(
111
+ FieldLabel,
112
+ {
113
+ htmlFor: "email",
114
+ className: "block text-sm",
115
+ children: "Username"
116
+ }
117
+ ),
118
+ /* @__PURE__ */ jsx(
119
+ Input,
120
+ {
121
+ type: "email",
122
+ required: true,
123
+ name: "email",
124
+ id: "email"
125
+ }
126
+ )
127
+ ] }),
128
+ /* @__PURE__ */ jsxs(Field, { children: [
129
+ /* @__PURE__ */ jsx(
130
+ FieldLabel,
131
+ {
132
+ htmlFor: "pwd",
133
+ className: "text-sm",
134
+ children: "Password"
135
+ }
136
+ ),
137
+ /* @__PURE__ */ jsx(
138
+ Input,
139
+ {
140
+ type: "password",
141
+ required: true,
142
+ name: "pwd",
143
+ id: "pwd",
144
+ className: "input sz-md variant-mixed"
145
+ }
146
+ )
147
+ ] }),
148
+ /* @__PURE__ */ jsx(Button, { className: "w-full", children: "Continue" })
149
+ ] })
150
+ ] }),
151
+ /* @__PURE__ */ jsx("div", { className: "bg-muted rounded-(--radius) border p-4", children: /* @__PURE__ */ jsxs("p", { className: "text-accent-foreground text-center text-sm", children: [
152
+ "Have an account ?",
153
+ /* @__PURE__ */ jsx(
154
+ Button,
155
+ {
156
+ asChild: true,
157
+ variant: "link",
158
+ className: "px-2",
159
+ children: /* @__PURE__ */ jsx(Link, { href: signInHref, children: "Sign In" })
160
+ }
161
+ )
162
+ ] }) })
163
+ ]
164
+ }
165
+ ) });
166
+ }
167
+
168
+ export { SignUpBlock };
@@ -0,0 +1,86 @@
1
+ import { StaggerChildren } from './chunk-DQPK2XRL.js';
2
+ import { Heading } from './chunk-WI547C47.js';
3
+ import { ScrollFadeIn } from './chunk-I23DDSU7.js';
4
+ import { Card, CardHeader, CardContent } from './chunk-AH6YSYYT.js';
5
+ import { Button } from './chunk-7KIDDF3I.js';
6
+ import { Badge } from './chunk-S4JAHKOP.js';
7
+ import { cn } from './chunk-QYZT24TS.js';
8
+ import { jsx, jsxs } from 'react/jsx-runtime';
9
+
10
+ var defaultAgents = [
11
+ {
12
+ name: "Atlas",
13
+ role: "Data Analyst",
14
+ description: "Transforms raw data into actionable insights with automated reporting.",
15
+ avatar: /* @__PURE__ */ jsx("div", { className: "flex size-16 items-center justify-center rounded-full bg-accent/10 text-2xl font-bold text-accent", children: "A" }),
16
+ capabilities: ["Analytics", "Reporting", "Forecasting"],
17
+ status: "active"
18
+ },
19
+ {
20
+ name: "Nova",
21
+ role: "Customer Support",
22
+ description: "Handles customer inquiries with empathy and precision, 24/7.",
23
+ avatar: /* @__PURE__ */ jsx("div", { className: "flex size-16 items-center justify-center rounded-full bg-accent/10 text-2xl font-bold text-accent", children: "N" }),
24
+ capabilities: ["Chat", "Email", "Tickets"],
25
+ status: "active"
26
+ },
27
+ {
28
+ name: "Orion",
29
+ role: "Content Creator",
30
+ description: "Generates and optimizes content across all your marketing channels.",
31
+ avatar: /* @__PURE__ */ jsx("div", { className: "flex size-16 items-center justify-center rounded-full bg-accent/10 text-2xl font-bold text-accent", children: "O" }),
32
+ capabilities: ["Writing", "SEO", "Social"],
33
+ status: "coming-soon"
34
+ }
35
+ ];
36
+ var statusVariant = {
37
+ active: "accent",
38
+ idle: "secondary",
39
+ "coming-soon": "outline"
40
+ };
41
+ var statusLabel = {
42
+ active: "Active",
43
+ idle: "Idle",
44
+ "coming-soon": "Coming Soon"
45
+ };
46
+ var columnClasses = {
47
+ 2: "grid-cols-1 sm:grid-cols-2",
48
+ 3: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3",
49
+ 4: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-4"
50
+ };
51
+ function AgentProfileGridBlock({
52
+ title = "Meet your AI team",
53
+ description = "Purpose-built agents that work together to accelerate your workflow.",
54
+ agents = defaultAgents,
55
+ columns = 3,
56
+ className
57
+ }) {
58
+ return /* @__PURE__ */ jsx(ScrollFadeIn, { children: /* @__PURE__ */ jsx("section", { className: className ?? "py-16 md:py-32", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-5xl px-6", children: [
59
+ /* @__PURE__ */ jsxs("div", { className: "text-center", children: [
60
+ /* @__PURE__ */ jsx(Heading, { level: 2, size: "section", className: "text-4xl lg:text-5xl", children: title }),
61
+ /* @__PURE__ */ jsx("p", { className: "mt-4 text-text-secondary", children: description })
62
+ ] }),
63
+ /* @__PURE__ */ jsx(
64
+ StaggerChildren,
65
+ {
66
+ staggerMs: 80,
67
+ className: cn("mt-8 grid gap-6 md:mt-16", columnClasses[columns]),
68
+ children: agents.map((agent, i) => /* @__PURE__ */ jsxs(Card, { className: "text-center", children: [
69
+ /* @__PURE__ */ jsxs(CardHeader, { className: "items-center", children: [
70
+ /* @__PURE__ */ jsx("div", { className: "size-16", children: agent.avatar }),
71
+ /* @__PURE__ */ jsx(Heading, { level: 3, size: "title", className: "mt-4 font-medium", children: agent.name }),
72
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-text-tertiary", children: agent.role })
73
+ ] }),
74
+ /* @__PURE__ */ jsxs(CardContent, { className: "space-y-4", children: [
75
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-text-secondary", children: agent.description }),
76
+ agent.capabilities && agent.capabilities.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap justify-center gap-1.5", children: agent.capabilities.map((cap) => /* @__PURE__ */ jsx(Badge, { variant: "secondary", className: "text-xs", children: cap }, cap)) }),
77
+ agent.status && /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Badge, { variant: statusVariant[agent.status], children: statusLabel[agent.status] }) }),
78
+ agent.href && /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Button, { variant: "link", asChild: true, children: /* @__PURE__ */ jsx("a", { href: agent.href, children: "Learn more" }) }) })
79
+ ] })
80
+ ] }, i))
81
+ }
82
+ )
83
+ ] }) }) });
84
+ }
85
+
86
+ export { AgentProfileGridBlock };
@@ -0,0 +1,175 @@
1
+ import { MarketingShellPageKit } from './chunk-Z233ZQZE.js';
2
+ import { TeamBlock } from './chunk-VBZQ4DBE.js';
3
+ import { TestimonialsBlock } from './chunk-FV2G6SAF.js';
4
+ import { ProcessFlowBlock } from './chunk-HZERHGBT.js';
5
+ import { HeroBlock } from './chunk-7A2RXKGH.js';
6
+ import { FAQBlock } from './chunk-NEHCPO53.js';
7
+ import { FeatureBlock } from './chunk-HJ3A2YNO.js';
8
+ import { CallToActionBlock } from './chunk-GJPTPLCQ.js';
9
+ import { cn } from './chunk-QYZT24TS.js';
10
+ import React from 'react';
11
+ import { jsx } from 'react/jsx-runtime';
12
+
13
+ var DEFAULT_SECTION_ORDER = [
14
+ "hero",
15
+ "features",
16
+ "process",
17
+ "team",
18
+ "testimonials",
19
+ "faq",
20
+ "cta"
21
+ ];
22
+ var DEFAULTS_BY_VARIANT = {
23
+ "agency-home": {
24
+ hero: {
25
+ headline: "A service partner for design and engineering velocity.",
26
+ subheadline: "Launch polished digital experiences with a repeatable service system.",
27
+ primaryAction: { label: "Talk to sales" }
28
+ },
29
+ features: {
30
+ features: [
31
+ {
32
+ title: "Cross-functional squads",
33
+ description: "Design, engineering, and QA operating in one weekly cadence.",
34
+ icon: /* @__PURE__ */ jsx("span", { "aria-hidden": true, children: "\u25CF" }),
35
+ bullets: ["Shared backlog", "Contract-first delivery", "Continuous validation"],
36
+ buttonLabel: "Learn more"
37
+ }
38
+ ]
39
+ },
40
+ process: {
41
+ title: "Service process",
42
+ steps: [
43
+ { title: "Discover", description: "Map goals, constraints, and target outcomes." },
44
+ { title: "Build", description: "Ship slices weekly with measurable acceptance." },
45
+ { title: "Scale", description: "Expand coverage using reusable contracts and kits." }
46
+ ]
47
+ },
48
+ team: null,
49
+ testimonials: {},
50
+ faq: {},
51
+ cta: {
52
+ title: "Need an execution partner?",
53
+ description: "Book a planning session and get a route-level rollout plan.",
54
+ primaryAction: { label: "Book planning", href: "/contact" }
55
+ }
56
+ },
57
+ "digital-workers": {
58
+ hero: {
59
+ headline: "Digital workers for planning, delivery, and quality.",
60
+ subheadline: "Deploy role-based workers that execute work while humans stay in control.",
61
+ primaryAction: { label: "Request demo" }
62
+ },
63
+ features: {
64
+ features: [
65
+ {
66
+ title: "Role-specialized workers",
67
+ description: "Assign planner, coder, and QA workers per workflow.",
68
+ icon: /* @__PURE__ */ jsx("span", { "aria-hidden": true, children: "\u25CD" }),
69
+ bullets: ["Shared context", "Traceable decisions", "Approval checkpoints"],
70
+ buttonLabel: "Explore workers"
71
+ }
72
+ ]
73
+ },
74
+ process: {
75
+ title: "Delivery process",
76
+ steps: [
77
+ { title: "Select workers", description: "Pick the worker stack for each objective." },
78
+ { title: "Run supervised", description: "Review outputs before execution-critical actions." },
79
+ { title: "Promote safely", description: "Ship with tests and release gates enforced." }
80
+ ]
81
+ },
82
+ team: {
83
+ title: "Worker team"
84
+ },
85
+ testimonials: {},
86
+ faq: {},
87
+ cta: {
88
+ title: "Design your worker stack",
89
+ description: "Start with a pilot route and scale based on measured outcomes.",
90
+ primaryAction: { label: "Start pilot", href: "/contact" }
91
+ }
92
+ },
93
+ "service-detail": {
94
+ hero: {
95
+ headline: "A focused service track for your highest-impact route.",
96
+ subheadline: "Bring one route from concept to production with a contract-first approach.",
97
+ primaryAction: { label: "Request proposal" }
98
+ },
99
+ features: {
100
+ features: [
101
+ {
102
+ title: "Outcome-led scope",
103
+ description: "Every section is mapped to a measurable business outcome.",
104
+ icon: /* @__PURE__ */ jsx("span", { "aria-hidden": true, children: "\u25C9" }),
105
+ bullets: ["Delivery milestones", "Weekly demos", "Launch checklist"],
106
+ buttonLabel: "See deliverables"
107
+ }
108
+ ]
109
+ },
110
+ process: {
111
+ title: "Implementation steps",
112
+ steps: [
113
+ { title: "Audit", description: "Review current route structure and conversion friction." },
114
+ { title: "Design", description: "Define section contracts and interaction states." },
115
+ { title: "Implement", description: "Ship validated route kit with test coverage." }
116
+ ]
117
+ },
118
+ team: null,
119
+ testimonials: {},
120
+ faq: {},
121
+ cta: {
122
+ title: "Need this service for your route?",
123
+ description: "Share your current page and goals, we will map a rollout plan.",
124
+ primaryAction: { label: "Contact team", href: "/contact" }
125
+ }
126
+ }
127
+ };
128
+ function normalizeSectionOrder(sectionOrder) {
129
+ if (!sectionOrder || sectionOrder.length === 0) {
130
+ return DEFAULT_SECTION_ORDER;
131
+ }
132
+ const seen = /* @__PURE__ */ new Set();
133
+ return sectionOrder.filter((sectionId) => {
134
+ if (seen.has(sectionId)) {
135
+ return false;
136
+ }
137
+ seen.add(sectionId);
138
+ return true;
139
+ });
140
+ }
141
+ function ServiceSuitePageKit({
142
+ shell,
143
+ variant = "agency-home",
144
+ sectionOrder,
145
+ hero,
146
+ features,
147
+ process,
148
+ team,
149
+ testimonials,
150
+ faq,
151
+ cta,
152
+ className
153
+ }) {
154
+ const defaults = DEFAULTS_BY_VARIANT[variant];
155
+ const resolvedHero = hero ?? defaults.hero;
156
+ const resolvedFeatures = features === void 0 ? defaults.features : features;
157
+ const resolvedProcess = process === void 0 ? defaults.process : process;
158
+ const resolvedTeam = team === void 0 ? defaults.team : team;
159
+ const resolvedTestimonials = testimonials === void 0 ? defaults.testimonials : testimonials;
160
+ const resolvedFaq = faq === void 0 ? defaults.faq : faq;
161
+ const resolvedCta = cta === void 0 ? defaults.cta : cta;
162
+ const orderedSections = normalizeSectionOrder(sectionOrder);
163
+ const sectionById = {
164
+ hero: resolvedHero === null ? null : /* @__PURE__ */ jsx("section", { "data-testid": "service-section-hero", className: "mx-auto w-full max-w-6xl px-6", children: /* @__PURE__ */ jsx(HeroBlock, { variant: "split", ...resolvedHero }) }),
165
+ features: resolvedFeatures === null ? null : /* @__PURE__ */ jsx("section", { "data-testid": "service-section-features", className: "mx-auto w-full max-w-6xl px-6", children: /* @__PURE__ */ jsx(FeatureBlock, { variant: "list", ...resolvedFeatures }) }),
166
+ process: resolvedProcess === null ? null : /* @__PURE__ */ jsx("section", { "data-testid": "service-section-process", className: "mx-auto w-full max-w-6xl px-6", children: /* @__PURE__ */ jsx(ProcessFlowBlock, { ...resolvedProcess }) }),
167
+ team: resolvedTeam === null ? null : /* @__PURE__ */ jsx("section", { "data-testid": "service-section-team", className: "mx-auto w-full max-w-6xl px-6", children: /* @__PURE__ */ jsx(TeamBlock, { ...resolvedTeam }) }),
168
+ testimonials: resolvedTestimonials === null ? null : /* @__PURE__ */ jsx("section", { "data-testid": "service-section-testimonials", className: "mx-auto w-full max-w-6xl px-6", children: /* @__PURE__ */ jsx(TestimonialsBlock, { ...resolvedTestimonials }) }),
169
+ faq: resolvedFaq === null ? null : /* @__PURE__ */ jsx("section", { "data-testid": "service-section-faq", className: "mx-auto w-full max-w-6xl px-6", children: /* @__PURE__ */ jsx(FAQBlock, { ...resolvedFaq }) }),
170
+ cta: resolvedCta === null ? null : /* @__PURE__ */ jsx("section", { "data-testid": "service-section-cta", className: "mx-auto w-full max-w-6xl px-6 pb-16", children: /* @__PURE__ */ jsx(CallToActionBlock, { ...resolvedCta }) })
171
+ };
172
+ return /* @__PURE__ */ jsx(MarketingShellPageKit, { ...shell, children: /* @__PURE__ */ jsx("div", { className: cn("space-y-10 pb-10", className), children: orderedSections.map((sectionId) => /* @__PURE__ */ jsx(React.Fragment, { children: sectionById[sectionId] }, sectionId)) }) });
173
+ }
174
+
175
+ export { ServiceSuitePageKit };
@@ -0,0 +1,134 @@
1
+ import { LOCAL_HERO_LOGOS } from './chunk-QQOWC53X.js';
2
+ import { HeaderBlock } from './chunk-WOYBVPXK.js';
3
+ import { FlipWords } from './chunk-6DYFX5IR.js';
4
+ import { ProgressiveBlur } from './chunk-3UJ3HJZ3.js';
5
+ import { Heading } from './chunk-WI547C47.js';
6
+ import { InfiniteSlider } from './chunk-IFIDWZ5M.js';
7
+ import { Button } from './chunk-7KIDDF3I.js';
8
+ import { ChevronRightIcon } from './chunk-G24VV5NO.js';
9
+ import { cn } from './chunk-QYZT24TS.js';
10
+ import Link from 'next/link';
11
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
12
+
13
+ var defaultFlipWords = ["scalable", "accessible", "beautiful", "performant"];
14
+ var defaultPrimaryAction = { label: "Start Building", href: "#link" };
15
+ var defaultSecondaryAction = { label: "Request a demo", href: "#link" };
16
+ var defaultLogos = LOCAL_HERO_LOGOS;
17
+ function heightClass(h) {
18
+ const n = parseInt(h, 10);
19
+ if (n <= 16) return "h-4";
20
+ if (n <= 20) return "h-5";
21
+ if (n <= 24) return "h-6";
22
+ return "h-7";
23
+ }
24
+ function HeroSectionBlock({
25
+ headline = "Build 10x Faster with NS",
26
+ flipWords = defaultFlipWords,
27
+ primaryAction = defaultPrimaryAction,
28
+ secondaryAction = defaultSecondaryAction,
29
+ logos = defaultLogos,
30
+ className
31
+ }) {
32
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
33
+ /* @__PURE__ */ jsx(HeaderBlock, {}),
34
+ /* @__PURE__ */ jsxs("main", { className: className ?? "overflow-x-hidden", children: [
35
+ /* @__PURE__ */ jsx("section", { children: /* @__PURE__ */ jsxs("div", { className: "py-24 md:pb-32 lg:pb-36 lg:pt-72", children: [
36
+ /* @__PURE__ */ jsx("div", { className: "relative mx-auto flex max-w-7xl flex-col px-6 lg:block lg:px-12", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-lg text-center lg:ml-0 lg:max-w-full lg:text-left", children: [
37
+ /* @__PURE__ */ jsx(Heading, { level: 1, size: "display", className: "mt-8 max-w-2xl text-5xl md:text-6xl lg:mt-16 xl:text-7xl", children: headline }),
38
+ /* @__PURE__ */ jsxs("p", { className: "mt-8 max-w-2xl text-balance text-lg", children: [
39
+ "Highly customizable components that are",
40
+ " ",
41
+ /* @__PURE__ */ jsx(
42
+ FlipWords,
43
+ {
44
+ words: flipWords,
45
+ interval: 3e3,
46
+ className: "text-accent"
47
+ }
48
+ )
49
+ ] }),
50
+ /* @__PURE__ */ jsxs("div", { className: "mt-12 flex flex-col items-center justify-center gap-2 sm:flex-row lg:justify-start", children: [
51
+ /* @__PURE__ */ jsx(
52
+ Button,
53
+ {
54
+ asChild: true,
55
+ size: "lg",
56
+ className: "h-12 rounded-full pl-6 pr-4 text-base",
57
+ children: /* @__PURE__ */ jsxs(Link, { href: primaryAction.href, children: [
58
+ /* @__PURE__ */ jsx("span", { className: "text-nowrap", children: primaryAction.label }),
59
+ /* @__PURE__ */ jsx(ChevronRightIcon, { size: 16, className: "ml-1.5" })
60
+ ] })
61
+ }
62
+ ),
63
+ /* @__PURE__ */ jsx(
64
+ Button,
65
+ {
66
+ asChild: true,
67
+ size: "lg",
68
+ variant: "ghost",
69
+ className: "h-12 rounded-full px-6 text-base hover:bg-surface-hover",
70
+ children: /* @__PURE__ */ jsx(Link, { href: secondaryAction.href, children: /* @__PURE__ */ jsx("span", { className: "text-nowrap", children: secondaryAction.label }) })
71
+ },
72
+ 2
73
+ )
74
+ ] })
75
+ ] }) }),
76
+ /* @__PURE__ */ jsxs(
77
+ "div",
78
+ {
79
+ "aria-hidden": "true",
80
+ className: "absolute inset-1.5 -z-10 overflow-hidden rounded-3xl border border-border/50 bg-[radial-gradient(circle_at_top_left,rgba(255,255,255,0.12),transparent_34%),radial-gradient(circle_at_bottom_right,rgba(59,130,246,0.18),transparent_30%),linear-gradient(135deg,rgba(15,23,42,0.98),rgba(30,41,59,0.94))] lg:rounded-[3rem]",
81
+ children: [
82
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-x-10 top-10 h-24 rounded-full bg-accent/20 blur-3xl" }),
83
+ /* @__PURE__ */ jsx("div", { className: "absolute left-8 top-16 size-40 rounded-full border border-foreground/10 bg-foreground/5 blur-[1px]" }),
84
+ /* @__PURE__ */ jsx("div", { className: "absolute right-10 bottom-10 size-48 rounded-full border border-accent/20 bg-accent/10 blur-[1px]" }),
85
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-[linear-gradient(to_right,rgba(255,255,255,0.03)_1px,transparent_1px),linear-gradient(to_bottom,rgba(255,255,255,0.03)_1px,transparent_1px)] bg-[size:48px_48px] opacity-40" })
86
+ ]
87
+ }
88
+ )
89
+ ] }) }),
90
+ /* @__PURE__ */ jsx("section", { className: "bg-background pb-2", children: /* @__PURE__ */ jsx("div", { className: "group relative m-auto max-w-7xl px-6", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center md:flex-row", children: [
91
+ /* @__PURE__ */ jsx("div", { className: "md:max-w-44 md:border-r md:pr-6", children: /* @__PURE__ */ jsx("p", { className: "text-end text-sm", children: "Powering the best teams" }) }),
92
+ /* @__PURE__ */ jsxs("div", { className: "relative py-6 md:w-[calc(100%-11rem)]", children: [
93
+ /* @__PURE__ */ jsx(
94
+ InfiniteSlider,
95
+ {
96
+ speed: 40,
97
+ gap: 112,
98
+ children: logos.map((logo) => /* @__PURE__ */ jsx("div", { className: "flex", children: /* @__PURE__ */ jsx(
99
+ "img",
100
+ {
101
+ className: cn("mx-auto w-fit dark:invert", heightClass(logo.height)),
102
+ src: logo.src,
103
+ alt: logo.alt,
104
+ height: logo.height,
105
+ width: "auto"
106
+ }
107
+ ) }, logo.alt))
108
+ }
109
+ ),
110
+ /* @__PURE__ */ jsx("div", { className: "bg-linear-to-r from-background absolute inset-y-0 left-0 w-20" }),
111
+ /* @__PURE__ */ jsx("div", { className: "bg-linear-to-l from-background absolute inset-y-0 right-0 w-20" }),
112
+ /* @__PURE__ */ jsx(
113
+ ProgressiveBlur,
114
+ {
115
+ className: "pointer-events-none absolute left-0 top-0 h-full w-20",
116
+ direction: "left",
117
+ blurIntensity: 1
118
+ }
119
+ ),
120
+ /* @__PURE__ */ jsx(
121
+ ProgressiveBlur,
122
+ {
123
+ className: "pointer-events-none absolute right-0 top-0 h-full w-20",
124
+ direction: "right",
125
+ blurIntensity: 1
126
+ }
127
+ )
128
+ ] })
129
+ ] }) }) })
130
+ ] })
131
+ ] });
132
+ }
133
+
134
+ export { HeroSectionBlock };
@@ -0,0 +1,50 @@
1
+ import { cn } from './chunk-QYZT24TS.js';
2
+ import { useRef, useEffect } from 'react';
3
+ import { jsx } from 'react/jsx-runtime';
4
+
5
+ function AudioVisualizerBlock({
6
+ className,
7
+ bars = 20,
8
+ isPlaying = false
9
+ }) {
10
+ const barsRef = useRef(null);
11
+ const opacityOffsetsRef = useRef(null);
12
+ if (opacityOffsetsRef.current === null || opacityOffsetsRef.current.length !== bars) {
13
+ opacityOffsetsRef.current = Array.from({ length: bars }, (_, i) => (i * 3 + 1) % 10 * 0.05);
14
+ }
15
+ const opacityOffsets = opacityOffsetsRef.current;
16
+ useEffect(() => {
17
+ const container = barsRef.current;
18
+ if (!container) return;
19
+ let interval;
20
+ const applyHeights = (heights) => {
21
+ const children = container.children;
22
+ for (let i = 0; i < children.length; i++) {
23
+ const child = children[i];
24
+ child.style.height = `${Math.max(10, heights[i])}%`;
25
+ child.style.opacity = String(isPlaying ? 0.5 + opacityOffsets[i] : 0.3);
26
+ }
27
+ };
28
+ if (isPlaying) {
29
+ interval = setInterval(() => {
30
+ applyHeights(Array.from({ length: bars }, () => Math.random() * 100));
31
+ }, 100);
32
+ } else {
33
+ applyHeights(Array(bars).fill(10));
34
+ }
35
+ return () => clearInterval(interval);
36
+ }, [isPlaying, bars, opacityOffsets]);
37
+ return /* @__PURE__ */ jsx("div", { ref: barsRef, className: cn("flex h-16 items-center justify-center gap-1.5", className), children: Array.from({ length: bars }, (_, i) => /* @__PURE__ */ jsx(
38
+ "div",
39
+ {
40
+ className: "w-1 rounded-full bg-accent transition-[height,opacity] duration-micro ease-out",
41
+ style: {
42
+ height: "10%",
43
+ opacity: 0.3
44
+ }
45
+ },
46
+ i
47
+ )) });
48
+ }
49
+
50
+ export { AudioVisualizerBlock };